โปรเจคนี้จะสอนวิธีควบคุม GPIO ของ Raspberry Pi ผ่านแดชบอร์ดที่สร้างด้วย Arduino Cloud โดยใช้แอปพลิเคชันที่เขียนใน Node-RED เอาไปเป็นตัวอย่างสร้างแอปของตัวเองที่ต้องเข้าถึง GPIO ของ RPI แล้วสุดท้ายก็ควบคุมผ่านแดชบอร์ดได้เลยจ้า
ตั้งค่าอุปกรณ์
ในโปรเจคนี้พี่ใช้ Raspberry Pi 5 ต่อกับ LED กับปุ่มกดบนเบรดบอร์ด ตามแผนภาพนี้เลย

หมายเหตุ: โปรเจคนี้ควรทำงานได้กับ Raspberry Pi ทุกเวอร์ชัน และจริงๆ แล้วกับเครื่อง Linux อื่นๆ ที่รองรับ libgpiod ด้วย ถ้าใช้แล้วไม่เวิร์คกับบอร์ดของน้อง รีบคอมเมนต์มาแจ้งพี่ด่วน!
วิธีสร้างโปรเจคของตัวเอง
ขั้นตอนการใช้งานโปรเจคนี้ตรงไปตรงมาเลย:
- สร้าง Device กับ Thing ใน Arduino Cloud แล้วขอ Arduino Cloud API Key มา
- ติดตั้ง Node-RED และโหนดที่จำเป็น
- พัฒนาแอปพลิเคชันใน Node-RED
- สร้างแดชบอร์ดใน Arduino Cloud
- ทดสอบทุกอย่างให้เรียบร้อย
1. สร้าง Device และ Thing ใน Arduino Cloud
หมายเหตุ: ก่อนเริ่ม ตรวจสอบให้แน่ใจว่ามีบัญชี Arduino Cloud แล้วนะ
สร้าง Device
ไปที่ส่วน [Devices] ของ Arduino IoT Cloud แล้วคลิกที่ + DEVICE
เลือก "Any Device" แล้วทำตามขั้นตอนในวิซาร์ด
หมายเหตุ: บันทึก
Device IDกับSecret Keyไว้ให้ดี เพราะต้องใช้ในโค้ด Python
สร้าง Thing
ในหน้าของ Device ที่เพิ่งสร้าง ไปที่ส่วน Associated Thing คลิก "Create Thing" แล้วตั้งชื่อใหม่ให้มัน
หมายเหตุ: จะสร้าง Thing จากรายการ Things ก่อนแล้วค่อยมาเชื่อมต่อกับ Device ทีหลังก็ได้
สร้างตัวแปร
เพิ่มตัวแปรโดยคลิกปุ่ม ADD พอเสร็จแล้ว รายการตัวแปรควรเป็นแบบนี้

ขอ Arduino Cloud API key
ขั้นตอนขอ Arduino Cloud API key ง่ายมาก:
- ไปที่ [https://cloud.arduino.cc/home/api-keys]
- คลิก CREATE API KEY และ ตั้งชื่อให้มัน
- จด
Client IDกับClient Secretไว้ หรือดาวน์โหลดไฟล์ PDF เก็บไว้ เราจะใช้ข้อมูลนี้ในโหนด Node-RED ต่อไป
2. ติดตั้ง Node-RED และโหนดที่จำเป็น
วิธีติดตั้ง Node-RED
มีหลายวิธีที่จะติดตั้ง Node-RED ใน Raspberry Pi หรือเครื่องอื่น ส่วนใหญ่ใช้ได้ทั้ง: docker, snap, apt, หรือการติดตั้ง node.js แบบ native
จุดที่ต้องระวังคือ เราต้องการให้อินสแตนซ์ Node-RED ของเราสามารถเข้าถึง GPIO และระบบของ host ได้ ซึ่งทำได้กับทุกวิธีติดตั้ง แต่สำหรับหลายวิธีมันค่อนข้างยากและมีปัญหาต้องแก้เยอะ ดังนั้นวิธีที่ง่ายและแนะนำสำหรับโปรเจคนี้คือการติดตั้งแบบ native โดยใช้ NPM
ทำตามนี้เลย:
- ติดตั้ง Node-RED
ติดตั้ง Node-RED ด้วยคำสั่งนี้
sudo npm install -g --unsafe-perm node-red
- จัดการเซอร์วิส
มีเครื่องมือหลายตัวที่ใช้จัดการเซอร์วิสได้ แต่พี่แนะนำให้ใช้ pm2 เพื่อจัดการและทำให้มันเริ่มทำงานตอนบูตเครื่อง
ติดตั้ง pm2
sudo npm install -g pm2
แก้ไขไฟล์ pm2.json และตั้งค่า path เต็มไปยังโฟลเดอร์ gpio-basic ของน้อง
{
"apps": [
{
"name": "node-red",
"script": "<FULL_PATH_TO_YOUR FOLDER>/pm2-node-red-start.sh"
}
]
}
เรียกใช้เซอร์วิส บันทึก และตั้งค่าให้ pm2 เริ่มทำงานตอนบูต:
sudo pm2 start pm2.json
sudo pm2 save
sudo env PATH=$PATH:/usr/bin $(which pm2) startup systemd
เซอร์วิสจะถูกเรียกใช้โดยอัตโนมัติตอนบูตเครื่อง
น้องสามารถสั่งให้บริการเริ่มหรือหยุดทำงานด้วยคำสั่ง sudo pm2 start node-red หรือ sudo pm2 stop node-red ได้ด้วยตัวเองเลย
เปิดใช้งาน Node-RED
เปิดเบราว์เซอร์ขึ้นมา แล้วเข้าไปที่ URL นี้: http://<IP_ADDRESS>:1880 โดยเปลี่ยน <IP_ADDRESS> เป็น IP Address ของ Raspberry Pi ของน้อง
หน้าต่าง Node-RED ก็จะเปิดขึ้นมา ถ้าตั้งค่าทุกอย่างถูกต้อง น้องควรจะเห็นโฟลว์แบบนี้

หมายเหตุ: ถ้าไม่เห็นโฟลว์ มีแต่หน้าจอว่างเปล่า น้องอาจต้องตรวจสอบการตั้งค่าใหม่ (อาจจะโฟลเดอร์ตั้งไม่ถูก) หรือไม่ก็อิมพอร์ตไฟล์ flow.json โดยการวางโค้ดลงไปตรงๆ เลยผ่าน เมนู-->Import ก็ได้
ติดตั้งโหนดที่จำเป็น
ครั้งแรกที่เปิด น้องอาจจะเห็นข้อความแจ้งว่ามีโหนดบางตัวหายไป นั่นเพราะแอปพลิเคชันนี้ต้องการโหนดต่อไปนี้:
- node-red-contrib-libgpiod: โหนดสำหรับควบคุม GPIO
- @arduino/node-red-contrib-arduino-iot-cloud: โหนดสำหรับสื่อสารกับ Arduino Cloud
- node-red-contrib-cpu: พี่ใช้โหนดนี้เพื่อสร้างค่าจำนวนเต็มส่งขึ้น Cloud ในตัวอย่างนี้พี่ส่งค่าโหลดของ CPU
วิธีการติดตั้งโหนดง่ายมาก แค่คลิกที่ เมนู-->Manage Palette ในเมนูหลัก
จากนั้นไปที่แท็บ Install ค้นหาโมดูลที่บอกไว้ด้านบน แล้วติดตั้งมันซะ
3. พัฒนาแอปพลิเคชัน Node-RED ของน้อง
ถ้าทุกอย่างทำงานถูกต้อง น้องควรจะเห็นภาพเหมือนด้านบน
ถึงเวลาตั้งค่าโหนดกันแล้ว
ตั้งค่าโหนด Arduino Cloud
มาเริ่มกันที่โหนด Arduino Cloud ก่อน สำหรับแต่ละโหนด น้องต้องทำตามนี้:
- เลือก Connection
หมายเหตุ: ครั้งแรก น้องจะต้องตั้งค่า Connection และใส่ API secrets
Client IDกับClient Secretลงไป
- เลือก
Thingจากเมนูแบบเลื่อนลง - เลือก
Property(ตัวแปร) จากเมนูแบบเลื่อนลง - ติ๊กถูกที่ช่อง
Send as device - เลือก
Deviceจากเมนูแบบเลื่อนลง


ตั้งค่าโหนด GPIO
มาเริ่มกันที่โหนด GPIO IN ก่อน ดับเบิลคลิกที่โหนดแล้วตั้งค่า:
- Device --> ตั้งค่าเป็น
gpiochipXของน้อง (ในตัวอย่างคือ gpiochip4) - Type: Digital pin
- Pin --> ตั้งค่าเป็นหมายเลขพินที่ใช้

ต่อไป ตั้งค่าโหนด GPIO OUT ดับเบิลคลิกที่โหนดแล้วตั้งค่า:
- Device --> ตั้งค่าเป็น
gpiochipXของน้อง (ในตัวอย่างคือ gpiochip4) - Type: Digital (0/1)
- Pin --> ตั้งค่าเป็นหมายเลขพินที่ใช้

Deploy
กดปุ่ม Deploy ที่มุมขวาบนเพื่อเผยแพร่โฟลว์ จัดไปวัยรุ่น!
4. สร้างแดชบอร์ด Arduino Cloud
แดชบอร์ดที่เรากำลังจะสร้างกันเนี่ย มันจะออกมาเป็นแบบนี้แหละ

มี 2 วิธีให้เลือกสร้างแดชบอร์ดนะ:
- สร้างเองมือ จัดไปวัยรุ่น! ลอกแบบจากภาพด้านบนตามคู่มือการสร้างแดชบอร์ดได้เลย
- วิดเจ็ต LED ต้องลิงก์กับตัวแปร
ledนะ - วิดเจ็ต Value ต้องลิงก์กับตัวแปร
test_value - วิดเจ็ต Button ต้องลิงก์กับตัวแปร
button
- วิดเจ็ต LED ต้องลิงก์กับตัวแปร
- โคลนของสำเร็จรูป จากบทความนี้เลย ตามคู่มือในภาคผนวกของโปรเจกต์นี้ได้
5. ทดสอบระบบทั้งหมด
ถ้าทำถูกต้องทุกขั้นตอน น้องควรจะเห็นสิ่งต่อไปนี้:
- ทุกครั้งที่น้องกดปุ่มจริงๆ บนบอร์ด วิดเจ็ตปุ่มในแดชบอร์ดก็จะอัปเดตตาม
- ทุกครั้งที่น้องเปลี่ยนสถานะ LED ในแดชบอร์ด ไฟ LED จริงๆ บนบอร์ดก็จะติดหรือดับตาม
- ค่าของ
test_valueจะแสดงค่า CPU load ของ Raspberry Pi ที่อัปเดตทุก 5 วินาที และน้องจะเห็นกราฟมันวิ่งในแดชบอร์ด
จัดไป! สนุกกับการควบคุมขา GPIO จากคลาวด์ได้เลย
System Interoperability: Arduino Cloud ไปหา RasPi
Arduino IoT Cloud ออกแบบมาเพื่อจัดการกับ ESP32 และบอร์ดตระกูล MKR โดยตรง แต่ Raspberry Pi มันเป็นระบบ Linux-based คนละเรื่องกันเลย โปรเจกต์ Arduino Cloud Node-RED Bridge นี้จะสอนเรื่อง "สถาปัตยกรรมโบรกเกอร์" แบบขั้นสูง แทนที่จะบังคับให้สองระบบนี้มาสู้กัน เราสร้างชั้นแปลภาษาขึ้นมาโดยใช้ Node-RED ทำให้แดชบอร์ดกราฟิกสวยๆ บน Arduino Cloud สามารถสั่งงานขา GPIO จริงๆ ของไมโครคอมพิวเตอร์ Linux ได้ทันที
The Node-RED Canvas Architecture
เราไม่ต้องเขียน C++ หรือ Python เพื่อแก้ปัญหานี้นะ เราจะใช้ Visual Flow-Based Programming แทน
- Raspberry Pi บูตระบบ Linux ขึ้นมา แล้วเราติดตั้ง Node-RED (ซอฟต์แวร์เซิร์ฟเวอร์ทรงพลังที่พัฒนาโดย IBM)
- เราเปิดแคนวาสของ Node-RED ในเบราว์เซอร์ มันจะดูเหมือนแผนภูมิการไหล (flowchart) ขนาดใหญ่
- เราติดตั้งปลั๊กอินเฉพาะทาง
node-red-contrib-arduino-iot-cloud - โฟลว์การแปลภาษา:
- ลากบล็อก
Arduino Propertyมาวางบนแคนวาส แล้วตั้งค่า Authentication ด้วย Arduino Cloud API key ของเรา มันจะคอยฟังสถานะจากปุ่มในแดชบอร์ดคลาวด์ของเรา (เช่น "เปิดปั๊ม") - ลากบล็อกมาตรฐาน
Raspberry Pi GPIO Outมาวางบนแคนวาส แล้วแมปมันให้ตรงกับ Physical Pin 12 บน Pi - ลากเส้นเชื่อมระหว่างบล็อกทั้งสองเข้าไว้ด้วยกัน! ง่ายมั้ยล่า
- ลากบล็อก
Bypassing the Microcontroller
โปรเจกต์นี้แสดงให้เห็นถึงการทำ Abstraction ของฮาร์ดแวร์ในระดับสุดยอด
- เรากำจัดความจำเป็นในการใช้บอร์ด Arduino จริงๆ ไปได้เลย!
- พอน้องแตะปุ่มในแอป Arduino IoT Cloud ขณะนั่งจิบกาแฟอยู่ที่โตเกียว...
- คำสั่งนั้นจะวิ่งไปยังเซิร์ฟเวอร์ Azure ของ Arduino ซอฟต์แวร์ Node-RED ที่กำลังทำงานอยู่ในบ้านน้องที่ลอนดอนจะดักจับ Webhook จาก API ทันที Node-RED จะแปลคำสั่งผ่านโฟลว์ที่เราสร้างไว้ แล้วสั่งงานคำสั่ง Python ระดับล่างภายในโปรเซสเซอร์ของ Raspberry Pi โดยตรง เพื่อดัน Pin 12 ขึ้นไปที่ 3.3V, กระตุ้นรีเลย์ให้เปิดเครื่องชงกาแฟ! สุดยอดไปเลยมั้ย
ตั้งตั้วโครงสร้างพื้นฐานบนคลาวด์ (Cloud Infrastructure Setup)
- Raspberry Pi (รุ่น 3 หรือ 4) ที่รันระบบปฏิบัติการ Raspberry Pi OS อยู่
- แพ็กเกจเซิร์ฟเวอร์ Node-RED ติดตั้งไว้บน Pi ตัวนี้แล้ว
- บัญชี Arduino IoT Cloud พร้อมกับ API credentials ที่สร้างไว้แล้ว
- โมดูลรีเลย์ (Relay Modules) หรือ LED ต่อเข้ากับขา GPIO ของ Pi เพื่อใช้แสดงผลเอาต์พุต (จัดไปวัยรุ่น!)
สู้งานนะน้อง! ห้ามช็อตนะตัวนี้