การเริ่มต้นใช้งานชิป Espressif ESP32-C3 (RISC-V CPU Core)#


ESP32-C3#

ESP32-C3 Series (announced: Nov 27, 2020) เป็นชิปไมโครคอนโทรลเลอร์ (MCU: Microcontroller Unit) หรือ MCU-based System-on-Chip ของบริษัท Espressif Systems และแตกต่างจากชิปรุ่น ESP32 / ESP32-S2 / ESP32-S3 ที่ใช้ซีพียูของ Tensilica Xtensa (LX6/LX7) กล่าวคือ ซีพียูของ ESP32-C3 ทำงานได้ตามสถาปัตยกรรมของชุดคำสั่ง (ISA: Instruction Set Architecture) ที่เรียกว่า RISC-V (pronounced "Risk-Five")

นอกจาก ESP32-C3 แล้ว ชิปรุ่นอื่นของ Espressif ที่ใช้ RISC-V CPU Core ได้แก่

  • ESP32-C6 (announced: Apr 9, 2021): มีสเปคต่ำกว่า ESP32-C3 แต่รองรับการใช้งาน IEEE 802.15.4 (Thread + Zigbee) และ Bluetooth 5 แต่ไม่รองรับการใช้งาน Wi-Fi
  • ESP32-H2 (announced: Aug 2, 2021): มีสเปคใกล้เคียงกับ ESP32-C3 แต่รองรับการใช้งาน Wi-Fi 6 / IEEE 802.11ax
  • ESP32-C2 Series (announced: Apr 29, 2022): มีสเปคต่ำกว่า ESP32-C3 เนื่องจากมีการลดขนาดความจุของหน่วยความจำภายใน และวงจรภายในบางรายการ ข้อสังเกต:

  • RISC-V ISA เป็นสถาปัตยกรรมของชุดคำสั่งที่เปิดเผยและไม่มีค่าลิขสิทธิ์ในการใช้งาน (Open & Free ISA) ซึ่งไม่เหมือนกับ Arm Cortex-M หรือ Tensilica Xtensa ที่มีลิขสิทธิ์การใช้งานสำหรับซีพียูหากมีบริษัทใดต้องการนำไปผลิตชิปของตนเอง

  • แต่ RISC-Vก็มีการกำหนดให้เป็นมาตรฐานโดยมี RISC-V International ซึ่งเป็นองค์กรที่ไม่แสวงหากำไรหรือมีคณะทำงานคอยกำกับดูแลในการกำหนดทิศทางการพัฒนา
  • การออกแบบและสร้างซีพียูสำหรับ RISC-V ที่เป็น IP (Intellectual Property) Cores โดยบริษัทต่าง ๆ หรือนักออกแบบ เพื่อการนำไปสร้างหรือผลิตเป็นชิปออกมาจำหน่ายนั้น อาจไม่ได้เป็น Open Source / Open Hardware และดังนั้นจึงมีค่าใช้จ่ายสำหรับการนำไปใช้งาน
  • อย่างไรก็ตาม RISC-V IP Cores ที่เป็น Open Source / Open Hardware ก็มีเช่นกัน และสามารถนำไปทดลองใช้งานได้ โดยการสร้างเป็นวงจรในชิปประเภท FPGA เป็นต้น

แม้ว่ามีการเลือกใช้ซีพียูที่แตกต่างออกไป แต่ชิป ESP32-C3 ก็มีวงจรรอบข้างซีพียู (On-chip Peripherals) ที่คล้ายกับชิป ESP32 เช่น รองรับการสื่อสารข้อมูลไร้สายด้วยวงจร Wi-Fi (2.4GHz) / Bluetooth 5 (LE) และมีวงจรที่ช่วยในการประมวลผลและสื่อสารข้อมูลที่เน้นความปลอดภัย (Security) ซึ่งเหมาะกับงานด้าน IoT

ESP32-C3 ถูกมองว่าเป็นตัวเลือกใหม่และแทนที่ชิป ESP8266 / ESP8285 ของบริษัท Espressif หากนำไปใช้ในลักษณะที่เรียกว่า Wi-Fi Serial Module ที่ทำงานร่วมกับชิปไมโครคอนโทรลเลอร์ตัวอื่น และใช้ชุดคำสั่งที่เรียกว่า Espressif AT Command Set เนื่องจากมีราคาไม่แพงและประหยัดพลังงานได้ดีกว่าเมื่อเปรียบเทียบกับชิป ESP32 และชิปรุ่นอื่นที่ไม่ได้ใช้ RISC-V CPU Core

รูป: Block Diagram แสดงองค์ประกอบภายในของชิป ESP32-C3

ชิป ESP32-C3 มีแกนซีพียู RISC-V (RV32IMC ISA) อยู่ภายในเพียงแกนเดียว (Single Core) ทำคำสั่งโดยใช้ 4-stage Instruction Pipeline ความเร็วสูงสุด 160 MHz โดยใช้ตัวสร้างสัญญาณ Clock จากภายนอก (40MHz crystal)

RV32IMC ISA

  • I = 32-bit Integer Instruction Set (no FPU extension)
  • M = Integer Multiplication and Division
  • C = Compressed Instructions

ชิป ESP32-C3 มีหน่วยความจำภายในดังนี้

  • 384 KB of ROM (Read-Only): เป็นส่วนที่เก็บโปรแกรมสำหรับการเริ่มต้นทำงานของระบบ และฟังก์ชันพื้นฐานต่าง ๆ หรือการทำงานของชิปในระดับล่างของฮาร์ดแวร์ (โดยรวมเรียกว่า ROM Functions) และข้อมูลในหน่วยความจำชนิดนี้ได้ถูกบันทึกข้อมูลมาจากโรงงาน ผู้ใช้ไม่สามารถเขียนข้อมูลลงในส่วนนี้ได้
  • 400 KB of SRAM: สำหรับเก็บข้อมูล (Data) และคำสั่งของโปรแกรม (Program Instructions) แต่ส่วนหนึ่งของ SRAM ที่มีขนาด 16 KB จะถูกใช้งานเป็น Cache สำหรับการอ่านข้อมูลและคำสั่งมาจากหน่วยความจำภายนอกในขณะที่ซีพียูทำงาน
  • 8 KB of RTC memory: ใช้สำหรับเก็บข้อมูลชั่วคราวและไม่สูญหาย เมื่อซีพียูเข้าสู่โหมดประหยัดพลังงาน (Deep-sleep mode)
  • 4 Kbit of eFuse: เป็นหน่วยความจำแบบ Non-volatile / One-time programmable มีวิธีการป้องกันการเขียนหรืออ่านข้อมูลจากภายนอกได้ (Read/write Protection) บางส่วนของหน่วยความจำสามารถเก็บข้อมูลที่ต้องมีการรักษาความปลอดภัย เช่น ใช้ในการเข้ารหัสข้อมูล สำหรับหน่วยความจำแพลช เป็นต้น
  • Embedded Flash: ชิปบางรุ่นได้รวมหน่วยความจำแฟลชไว้ในชิปเดียวกัน มีขนาดความจุ 2MB หรือ 4MB

หน่วยความจำภายในชิปของ ESP32-C3 สามารถเข้าถึงได้ผ่านทางบัสของซีพียูทั้งสองประเภท ได้แก่ บัสสำหรับข้อมูล (Data Bus) และ บัสสำหรับคำสั่ง (Instruction Bus) โดยมีการแบ่งตามช่วงของแอดเดรสในแผนผังของหน่วยความจำ (เรียกว่า Memory Address Map) สำหรับหน่วยความจำภายในและภายนอก เช่น

  • 0x0000_0000 ~ 0x4000_0000 เข้าถึงได้จากบัสสำหรับข้อมูลเท่านั้น
  • 0x4000_0000 ~ 0x4FFF_FFFF เข้าถึงได้จากบัสสำหรับคำสั่งเท่านั้น
  • 0x5000_0000 ~ 0xFFFF_FFFF เข้าถึงได้จากบัสทั้งสองประเภท

การเข้าถึงรีจิสเตอร์ต่าง ๆ ของวงจรรอบข้างที่อยู่ภายในชิป (On-chip Peripherals) จะอยู่ในช่วงแอดเดรส 0x6000_0000 ~ 0x600D_0FFF และเข้าถึงได้ด้วยบัสสำหรับข้อมูล

ในส่วนที่เกี่ยวของกับการใช้งานขา I/O ชิป ESP32-C3 พอจะสรุปได้คร่าว ๆ ดังนี้

รูป: ตัวถัง QFN32 และตำแหน่งขาของชิป ESP32-C3FN4

โดยทั่วไปแล้ว ชิป ESP32-C3 มีขา I/O ทางกายภาพ (Physical GPIO pins / pads) จำนวน 22 ขา สำหรับตัวถังแบบ 32 ขา (QFN32) และภายในชิปมีวงจร GPIO Matrix ที่ใช้ในการเลือกเส้นทางเชื่อมต่อสัญญาณระหว่างวงจรภายในต่าง ๆ (Internal Peripheral Units: SPI/FSPI, RMT, I2S, I2C, UART, ...) กับขาของชิปแต่ละขาได้ ทำให้มีความยืดหยุ่นในการเลือกใช้ขาของชิป

นอกจากนั้นแล้วยังมีวงจร IO MUX ทำหน้าที่เลือกสัญญาณในแต่ละทิศทาง ระหว่างขาของชิปกับวงจร GPIO Matrix หรือจะเลือกได้บางสัญญาณที่ไม่ต้องผ่าน GPIO Matrix ก็ได้ (GPIO Matrix Bypassing / Direct Input & Output via IO MUX) ซึ่งเหมาะสำหรับสัญญาณที่มีความถี่หรือความเร็วสูง (เช่น SPI และ USB-JTAG/Serial เป็นต้น)

รูป: การเชื่อมต่อและเลือกเส้นทางของสัญญาณภายในชิปผ่าน GPIO Matrix และ IO MUX

นอกจากขา I/O สำหรับสัญญาณดิจิทัลแล้ว ชิป ESP32-C3 ยังมีวงจร ADC อยู่ภายใน จำนวน 2 ชุด และรับอินพุตแบบแอนะล็อกจากขาหมายเลข GPIO1 ~ GPIO4 (สำหรับ ADC1) และ GPIO5 (สำหรับ ADC2) แล้วแปลงเป็นข้อมูลขนาด 12 บิต

 

รายละเอียดในเชิงลึกเกี่ยวกับ ESP32-C3 SoC สามารถศึกษาได้จากไฟล์: ESP32C3 Technical Reference Manual

 


ตัวเลือกสำหรับการใช้งาน ESP32-C3#

ตัวเลือกที่เป็นฮาร์ดแวร์สำหรับ ESP32-C3 จำแนกได้เป็น 3 ระดับ

  • SoCs: เป็นชิปที่บริษัท Espressif ได้ผลิตและจำหน่าย แบ่งออกเป็นกลุ่มย่อย ได้แก่ ESP32-C3 และ ESP8685 อาจมีความแตกต่างกันไปบ้าง เช่น ขนาดของตัวชิป จำนวนขา GPIO การรวมหน่วยความจำ Embedded Flash ไว้ภายในชิป หรือใช้ชิปหน่วยความจำ SPI Flash ภายนอกได้ และขนาดของหน่วยความจำ Flash ช่วงอุณหภูมิในการทำงานของชิป เป็นต้น
  • Modules: เป็นโมดูลที่มีลักษณะเป็นแผงวงจร ซึ่งมีชิป ESP32-C3 และวงจรส่วนอื่น เช่น 40MHz crystal และวงจรเชื่อมต่อกับสายอากาศ (Antenna) อยู่บนแผ่น PCB โมดูลพวกนี้อาจมาจากบริษัท Espressif หรือบริษัทอื่น
  • Boards: เป็นบอร์ดไมโครคอนโทรลเลอร์ที่ใช้ชิปหรือโมดูลสำหรับ ESP32-C3 อาจมาจากบริษัท Espressif ที่ได้ทำบอร์ดตัวอย่างที่เรียกว่า DevKit ออกมาสู่ตลาดเพื่อนำไปทดลองใช้งาน หรือบอร์ดที่เป็นสินค้าของบริษัทอื่น

ข้อสังเกต:

  • แม้ว่าชิป ESP32-C3 มีช่วงของแอดเดรสที่เข้าถึงหน่วยความจำภายนอกสำหรับเก็บโปรแกรมคำสั่งและข้อมูล ได้ไม่เกิน 8MB (program) + 8MB (data) แต่โดยทั่วไปจะเห็นได้ว่า ขนาดของชิปหน่วยความจำ Flash มักจะเป็น 2MB หรือ 4MB ซึ่งน่าจะเพียงพอสำหรับงานโดยทั่วไป

ESP32-C3 SoCs: ESP32-C3 Datasheet

  • Family members:
    • ESP32-C3: external Flash, 22 GPIO pins
    • ESP32-C3FN4: embedded Flash (4MB), 22 GPIO pins
    • ESP32-C3FH4: embedded Flash (4MB), 22 GPIO pins
    • ESP32-C3FH4AZ: embedded Flash (4MB), 16 GPIO pins
  • Chip package: QFN32 (5 x 5 mm^2)
  • Temperature range:
    • N = Normal (-40 °C .. +85 °C)
    • H = High (-40 °C .. +105 °C)

ESP8685 SoCs: ESP8685 Datasheet

  • Family members:
    • ESP8685H2: 2MB embedded Flash
    • ESP8685H4: 4MB embedded Flash
  • Chip package: QFN28 (4 x 4 mm^2)
    • Note: SPI Flash signals are not bonded out.
  • Temperature range: -40 °C .. +105 °C (High)

ESP32-C3 Modules

  • Espressif
    • ESP32-C3-MINI-1/1U (external Flash)
    • ESP32-C3-WROOM-02/02U (embedded Flash)
    • ESP8685-WROOM-03/-05/-06 (embedded Flash)
  • Ai Thinker
    • ESP-C3-12F
    • ESP-C3-32S
    • ESP-C3-01M
    • ESP-C3-13 / ESP-C3-13U
    • ESP-C3-M1 / ESP-C3-M1-I

รูป: โมดูล Espressif ESP32-C3 WROOM-02 / 02U (Datasheet)

รูป: Block Diagram ของโมดูล Espressif ESP32-C3 WROOM-02 (PCB Antenna) ที่มีการแยกกันระหว่างชิป ESP32-C3 กับชิป External SPI Flash ภายนอก

 


ตัวอย่างบอร์ดไมโครคอนโทรลเลอร์ที่ใช้ชิป ESP32-C3#

หลังจากได้มีการเปิดตัวชิป ESP32-C3 ในเดือนพฤศจิกายน ค.ศ. 2020 เป็นต้นมา มีบอร์ด ESP32-C3 ออกมาสู่ตลาดเพื่อให้ผู้ใช้ได้เลือกและทดลองใช้งาน นอกเหนือจากบอร์ดของบริษัท Espressif แล้วยังมีของบริษัทอื่น เช่น Ai Thinker และ Adafruit เป็นต้น ตามที่ได้รวบรวมมาเป็นตัวอย่างดังนี้

List of Commercial ESP32-C3 Boards / DevKits

รูป: บอร์ด Espressif ESP32-C3 DevKitM-1 และ DevKitC-02

รูป: บอร์ด Wemos ESP32-C3 LOLIN Mini (v1.0.0) [Schematic]

บอร์ด ESP32-C3 LOLIN Mini มี Onboard (Blue) LED ต่ออยู่ที่ขา GPIO-7 และสำหรับการเชื่อมต่อกับคอมพิวเตอร์ ก็มีคอนเนกเตอร์ USB Type-C โดยไม่ได้ใช้ชิป USB-to-Serial Bridge ดังนั้นจึงต้องเปิดใช้งาน Built-in USB-CDC หากต้องการสื่อสารข้อมูลกับเครื่องคอมพิวเตอร์ของผู้ใช้โดยใช้คำสั่ง เช่น Serial.println()

เมื่อกดปุ่ม BOOT ค้างไว้ แล้วกดปุ่ม RST เพื่อรีเซตการทำงานของบอร์ด และเข้าสู่โหมด Device Firmware Upgrade (DFU) คอมพิวเตอร์ของผู้ใช้จะมองเห็น Virtual Serial COM Port และถ้าต้องการรับส่งข้อมูลผ่านพอร์ตนี้ ในขั้นตอนการคอมไพล์โค้ดสำหรับ Arduino Sketch จะต้องเลือก "USB CDC on Boot: Enabled"

รูป: บอร์ด Ai Thinker ESP-C3-13 Kits

จากรูปภาพของบอร์ด Ai Thinker ESP-C3-13 Kits มีการจำแนกออกเป็น 4 รูปแบบ ดังนี้

  • (a) C3FN4: normal temperature version (N), embedded 4MB Flash
  • (b) C3FN4: normal temperature version (N), embedded 4MB Flash, with IPEX connector for external antenna
  • (c) C3FH4: high temperature version (H), embedded 4MB Flash
  • (d) C3-2M: normal temperature version (N), external 2MB Flash

เนื่องจากบอร์ดใช้ชิปป CH340 ทำหน้าที่เป็น USB-to-Serial Bridge ดังนั้นคอมพิวเตอร์ของผู้ใช้ จะต้องมีการติดตั้ง CH340/CH341 USB Driver สำหรับอุปกรณ์ตัวนี้ก่อน

รูป: เปรียบบอร์ด WeMos LOLIN C3 Mini (ด้านซ้ายมือ) และบอร์ด Ai Thinker ESP-C3-13 Kit / C3FN4 (ด้านขวามือ)

 


การเขียนโปรแกรมสำหรับ ESP32-C3#

บอร์ดไมโครคอนโทรลเลอร์ที่ใช้ชิป ESP32-C3 สามารถเขียนโปรแกรมได้หลายภาษา เช่น

การเขียนโปรแกรมสำหรับ ESP32-C3 ก็คงเหมือนกับกรณีของชิป ESP32 รุ่นอื่น และมีการใช้ภาษาคอมพิวเตอร์ต่อไปนี้ในการเขียนโปรแกรมสำหรับผู้ใช้ส่วนใหญ่

  • การเขียนโปรแกรมภาษา C/C++ โดยใช้ ESP-IDF: IoT Development Framework for the ESP32 ซึ่งประกอบด้วย SDK และ Toolchain ต่าง ๆ ที่ได้มีการพัฒนาโดยบริษัท Espressif และใช้ FreeRTOS เป็นพื้นฐานในการทำงานของโค้ด
  • การเขียนโปรแกรมภาษา C/C++ ด้วย Arduino API ผู้ใช้จะต้องติดตั้ง Arduino-ESP32 Core สำหรับการใช้งานร่วมกับซอฟต์แวร์ Arduino IDE
  • การเขียนโปแกรมภาษา Python สำหรับไมโครคอนโทรลเลอร์ ในปัจจุบันมีสองตัวเลือกที่ได้รับความนิยมคือ MicroPython และ CircuitPython ผู้ใช้สามารถดาวน์โหลดไฟล์ .bin สำหรับนำไปใช้ในการติดตั้ง Firmware (โดยใช้โปรแกรม esptool.py) จำแนกตามบอร์ดไมโครคอนโทรลเลอร์ที่รองรับการใช้งาน

การติดตั้งไฟล์ Firmware สำหรับ MicroPython#

การติดตั้งไฟล์ที่เป็น Firmware (.bin) สำหรับ MicroPython / CircuitPython เพื่อใช้งานกับ ESP32-C3 สามารถทำได้โดยใช้คำสั่ง esptool.py ซึ่งเป็นโปรแกรมภาษา Python ตัวอย่างการทำคำสั่งเพื่อติดตั้งและเขียนไฟล์ไปยังหน่วยความจำมีดังนี้

# install esptool
$ pip install esptool

# show the version of esptool (current version: 3.2)
$ esptool.py version
esptool.py v3.2
3.2

# erase the internal Flash of ESP32 device
$ esptool.py --port PORT_NAME erase_flash

# upload the firmware file (.bin) to the device
$ esptool.py --port PORT_NAME --baud 1000000 write_flash -z 0 FIRMWARE.bin

โดยที่ PORT_NAME จะต้องเป็นชื่อพอร์ตของอุปกรณ์ซึ่งตรงกับบอร์ด ESP32-C3 ในขณะที่กำลังเชื่อมต่อกับคอมพิวเตอร์ และ FIRMWARE.bin เป็นชื่อไฟล์ (ระบุชื่อไฟล์แบบ Full Path Name) สำหรับเฟิร์มแวร์

เมื่อติดตั้งเฟิร์มแวร์ได้สำเร็จแล้ว ก็สามารถใช้ซอฟต์แวร์อย่างเช่น Thonny IDE เป็น Python Editor สำหรับการเขียนโค้ดและเชื่อมต่อกับบอร์ด ESP32-C3 ได้

 


ซอฟต์แวร์ Arduino สำหรับ ESP32#

หากยังไม่เคยติดตั้งใช้งาน ให้ดาวน์โหลดไฟล์สำหรับการติดตั้งซอฟต์แวร์ Arduino IDE ได้จากเว็บไซต์ https://www.arduino.cc/en/software/ จากนั้นจะต้องติดตั้ง Arduino-ESP32 Core ซึ่งมีขั้นตอนในการติดตั้ง อ้างอิงจากเอกสาร Arduino-ESP32 Project และมีขั้นตอนที่สำคัญดังนี้

  1. ไปที่เมนู File > Preferences จะมีการเปิดหน้าต่างใหม่ และตรงช่องข้อความ Additional Board Manager URLs: ให้เพิ่มรายการไฟล์ .json ซึ่งเป็น URL ที่ชี้ไปยังไฟล์ .json ใน Github
  2. ไปที่เมนู Tools > Boards Manager... จะมีการเปิดหน้าต่างใหม่ ให้ค้นหารายการสำหรับ esp32 เลือกเวอร์ชันและกดปุ่ม Install
  3. สร้าง Arduino Sketch ใหม่ เขียนโค้ด และเลือกบอร์ด ESP32 ให้ถูกต้องและตรงกับอุปกรณ์ที่จะใช้งานจริง ก่อนทำขั้นตอน Build & Upload ตามลำดับ

 

รูป: การติดตั้งหรืออัปเดตสำหรับ Arduino-ESP32 Core (เวอร์ชันที่ได้ทดลองใช้คือ v2.0.3)

รูป: สาธิตการใช้งาน Arduino IDE และเขียนโค้ดทดสอบการทำงานของบอร์ด WeMos LOLIN C3 Mini

มาดูโค้ดตัวอย่างที่ได้นำมาทดลอง โค้ดนี้สาธิตการใช้คำสั่ง analogWrite() เพื่อสร้างสัญญาณ PWM (Pulse Width Modulation) ที่มีการปรับค่า Duty Cycle ของสัญญาณจาก 0 ไปจนถึง 255 แล้วลดลง ซึ่งจะทำให้ความสว่างของ LED ที่อยู่บนบอร์ดไมโครคอนโทรลเลอร์เปลี่ยนแปลงตามค่า Duty Cycle

//////////////////////////////////////////////////////////////
// Date: 2022-05-10
// Board: WeMos LOLIN C3 Mini (4MB Flash)
// Arduino-ESP32 Core: v2.0.3 
// Espressif ESP-IDF: v4.4.1-1
//////////////////////////////////////////////////////////////

#define PWM_LED_PIN  (7) // GPIO-7 onboard LED LOLIN C3 Mini

void setup() {
  Serial.begin( 115200 );
  Serial.printf( "ESP32 demo: %s\n", ESP.getChipModel() );
  Serial.printf( "ESP-IDF version: %s\n", ESP.getSdkVersion() );
  pinMode( PWM_LED_PIN, OUTPUT );
  digitalWrite( PWM_LED_PIN, LOW );
}

const int N=256; // number of steps for PWM duty cycles
int i=0; // counter variable: 0..(N-1)

void loop() {
  // compute a non-negative value based on the sine function
  // and scale it up to the range from 0 to 255.
  int value = int(256*sin(i*PI/N));
  i = (i+1) % N;
  analogWrite( PWM_LED_PIN, value );
  Serial.printf( "value:%d\n", value );
  delay(8);
}
//////////////////////////////////////////////////////////////

 

โค้ดตัวอย่างถัดไปสาธิตการเชื่อมต่อบอร์ด ESP32-C3 เข้ากับระบบ Wi-Fi AP (Access Point) และจะต้องกำหนดค่าสำหรับ WIFI_SSID และ WIFI_PASSWD ให้ตรงกับการใช้งานจริง

#include <WiFi.h>

#define WIFI_SSID     "xxxxxxx"
#define WIFI_PASSWD   "xxxxxxx"

void setup() {
  Serial.begin( 115200 );
  while (!Serial){ delay(10); }
  Serial.println( "ESP32-C3 Mini v1.0.0" );
  // use WiFi STA (station mode)
  WiFi.mode( WIFI_STA ); 
  WiFi.disconnect();
  // WiFi Tx power to 11dBm (see: WiFi/WiFiGeneric.h)
  wifi_power_t tx_power = WIFI_POWER_11dBm;
  WiFi.setTxPower( tx_power );
  delay( 100 );
  // connect to Wi-Fi AP
  WiFi.begin( WIFI_SSID, WIFI_PASSWD );
  // wait until Wi-Fi is connected.
  while ( WiFi.status() != WL_CONNECTED ) {
    Serial.print( "." );
    delay( 500 );
  }
  Serial.println( "" );
  // show the IP address assigned by DHCP
  Serial.printf( "IP address: %s\n", 
                 WiFi.localIP().toString().c_str() );
}

void loop() {
  delay( 100 );
}

 

โค้ดสาธิตการตรวจสอบและแสดงรายการเครือข่ายไร้สายที่ปรากฏในบริเวณโดยรอบ (Wi-Fi Scanning)

#include <Arduino.h>
#include "WiFi.h"

void wifi_scan() {
  Serial.println( "\nWiFi scanning..." );
  int n = WiFi.scanNetworks(); // number of networks found
  if (n == 0) {
    Serial.println( "No APs found" );
  } else {
    Serial.printf( "Number of APs found: %d\n", n );
    for ( int i=0; i<n; i++ ) {
      Serial.printf( "%d) \"%s\" (%d)\n",
        (i+1), WiFi.SSID(i).c_str(), WiFi.RSSI(i) );
    }
  }
  Serial.println( "=================\n" );
}

void setup() {
  Serial.begin( 115200 );
  Serial.flush();
  WiFi.mode( WIFI_STA );
  WiFi.disconnect();
  delay( 1000 );
}

void loop() {
  wifi_scan();
  delay( 5000 );
}

 

ข้อสังเกต:

1) การใช้กำลังส่ง Tx Power ในระดับสูง เพื่อเชื่อมต่อผ่าน Wi-Fi (ซึ่งอาจใช้กระแสสูงมากกว่า 300mA ที่กำลังส่งสูงสุด @21 dBm) พร้อมกับการใช้ขา +3.3V ของบอร์ดเพื่อจ่ายแรงดันไฟฟ้าให้อุปกรณ์อื่น อาจมีข้อจำกัดในการใช้งานได้ เช่น ทำให้การทำงานของระบบไม่เสถียร

ผู้ผลิตบอร์ด ESP32-C3 LOLIN Mini v1.0.0 ได้แนะนำให้ตั้งค่ากำลังสูงสุดไว้ที่ 8.5dBm และจากการทดลองก็สามารถใช้ค่า 11dBm ได้เช่นกัน แต่ถ้าใช้ค่าสูงกว่านั้น จะทำให้ไม่สามารถเชื่อมต่อ WiFi ได้ ประเด็นนี้จึงแสดงให้เห็นข้อจำกัดหรือปัญหาในการออกแบบบอร์ดดังกล่าว และก็มีข้อสังเกตอยู่ว่า บอร์ดอื่นที่ใช้ชิป ESP32-C3 และไอซีควบคุมแรงดัน ME6211C33 เหมือนกัน (ซึ่งให้เอาต์พุต +3.3V / 500mA max) ก็ไม่พบปัญหาดังกล่าว

2) หากใช้บอร์ด ESP32C3 ที่มีชิป USB-to-Serial IC (เช่น CH340C) เช่น บอร์ด Ai Thinker NodeMCU ESP32C3-32S-Kit และเลือกการตั้งค่าเป็น "ESP32C3 Dev Module" สำหรับใช้เป็นบอร์ดเป้าหมายในการคอมไพล์โค้ดด้วย Arduino IDE ในกรณนี้แนะนำให้แก้ไขไฟล์ boards.txt ซึ่งอยู่ในไดเรกทอรี (สำหรับผู้ใช้ Windows)

C:\Users\%USERNAME%\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.4

ตัวเลข 2.0.4 หมายถึง การใช้ Arduino ESP32 Core v2.0.4 ดังนั้นอาจจะต้องแก้ไขตัวเลขให้ตรงกับเลขของเวอร์ชันที่ใช้งานจริง

ให้ไปยังในส่วนที่เกี่ยวข้องกับ esp32c3.name=ESP32C3 Dev Module ในไฟล์ boards.txt

เมื่อเปิดไฟล์ด้วย Text Editor ให้เลื่อนหาบรรทัดต่อไปนี้ แก้ไขการกำหนดค่า โดยเปลี่ยนจาก

esp32c3.serial.disableDTR=false
esp32c3.serial.disableRTS=false

ให้เป็น

esp32c3.serial.disableDTR=true
esp32c3.serial.disableRTS=true

แล้วเริ่มต้นใช้งาน Arduino IDE ใหม่อีกครั้ง เพื่อไม่ให้มีการรีเซตการทำงานของ ESP32-C3 เมื่อเปิดใช้งาน Arduino Serial Monitor

 


การใช้งาน WokWi Simulator#

หากต้องการจะลองเขียนโค้ดและจำลองการทำงานของฮาร์ดแวร์ในเบื้องต้น ก็สามารถใช้ Wokwi Online Simulator for ESP32 ได้ ซึ่งรองรับ ESP32 / ESP32-S2 / ESP32-C3 และเขียนโค้ดด้วย ESP-IDF, Arduino, MicroPython / CircuitPython และ Embedded Rust (experimental) — ดูรายละเอียดเพิ่มเติมได้จาก "Wokwi - ESP32 Simulation"

รูป: การสร้างโปรเจกต์ใน WokWi Simulator เพื่อทดลองเขียนโค้ด Arduino และใช้งานร่วมกับบอร์ด ESP32-C3 DevKitM-1

รูป: การจำลองการทำงานของโค้ด Arduino สำหรับ ESP32-C3 สาธิตการควบคุมและเปลี่ยนสีของ RGB LED (NeoPixel) จำนวนหนึ่งดวง และมีขาสัญญาณข้อมูลต่อกับขา GPIO-8

รูป: ตัวอย่างการใช้คำสั่ง analogWrite() เพื่อสร้างสัญญาณ PWM และแสดงรูปกราฟสัญญาณจากค่าตัวเลขสำหรับ PWM Duty Cycle (ค่าตัวเลขอยู่ในช่วง 0..255)

 


กล่าวสรุป#

ESP32-C3 เป็นอีกหนึ่งตัวเลือกที่น่าสนใจสำหรับการประยุกต์ใช้งานไมโครคอนโทรลเลอร์ เนื่องจากมีราคาไม่แพง ใช้พลังงานต่ำ สามารถเชื่อมต่อระบบเครือข่าย Wi-Fi และ Bluetooth ได้ แต่ไม่เน้นความเร็วในการประมวลผล ไม่มี Floating-Point Unit (FPU) มีจำนวนขา GPIO ให้ใช้ได้น้อยกว่า ซึ่งถือว่ามีจำนวนค่อนข้างจำกัด แต่ชิปรุ่นนี้สามารถทำงานในโหมดประหยัดพลังงานได้ต่ำกว่า เมื่อเปรียบเทียบกับชิป ESP32 / ESP32-S3 (Dual-Core)

 


This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

Created: 2022-05-09 | Last Updated: 2022-07-28