หลังจากที่พวกเราใช้งาน esp8266 โดยเฉพาะโมดูล esp-01 และ esp-01s เพื่อเป็นตัวบริหารจัดการเครือข่ายเซ็นเซอร์มาเป็นระยะเวลาพอสมควร และด้วยขีดจำกัดในเรื่องของจำนวนขาใช้งานทำให้ต้องออกแบบระบบให้ทำงานคู่กับ STM32F103C8T6 หรือ STM32F401CCU6/STM32F411CEU6 เพื่อให้การทำงานมีความสเถียรไม่ประสบปัญหาเกี่ยวกับ WDT ของ esp8266 และด้วยเวลาที่ผ่านไป ทาง espressif ออกไมโครคอนโทรลเลอร์ตามมาอีกหลายตัว เช่น esp32, esp32-s2, esp32-c3 และ esp32-s3
ทางเราได้ทดสอบและใช้งาน esp32 จนแทบจะเป็นตัวหลักในการทำงาน จน esp32-s2 กับบอร์ดของ LILYGO ทำให้เราลองสั่งมาใช้งาน ปัญหาหลักอยู่ที่เครื่องมือในการพัฒนานั้นออกมาล่าช้ามาก แต่อย่างไรก็ดี ณ ตอนนี้ทาง espressif ได้ออกชุดพัฒนาสำหรับ Arduino หรือ Arduino Core for ESP32 รุ่น 2.0 พร้อมรองรับการใช้กับ esp32 esp32-s2 และ esp32c3 ทำให้การใช้งานกับ ESP32 และ ESP32-S2 ใช้งานได้ดี และล่าสุดทางทีมงานเราได้บอร์ด esp-c3-32s มาจึงเกิดมาเป็นบทความนี้
สำหรับบทความนี้เป็นการเรียบเรียงจาก datasheet ของ ESP32-C3 WROOM-02 ซึ่งในบทความนี้เราใช้บอร์ดดังภาพที่ 1 ส่วนตัวอย่างโปรแกรมเป็นการขับหลอด LED แบบ RGB บนบอร์ดให้ทำงานโดยใช้ Arduino Core for ESP32 และ ESP-IDF ที่ปรับปรุงมาจากบทความใน Ep.3
ESP32-C3
ESP32-C3 เป็น SoC (System on Chip) ซึ่งแต่เดิมนั้น ESP32-C3 เรียกชื่อกันว่า ESP-C3 เพื่อนำมาใช้แทน esp8266 และมีสถาปัตยกรรมของหน่วยประมวลผลแตกต่างจากเดิม คือ เปลี่ยนจาก Tensilica L106 ซึ่งเป็นหน่วยประมวลผลแบบ RISC ขนาด 32 บิต มาเป็น RISC-V แบบ 32 บิต โดยทั้ง 2 รุ่นมีแกน (core) เท่ากันคือ 1 แกน
คุณสมบัติ
จากภาพผังฟังก์ชันงานของ ESP32-C3 ในภาพที่ 2 สามารถอธิบายรายละเอียดของงานได้ดังนี้
- RISC-V แกน 32 บิตที่ทำงาน
- ความเร็ว 160MHz จากคริสตัลความถี่ 40MHz ที่มากับโมดูล
- มี GPIO จำนวน 22 ขา แต่เหลือใช้งานได้ 15 ขา เนื่องจากโมดูลติดตั้งหน่วยความจำแฟลชภายนอกมาให้ 2 หรือ 4MB (โมดูลรุ่น ESP-C3-32s ของ AI Thinker มีรอมขนาด 2MB)
- หน่วยความจำ RAM ภายใน 400KB
- ใช้เป็นหน่วยความจำแคช (Cache Memory) 16KB
- เหลือใช้งาน 386KB
- หน่วยความจำ 8KB ในโมดูล RTC (Real-time clock)
- รอมภายในขนาด 384KB
- รองรับโหมดประหยัดพลังงาน
- รองรับการเพิ่มหน่วยความจำแฟลชภายนอก
- การเชื่อมต่อ
- รองรับการสื่อสาร WiFi
- มาตรฐาน IEE802.11 b/g/n
- ย่านความถี่ 2412 ถึง 2484MHz หรือ 2.4GHz
- รองรอบแบนด์วิดธ์แบบ 20MHz และ 40MHz
- อัตราการรับส่งในโหมด 1T1R สูงสุดที่ 150Mbps
- รองรับมาตรฐาน 802.11mc FTM
- รองรับการทำงานในโหมด
- Station
- SoftAP
- Station+SoftAP
- promiscuous หรือ โหมดที่ตัวคอนโทรลเลอร์ที่ทำหน้าที่ควบคุมการสื่อสารส่งต่อทราฟฟิกทั้งหมดที่ได้รับมาไปให้หน่วยประมวลผลกลาง ทำให้สามารถทำ package sniffing เพื่อทำการวิเคราะห์ข้อมูลแพ็คเกจได้
- รองรับ Bluetooth
- รองรับ Bluetooth 5 และ Bluetooth mesh
- รองรับความเร็วในการสื่อสาร 125Kbps, 500Kbps, 1Mkbps และ 2Mbps
- รองรับการสื่อสาร WiFi
- การเชื่อมต่อกับอุปกรณ์ภายนอก (Peripherals)
- GPIO
- SPI
- UART
- I2C
- I2S
- Remote Control Peripheral
- LED PWM controller
- DMA Controller
- TWAI® Controller รองรับ CAN bus
- USB Serial/JTAG controller
- มีเซ็นเซอร์วัดอุณหภูมิในตัว
- SAR
- ADC
- เงื่อนไขในการใช้งาน
- แรงดัน 3.0 ~ 3.6V
- อุณหภูมิ
- –40 ~ 85 °C
- –40 ~ 105 °C
- ความปลอดภัยที่มีการรองรับการใช้งานในระดับฮาร์ดแวร์ได้แก่
- รองรับการบูตแบบปลอดภัยตามมาตรฐาน RSA-3072 ซึ่งเป็นการเข้ารหัสแบบ RSA ด้วยคีย์ขนาด 3072 บิต
- รองรับการเข้ารหัสข้อมูลในหน่วยความจำแฟลชแบบ AES-128-XTS
- การพัฒนาซอฟต์แวร์
- พัฒนาผ่าน ESP-IDF
- พัฒนาผ่านทาง Arduino ด้วย Arduino core for ESP32
- ลักษณะของโมดูล
- ESP32-C3 WROOM-02 มี PCB เป็นเสาอากาศ ดังภาพที่ 3
- ESP32-C3 WROOM-02U มีขั้วต่อสำหรับต่อเสาอากาศภายนอกตัวถัง ดังภาพที่ 4
- การนำไปใช้
- Smart Home
- ควบคุมระบบแสงสว่าง
- ปุ่มอัจฉริยะ
- ปลั๊กอัจฉริยะ
- การระบุตำแหน่งภายในบ้าน
- Industrial Automation
- หุ่นยนต์อุตสาหกรรม
- Mesh Network
- HMI (Human Machine Interface)
- Industrial field bus
- Health Care
- Health Monitor
- Baby Monitor
- Consumer Electronics
- Smart Watch/bracelet
- Over-the-top (OTT) devices
- WiFi and Bluetooth speaker
- Logger toys and proximity sensing toys
- Smart Agriculture
- Smart greenhouse (โรงเรือนแบบชาญฉลาด)
- Smart irrigation
- Agriculture robot (หุ่นยนต์ภาคการเกษตร)
- Retail and Catering
- POS (Point-of-sell) Machine
- Service robot
- Audio Device
- Internet Music Players
- Live Streaming devices
- Internet Radio players
- Generic Low-power IoT Sensor Hubs
- Generic Low-power IoT Data Loggers
- Smart Home
ผังวงจรของบอร์ดเป็นดังภาพที่ 5 จะพบว่าบนบอร์ดมี LED แบบ RGB ที่ต่อเข้ากับขา IO3, IO4 และ IO5 เพื่อคุมการเปล่งแสงของหลอดสีแดง สีเขียว และสีน้ำเงิน
ขา GPIO
esp32-c3 มี GPIO ให้ใช้งาน 22 ขา คือ GPIO0 ถึง GPIO21 ซึ่งมีหน้าที่ดังนี้
GPIO | Analog Function | หมายเหตุ |
---|---|---|
GPIO0 | ADC1_CH0 | RTC, XTAL |
GPIO1 | ADC1_CH1 | RTC, XTAL |
GPIO2 | ADC1_CH2 | Strapping pin, RTC, FSPIQ |
GPIO3 | ADC1_CH3 | RTC, บนบอร์ดต่อเข้ากับ LED สีแดง |
GPIO4 | ADC1_CH4 | RTC, บนบอร์ดต่อเข้ากับ LED สีเขียว, FSPIHD, MTMS |
GPIO5 | ADC2_CH0 | RTC, บนบอร์ดต่อเข้ากับ LED สีน้ำเงิน และสามารถใช้ได้เมื่ออยู่ในโหมด Deep Sleep, FSPIWP, MTDI |
GPIO6 | FSPICLK, MTCK | |
GPIO7 | FSPID, MTD0 | |
GPIO8 | Strapping pin | |
GPIO9 | Strapping pin | |
GPIO10 | FSPICS0 | |
GPIO11 | ||
GPIO12 | SPIO/1 ใช้กับ SPI Flash และ PSRAM ไม่แนะนำให้นำไปใช้ | |
GPIO13 | SPIO/1ใช้กับ SPI Flash และ PSRAM ไม่แนะนำให้นำไปใช้ | |
GPIO14 | SPIO/1ใช้กับ SPI Flash และ PSRAM ไม่แนะนำให้นำไปใช้ | |
GPIO15 | SPIO/1ใช้กับ SPI Flash และ PSRAM ไม่แนะนำให้นำไปใช้ | |
GPIO16 | SPIO/1ใช้กับ SPI Flash และ PSRAM ไม่แนะนำให้นำไปใช้ | |
GPIO17 | SPIO/1ใช้กับ SPI Flash และ PSRAM ไม่แนะนำให้นำไปใช้ | |
GPIO18 | USB-JTAG ถ้าใช้งานเป็น GPIO ส่วนของ USB-JTAG จะถูกปิดการทำงาน | |
GPIO19 | USB-JTAG ถ้าใช้งานเป็น GPIO ส่วนของ USB-JTAG จะถูกปิดการทำงาน | |
GPIO20 | RX0 | |
GPIO21 | TX0 |
การติดตั้ง
การติดตั้งชุด Arduino core for ESP32 กระทำโดยกำหนด json ต่อไปนี้ใน File/Preferences
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
หลังจากนั้นไปที่ Tools/Board…/Boards Manager เลือก esp32 แล้วติดตั้งจะได้ชุดพัฒนา Arduino core for ESP32 ในเครื่องแล้ว
การตั้งค่า
การกำหนดค่าสำหรับโมูลที่เป็น esp-c3-32s ของ Ai Thinker ต้องกำหนดให้ขนาด Flash เป็น 2MB ดังภาพที่ 5
ตัวอย่างโปรแกรม
ตัวอย่างโปรแกรมการเขียนโปรแกรมเพื่อสั่งหลอด LED ที่มากับบอร์ดไมโครคอนโทรลเลอร์ให้ติดเป็นดังนี้
void setup() {
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
}
void loop() {
for (int i = 3; i < 6; i++) {
digitalWrite(i, LOW);
delay(250);
digitalWrite(i, HIGH);
delay(250);
}
}
จากโค้ดจะพบว่าขาที่ใช้ติดต่อกับ LED แบบ RGB บนบอร์ด คือ ขา 3, 4 และ 5 ที่เชื่อมต่อเข้ากับขา LED_R, LED_G และ LED_B ซึ่งจากวงจรจะพบว่า การขับให้หลอดติดนั้นต้องส่งสัญญาณดิจิทัล 1 เนื่องจากเป็นทำให้ขาให้มีแรงดันที่ขาที่เชื่อมต่อกับ LED และอีกขาของ LED นั้นถูกเชื่อมต่อกับ GND จึงครบวงจรกระแสไฟไหลผ่านได้ทำให้หลอดติด ซึ่งภาพตัวอย่างของการทำงานเป็นดังภาพที่ 7
ส่วนโค้ดสำหรับ ESP-IDF ที่ปรับปรุงมาจากบทความ ESP-IDF Ep.3 : GPIO Output เป็นดังนี้
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <math.h>
#include "driver/gpio.h"
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#define LED_R_PIN 3
#define LED_G_PIN 4
#define LED_B_PIN 5
void app_main(void)
{
printf("C3 LEDs");
gpio_pad_select_gpio(LED_R_PIN);
gpio_set_direction(LED_R_PIN, GPIO_MODE_OUTPUT);
gpio_pad_select_gpio(LED_G_PIN);
gpio_set_direction(LED_G_PIN, GPIO_MODE_OUTPUT);
gpio_pad_select_gpio(LED_B_PIN);
gpio_set_direction(LED_B_PIN, GPIO_MODE_OUTPUT);
while(1) {
gpio_set_level(LED_R_PIN, 1);
vTaskDelay( 500/portTICK_PERIOD_MS );
gpio_set_level(LED_R_PIN, 0 );
vTaskDelay( 500/portTICK_PERIOD_MS );
gpio_set_level(LED_G_PIN, 1);
vTaskDelay( 500/portTICK_PERIOD_MS );
gpio_set_level(LED_G_PIN, 0 );
vTaskDelay( 500/portTICK_PERIOD_MS );
gpio_set_level(LED_B_PIN, 1);
vTaskDelay( 500/portTICK_PERIOD_MS );
gpio_set_level(LED_B_PIN, 0 );
vTaskDelay( 500/portTICK_PERIOD_MS );
gpio_set_level(LED_R_PIN, 1 );
gpio_set_level(LED_G_PIN, 1 );
gpio_set_level(LED_B_PIN, 0 );
vTaskDelay( 500/portTICK_PERIOD_MS );
gpio_set_level(LED_R_PIN, 0 );
gpio_set_level(LED_G_PIN, 1 );
gpio_set_level(LED_B_PIN, 1 );
vTaskDelay( 500/portTICK_PERIOD_MS );
gpio_set_level(LED_R_PIN, 1 );
gpio_set_level(LED_G_PIN, 0 );
gpio_set_level(LED_B_PIN, 1 );
vTaskDelay( 500/portTICK_PERIOD_MS );
gpio_set_level(LED_R_PIN, 1 );
gpio_set_level(LED_G_PIN, 1 );
gpio_set_level(LED_B_PIN, 1 );
vTaskDelay( 500/portTICK_PERIOD_MS );
gpio_set_level(LED_R_PIN, 0 );
gpio_set_level(LED_G_PIN, 0 );
gpio_set_level(LED_B_PIN, 0 );
vTaskDelay( 500/portTICK_PERIOD_MS );
}
}
สรุป
จากบทความนี้จะพบว่า ESP32-C3 เป็นทางเลือกใหม่ของค่าย espressif ที่ตัดสินใจลองตลาดด้วยการใช้ RISC-V เป็นหน่วยประมวลผลกลาง และพวกเรายังพบว่า เครื่องมือในการพัฒนาที่ดีที่สุดของค่ายนี้ยังคงเป็น ESP-IDF ของทาง espressif เนื่องจากมีความสบูรณ์ในการทำงาน และอัพเดตแก้ปัญหาไวกว่าชุด Arduino core for ESP32 ซึ่งถือว่าเป็นเรื่องปกติ เพราะต้นน้ำต้องมั่นคงก่อนปลายน้ำจึงจะถูกเปลี่ยนแปลง สุดท้ายนี้ ขอให้สนุกกับการเขียนโปรแกรมครับ
ท่านใดต้องการพูดคุยสามารถคอมเมนท์ได้เลยครับ
แหล่งอ้างอิง
(C) 2020-2021, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2021-10-01, 2021-12-15