การใช้งาน PlatformIO (PIO) Core สำหรับ WSL2 Ubuntu ในเบื้องต้น#
▷ PIO Core และการทำคำสั่งแบบ Command Line#
PlatformIO IDE เป็นแอปพลิเคชันแบบ GUI และเป็น Open Source สำหรับการเขียนโค้ด C/C++ เพื่อนำไปใช้กับบอร์ดไมโครคอนโทรลเลอร์ได้หลายตระกูลหลายรุ่น การทำงานของโปรแกรมนี้อาศัยโปรแกรมอีกตัวหนึ่งเป็นพื้นฐานในการทำงาน คือ PlatformIO (PIO) Core ซึ่งใช้ภาษา Python และมีการใช้งานเป็นแบบ Command Line Interface (CLI) (เหมาะสำหรับการเขียนสคริปต์คำสั่งและการคอมไพล์โค้ดแบบ Automated Build Process) ดังนั้นจึงทำงานได้แบบ Cross-platform ใช้ได้กับระบบปฏิบัติการต่าง ๆ ที่รองรับการใช้งาน Python 3
บทความนี้กล่าวถึง การติดตั้งและใช้งาน PIO Core ในเบื้องต้น และลองเขียนโค้ด Arduino Sketch สำหรับบอร์ด ESP32 (WeMos Lolin32 Lite) แต่ถ้าได้ติดตั้งซอฟต์แวร์ PlatformIO IDE เป็น Extension สำหรับ VS Code ไว้แล้ว ก็สามารถใช้คำสั่งต่าง ๆ ของ PIO Core ได้โดยไม่ต้องติดตั้งเพิ่ม
▷ ขั้นตอนการติดตั้ง PIO Core#
ทำคำสั่งเพื่อติดตั้ง PIO Core ดังนี้
# Set the URL of the Python installation script.
$ URL=https://raw.githubusercontent.com/
# Set the remote path to the script.
$ SCRIPT=platformio/platformio-core-installer/master/get-platformio.py
# Get the installation script file using wget.
$ wget ${URL}${SCRIPT} -O ./get-platformio.py
# Run the script to install PIO Core.
$ python3 ./get-platformio.py
เมื่อทำคำสั่งแล้ว จะมีการติดตั้งแพ็กเกจต่าง ๆ ที่จำเป็นสำหรับ PIO Core ไว้ใน
$USER/.platformio/penv
(ใช้งานแบบ Python Virtual Environment)
เพิ่มโค้ด Bash Script ตามตัวอย่างต่อไปนี้ ไว้ในไฟล์ $HOME/.profile
(ใช้คำสั่ง nano
เพื่อแก้ไขไฟล์ตามตัวอย่าง) เพื่อทำให้ระบบสามารถค้นหาและเรียกใช้คำสั่ง pio
ได้
$ nano $HOME/.profile
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
PATH="$PATH:$HOME/.local/bin"
fi
if [ -d "$HOME/.platformio/penv/bin" ] ; then
PATH="$PATH:$HOME/.platformio/penv/bin"
fi
และทำคำสั่ง
# Update the PATH environment variable
export PATH=$PATH:$HOME/.platformio/penv/bin:$HOME/.local/bin
หลังจากนั้นจึงสามารถเรียกใช้คำสั่ง platformio
หรือ pio
ได้
▷ การทำให้ WSL2-Linux / Ubuntu มองเห็นและใช้งานอุปกรณ์ USB ได้#
สำหรับผู้ใช้ WSL2 ร่วมกับ Ubuntu ถ้าใช้ WSL Kernel
ตั้งแต่เวอร์ชัน 5.10.60.1 เป็นต้นไป
ก็สามารถใช้โปรแกรม usbipd
(USB-over-IP server daemon) เพื่อทำให้มองเห็นอุปกรณ์ USB ได้ใน WSL2
แต่มีขั้นตอนที่จะต้องดำเนินการก่อนใช้งาน
ทำคำสั่งต่อไปนี้ใน WSL2 - Ubuntu Terminal เพื่อติดตั้งแพ็กเกจสำหรับ Ubuntu
$ sudo apt install linux-tools-virtual hwdata -y
$ sudo update-alternatives --install /usr/local/bin/usbip usbip \
`ls /usr/lib/linux-tools/*/usbip | tail -n1` 20
ลองทำคำสั่งต่อไปนี้ เพื่อตรวจสอบดูว่า สามารถเรียกใช้คำสั่ง usbpip
ได้หรือไม่
$ which usbip
/usr/local/bin/usbip
ถัดไปให้เปิดใช้งาน Windows PowerShell (Administrator) แล้วทำคำสั่งต่อไปนี้ เพื่อแสดงรายการอุปกรณ์ USB ที่มองเห็นได้ใน Windows
# Show version.
> usbipd --version
# List USB devices.
> usbipd wsl list
เชื่อมต่อบอร์ด ESP32 กับพอร์ต USB ของคอมพิวเตอร์ผู้ใช้
แล้วทำคำสั่งเพื่อเลือกใช้อุปกรณ์ USB ตาม Bus ID ที่ต้องการใช้งานกับ
WSL2 - Ubuntu เช่น 6-1
ซึ่งตรงกับชิป USB-SERIAL CH340 ของบอร์ดไมโครคอนโทรลเลอร์ ESP32
> usbipd wsl attach --busid 6-1
รูป: ตัวอย่างการทำคำสั่ง usbpid
เพื่อเลือกใช้อุปกรณ์ USB กับ WSL2
ถัดไปให้ทำคำสั่งใน Bash Shell ของ WSL2 - Ubuntu เพื่อดูว่า มองเห็นอุปกรณ์ เช่น USB-to-Serial CH340 ตามตัวอย่าง
$ lsusb | grep CH340
Bus 001 Device 002: ID 1a86:7523 QinHeng Electronics CH340 serial converter
สำหรับผู้ใช้ Linux โดยทั่วไป หากจะใช้โปรแกรมคำสั่งต่าง ๆ เข้าถึงอุปกรณ์ USB
ในระบบได้โดยไม่ต้องใช้สิทธิ์ root
ก็แนะนำให้เพิ่มไฟล์ .rules สำหรับโปรแกรม udev
เพื่ออนุญาตให้ผู้ใช้ทั่วไปเข้าถึงอุปกรณ์เหล่านั้นได้
ผู้พัฒนา PIO ได้จัดทำไฟล์
99-platformio-udev.rules
ให้ผู้ใช้ดาวน์โหลดไปใช้งาน โดยนำไปใส่ไว้ในไดเรกทอรี /etc/udev/rules.d/
แล้วอัปเดทการทำงานของ udev
$ sudo mv 99-platformio-udev.rules /etc/udev/rules.d/
# update the udev rules
$ sudo service udev restart
# or
$ sudo udevadm control --reload-rules
$ sudo udevadm trigger
สำหรับผู้ใช้ Ubuntu / Debian / Raspberry Pi OS
ให้เพิ่มชื่อผู้ใช้ $USER
ให้เป็นส่วนหนึ่งของกลุ่ม dialout
และ plugin
$ sudo usermod -a -G dialout $USER
$ sudo usermod -a -G plugdev $USER
ทำคำสั่งเพื่อตรวจสอบดูว่า สามารถมองเห็นอุปกรณ์ USB ได้หรือไม่ เช่น พอร์ต /dev/ttyUSB0
สำหรับบอร์ด ESP32
รูป: การทำคำสั่งเพื่อตรวจสอบดูรายการอุปกรณ์ USB
▷ การเริ่มต้นสร้างโปรเจกต์สำหรับ Arduino-ESP32#
เริ่มต้นด้วยการทำคำสั่งเพื่อลองดูว่า มีรายการบอร์ดไมโครคอนโทรลเลอร์ใดบ้างให้เลือกใช้ได้ เช่น
ค้นหาตามชื่อของบอร์ดไมโครคอนโทรลเลอร์ที่ขึ้นต้นด้วย esp32dev
หรือ lolin
$ pio boards esp32 | grep -E "^(esp32dev|lolin)"
esp32dev ESP32 240MHz 4MB 320KB Espressif ESP32 Dev Module
lolin_c3_mini ESP32C3 160MHz 4MB 320KB WEMOS LOLIN C3 Mini
lolin_d32 ESP32 240MHz 4MB 320KB WEMOS LOLIN D32
lolin_d32_pro ESP32 240MHz 4MB 320KB WEMOS LOLIN D32 PRO
lolin_s2_mini ESP32S2 240MHz 4MB 320KB WEMOS LOLIN S2 Mini
lolin_s2_pico ESP32S2 240MHz 4MB 320KB WEMOS LOLIN S2 PICO
lolin32 ESP32 240MHz 4MB 320KB WEMOS LOLIN32
lolin32_lite ESP32 240MHz 4MB 320KB WEMOS LOLIN32 Lite
เริ่มต้นสร้างโปรเจกต์ใหม่ เช่น ใช้ชื่อว่า pio_demo
ในไดเรกทอรี $HOME
ของผู้ใช้
# Create a new project under a new directory.
$ mkdir -p $HOME/pio_demo && cd $HOME/pio_demo
$ pio project init --board lolin32_lite
แต่ถ้าจะสร้างโปรเจกต์และเปิดใช้งานกับ VS Code IDE ให้ทำคำสั่งโดยเพิ่ม
--ide vscode
และจะมีการติดตั้ง PlatformIO Extension
ให้กับ VS Code IDE
$ pio project init --board lolin32_lite --ide vscode
โครงสร้างภายในไดเรกทอรีสำหรับโปรเจกต์ มีลักษณะดังนี้
$ tree -L 1
.
├── include
├── lib
├── platformio.ini
├── src
└── test
ไฟล์ platformio.ini
ถูกสร้างขึ้นและมีการตั้งค่าใช้งานในเบื้องต้นสำหรับ PIO ดังนี้
[env:lolin32_lite]
platform = espressif32
board = lolin32_lite
framework = arduino
ลองเขียนโค้ดในไฟล์ src/main.cpp
(LED Blink) ตามตัวอย่างดังนี้
$ nano src/main.cpp
#include "Arduino.h"
#ifndef LED_BUILTIN
#define LED_BUILTIN (22) // WeMos Lolin32 Lite
#endif
void setup() {
// initialize LED digital pin as an output.
pinMode( LED_BUILTIN, OUTPUT );
}
void loop() {
static int state = 0;
// turn the LED on (HIGH is the voltage level)
state ^= 1; // toggle the LED state
digitalWrite( LED_BUILTIN, state );
delay( 500 );
}
ทำคำสั่งคอมไพล์โค้ดและไฟล์ต่าง ๆ ในโปรเจกต์
# Build project from the current directory.
$ pio run
เมื่อคอมไพล์โค้ดได้สำเร็จ ทำคำสั่งเพื่ออัปโหลดไฟล์เฟิร์มแวร์ที่ได้ ไปยังบอร์ด ESP32
# List attached target boards.
$ pio device list
/dev/ttyUSB0
------------
Hardware ID: USB VID:PID=1A86:7523 LOCATION=1-1
Description: USB Serial
# Upload firmware to the target board.
$ pio run -t upload --upload-port /dev/ttyUSB0
หากจะลองเปิดไฟล์ของโปรเจกต์ใน VS Code IDE (ถ้าได้มีการติดตั้งซอฟต์แวร์นี้ไว้ใน Windows ของผู้ใช้แล้ว) ก็ให้ทำคำสั่งดังนี้
$ code .
ผู้ใช้สามารถเปิดไฟล์ src/main.cpp
แก้ไขโค้ด และทำคำสั่ง pio
ใน
Terminal เพื่อคอมไพล์โค้ดได้เช่นกัน
รูป: การใช้งานโปรแกรม VS Code
รูป: การใช้งานโปรแกรม VS Code — ทำคำสั่ง pio
เพื่ออัปโหลดไฟล์เฟิร์มแวร์ไปยังบอร์ด
ในกรณีที่ไม่ได้สร้างโปรเจกต์สำหรับ VS Code IDE ตั้งแต่เริ่มต้น
และต้องการให้ C/C++ Extension - Indexer & IntelliSense ใน VS Code
ทำงานได้อย่างถูกต้อง จะต้องมีการแก้ไขการตั้งค่าในไฟล์ .vscode/c_cpp_properties.json
ดังนี้
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${HOME}/.platformio/packages/framework-arduinoespressif32/**",
"${workspaceFolder}/**"
],
"browse": {
"path": [
"${workspaceFolder}"
],
"limitSymbolsToIncludedHeaders": false
},
"defines": [],
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "${default}",
"compilerPath": "${HOME}/.espressif/tools/xtensa-esp32-elf/esp-2021r2-patch3-8.4.0/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc"
}
],
"version": 4
}
ข้อสังเกต: "compilerPath:"
มีไว้เพื่อระบุชื่อไดเรกทอรีที่มีคำสั่งคอมไพเลอร์
xtensa-esp32-elf
และในตัวอย่างเป็นเวอร์ชัน esp-2021r2-patch3-8.4.0
ดังนั้นจะต้องระบุเวอร์ชันให้ตรงกับที่ใช้งานจริงด้วย
▷ กล่าวสรุป#
บทความนี้นำเสนอขั้นตอนการติดตั้งซอฟต์แวร์ เพื่อใช้งาน PlatformIO (PIO) Core สำหรับ WSL2 / Ubuntu Linux ทำคำสั่งคอมไพล์โค้ดในโปรเจกต์ตัวอย่าง และอัปโหลดไปยังบอร์ดไมโครคอนโทรลเลอร์ ESP32 ที่ได้เลือกมาสาธิตการใช้งาน
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.
Created: 2022-09-29 | Last Updated: 2022-09-29