Pin Esp32 Mana Yang Harus Kita Gunakan?
Bagi yang terbiasa menggunakan Arduino Uno dan Arduino Mega, akan terlihat sedikit asing jika ingin menggunakan ESP32. Sama seperti saya ketika migrasi dari Arduino mega ke ESP32 karena Alasan keterbatasan Speed dan Memory pada Arduino Mega. Namun ketika mencoba menggunakan ESP32 ini, ada karakteristik khusus yang membuat dia berbeda dari pada Arduino pada umum nya.
Apa saja kah perbedaan yang mencolok pada pin out ESP32 ini? hal yang mencolok adalah sebagai berikut:
- Pin Hardware Serial Terdiri dari 3 channel, Serial1 dan Serial2 bisa di swap ke pin lain lain nya
- Pin I2C ada 2 Channel, Pin ini juga bisa di swap ke pin pin lain
- PIN SPI ada 3 channel, saya sendiri hanya pernah mengunakan 2 channel, satu sebagai LoRa dan Satu lagi Sebagai SD Card ( atau terkadang Ethernet)
- Ada pin yang hanya berfungsi sebagai input dan harus di pullup
- Ada pin yang di fungsi kan sebagai wake up ketika ESP32 dalam mode Sleep
- Toleransi Pin ada di 3.3v, bukan di 5v
- Ada pin yang tidak bisa di gunakan sebagai input, jika di gunakan akan masuk mode flash ketika start, sehingga tidak bisa di gunakan ESP32
Kehati-hatian kita dalam memilih pin pada ESP32 akan mengurangi resiko kesalahan dalam design hardware yang menggunakan ESP32. Nah dari point di atas, yuk kita jadi kan dari pembahasan fungsi-fungsi Pin out ESP32.
Pin Hardware Serial
Pada ESP32 ada 3 channel pin Serial. Serial0 default di gunakan sebagai jalur upload Program dari Usb to Serial, kemudan Serial1 dan Serial2 bisa di swap seperti layak nya software Serial pada Arduino Uno dan Mega. Di case saya sebagai pengguna chip esp32, pin yang bisa di fungsikan sebagai hardware serial adalah pin yang bisa kita gunakan sebagai output. Pin mana kah itu?
GPIO | FUNCTION | GPIO | FUNCTION |
GPIO32 | RX/TX | GPIO15 | RX/TX |
GPIO33 | RX/TX | GPIO21 | RX/TX |
GPIO25 | RX/TX | GPIO22 | RX/TX |
GPIO26 | RX/TX | GPIO17 | RX/TX |
GPIO27 | RX/TX | GPIO16 | RX/TX |
GPIO14 | RX/TX | ||
GPIO13 | RX/TX |
Nah bagaimana kah penggunakan Hardware Serial1 dan Serial2 di Arduino? Just simple, code program nya hanya seperti di bawah ini
// ganti sesukamu sesuai table #define RXD1 17 #define TXD1 16 // ganti sesukamu sesuai table #define RXD2 27 #define TXD2 26 #define BAUD 115200 #define PROTOCOL SERIAL_8N1 void setup() { // put your setup code here, to run once: Serial.begin(115200); Serial1.begin(BAUD, PROTOCOL, RXD1, TXD1); Serial2.begin(BAUD, PROTOCOL, RXD2, TXD2); } void loop() { // put your main code here, to run repeatedly: Serial.println("hi mikroavr"); Serial1.println("hi mikroavr"); Serial2.println("hi mikroavr"); }
Ada beberapa protokol Serial yang support pada ESP32, list nya sebagai berikut:
- SERIAL_5N1 5-bit No parity 1 stop bit
- SERIAL_6N1 6-bit No parity 1 stop bit
- SERIAL_7N1 7-bit No parity 1 stop bit
- SERIAL_8N1 (the default) 8-bit No parity 1 stop bit
- SERIAL_5N2 5-bit No parity 2 stop bits
- SERIAL_6N2 6-bit No parity 2 stop bits
- SERIAL_7N2 7-bit No parity 2 stop bits
- SERIAL_8N2 8-bit No parity 2 stop bits
- SERIAL_5E1 5-bit Even parity 1 stop bit
- SERIAL_6E1 6-bit Even parity 1 stop bit
- SERIAL_7E1 7-bit Even parity 1 stop bit
- SERIAL_8E1 8-bit Even parity 1 stop bit
- SERIAL_5E2 5-bit Even parity 2 stop bit
- SERIAL_6E2 6-bit Even parity 2 stop bit
- SERIAL_7E2 7-bit Even parity 2 stop bit
- SERIAL_8E2 8-bit Even parity 2 stop bit
- SERIAL_5O1 5-bit Odd parity 1 stop bit
- SERIAL_6O1 6-bit Odd parity 1 stop bit
- SERIAL_7O1 7-bit Odd parity 1 stop bit
- SERIAL_8O1 8-bit Odd parity 1 stop bit
- SERIAL_5O2 5-bit Odd parity 2 stop bit
- SERIAL_6O2 6-bit Odd parity 2 stop bit
- SERIAL_7O2 7-bit Odd parity 2 stop bit
- SERIAL_8O2 8-bit Odd parity 2 stop bit
Nah, Mudah bukan? jadi dengan swap pin serial ini, kita bisa mengurangi kesalahan dalam design pcb atau mudah dalam mentrace jalur PCB.
PIN i2C ESP32
Pin i2C satu channel pada Mikrokontroller sesungguh nya bisa mendrive banyak slave (device). Namun ada beberapa device i2c yang tidak bisa dirubah address nya. Sehingga kita membutuhkan I2c lebih dari satu channel. Contoh nya ada pada sensor SUHU SHT25. Untuk itu, terkadang kita membutuhkan MCU yang memiliki dua channel i2C atau ic mulpilexer i2C.
default pin i2C yaitu GPIO21 Sebagai SDA , GPIO22 sebagai SCL
Semua pin pada Table Serial di atas bisa digunakan sebagai i2C. Untuk configurasi pin di program RTClib ( DS3231) Adalah Sebagai Berikut
#include <Wire.h> #include "RTClib.h" RTC_DS3231 rtc; char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; #define I2C_SDA 16 // ganti sesukamu #define I2C_SCL 17 // ganti sesukamu void setup () { Serial.begin(115200); Wire.begin(I2C_SDA,I2C_SCL); if (! rtc.begin()) { Serial.println("Couldn't find RTC"); Serial.flush(); abort(); } if (rtc.lostPower()) { Serial.println("RTC lost power, let's set the time!"); rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); } } void loop () { DateTime now = rtc.now(); Serial.print(now.year(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.day(), DEC); Serial.print(" ("); Serial.print(daysOfTheWeek[now.dayOfTheWeek()]); Serial.print(") "); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.print(now.second(), DEC); Serial.println(); Serial.print("Temperature: "); Serial.print(rtc.getTemperature()); Serial.println(" C"); Serial.println(); delay(3000); }
Program di Atas menjelaskan bahwa pin SDA DS3231 di hubungkan ke pin GPIO16 dan Pin SCL DS3231 dihubungkan ke pin GPIO17
PIN SPI ESP32
ESP32 memiliki banyak SPI. Ada yang di sebut VSPI dan ada juga yang di sebut HSPI. Untuk config pin nya bisa kita lihat pada tabel di bawah ini
HSPI | Fungsi | VSPI | fungsi |
GPIO14 | SCK | GPIO18 | SCK |
GPIO15 | MOSI | GPIO19 | MOSI |
GPIO2 | MISO | GPIO23 | MISO |
Contoh Pengguanaan nya bisa di lihat pada program LoRa di bawah ini
#include <SPI.h> #include <LoRa.h> int counter = 0; SPIClass spiLoRa(HSPI); #define SCK_LORA 14 #define MISO_LORA 2 #define MOSI_LORA 15 #define SS_LORA 5 #define FREQ_LORA 923E6 #define resetPin 18 #define irqPin 19 void setup() { Serial.begin(9600); while (!Serial); spiLoRa.begin(SCK_LORA,MISO_LORA,MOSI_LORA,SS_LORA); LoRa.setSPI(spiLoRa); LoRa.setPins(SS_LORA, resetPin, irqPin); if (!LoRa.begin(FREQ_LORA)) { Serial.println("Starting LoRa failed!"); while (1); } Serial.println(); Serial.println(); Serial.println("LoRa success init"); } void loop() { Serial.print("Sending packet: "); Serial.println(counter); // send packet LoRa.beginPacket(); LoRa.print("hello "); LoRa.print(counter); LoRa.endPacket(); counter++; delay(5000); }
Atau Contoh lain pada SD card bisa dilihat pada program di bawah ini
#include "FS.h" #include "SD.h" #include "SPI.h" SPIClass spiSD(HSPI); #define SD_CS 27 #define SDSPEED 27000000 File root; void setup(){ Serial.begin(115200); spiSD.begin(14,2,15,27);//SCK,MISO,MOSI,ss // инициализируем HSPI1 if(!SD.begin( SD_CS, spiSD, SDSPEED)){ // if(!SD.begin()){ Serial.println("Card Mount Failed"); return; } Serial.println("found SD card"); root = SD.open("/"); printDirectory(root, 0); Serial.println("SD card Done"); } void loop() { } void printDirectory(File dir, int numTabs) { while (true) { File entry = dir.openNextFile(); if (! entry) { // no more files break; } for (uint8_t i = 0; i < numTabs; i++) { Serial.print('\t'); } Serial.print(entry.name()); if (entry.isDirectory()) { Serial.println("/"); printDirectory(entry, numTabs + 1); } else { // files have sizes, directories do not Serial.print("\t\t"); Serial.println(entry.size(), DEC); } entry.close(); } }
PIN Input Ony PullUp
Ada 4 pin ESP32 yang hanya bisa di gunakan Sebagai Input Only. Namun harus di pullup dengan resistor 10k jika ingin menggunakan nya. Pin nya adalah sebagai berikut
Pin nya hanya ada 4pcs yaitu, GPIO39, GPIO36, GPIO34 dan GPIO35. Bisa di pastikan jika teman-teman menggunakan ke empat pin ini sebagai pin out maka akan terjadi error pada ESP32.
Oke teman-teman, mungkin ini dulu pin yang sering saya gunakan dalam design ESP32 custome denga fungsi khusus. Ada beberapa pin lain yang belum kita bahas, mungkin akan di update di kemudian hari, Seperti pin ADC dan pin RTC.
Semoga Bermanfaat, Thanks
Sumber Link