Network Architecture: Arduino + Raspberry Pi
Arduino นี่แหละที่เทพเรื่องอ่านค่าจากเซนเซอร์ แต่ถ้าให้มันมาทำเป็นเว็บเซิร์ฟเวอร์หรือเก็บข้อมูลในฐานข้อมูลเนี่ย... อย่าหวังเลยวัยรุ่น! ส่วน Raspberry Pi นั้นคือคอมพิวเตอร์ Linux เต็มตัว แต่มันดันไม่มีขา Analog ไว้ต่อเซนเซอร์อีกต่างหาก โครงการ IoT Ecosystem นี้เลยมาจัดการปัญหานี้ด้วยการจับสองแพลตฟอร์มนี้มาทำงานร่วมกันผ่านเครือข่ายวิทยุ nRF24L01
ภาพรวม
รุ่นพี่พัฒนาชุดซอฟต์แวร์สำหรับสื่อสารบนโมดูลวิทยุ nRF24 ขึ้นมา โดยออกแบบตามโมเดล OSI ใช้เวลาพัฒนามาหลายปี จนตอนนี้เรียกได้ว่าครบถ้วนและใช้งานได้จริงแล้วล่ะ มันรองรับสถานการณ์การสื่อสารได้หลากหลายรูปแบบมาก โดยมีเลเยอร์แบบ Mesh ที่ทำให้โหนดไร้สายสามารถหาเส้นทางสื่อสารใหม่ผ่านเครือข่ายได้อัตโนมัติ ถ้าเส้นทางเดิมใช้ไม่ได้ มันก็จะใช้โหนดอื่นๆ เป็นสะพานเชื่อมต่อแทน
ที่เราจะพูดถึงต่อไปนี้คือหนึ่งในสถานการณ์การใช้งานขั้นสูงของมันเลย
พูดง่ายๆ ก็คือ เราใช้ Raspberry Pi ที่ต่ออินเทอร์เน็ตไว้แล้วเป็นประตูเชื่อม (Gateway) สำหรับอุปกรณ์ Arduino ทั้งหมดของเรา โดย Arduino แต่ละตัวจะรันสแต็ก IP ของตัวเองและสื่อสารกับ Pi โดยตรงผ่านโปรโตคอล MQTT วิธีนี้ทำให้เราส่งและรับข้อมูลจาก Arduino ได้จากอุปกรณ์หรือซอฟต์แวร์ใดๆ ก็ตามที่รองรับ MQTT แม้แต่มือถือก็ทำได้! และทั้งหมดนี้สื่อสารกันแบบไร้สายผ่านโมดูลวิทยุ nrf24l01
คำแนะนำต่อไปนี้จะถือว่าเพื่อนๆ ต่อสายโมดูลวิทยุเรียบร้อยและพร้อมใช้งานแล้วนะ ถ้ายังไม่เคยต่อ ลองหาอ่าน Tutorial การตั้งค่าและการส่งข้อความง่ายๆ ดูได้ มีเยอะแยะเลย

โมเดล Hub and Spoke
- โหนด Spoke (Arduinos): วางชุด Arduino Nano ราคา
$5+ โมดูลวิทยุ nRF24L01 + เซนเซอร์วัดอุณหภูมิ DHT22 ไว้ในทุกห้องของบ้าน มันจะตื่นจากโหมด Deep Sleep, ยิงแพ็กเก็ตข้อมูลผ่านวิทยุไปหา Hub, แล้วก็กลับไปนอนต่อ - ฮับ (Raspberry Pi): Raspberry Pi ตัวหนึ่งตั้งไว้ในห้องนั่งเล่น มันมีโมดูลวิทยุ nRF24L01 ทำหน้าที่เป็นตัวรับสัญญาณล้วนๆ
- ไลบรารี
RF24Network: ไลบรารีตัวนี้จะจัดการฟิสิกส์ซับซ้อนเรื่องการชนกันของแพ็กเก็ต (Packet Collision) เพื่อให้ Arduino 5 ตัวสามารถคุยกับ Pi เพียงตัวเดียวได้โดยไม่รบกวนกัน
การแสดงผลข้อมูล (Node-RED)
พลังที่แท้จริงของ Pi อยู่ที่ความสามารถด้านซอฟต์แวร์ของมันต่างหาก
- Pi จะรันสคริปต์ Python เพื่อรวบรวมข้อมูลวิทยุที่เข้ามา
- มันจะส่งข้อมูลเหล่านั้นเข้าไปใน MQTT Broker (เช่น Mosquitto) หรือฐานข้อมูล SQL
- มันรัน Node-RED หรือ HomeAssistant ด้วย ตอนนี้คุณก็ล็อกอินเข้าไปที่ IP Address ของ Pi จาก iPhone ได้เลย และจะเห็นแดชบอร์ดกราฟิกสวยงามที่แสดงอุณหภูมิเฉพาะของแต่ละห้องในบ้านคุณ!
วิธีตั้งค่า
ขั้นตอนแรกคือการติดตั้งไลบรารี RF24 ทั้งหลาย
- บน Arduino: วิธีที่ง่ายที่สุดคือเปิด Arduino Library Manager ขึ้นมา แล้วเลือกไลบรารี RF24Ethernet มันควรจะติดตั้งไลบรารี RF24 ที่จำเป็นทั้งหมดให้โดยอัตโนมัติ
- บนอุปกรณ์ Linux: มีสคริปต์สำหรับติดตั้งเขียนไว้แล้ว สามารถดูคำแนะนำการติดตั้งได้จากหน้าเอกสารหลักของไลบรารี ในสถานการณ์นี้ เราจะเลือกติดตั้งไลบรารี RF24 ทั้งหมด รวมถึงไลบรารี ncurses ด้วย และเลือกใช้ไดรเวอร์ SPIDEV เมื่อถูกถาม และอย่าลืมเลือกให้สร้างตัวอย่างโปรแกรม (Build Examples) เมื่อถูกถามด้วย
หากมีปัญหาใดๆ เกี่ยวกับตัวติดตั้งหรือไลบรารี สามารถแจ้งปัญหาได้ที่หน้า GitHub ของโปรเจกต์

เมื่อติดตั้งเสร็จแล้ว บน Raspberry Pi เราต้องเข้าไปที่โฟลเดอร์ตัวอย่างและคอมไพล์มัน:
cd rf24libs/RF24Gateway/examples/ncurses- ถ้าคุณใช้การต่อพินแบบค่าเริ่มต้นสำหรับโมดูล nrf24 กับ RPi ของคุณ ให้จากไดเรกทอรี
ncursesพิมพ์cd ../buildแล้วรันmakeเพื่อคอมไพล์ไฟล์ตัวอย่างได้เลย ถ้าไม่ใช่ ให้แก้ไขไฟล์ตามขั้นตอนที่ 3 - รัน
nano RF24Gateway_ncurses.cppเพื่อแก้ไขไฟล์ และเปลี่ยนบรรทัดRF24 radio(22, 0);ให้ตรงกับการต่อพินที่คุณเลือกไว้ จากนั้นรันmakeตามขั้นตอนที่ 2
เลื่อนลงไปดูข้อมูลการต่อสาย (wiring) ได้ที่เว็บไซต์ของไลบรารี
- RF24Gateway ออกแบบมาให้รันใน
screenนะจ๊ะ จะได้สั่งให้มันทำงานเบื้องหลัง แล้วยังสามารถเรียกใช้ GUI ได้ตามสะดวก ใช้คำสั่งsudo apt-get install screenติดตั้งก่อน แล้วก็รันscreenได้เลย ใช้ปุ่มลัดctrl+A+Dเพื่อออกจาก screen และคำสั่งscreen -rเพื่อกลับเข้าไปทำงานต่อ - รันคำสั่งต่อไปนี้เพื่อตั้งค่าอินเตอร์เฟซด้วยตัวเอง (ถ้าอยากให้ตั้งอัตโนมัติต้องรัน gateway ในโหมด root) ถ้าชื่อผู้ใช้ (username) ของนายไม่ใช่ 'pi' ก็แก้ไขคำสั่งให้ตรงหลัง 'user' ด้วย
sudo ip tuntap add dev tun_nrf24 mode tun user pi multi_queue sudo ifconfig tun_nrf24 10.10.2.2/24 - ถ้ายังไม่ได้เปิด อย่าลืมเปิด SPI interface บน RPi ด้วยคำสั่ง
sudo raspi-configนะตัวนี้ - พอ build บน Raspberry Pi เสร็จแล้ว เราสามารถ
cd ncursesจากโฟลเดอร์ build ได้เลย แล้วรัน./RF24Gateway_ncursesเพื่อทดสอบตัวอย่าง
ใกล้เสร็จแล้ววว! มันควรจะออกมาหน้าตาประมาณนี้:

ขั้นต่อไปบน RPi คือติดตั้ง mosquitto ซึ่งเป็น MQTT broker:
- รัน
sudo apt-get install mosquitto - รัน
nano /etc/mosquitto/mosquitto.confแล้วเพิ่มสองบรรทัดนี้เข้าไป: ก:allow_anonymous trueข:listener 1883 - รัน
sudo service mosquitto restartเพื่อโหลดการตั้งค่าใหม่
เรียบร้อยบน Raspberry Pi แล้ว! สู้งานนะน้อง
ขั้นตอนฝั่ง Arduino:
- เปิด Arduino library manager แล้วค้นหา RF24Ethernet ติดตั้งไลบรารีให้เรียบร้อย เราต้องการไลบรารี MQTT ที่ชื่อ "MQTT" โดย Joel Gaehwiler ด้วย
- เปิดตัวอย่างหนึ่งขึ้นมา: File -> Examples -> RF24Ethernet -> MQTT -> mqtt_basic
- ถ้าไม่ได้ใช้ขา 7 และ 8 สำหรับ CE กับ CS ตามลำดับ ก็ให้ตั้งค่าการต่อสายใน
RF24 radio(7, 8);ให้ถูกต้อง - อัพโหลดโค้ดลง Arduino ของนายได้เลย
ขั้นตอนฝั่งมือถือ:
บน iOS ของพี่ พี่ใช้แอปชื่อ MQTTool ใช้ง่ายดี ตราบใดที่ Raspberry Pi ของนายเชื่อมต่ออยู่ในเครือข่าย LAN เดียวกันกับมือถือ นายก็ควรจะส่งและรับข้อความจาก Arduino ได้แล้ว
- บน Raspberry พิมพ์
ifconfigเพื่อดูที่อยู่ IP มันจะเป็น eth0 หรือ wlan0 ก็แล้วแต่ว่านายเชื่อมต่อผ่าน WiFi หรือสายแลน - IP ที่ได้จากขั้นตอนที่ 1 นี่แหละ ที่นายต้องเอาไปใส่ในแอปบนมือถือ ในส่วนของการตั้งค่าการเชื่อมต่อ
- พอเชื่อมต่อได้แล้ว นายสามารถ publish ข้อความอะไรก็ได้ไปยังหัวข้อ (topic) ชื่อ inTopic แล้ว MQTT server จะส่งข้อความนั้นไปยัง Arduino ของนาย ซึ่งจะพิมพ์มันออกมาทางพอร์ตอนุกรม

- นายยังสามารถ subscribe ไปยังหัวข้อ 'outTopic' ได้ด้วย แล้วมือถือของนายก็จะเริ่มรับข้อความจากโหนดที่เชื่อมต่ออยู่
ถ้าอยากเพิ่มอุปกรณ์อีก ก็แค่เปลี่ยนที่อยู่ IP ในตัวอย่างสเก็ตช์จาก 10.10.2.4 เป็นเลขใน octet สุดท้ายตั้งแต่ 3-254 ตัวอื่นๆ เช่น 10.10.2.5 จัดไปวัยรุ่น
ต่อยอดจากตรงนี้:
นี่ก็น่าจะพอให้น้องเริ่มต้นกับ RF24Gateway/RF24Ethernet และ MQTT ได้ละ เรื่องยากที่สุดคือทำให้อุปกรณ์ตัวแรกมันรันได้นี่แหละ พอผ่านจุดนั้นมาแล้ว ที่เหลือก็แค่ปรับแต่ง Topic ของ MQTT กับข้อมูลที่ส่ง/รับกันไปตามใจชอบ
จะให้มันเจ๋งขึ้นไปอีก น้องสามารถลงซอฟต์แวร์อย่าง Node Red บน Raspberry Pi ได้เลย แล้วจะสร้างกราฟวาดชาร์ต ออกแบบสถานการณ์รับ-ส่งข้อมูล เช่น สวิตช์เปิดปิดอุปกรณ์ต่างๆ แบบระบบ Home Automation จัดไปวัยรุ่น
อินเตอร์เฟสวิทยุของ RPi ตัวนี้มันทำงานเหมือนเป็น Network Interface มาตรฐานเลย เพราะฉะนั้นเครื่องมือ โปรโตคอล และซอฟต์แวร์อีกเพียบเลยที่สามารถคุยกับ Arduino โหนดที่รัน RF24Ethernet อยู่ได้ จะเอาไปทำอะไรก็สุดแต่ไอเดียน้องเลย แถมถ้าอยากให้เข้าถึงจากที่ไหนก็ได้ ก็ลง VPN บน RPi เพิ่มเข้าไปอีกที ควบคุมหรือดูกราฟจากนอกบ้านก็ยังได้

หมายเหตุสำคัญนะตัวนี้:
การตั้งค่านี้ทำให้ RPi ของน้องมีอินเตอร์เฟสไร้สายที่เปิดใช้ IP แล้วนะ เพราะฉะนั้นอย่าลืมตั้งค่า Firewall ให้เหมาะสม และใช้พาสเวิร์ดที่แข็งแรงๆ ด้วยล่ะ เดี๋ยวจะมีใครแวะมาเยี่ยมไม่ได้รับเชิญเอาได้
อุปกรณ์ฮาร์ดแวร์สำคัญสำหรับ IoT
- Raspberry Pi 3 หรือ 4: ตัวกลางหลัก หรือ "โบรกเกอร์" นั่นแหละ
- Arduino Nano nodes (สัก 3 ถึง 5 ตัว).
- โมดูล nRF24L01 Transceiver.
- ไลบรารี RF24Network / RF24Mesh สำหรับ C++.
สู้งานนะน้อง!