[TH] Understand and use the ESP32-C3

หลังจากที่พวกเราใช้งาน  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

ภาพที่ 1 บอร์ดไมโครคอนโทรลเลอร์ ESP32-C3

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 สามารถอธิบายรายละเอียดของงานได้ดังนี้

  1. RISC-V แกน 32 บิตที่ทำงาน
    1. ความเร็ว  160MHz จากคริสตัลความถี่ 40MHz ที่มากับโมดูล
    2. มี GPIO จำนวน 22 ขา แต่เหลือใช้งานได้ 15 ขา เนื่องจากโมดูลติดตั้งหน่วยความจำแฟลชภายนอกมาให้ 2 หรือ 4MB (โมดูลรุ่น ESP-C3-32s ของ AI Thinker มีรอมขนาด 2MB)
    3. หน่วยความจำ RAM ภายใน 400KB
      1. ใช้เป็นหน่วยความจำแคช (Cache Memory) 16KB
      2. เหลือใช้งาน 386KB
    4. หน่วยความจำ 8KB ในโมดูล RTC (Real-time clock)
    5. รอมภายในขนาด 384KB
    6. รองรับโหมดประหยัดพลังงาน
    7. รองรับการเพิ่มหน่วยความจำแฟลชภายนอก
  2. การเชื่อมต่อ
    1. รองรับการสื่อสาร WiFi
      1. มาตรฐาน IEE802.11 b/g/n
      2. ย่านความถี่ 2412 ถึง 2484MHz หรือ 2.4GHz
      3. รองรอบแบนด์วิดธ์แบบ 20MHz และ 40MHz
      4. อัตราการรับส่งในโหมด 1T1R สูงสุดที่ 150Mbps
      5. รองรับมาตรฐาน 802.11mc FTM
      6. รองรับการทำงานในโหมด
        1. Station
        2. SoftAP
        3. Station+SoftAP
        4. promiscuous หรือ โหมดที่ตัวคอนโทรลเลอร์ที่ทำหน้าที่ควบคุมการสื่อสารส่งต่อทราฟฟิกทั้งหมดที่ได้รับมาไปให้หน่วยประมวลผลกลาง ทำให้สามารถทำ package sniffing เพื่อทำการวิเคราะห์ข้อมูลแพ็คเกจได้
    2. รองรับ Bluetooth
      1. รองรับ Bluetooth 5 และ Bluetooth mesh
      2. รองรับความเร็วในการสื่อสาร 125Kbps, 500Kbps, 1Mkbps และ 2Mbps
  3. การเชื่อมต่อกับอุปกรณ์ภายนอก (Peripherals)
    1. GPIO
    2. SPI
    3. UART
    4. I2C
    5. I2S
    6. Remote Control Peripheral
    7. LED PWM controller
    8. DMA Controller
    9. TWAI® Controller รองรับ  CAN bus
    10. USB Serial/JTAG controller
    11. มีเซ็นเซอร์วัดอุณหภูมิในตัว
    12. SAR
    13. ADC
  4. เงื่อนไขในการใช้งาน
    1. แรงดัน 3.0 ~ 3.6V
    2. อุณหภูมิ
      1. –40 ~ 85 °C
      2. –40 ~ 105 °C
  5. ความปลอดภัยที่มีการรองรับการใช้งานในระดับฮาร์ดแวร์ได้แก่
    1. รองรับการบูตแบบปลอดภัยตามมาตรฐาน RSA-3072 ซึ่งเป็นการเข้ารหัสแบบ RSA ด้วยคีย์ขนาด 3072 บิต
    2. รองรับการเข้ารหัสข้อมูลในหน่วยความจำแฟลชแบบ  AES-128-XTS
  6. การพัฒนาซอฟต์แวร์
    1. พัฒนาผ่าน ESP-IDF
    2. พัฒนาผ่านทาง Arduino ด้วย Arduino core for ESP32
  7. ลักษณะของโมดูล
    1. ESP32-C3 WROOM-02 มี PCB เป็นเสาอากาศ  ดังภาพที่ 3
    2. ESP32-C3 WROOM-02U มีขั้วต่อสำหรับต่อเสาอากาศภายนอกตัวถัง ดังภาพที่ 4
  8. การนำไปใช้
    1. Smart Home
      1.  ควบคุมระบบแสงสว่าง
      2. ปุ่มอัจฉริยะ
      3. ปลั๊กอัจฉริยะ
      4. การระบุตำแหน่งภายในบ้าน
    2. Industrial Automation
      1. หุ่นยนต์อุตสาหกรรม
      2. Mesh Network
      3. HMI (Human Machine Interface)
      4. Industrial field bus
    3. Health Care
      1. Health Monitor
      2. Baby Monitor
    4. Consumer Electronics
      1. Smart Watch/bracelet
      2. Over-the-top (OTT) devices
      3. WiFi and Bluetooth speaker
      4. Logger toys and proximity sensing toys
    5. Smart Agriculture
      1. Smart greenhouse (โรงเรือนแบบชาญฉลาด)
      2. Smart irrigation
      3. Agriculture robot (หุ่นยนต์ภาคการเกษตร)
    6. Retail and Catering
      1. POS (Point-of-sell) Machine
      2. Service robot
    7. Audio Device
      1. Internet Music Players
      2. Live Streaming devices
      3. Internet Radio players
    8. Generic Low-power IoT Sensor Hubs
    9. Generic Low-power IoT Data Loggers
ภาพที่ 2 ผังฟังก์ชันงานของ ESP32-C3
ที่มา หน้าที่ 6 ของเอกสาร esp-c3-32s
ภาพที่ 3 โมดูล ESP32-WROOM-02
ที่มา ภาพที่ 8 หน้าที่24 ของ ESP-32 WROOM-02 Dataheet
ภาพที่ 4 โมดูล ESP32-WROOM-02U
ที่มา ภาพที่ 9 หน้าที่24 ของ ESP-32 WROOM-02 Dataheet

ผังวงจรของบอร์ดเป็นดังภาพที่ 5 จะพบว่าบนบอร์ดมี LED แบบ RGB ที่ต่อเข้ากับขา IO3, IO4 และ IO5 เพื่อคุมการเปล่งแสงของหลอดสีแดง สีเขียว และสีน้ำเงิน

ภาพที่ 5 ผังวงจรของบอร์ด /Nodemcu-esp-c3-32s-kit ของ WaveShare
ที่มา

ขา GPIO

esp32-c3 มี GPIO ให้ใช้งาน 22 ขา คือ GPIO0 ถึง GPIO21 ซึ่งมีหน้าที่ดังนี้

GPIOAnalog Functionหมายเหตุ
GPIO0ADC1_CH0RTC, XTAL
GPIO1ADC1_CH1RTC, XTAL
GPIO2ADC1_CH2Strapping pin, RTC, FSPIQ
GPIO3ADC1_CH3RTC, บนบอร์ดต่อเข้ากับ LED สีแดง
GPIO4 ADC1_CH4RTC, บนบอร์ดต่อเข้ากับ LED สีเขียว, FSPIHD, MTMS
GPIO5ADC2_CH0RTC, บนบอร์ดต่อเข้ากับ LED สีน้ำเงิน และสามารถใช้ได้เมื่ออยู่ในโหมด Deep Sleep, FSPIWP, MTDI
GPIO6FSPICLK, MTCK
GPIO7FSPID, MTD0
GPIO8Strapping pin
GPIO9Strapping pin
GPIO10FSPICS0
GPIO11
GPIO12SPIO/1 ใช้กับ SPI Flash และ PSRAM ไม่แนะนำให้นำไปใช้
GPIO13SPIO/1ใช้กับ SPI Flash และ PSRAM ไม่แนะนำให้นำไปใช้
GPIO14SPIO/1ใช้กับ SPI Flash และ PSRAM ไม่แนะนำให้นำไปใช้
GPIO15SPIO/1ใช้กับ SPI Flash และ PSRAM ไม่แนะนำให้นำไปใช้
GPIO16SPIO/1ใช้กับ SPI Flash และ PSRAM ไม่แนะนำให้นำไปใช้
GPIO17SPIO/1ใช้กับ SPI Flash และ PSRAM ไม่แนะนำให้นำไปใช้
GPIO18USB-JTAG ถ้าใช้งานเป็น GPIO ส่วนของ USB-JTAG จะถูกปิดการทำงาน
GPIO19USB-JTAG ถ้าใช้งานเป็น GPIO ส่วนของ USB-JTAG จะถูกปิดการทำงาน
GPIO20RX0
GPIO21TX0

การติดตั้ง

การติดตั้งชุด 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

ภาพที่ 6 การตั้งค่าบอร์ด

ตัวอย่างโปรแกรม

ตัวอย่างโปรแกรมการเขียนโปรแกรมเพื่อสั่งหลอด 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

ภาพที่ 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 ซึ่งถือว่าเป็นเรื่องปกติ เพราะต้นน้ำต้องมั่นคงก่อนปลายน้ำจึงจะถูกเปลี่ยนแปลง สุดท้ายนี้ ขอให้สนุกกับการเขียนโปรแกรมครับ

ท่านใดต้องการพูดคุยสามารถคอมเมนท์ได้เลยครับ

แหล่งอ้างอิง

  1. ESP32-C3 DevKitM-1
  2. ESPRESSIF ESP32-C3
  3. ESP32-C3 WROOM-02 Datasheet
  4. WaveShare ESP-C3-Kit

(C) 2020-2021, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2021-10-01, 2021-12-15