ESP8266 sebagai mikrokontroler

Walaupun ESP8266 sering digunakan sebagai jembatan Serial-to-WiFi 'bodoh', ini adalah mikrokontroler yang sangat kuat. Dalam bab ini, kita akan melihat fungsi spesifik non-Wi-Fi dari ESP8266.

I / O Digital

Sama seperti Arduino normal, ESP8266 memiliki pin input / output digital (I / O atau GPIO, pin Input / Output Tujuan Umum). Sesuai namanya, mereka dapat digunakan sebagai input digital untuk membaca tegangan digital, atau sebagai output digital untuk output baik 0V (sink sekarang) atau 3.3V (sumber sekarang).

Pembatasan tegangan dan arus

ESP8266 adalah mikrokontroler 3.3V, sehingga I / O-nya juga beroperasi pada 3.3V. Pin tidak toleran 5V, menerapkan lebih dari 3.6V pada pin apa pun akan membunuh chip.
Arus maksimum yang dapat diambil dari pin GPIO tunggal adalah 12mA .

Pin yang dapat digunakan

ESP8266 memiliki 17 pin GPIO (0-16), namun, Anda hanya dapat menggunakan 11 pin, karena 6 pin (GPIO 6 - 11) digunakan untuk menghubungkan chip memori flash. Ini adalah chip kecil berkaki 8 tepat di sebelah ESP8266. Jika Anda mencoba menggunakan salah satu pin ini, Anda mungkin merusak program Anda.
GPIO 1 dan 3 digunakan sebagai TX dan RX dari port Serial perangkat keras (UART), jadi dalam kebanyakan kasus, Anda tidak dapat menggunakannya sebagai I / O normal saat mengirim / menerima data serial.

Mode boot

Seperti disebutkan dalam bab sebelumnya, beberapa pin I / O memiliki fungsi khusus saat boot: Mereka memilih 1 dari 3 mode boot:
GPIO15GPIO0GPIO2Mode
0V0V3.3VUart Bootloader
0V3.3V3.3VSketsa boot (flash SPI)
3.3VxxMode SDIO (tidak digunakan untuk Arduino)
Catatan: Anda tidak perlu menambahkan resistor pull-up eksternal ke GPIO2, yang internal diaktifkan saat boot.
Kami memastikan bahwa kondisi ini dipenuhi dengan menambahkan resistor eksternal di bab sebelumnya, atau pabrikan papan board Anda menambahkannya untuk Anda. Ini memiliki beberapa implikasi, namun:
  • GPIO15 selalu ditarik rendah, sehingga Anda tidak dapat menggunakan resistor pull-up internal. Anda harus mengingat hal ini saat menggunakan GPIO15 sebagai input untuk membaca sakelar atau menghubungkannya ke perangkat dengan output kolektor terbuka (atau saluran terbuka), seperti I²C.
  • GPIO0 ditarik tinggi selama operasi normal, jadi Anda tidak dapat menggunakannya sebagai input Hi-Z.
  • GPIO2 tidak boleh rendah saat boot, jadi Anda tidak bisa menghubungkan switch ke sana.

Resistor pull-up / down internal

GPIO 0-15 semuanya memiliki resistor pull-up bawaan, seperti pada Arduino. GPIO16 memiliki resistor pull-down bawaan.

PWM

Tidak seperti kebanyakan chip Atmel (Arduino), ESP8266 tidak mendukung PWM perangkat keras, namun, perangkat lunak PWM didukung pada semua pin digital. Rentang PWM default adalah 10-bit @ 1kHz, tetapi ini dapat diubah (hingga> 14-bit @ 1kHz).

Input analog

ESP8266 memiliki input analog tunggal, dengan rentang input 0 - 1.0V. Jika Anda menyediakan 3.3V, misalnya, Anda akan merusak chip. Beberapa papan seperti NodeMCU memiliki pembagi tegangan resistif on-board, untuk mendapatkan rentang 0 - 3.3V yang lebih mudah. Anda juga bisa menggunakan trimpot sebagai pembagi tegangan.
ADC (pengubah analog ke digital) memiliki resolusi 10 bit.

Komunikasi

Serial

ESP8266 memiliki dua perangkat keras UART (port Serial):
UART0 pada pin 1 dan 3 (TX0 dan RX0 resp.), Dan UART1 pada pin 2 dan 8 (resp TX1 dan RX1). Namun, GPIO8 digunakan untuk menghubungkan chip flash . Ini berarti bahwa UART1 hanya dapat mengirimkan data.
UART0 juga memiliki kontrol aliran perangkat keras pada pin 15 dan 13 (RTS0 dan CTS0 resp.). Kedua pin ini juga dapat digunakan sebagai pin TX0 dan RX0 alternatif.

I²C

ESP tidak memiliki perangkat keras TWI (Two Wire Interface), tetapi diterapkan dalam perangkat lunak. Ini berarti Anda dapat menggunakan hampir dua pin digital. Secara default, pustaka I²C menggunakan pin 4 sebagai SDA dan pin 5 sebagai SCL. (Lembar data menetapkan GPIO2 sebagai SDA dan GPIO14 sebagai SCL.) Kecepatan maksimum sekitar 450kHz.

SPI

ESP8266 memiliki satu koneksi SPI yang tersedia untuk pengguna, disebut HSPI. Ini menggunakan GPIO14 sebagai CLK, 12 sebagai MISO, 13 sebagai MOSI dan 15 sebagai Slave Select (SS). Ini dapat digunakan dalam mode Slave dan Master (dalam perangkat lunak).

Gambaran umum GPIO

GPIOFungsiNegaraBatasan
0Pilih mode boot3.3VTidak Hi-Z
1TX0-Tidak dapat digunakan selama transmisi Serial
2Mode boot pilih
TX1
3.3V (hanya boot)Jangan terhubung ke ground saat boot.
Mengirim data debug saat boot
3RX0-Tidak dapat digunakan selama transmisi Serial
4SDA (I²C)--
5SCL (I²C)--
6 - 11Koneksi flashxTidak bisa digunakan, dan tidak pecah
12MISO (SPI)--
13MOSI (SPI)--
14SCK (SPI)--
15SS (SPI)0VPenarik pull-up tidak dapat digunakan
16Bangun dari tidur-Tidak ada pull-up resistor, tetapi pull-down sebagai gantinya
Harus terhubung ke RST untuk bangun

ESP8266 sebagai mikrokontroler - Perangkat Lunak

Sebagian besar fungsi mikrokontroler ESP menggunakan sintaks yang persis sama dengan Arduino normal, sehingga sangat mudah untuk memulai.

I / O Digital

Sama seperti dengan Arduino biasa, Anda dapat mengatur fungsi pin menggunakan di pinMode(pin, mode);mana pinnomor GPIO *, dan modedapat berupa INPUT, yang merupakan default OUTPUT,, atau INPUT_PULLUPuntuk mengaktifkan resistor pull-up bawaan untuk GPIO 0-15 . Untuk mengaktifkan resistor pull-down untuk GPIO16, Anda harus menggunakan INPUT_PULLDOWN_16.
(*) NodeMCU menggunakan pemetaan pin yang berbeda, baca lebih lanjut di sini . Untuk mengatasi pin NodeMCU, misalnya pin 5, gunakan D5: misalnya:pinMode(D5, OUTPUT);
Untuk mengatur pin output tinggi (3.3V) atau rendah (0V), gunakan di digitalWrite(pin, value);mana pinpin digital, dan value1 atau 0 (atau HIGHdan LOW).
Untuk membaca input, gunakan digitalRead(pin);
Untuk mengaktifkan PWM pada pin tertentu, gunakan di analogWrite(pin, value);mana pinpin digital, dan valueangka antara 0 dan 1023.
Anda dapat mengubah rentang (kedalaman bit) dari output PWM dengan menggunakan analogWriteRange(new_range);
Frekuensi dapat diubah dengan menggunakan analogWriteFreq(new_frequency);new_frequencyharus antara 100 dan 1000Hz.

Input analog

Sama seperti pada Arduino, Anda dapat menggunakan analogRead(A0)untuk mendapatkan tegangan analog pada input analog. (0 = 0V, 1023 = 1.0V).
ESP juga dapat menggunakan ADC untuk mengukur tegangan suplai (V CC ). Untuk melakukan ini, sertakan ADC_MODE(ADC_VCC);di bagian atas sketsa Anda, dan gunakan ESP.getVcc();untuk benar-benar mendapatkan tegangan.
Jika Anda menggunakannya untuk membaca tegangan suplai, Anda tidak dapat menghubungkan apa pun ke pin analog.

Komunikasi

Komunikasi serial

Untuk menggunakan UART0 (TX = GPIO1, RX = GPIO3), Anda dapat menggunakan Serialobjek, seperti pada Arduino: Serial.begin(baud).
Untuk menggunakan pin alternatif (TX = GPIO15, RX = GPIO13), gunakan Serial.swap()setelah Serial.begin.
Untuk menggunakan UART1 (TX = GPIO2), gunakan Serial1objek.
Semua fungsi Arduino Stream, seperti read, write, print, println, ...didukung juga.

I²C dan SPI

Anda cukup menggunakan sintaksis pustaka Arduino default, seperti biasanya.

Membagi waktu CPU dengan bagian RF

Satu hal yang perlu diingat saat menulis program untuk ESP8266 adalah sketsa Anda harus berbagi sumber daya (waktu dan memori CPU) dengan tumpukan Wi-Fi dan TCP (perangkat lunak yang berjalan di latar belakang dan menangani semua Wi-Fi dan koneksi IP).
Jika kode Anda terlalu lama untuk dieksekusi, dan jangan biarkan tumpukan TCP melakukan tugasnya, itu mungkin macet, atau Anda bisa kehilangan data. Cara terbaik untuk menjaga waktu eksekusi Anda dalam beberapa ratus milidetik.
Setiap kali loop utama diulang, sketsa Anda menghasilkan Wi-Fi dan TCP untuk menangani semua permintaan Wi-Fi dan TCP.
Jika loop Anda membutuhkan waktu lebih lama dari ini, Anda harus secara eksplisit memberikan waktu CPU ke tumpukan Wi-Fi / TCP, dengan menggunakan termasuk delay(0);atau yield();Jika tidak, komunikasi jaringan tidak akan berfungsi seperti yang diharapkan, dan jika lebih dari 3 detik, WDT (Watch Dog Timer) yang lunak akan mengatur ulang ESP. Jika soft WDT dinonaktifkan, setelah lebih dari 8 detik, perangkat keras WDT akan mengatur ulang chip.
Namun dari sudut pandang mikrokontroler, 3 detik adalah waktu yang sangat lama (240 juta sepeda motor), jadi kecuali jika Anda melakukan angka yang sangat berat, atau mengirimkan string yang sangat panjang ke Serial, Anda tidak akan terpengaruh oleh ini. Hanya perlu diingat bahwa Anda menambahkan bagian yield();dalam foratau whileloop yang bisa lebih lama dari, katakanlah 100 ms.

Sumber

Di sinilah saya mendapatkan sebagian besar informasi saya untuk menulis artikel ini, ada beberapa detail lagi di halaman GitHub, jika Anda menyukai beberapa hal yang lebih maju, seperti EEPROM atau tidur nyenyak dll
0
Komentar With Facebook
Komentar With Blogger

Post a Comment

Zoom
Jika setelah di zoom masih kurang jelas, coba
Untuk melihat ukuran lebih besar atau lebih jelas lagi,
membutuhkan koneksi dan grafik yang cukup baik..