LAB2 — [M2] — Node-RED on Raspberry Pi

Puwanat Torcheewee
7 min readApr 8, 2020

--

Node-RED เป็นเครื่องมือสำหรับนักพัฒนาโปรแกรมในการเชื่อมต่ออุปกรณ์ฮาร์ดแวร์เข้ากับ APIs (Application Programming Interface) ซึ่งเป็นการพัฒนาโปรแกรมแบบ Flow-Based Programming ที่มีหน้า UI สำหรับนักพัฒนาให้ใช้งานผ่าน Web Browser ทำให้การเชื่อมต่อเส้นทางการไหลของข้อมูลนั้นเป็นเรื่องง่าย

เนื่องจาก Node-RED เป็น Flow-Based Programming นั้นทำให้เราแทบจะไม่ต้องเขียน Code ในการพัฒนาโปรแกรมเลย แค่เพียงเลือก Node มาวางแล้วเชื่อมต่อก็สามารถควบคุม I/O ได้โดย Node-RED จะมี Node ให้เลือกใช้งานอย่างหลากหลายสามารถสร้างฟังก์ชัน JavaScript ได้โดยใช้ Text Editor ที่มีอยู่ใน Node-RED และยังสามารถบันทึก Function, Templates, Flows เพื่อไปใช้งานกับงานอื่นต่อไป Node-RED นั้นทำงานบน Node.js ทำให้เหมาะสำหรับการใช้งานกับ Raspberry Pi เนื่องจากใช้ทรัพยากรน้อย ขนาดไฟล์ไม่ใหญ่และ Node.js ยังทำหน้าที่เป็นตัวกลางให้ Raspberry Pi สามารถติดต่อกับ Web Browser และอุปกรณ์อื่นๆ ได้

แนะนำ การใช้งาน WebIOPi : คลิกที่นี่

ทดสอบติดตั้งและใช้งาน Node-RED

  1. ตรวจสอบว่า Raspberry pi มี Node-RED โดยพิมพ์คำสั่งที่ terminal
$ node-red

ถ้ามีจะขึ้นดังรูป หากไม่มีให้ทำดังนี้ : คลิกที่นี่

]

2. เข้า Web browser โดยพิมพ์ IP Address ของ raspberry pi โดยใช้ port 1880 เช่น 192.168.1.49:1880

  • **หมายเหตุ เราสามารถเข้า IP Address เพื่อใช้ node-red ใน Browser ที่อยู่ใน windows ได้ หรือจะเข้า Browser ใน RPi ก็ได้

เริ่มการทดลอง

การทดลองที่ 1 LED Output Control

➽ ขั้นแรกต้องเตรียมโปรแกรมให้พร้อม

  • เข้า Node-RED
  • เลื่อนลงมาที่ Raspberry pi เลือก rpi gpio out แล้วลากออกมา
  • double click ที่ PIN เพื่อ Set ค่า (ในตัวอย่างเลือก PIN 13 (GPIO27))
  • เพิ่ม Trigger และ Set ค่า
  • เพิ่ม inject -> payload เลือก timestamp
  • ลากเส้นเชื่อมต่อกันทั้งหมด แล้วกด deploy ที่มุมขวา

➽ ต่อวงจรดังรูป

  • ใช้ PIN 6 (GND) ต่อขาลบของLEDและขาตัวต้านทาน
  • ใช้ PIN 13(เลือกไว้ตอนแรกในPIN) ต่อขาบวกของLED

➽ จะได้ผลลัพธ์ เมื่อกดปุ่มที่ inject ไฟจะติด

การทดลองที่ 2 Switch Input/LED Output

  • เลื่อนลงมาที่ Raspberry pi เลือก rpi gpio out แล้วลากออกมาแล้ว set ค่า PIN ในตัวอย่างเลือก PIN 11 (GPIO 17)
  • เลือก rpi gpio in ลากออกมา set ค่า ในตัวอย่างเลือก PIN 15 (GPIO 22) แล้ว Resister? = pullup
  • นำมาเชื่อมกัน แล้วกด deploy ด้านมุมขวามือ

➽ ต่อวงจร ดังรูป

➽ จะได้ผลลัพธ์

การทดลองที่ 3 Send/Recieve Massage and IoT Broker

Message Queuing Telemetry Transport (MQTT) เป็น Protocol ที่ออกแบบมาเพื่อ การเชื่อมต่อแบบ M2M (machine-to-machine) ออกแบบมาให้สนับสนุน IoT (Internet of Thing) คือเทคโนโลยีที่อินเทอร์เน็ตเชื่อมต่อกับอุปกรณ์ต่างๆ เช่น Smart phone, Raspberry pi เป็นต้น ทําให้เราสามารถเชื่อมต่ออุปการณ์เข้าด้วยกันผ่านระบบอินเตอร์เน็ตได้ และยังออกแบบ มาเพื่อใช้งานกับอุปกรณ์อิเล็กทรอนิกส์ขนาดเล็ก การรับส่งข้อมูลในเครือข่ายที่มีขนาดเล็ก แบนวิธต่ำ ใช้หลักการแบบ Publisher / Subscriber และมีตัวกลางคือ Broker ซึ่งจะคอยจัดการกับ ข้อมูลจาก Publisher และ Subscriber

➽สรุปองค์ประกอบของ MQTT Protocol

  • Broker ทําหน้าที่เป็นตัวกลางคอยจัดการกับ ข้อความโดย อ้างอิงจาก Topic
  • Publisher ทําหน้าที่คอยส่งข้อมูลไปยัง Topic
  • Subscriber ทําหน้าที่คอยดูการเปลี่ยนแปลงของ message ที่อ้างอิงด้วยTopic เช่นถ้ามี หัวข้อหน้าสนใจและมีการเปลี่ยนแปลงก็จะทําการดึงข้อมูลนั้นๆ มาใช้งาน
  • QoS คือ คุณภาพหรือความสําคัญของการส่งข้อมูล QoS0 คือการส่งข้อมูลเพียงครั้งเดียว ปลายทางอาจจะได้รับหรือไม่ได้รับก็ได้ QoS1 คือการส่งข้อมูลเพียงครั้งเดียว ปลายทางอาจจะได้รับหรือไม่ได้รับก็ได้ แต่จะมีการจําข้อมูลที่ส่งล่าสุดไว้ เมื่อมีการเชื่อมต่อ เข้ามาก็จะได้รับข้อมูลล่าสุดที่ส่งไป QoS2 คือการส่งข้อมูลไปจนการปลายทางจะได้รับ

แนะนํา Link ของ Broker

  • Iot.eclipse.org Port1883
  • broker.hivemq.com Port 1883 ( เป็น Broker ที่ใช้ในบทความนี้ )
  • test.mosquitto.org Port 1883

➽ การใช้งาน Node MQTT เบื้องต้น

  1. ให้เราเลือก node inject เปลี่ยนชนิดเป็น String ส่งข้อความไปยัง Topic ว่า Hello MQTTlens

2. ให้เราเลือก node mqtt ฝั่ง Output มาจากนั้นให้เข้าไปใส่ Link ของ Broker และใส่ชื่อ Topic ชื่อว่า SendToMQTTlens

3. เชื่อมต่อ node แล้วกด Deploy จากนั้นให้รอจนกว่า node mqtt จะขึ้นสถานะว่า connected

4. จากนั้นให้เลือก node mqtt ฝั่ง input และ node debug ใส่ Link ของ Broker และ Topic ให้ตรงกับ node mqtt ฝั่ง output จากนั้นให้กด Deploy

ขึ้น connected 2 ที่ถือว่าใช้งานได้

5. จากนั้นติดตั้ง application MQTTlens ใน google

6. เข้าไปใน application MQTTlens จากนั้นให้เพิ่มการเชื่อมต่อแล้วคลิกที่ Connections

7. ให้ใส่ Link ของ Broker เข้าไป port 1883 จากนั้นให้คลิกที่ CREATE CONNECTION

]

8. พอเข้าหน้านี้แล้วให้ใส่ SendToMQTTlens ที่ SUBSCRIBE เพื่อเชื่อมต่อกับ Node-RED ให้รับข้อความมาแสดงที่ MQTTlens และใส่ SendToMQTTlens ที่ PUBLISH เพื่อส่งข้อความไปแสดงที่ Node-RED

9. ทดสอบส่งข้อความจาก MQTTlens ไปที่ Node-RED โดยพิมพ์ข้อความที่ต้องการส่งที่ Massage ตัวอย่าง “HELLO! Node-RED” จากนั้นให้คลิกที่ปุ่ม PUBLISH เพื่อส่งข้อความ

10. ไปที่ Node-RED เพื่อดูข้อความที่ส่งมาจาก MQTTlens

=> ข้อความจะแสดง ที่ debug เหมือนจากที่เราส่งมาจาก MQTTlens

11. แล้วให้คลิกที่ปุ่ม SUBSCRIBE เพื่อเชื่อมต่อกับ Node-RED เพื่อให้รับข้อความมาแสดงที่ MQTTlens จะขึ้นดังรูป

12. ทดสอบการส่งข้อความจาก Node-RED ไปที่ MQTTlens โดยการคลิกที่ปุ่ม inject ที่เรากำหนดข้อความไว้ครั้งแรก

เมื่อคลิกส่งแล้วจะแสดงข้อความที่เราต้องการส่งที่ช่อง debug

13. ไปที่ MQTTlens เพื่อไปดูข้อความที่ Node-RED ส่งเข้ามา ข้อความที่ส่งมาคือ “Hello MQTTlens”

➽ผลการทำงาน

โจทย์ท้าทาย

การทดลองที่ 4 อ่าน CPU and GPU Temperature ด้วย NodeRED

เราจะใช้ Node-RED UI จะเป็นส่วนเสริมของโปรแกรม Node-RED เพื่อให้โปรแกรม Node-RED สามารถสร้าง UI ไว้สําหรับการแสดงผลผ่าน UI ได้

  1. ตรวจสอบว่า Raspberry Pi ของเรานั้นมี npm หรือไม่โดยพิมพ์คําสั่ง
$ npm -v

2. หากไม่มีให้ทําการติดตั้งโดยพิมพ์คําสั่ง

$ sudo apt-get install npm

3. จากนั้นให้พิมพ์คําสั่ง เพื่อเข้าไปใน Home ของ node-red

$ cd $HOME/.node-red

4. ให้พิมพ์คําสั่ง เพื่อลง Node-RED Dashboard

$  npm install node-red-dashboard

5. จากนั้นให้เปิดใช้งาน Node-red แล้วเข้า web Browser ใส่ IP Address port 1880 ตามด้วย /ui

6. ก็จะแสดงหน้าของ Node-RED UI ขึ้นมา

7. ตรงแถบเครื่องมือก็จะมี node สําหรับการสร้าง dashbooard เพิ่มขึ้นมาด้วย

  • *** โค้ดเพื่อเช็คดูอุณหภูมิของ CPU และ GPU พิมพ์ลงใน PYTHON3 (IDLE) แล้ว save file ชื่อว่า TempCPU.py

-> พิมพ์คำสั่งนี้เพื่อดูอุณหภูมิ

$ sudo python3 TempCPU.py
ผลลัพธ์จะส่งค่าอุณหภูมิมาทุกๆ 5 วินาที

8. ลาก inject ออกมา แล้วดับเบิลคลิกที่ icon ให้เลือก Repeat -> Interval แล้วใช้ Default ของ every = 1 secons คือสั่งทำงานทุกๆ 1 วินาที

9. แล้วไปที่ fucntion เลือกเอา exec เพื่อแรับค่าอุณหภูมิของ GPU ดับเบิลคลิกแล้วใส่คำสั่งที่ตำแหน่ง

  • Command => /opt/vc/bin/vcgencmd
  • ล่าง + Append => measure_temp

ตามรูป

10. แล้วไปที่ fucntion เลือกเอา exec เพื่อรับค่าอุณหภูมิของ CPU ดับเบิลคลิกแล้วใส่คำสั่งที่ตำแหน่ง

  • Command => cat
  • ล่าง + Append => /sys/class/thermal/thermal_zone0/temp

ตามรูป

11. แล้วไปที่ fucntion เลือกเอา function เพื่ออ่านอุณหภูมิของ GPU ดับเบิลคลิกแล้วพิมพ์โค้ดใส่

12. แล้วไปที่ fucntion เลือกเอา function เพื่ออ่านอุณหภูมิของ CPU ดับเบิลคลิกแล้วพิมพ์โค้ดใส่

13. แล้วไปที่ dashboard เลือกเอา gauge เพื่อแสดงอุณหภูมิของ CPU และ GPU บน gauge ดับเบิลคลิกตั้งค่าตามรูป

  • ฝั่ง GPU
  • ฝั่ง CPU ช่องของ Group จะเลือกให้แล้วจากที่เราตั้งไว้ใน GPU

14. แล้วไปที่ common เลือกเอา debug เพื่อแสดงอุณหภูมิของ CPU และ GPU

15. เชื่อมโหนดต่อกันตามรูปแล้วกด Deploy มุมขวามือ

16. จากไปที่ IP Address port 1880 ตามด้วย /ui ในตัวอย่างคือ 192.168.1.49:1880/ui เพื่อดูผลลัพธ์

แสดงค่าอุณหภูมิที่ debug ด้วย

เอกสาร PDF สำหรับ Offline : link

--

--