การเริ่มต้นใช้งานบอร์ด LUATOS CORE-ESP32C3#


AirM2M / LUATOS CORE-ESP32C3#

บอร์ด LUATOS CORE-ESP32C3 เป็นอีกหนึ่งบอร์ดไมโครคอนโทรลเลอร์ของบริษัท Hezhou Communication Technology Co., Ltd. (Shanghai, China) บอร์ดนี้มีราคาถูกและใช้ชิป Espressif ESP32-C3 รองรับการสื่อสารข้อมูลแบบไร้สายตามมาตรฐาน IEEE 802.11b/g/n (2.4 GHz WiFi) & Bluetooth 5 (LE)

ภายในชิปมีตัวประมวลผลที่ทำงานตามสถาปัตยกรรมชุดคำสั่งแบบ RISC-V (32-bit Single-Core RV32IMC, I=integer, M=multiplication/division C=standard compressed instruction set extension)

บอร์ดที่ได้นำมาทดลองใช้งาน มี 2 รุ่น และมีความแตกต่างกันดังนี้

  • Classic version (Schematic): มีชิป USB-to-Serial Bridge IC (WCH CH340) อยู่บนบอร์ด
  • Contracted version (Schematic): ไม่มีชิป WCH CH340 ดังนั้นจึงมีราคาถูกกว่าเล็กน้อย

รูป: บอร์ด LUATOS ESP32C3-CORE - Top View

รูป: บอร์ด LUATOS ESP32C3-CORE - Bottom View

 

ข้อมูลเกี่ยวกับบอร์ด LUATOS ESP32C3-CORE

  • ใช้ชิป ESP32-C3 และใช้ชิป SPI Flash (4MB) แยกกัน
  • มี 40MHz Crystal Oscillator
  • มีปุ่มกด CHIP_EN / RST (Reset) และ BOOT/GPIO-9
  • มีวงจร LED (active-high) อยู่บนบอร์ด 2 ชุด (D4 และ D5) ต่อกับขา GPIO-12 และ GPIO-13 ตามลำดับ
  • ใช้ไอซี ME6212C33M5G (LDO Voltage Regulator, 3.3V / 350mA max.) แปลงแรงดันไฟฟ้า VUSB (5V) ให้เป็น 3.3V และมีขา PWB สำหรับ Shutdown / Enable
  • มีคอนเนกเตอร์ USB Type-C สำหรับเชื่อมต่อกับคอมพิวเตอร์ของผู้ใช้

 

รูป: บอร์ด LUATOS ESP32C3-CORE (with CH340) - Board Layout

รูป: ผังแสดงตำแหน่งขาของบอร์ด (Board Pinout)

รูป: รายการอุปกรณ์ของบอร์ด (Interactive BOM)

รูป: ผังวงจรของบอร์ด (View Schematic)


ตัวเลือกสำหรับการเขียนโปรแกรม#

บอร์ดนี้ เช่นเดียวกับบอร์ดอื่นที่ใช้ชิป ESP32-C3 สามารถเขียนโปรแกรมได้ โดยใช้ภาษาคอมพิวเตอร์ที่แตกต่างกัน เช่น

LuatOS เป็นชื่อของซอฟต์แวร์ที่ทางบริษัท Hezhou ได้สร้างขึ้น เพื่อนำมาใช้ในการพัฒนาเฟิร์มแวร์ด้วยภาษา Lua v5.3 และใช้ ESP-IDFV4.4+ & FreeRTOS เป็นพื้นฐานในการทำงาน สามารถนำมาใช้ได้กับชิป ESP32-C3 และ ESP32-S2 ของบริษัท Espressif


ตัวอย่างโค้ดสำหรับ Arduino#

ในการเขียนโปรแกรมด้วย Arduino IDE ให้ติดตั้ง Arduino-ESP32 Core โดยจะต้องติดตั้งไฟล์ package_esp32_index.json (เป็น Stable Version ตาม URL ต่อไปนี้) ใน Arduino Board Managers

URL: https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

รูป: ตัวอย่างการติดตั้งหรืออัปเดต Arduino-ESP32 Core สำหรับ Arduino IDE

รูป: ตัวอย่างการเลือกบอร์ด "AirM2M_CORE_ESP32C3" และตั้งค่าใข้งานสำหรับ Arduino IDE

รูป: ตัวอย่างการเลือกบอร์ดเป็น "ESP32C3 Dev Module"

ข้อสังเกต: ถ้าใช้บอร์ด ESP32-C3 ที่ไม่มีชิป USB-to-Serial IC จะต้องเลือกใช้ USB CDC on Boot เพื่อใช้ในการอัปโหลดโปรแกรมและสื่อสารข้อมูลกับคอมพิวเตอร์ของผู้ใช้


โค้ดตัวอย่างที่ 1 สาธิตการเขียนโค้ดโดยใช้คำสั่งของ Arduino API และ FreeRTOS for ESP32 เพื่อเขียนโค้ดแบบมัลติทาสก์ (Multi-Tasking) และทำให้ LED ทั้งสองดวงบนบอร์ดกระพริบ (มีสถานะติด-ดับ) สลับกัน

#define TASK_STACK_SIZE  (2048)  // bytes
#define TASK_PRIORITY    (2)

const uint32_t LED_PINS[] = {12, 13}; // use onboard LEDs

SemaphoreHandle_t mutex;

void setup() {
  Serial.begin(115200);
  while (!Serial){ delay(10); }

  UBaseType_t priority = uxTaskPriorityGet(NULL); 
  Serial.printf( "The priority of main task: %lu\n", priority );
  Serial.printf( "FreeRTOS-ESP32 max priority: %lu\n", (configMAX_PRIORITIES-1) );

  mutex = xSemaphoreCreateMutex(); // create a mutex
  // create two tasks with the same task priority 
  xTaskCreate( led_task, "LED-1 Task",
               TASK_STACK_SIZE, (void*)0, TASK_PRIORITY, NULL );
  xTaskCreate( led_task, "LED-2 Task", 
               TASK_STACK_SIZE, (void*)1, TASK_PRIORITY, NULL );
}

void loop() {
  yield();
}

void led_task( void * pvParameters ) {
  uint32_t id = (uint32_t)pvParameters;
  uint32_t pin = LED_PINS[id];
  pinMode( pin, OUTPUT );
  if (id == 0) {
    vTaskDelay( 500/portTICK_PERIOD_MS ); 
  }
  while(1) {
    xSemaphoreTake( mutex, portMAX_DELAY ); // acquire the mutex lock
    digitalWrite( pin, HIGH ); // turn the LED on
    Serial.printf( "LED-%lu task @ %lu msec\n", id, millis() );
    vTaskDelay( 500/portTICK_PERIOD_MS );
    digitalWrite( pin, LOW ); // turn the LED off
    xSemaphoreGive( mutex ); // release the mutex lock
    taskYIELD();
  }
}

รูป: ตัวอย่างข้อความที่เป็นเอาต์พุตและได้รับใน Arduino Serial Monitor


โค้ดตัวอย่างที่ 2 สาธิตการเขียนโค้ดสาธิตการตรวจสอบเครือข่ายไร้สายในบริเวณโดยรอบ (WiFi Scan)

#include <WiFi.h>

#define WIFI_SSID     "xxxxxxxxxx"
#define WIFI_PASSWD   "xxxxxxxxxx"

#include <map> 
#include <iterator> 
using namespace std; 
std::map<String, int> scan_results;
std::map<String, int>::iterator iter; 

void setup() {
  Serial.begin(115200);
  while (!Serial){ delay(10); }
  Serial.println( "ESP32-C3" );
  Serial.flush();

  // use WiFi STA (station mode)
  WiFi.mode( WIFI_STA ); 
  WiFi.disconnect();
  // set WiFi Tx power (see: WiFi/WiFiGeneric.h)
  wifi_power_t tx_power = WIFI_POWER_19_5dBm;
  WiFi.setTxPower( tx_power );
  delay(10);  
  // 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(100);
  }
  Serial.println( "" );
  // show the IP address assigned by DHCP
  Serial.printf( "IP address: %s\n", 
                 WiFi.localIP().toString().c_str() );

  //disconnect WiFi network, but keep the WiFi active
  WiFi.disconnect(false);
}

void wifi_scan() {
  Serial.print( "WiFi scan (synchronous mode) started..." );
  int n = WiFi.scanNetworks(); // number of networks found
  Serial.println( " done" );
  if ( n==0 ) {
     Serial.println( "No WiFi networks found..." );
  } else {
     Serial.printf( "WiFi networks found: %d\n", n );
     for ( int i=0; i < n; ++i ) {
        // keep only BSSID and RSSI for each network found
        String bssid_str = WiFi.BSSIDstr(i);
        int rssi_value = WiFi.RSSI(i);
        iter = scan_results.find( bssid_str );
        if (iter == scan_results.end()) {
          scan_results.insert( { bssid_str, rssi_value } ); // insert 
        } else {
          iter->second = rssi_value; // update
        }
     }
  }
  Serial.println( "" );

  for ( iter = scan_results.begin(); iter != scan_results.end(); ++iter ) { 
     String mac_str = iter->first;
     int rssi_value = iter->second;
     // replace the last six hex digits with "xx"
     mac_str = mac_str.substring( 0, mac_str.length()-8 );
     mac_str += "xx:xx:xx";
     Serial.printf( "%s %d\n", mac_str.c_str(), rssi_value ); 
  }
  Serial.printf( "Free heap: %lu bytes\n\n", ESP.getFreeHeap() );
  Serial.flush();
}

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

รูป: ตัวอย่างข้อความที่เป็นเอาต์พุตสำหรับ WiFi Scan


ตัวอย่างการใช้งาน LuatOS-ESP32#

LuatOS รองรับการเขียนโค้ดด้วยภาษา Lua v5.3 และสามารถนำมาใช้ได้กับบอร์ดไมโครคอนโทรลเลอร์หลายแบบ (เช่น Air101 / Air103 / W806) ซึ่งรวมถึงบอร์ด CORE-ESP32C3 ผู้ใช้สามารถเขียนโปรแกรมโดยใช้ VS Code IDE พร้อมกับติดตั้ง VS Code Extension ที่มีชื่อว่า LuatIDE แต่มีเมนูคำสั่งและข้อความเป็นภาษาจีน ดังนั้นจึงยังไม่แนะนำให้ใช้งาน หากสนใจตัวอย่างการเขียนโค้ด ก็สามารถดูได้จาก https://github.com/openLuat/LuatOS/tree/master/demo

รูป: การทดลองใช้งาน VS Code IDE + LuatOS สำหรับบอร์ด CORE-ESP32C3 ที่มีชิป CH340C USB-to-Serial และใช้เฟิร์มแวร์ที่มีชื่อว่า LuatOS-SoC_V0003_ESP32C3_SSL.soc


กล่าวสรุป#

บอร์ด AirM2M / LUATOS CORE-ESP32C3 ก็เป็นอีกหนึ่งตัวเลือกสำหรับผู้ที่สนใจและต้องการลองใช้งานชิป Espressif ESP32-C3 และมีราคาค่อนข้างต่ำกว่าบอร์ดที่เป็นตัวเลือกอื่น

 


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

Created: 2022-07-15 | Last Updated: 2022-07-16