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:
GPIO15 | GPIO0 | GPIO2 | Mode |
---|---|---|---|
0V | 0V | 3.3V | Uart Bootloader |
0V | 3.3V | 3.3V | Sketsa boot (flash SPI) |
3.3V | x | x | Mode 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 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
GPIO | Fungsi | Negara | Batasan |
---|---|---|---|
0 | Pilih mode boot | 3.3V | Tidak Hi-Z |
1 | TX0 | - | Tidak dapat digunakan selama transmisi Serial |
2 | Mode boot pilih TX1 | 3.3V (hanya boot) | Jangan terhubung ke ground saat boot. Mengirim data debug saat boot |
3 | RX0 | - | Tidak dapat digunakan selama transmisi Serial |
4 | SDA (I²C) | - | - |
5 | SCL (I²C) | - | - |
6 - 11 | Koneksi flash | x | Tidak bisa digunakan, dan tidak pecah |
12 | MISO (SPI) | - | - |
13 | MOSI (SPI) | - | - |
14 | SCK (SPI) | - | - |
15 | SS (SPI) | 0V | Penarik pull-up tidak dapat digunakan |
16 | Bangun 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 pin
nomor GPIO *, dan mode
dapat berupa INPUT
, yang merupakan default OUTPUT
,, atau INPUT_PULLUP
untuk 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 pin
pin digital, dan value
1 atau 0 (atau HIGH
dan LOW
).
Untuk membaca input, gunakan
digitalRead(pin);
Untuk mengaktifkan PWM pada pin tertentu, gunakan di
analogWrite(pin, value);
mana pin
pin digital, dan value
angka 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_frequency
harus 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
Jika Anda menggunakannya untuk membaca tegangan suplai, Anda tidak dapat menghubungkan apa pun ke pin analog.
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
Serial
objek, 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
Serial1
objek.
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.
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 for
atau while
loop 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
Post a Comment