Using Arduino IDE on Raspberry Pi 4

<rawat.s>
4 min readAug 4, 2020

--

‍‍ ‍‍

ในช่วงที่ผ่านมาผู้เขียนได้ลองใช้บอร์ด Raspberry Pi 4 (RPi) Model B (2GB RAM) ที่ได้ติดตั้ง Raspbian OS ในลักษณะเป็นคอมพิวเตอร์แบบ Desktop เป็นตัวเลือกเสริมจากการใช้คอมพิวเตอร์แบบ Notebook

ตัวอย่างของซอฟต์แวร์ที่ได้ลองใช้งาน เช่น Chromium (Web Browser), GIMP (Photo Editing Tool), Mu Editor (Python Editor), Thonny IDE (Python Editor), Visual Studio Code IDE (Community Build), Wolfram Engine / Mathematica เป็นต้น และซอฟต์แวร์ที่จะนำมาลองใช้งานในบทความนี้คือ Arduino IDE

คำสั่งต่อไปนี้แสดงข้อมูลเกี่ยวกับ RPi 4B (2GB RAM) และระบบปฏิบัติการที่ใช้สำหรับการติดตั้งและใช้งาน Arduino IDE (แนะนำให้ใช้ microSD ความจุ 32 GB)

$ cat /etc/os-releasePRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
$ uname -aLinux rpi4b-2gb 4.19.118-v7l+ #1311 SMP Mon Apr 27 14:26:42 BST 2020 armv7l GNU/Linux

ขั้นตอนการติดตั้ง Arduino IDE (v1.8.12) สำหรับ Raspberry Pi 4

‍‍ ‍‍

คำสั่งต่อไปนี้ จะทำการดาวน์โหลดไฟล์ .tar.xz สำหรับระบบปฏิบัติการ Linux ที่ใช้ซีพียูตระกูล ARM ในตัวอย่างนี้ได้เลือกใช้เวอร์ชัน v1.8.12 สำหรับ Arduino IDE

$ ARDUINO_VERSION=arduino-1.8.12
$ ARDUINO_FILE=${ARDUINO_VERSION}-linuxarm.tar.xz
$ wget -c https://downloads.arduino.cc/${ARDUINO_FILE}
$ tar -xvf ${ARDUINO_FILE}
$ sudo mv ${ARDUINO_VERSION} /opt/
$ sudo chown -R $USER:$USER /opt/${ARDUINO_VERSION}
$ cd /opt/${ARDUINO_VERSION}
$ sudo ./install.sh

‍‍ ‍‍

เปิดใช้งาน Arduino IDE โดยทำคำสั่งต่อไปนี้ (ให้ทำงานใน Background Mode และไม่แสดงข้อความต่าง ๆ ที่ปรากฏขณะโปรแกรมทำงาน)

$ arduino > /dev/null 2>&1 &
หน้าต่างหลักของ Arduino IDE

‍‍ ‍‍

จากนั้นให้ลองอัปเดตแพคเกจต่าง ๆ สำหรับ Boards Manager หรือติดตั้งเพิ่มเติมได้ ตามตัวอย่างต่อไปนี้

ในส่วนของ Boards Manager: อัปเดต Software Package ให้เป็นเวอร์ชันล่าสุด
ลองติดตั้งแพคเกจสำหรับ Arduino ที่ใช้ ATSAMD21 (ARM Cortex-M0+)

‍‍ ‍‍

เพิ่มรายการใน Boards Manager URLs เช่น สำหรับบอร์ด ESP32
ทำขั้นตอนติดตั้งแพคเกจสำหรับ ESP32

ข้อสังเกต: ถ้าเราได้ติดตั้ง Board Managers สำหรับบอร์ดไมโครคอนโทรลเลอร์ตระกูล ARM Cortex-M เช่น ของ Arduino หรือ Adafruit เป็นต้น เราจะมีตัวเลือก GNU ARM Embedded Toolchains (เวอร์ชันอาจแตกต่างไปจากตัวอย่าง) ตามรายการดังนี้

~/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/~/.arduino15/packages/adafruit/tools/arm-none-eabi-gcc/9-2019q4/bin/~/.arduino15/packages/STM32/tools/xpack-arm-none-eabi-gcc/9.2.1-1.1/bin/

ตัวอย่างโค้ด Arduino Sketch เพื่อสาธิตการทำงาน

‍‍‍‍‍‍ ‍‍

ถัดไปเราจะมาลองเขียนโค้ด Arduino Sketch เพื่อลองใช้กับบอร์ดไมโครคอนโทรลเลอร์ที่ใช้ตัวประมวลผลเป็น ATSAMD21 (Arduino M0 / Zero Compatible)

// Dual-LED Blink Demo
// Target board: WeMos / RobotDyn M0 (ATSAMD21G18A)
#define LED1 (25) // onboard LED (active-low)
#define LED2 (26) // onboard LED (active-low)
void setup() {
pinMode( LED1, OUTPUT );
pinMode( LED2, OUTPUT );}
int state = 0;void loop() {
digitalWrite( LED1, state );
digitalWrite( LED2, !state );
state ^= 1; // toggle the state
delay(500);
}
การเลือกบอร์ด Arduino Zero (Native USB Port) และทำขั้นตอน Build
ทำขั้นตอน Build และ Upload ได้สำเร็จแล้ว

เมื่ออัปโหลด Arduino Sketch ไปยังบอร์ดไมโครคอนโทรลเลอร์ (ใช้บอร์ด RobotDyn SAMD21 M0 / M0-Mini) ผ่านทาง USB ได้สำเร็จ ก็จะเห็น LED บนบอร์ดทั้งสองดวงกระพริบ (Blinking) สลับกัน

ตัวอย่างโค้ด: LEDs + Push Button

‍‍‍‍‍‍ ‍‍

โค้ดสาธิตการอ่านค่าจากวงจรปุ่มกด Push Button (Active-Low) บนเบรดบอร์ด โดยใช้ขา D10 (SAMD21 PA18 pin) เป็นอินพุต-ดิจิทัล เมื่อกดปุ่มแล้วปล่อยในแต่ละครั้ง จะทำให้หยุดชั่วคราวหรือให้ LED กระพริบต่อไป

#define LED1  (25) // onboard LED (PB03 pin)
#define LED2 (26) // onboard LED (PA27 pin)
#define BTN (10) // D10 pin (PA18 pin)
typedef enum {ON=0, OFF=1} led_state_t;
led_state_t state;
boolean blinking = true;
void setup() {
pinMode( BTN, INPUT_PULLUP );
pinMode( LED1, OUTPUT );
pinMode( LED2, OUTPUT );
digitalWrite( LED1, state );
digitalWrite( LED2, !state );
}
void loop() {
if ( !digitalRead( BTN ) ) {
while (!digitalRead( BTN )) { delay(10); }
blinking = !blinking;
}
if (blinking) {
state = (state==ON) ? OFF : ON; // toggle state
digitalWrite( LED1, state );
digitalWrite( LED2, !state );
}
delay(100);
}

ตัวอย่างโค้ด: LEDs + Push Button (Sleep Mode/Wakeup)

‍‍‍‍‍‍ ‍‍

โค้ดสาธิตการทำให้ MCU เข้าสู่ Sleep Mode (Low-Power) แล้วปลุกให้ทำงานต่อด้วยการกดปุ่ม (เป็นเหตุการณ์ภายนอก หรือ External Wakeup) ในตัวอย่างนี้ เมื่อถูกปลุกด้วยการกดปุ่มในแต่ละครั้ง จะเห็นว่า LED กระพริบ 3 ครั้ง แต่ถ้ามีการกดปุ่มแล้วปล่อยครบ 5 ครั้งแล้ว ตัวซีพียูจะไม่เข้าสู่ Sleep Mode อีกต่อไป (ทำงานตามปรกติ)

#include <ArduinoLowPower.h>

#define LED (25) // onboard LED (PB03 pin)
#define BTN (10) // D10 pin (PA18 pin)
typedef enum {ON=0, OFF=1} led_state_t;
led_state_t state = OFF;
volatile uint32_t ext_event_count = 0;
boolean sleep_mode = false;
void setup() {
pinMode( BTN, INPUT_PULLUP );
pinMode( LED, OUTPUT );
digitalWrite( LED, HIGH );

SerialUSB.begin( 115200 );
while( !SerialUSB ){ delay(10); } // Wait for Serial Monitor

if ( digitalRead( BTN ) ) { // if the button is not pressed
SerialUSB.println("Start Low-Power mode...");
SerialUSB.flush();
LowPower.attachInterruptWakeup( BTN, wakeup_cb, RISING );
sleep_mode = true; // enable sleep mode
}
}
char sbuf[64];void wakeup_cb() {
ext_event_count++; // increment the external event counter
}
void loop() {
for ( int i=0; i < 6; i++ ) { // blink the LED three times
state = (state == ON) ? OFF : ON;
digitalWrite( LED, state );
delay(100);
}
if ( sleep_mode && (ext_event_count >= 5) ) {
sleep_mode = false;
SerialUSB.println("Done...");
}
if ( sleep_mode ) {
LowPower.sleep(); // enter sleep mode for low-power operation
}
}

สำหรับตัวอย่างโค้ดนี้ จะต้องติดตั้งไลบรารีชื่อ Arduino Low Power ก่อน (ใช้ได้สำหรับ ARM 32 บิต ตระกูล SAMD21 และ nRF52) ตามตัวอย่าง โดยค้นหาและติดตั้งไลบรารีโดยใช้ Library Manager ของ Arduino IDE

โดยสรุป เราได้เห็นขั้นตอนการติดตั้งซอฟต์แวร์ Arduino IDE สำหรับ Raspberry Pi 4 Model B / Raspbian OS เพื่อนำมาใช้สำหรับการเขียนโค้ดไมโครคอนโทรลเลอร์ตามรูปแบบของ Arduino Sketch

--

--