ระบบสื่อสารไร้สายระหว่าง Raspberry PI กับ Arduino มีหลายวิธี ผมเคยเขียนถึงการใช้ Bluetooth มาแล้ว มาคราวนี้จะกล่าวถึงการใช้คลื่นวิทยุ[1,2]บ้างครับ พยายามหาข้อมูลอุปกรณ์ที่มีจำหน่ายในประเทศไทยก็จะพบ Zigbee หรือ Xbee [3] และ NRF24L01 [4] หากเทียบกันทางเทคนิคแล้ว Zigbee มีอะไรเยอะแยะกว่า ์NFR24L01 แต่ก็ราคาสูงกว่ามาก ดังนั้นหากมองว่า NRF24L01 เป็นทางเลือกสำหรับระบบสื่อสารที่ไม่ต้องการความซับซ้อนเชิงเทคนิคและต้นทุนต่ำก็ไม่ผิดนักนะครับ
NRF24L01 ใช้ช่วงความยาวคลื่นที่ 2.4 GHz [5] ซึ่งเป็นย่านความถี่เดียวกับ WiFi, GPS หรือวิทยุสมัครเล่น ในไทยเราผมเห็นมีจำหน่ายสองรูปแบบคือแบบที่มีเสาอากาศแบบ zig-zag (ซ้ายมือ) และแบบที่มี Power Amplifier (ขวามือ) ซึ่งมีราคาแตกต่างกัน แต่การใช้งานและตำแหน่งของ pin เหมือนกัน
ที่แตกต่างคือตัวเลขระยะห่างหรือ Range ระหว่างโมดูล ตามเอกสารจากผู้ผลิตหรือผู้จำหน่ายจะอ้างถึงตัวเลขที่แตกต่างกันเล็กน้อย แต่ก็อยู่ที่ประมาณ 100 เมตรในที่โล่ง (ในที่มีสิ่งกีดขวางเยอะระยะก็จะลดลง) สำหรับเสาอากาศ zig-zag แบบที่มี Power Amplifier ก็จะได้ระยะเพิ่มอีกเท่าตัว
ผมเข้าใจว่า NRF24L01 นี้กำลังได้รับความนิยมเพราะสังเกตุเห็นชุด Kit สำหรับการศึกษามี NRF24L01 ติดอยู่ด้วยหลายรายแล้ว เช่น http://yourduino.com/sunshop2/index.php?l=product_detail&p=395
, Bus, Star, Ring, Tree และ Mesh (เอกสารบางฉบับอาจมีการผสมกันระหว่างรูปแบบเหล่านี้ได้เพิ่มมาอีกหลายรูปแบบ)
ที่กล่าวถึงเรื่อง topology นี้ก็เพื่อจะบอกให้ทราบว่าข้อดีของการสื่อสารด้วย NRF24L01 ว่าช่วยให้เราสามารถสร้างโครงข่ายการสือสารระหว่าง Raspberry PI กับ Arduino ได้หลายรูปแบบมากขึ้น (ยกเว้นรูปแบบ Fully Mesh ซึ่งต้องใช้ Zigbee) ไม่ได้จำกัดอยู่กับอุปกรณ์เพียงสองชิ้นดังนั้นเราจึงสร้างประโยชน์จากรูปแบบการสื่อสารได้มากขึ้นตามไปด้วย
1.MOSI (Master Out Slave In) นำข้อมูลจาก Master ไปสู่ Slave
2.MISO (Master In Slave Out) นำข้อมูลจาก Slave ไปสู่ Master
3.SCLK (Serial Clock) เป็นสัญญาณนาฬิกาที่ Master เป็นผู้สร้างเพื่อให้กำกับเวลาในการสื่อสาร
สำหรับ SS (Slave Select) ไม่ได้เกี่ยวข้องกับการสื่อสารแต่เป็นตัวที่ใช้สำหรับการ ควบคุมเส้นทางการสื่อสาร
ทั้ง Arduino และ Raspberry PI ต่างก็มี PIN สำหรับใช้งานกับ SPI มาพร้อมแล้ว ดูรายละเอียดได้จากเว็บไซต์นี้ และส่วน Raspberry PI ทาง RPI.tv เขาก็ทำเอกสารไว้เรียบร้อยแล้วเช่นกัน
ตารางแสดงการต่อสายสัญญาณ
NRF24L01 จะมี 2 pin ที่ใช้ในการควบคุมการสื่อสารคือ CS กับ CSN โดย CS pin จะมี Mode เป็น Input เสมอ หากให้ค่าเป็น HIGH NRF24L01 จะทำการตรวจสอบอากาศเพื่อรับข้อมูล หากเป็น LOW ก็จะอยู่ในสภาพ stand by และพร้อมจะส่งข้อมูลออกไป ส่วน CSN จะเกี่ยวข้องกับการรับ-ส่งข้อมูลผ่าน SPI Bus ที่กล่าวมานี้ก็เพียงต้องการให้รายละเอียดเบื้องต้นเท่านั้น ในการทำงานจริงนั้น Library จะรับหน้าที่จัดการกำหนดค่าให้กับ Pin เหล่านี้ตามความเหมาะสมเอง อ่านเพิ่มเติมได้จาก Product Specification [8]
2. การใช้คำสั่ง raspi-config โดยอ้างอิงจาก http://www.raspberrypi-spy.co.uk/2014/08/enabling-the-spi-interface-on-the-raspberry-pi/
3. reboot หรือ restart Raspberry PI แล้วลองพิมพ์คำสั่ง ls /dev/ ดู จะพบ spidev0.0 และ spidev0.1 ดังภาพ
1. สร้างโฟลเดอร์สำหรับเก็บ Source บน Raspberry PI แล้วดาวน์โหลด Source มาไว้ในโฟลเดอร์นี้
จะพบว่ามีไฟล์ชื่อ setup.py อยู่
2. ปรับสภาพแวดล้อม Python ให้เหมาะสมก่อน
3. เร่ิมติดตั้ง
2. ในข่ายงานควรใช้ Firmware ที่เหมือนกัน การคละกันอาจทำให้การสื่อสารไม่มีประสิทธิผลได้
รู้จักกับ NRF24L01
NRF24L01 ใช้ช่วงความยาวคลื่นที่ 2.4 GHz [5] ซึ่งเป็นย่านความถี่เดียวกับ WiFi, GPS หรือวิทยุสมัครเล่น ในไทยเราผมเห็นมีจำหน่ายสองรูปแบบคือแบบที่มีเสาอากาศแบบ zig-zag (ซ้ายมือ) และแบบที่มี Power Amplifier (ขวามือ) ซึ่งมีราคาแตกต่างกัน แต่การใช้งานและตำแหน่งของ pin เหมือนกัน
ที่แตกต่างคือตัวเลขระยะห่างหรือ Range ระหว่างโมดูล ตามเอกสารจากผู้ผลิตหรือผู้จำหน่ายจะอ้างถึงตัวเลขที่แตกต่างกันเล็กน้อย แต่ก็อยู่ที่ประมาณ 100 เมตรในที่โล่ง (ในที่มีสิ่งกีดขวางเยอะระยะก็จะลดลง) สำหรับเสาอากาศ zig-zag แบบที่มี Power Amplifier ก็จะได้ระยะเพิ่มอีกเท่าตัว
ผมเข้าใจว่า NRF24L01 นี้กำลังได้รับความนิยมเพราะสังเกตุเห็นชุด Kit สำหรับการศึกษามี NRF24L01 ติดอยู่ด้วยหลายรายแล้ว เช่น http://yourduino.com/sunshop2/index.php?l=product_detail&p=395
Network Topology
Network Topology คือรูปแบบการเชื่อมโยงระหว่างอุปกรณ์หรือ Node ต่าง ๆ ในข่ายงานสื่อสาร รูปแบบที่ว่านี้ได้แก่ Point to Point เป็นรูปแบบที่ง่ายที่สุด เป็นการสื่อสารระหว่าง Node 2 Node, Bus, Star, Ring, Tree และ Mesh (เอกสารบางฉบับอาจมีการผสมกันระหว่างรูปแบบเหล่านี้ได้เพิ่มมาอีกหลายรูปแบบ)
ภาพจาก http://en.wikipedia.org/wiki/Network_topology |
ที่กล่าวถึงเรื่อง topology นี้ก็เพื่อจะบอกให้ทราบว่าข้อดีของการสื่อสารด้วย NRF24L01 ว่าช่วยให้เราสามารถสร้างโครงข่ายการสือสารระหว่าง Raspberry PI กับ Arduino ได้หลายรูปแบบมากขึ้น (ยกเว้นรูปแบบ Fully Mesh ซึ่งต้องใช้ Zigbee) ไม่ได้จำกัดอยู่กับอุปกรณ์เพียงสองชิ้นดังนั้นเราจึงสร้างประโยชน์จากรูปแบบการสื่อสารได้มากขึ้นตามไปด้วย
ตัวอย่าง Star topoly |
ตัวอย่าง Tree topology |
ใช้ SPI
Serial Peripheral Interface (SPI) [6,7] คือพิธีการสื่อสาร (communication protocol) ที่ Arduino และ Raspberry PI ใช้สื่อสารกับ NRF24L01 การสื่อสารผ่าน SPI นี้อุปกรณ์จะมีบทให้เล่นสองบทคือ Master ซึ่งจะเป็น Arduino หรือ Raspberry PI และ Slave ซึ่งก็คือตัว NRF24L01 และต้องอาศัยเส้นทางเดินของสัญญาณหลักอย่างน้อย 3 เส้นทางคือ1.MOSI (Master Out Slave In) นำข้อมูลจาก Master ไปสู่ Slave
2.MISO (Master In Slave Out) นำข้อมูลจาก Slave ไปสู่ Master
3.SCLK (Serial Clock) เป็นสัญญาณนาฬิกาที่ Master เป็นผู้สร้างเพื่อให้กำกับเวลาในการสื่อสาร
สำหรับ SS (Slave Select) ไม่ได้เกี่ยวข้องกับการสื่อสารแต่เป็นตัวที่ใช้สำหรับการ ควบคุมเส้นทางการสื่อสาร
ทั้ง Arduino และ Raspberry PI ต่างก็มี PIN สำหรับใช้งานกับ SPI มาพร้อมแล้ว ดูรายละเอียดได้จากเว็บไซต์นี้ และส่วน Raspberry PI ทาง RPI.tv เขาก็ทำเอกสารไว้เรียบร้อยแล้วเช่นกัน
การต่อสายสัญญาณ
กรณีตัวอย่างนี้ผมใช้การติดตั้ง NRF24L01 ไว้บนArduino Mega 2560 และ Raspberry PI Model B rev 2 เพียงอย่างละชุดเท่านั้นเพื่อทำการทดสอบการสื่อสารแบบจุดต่อจุด (point to point) ก่อนรูปแสดง PIN Diagram ของ NRF24L01 จาก http://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo |
ตารางแสดงการต่อสายสัญญาณ
NRF24L01 Plus | Arduino Mega 2560 |
---|---|
VCC | 3.3V |
GRD | GRD |
CE | 9 |
CSN | 10 |
SCK | 52 |
MOSI | 51 |
MISO | 50 |
IRQ | No use |
NRF24L01 Plus | Raspberry PI |
---|---|
VCC | 3.3V (pin 1) |
GRD | GRD (pin 6) |
CE | GPIO 25 (pin 22) |
CSN | GPIO 8 (pin 24) |
SCK | GPIO 11 (pin 23) |
MOSI | GPIO 10 (pin 19) |
MISO | GPIO 9 (pin 21) |
IRQ | GPIO 18 (pin 12) |
Arduino รุ่นอื่น ๆ มักจะกำหนด SPI pins ดังนี้
Pin 11 : MOSI
Pin 12 : MISO
Pin 13: SCK
NRF24L01 จะมี 2 pin ที่ใช้ในการควบคุมการสื่อสารคือ CS กับ CSN โดย CS pin จะมี Mode เป็น Input เสมอ หากให้ค่าเป็น HIGH NRF24L01 จะทำการตรวจสอบอากาศเพื่อรับข้อมูล หากเป็น LOW ก็จะอยู่ในสภาพ stand by และพร้อมจะส่งข้อมูลออกไป ส่วน CSN จะเกี่ยวข้องกับการรับ-ส่งข้อมูลผ่าน SPI Bus ที่กล่าวมานี้ก็เพียงต้องการให้รายละเอียดเบื้องต้นเท่านั้น ในการทำงานจริงนั้น Library จะรับหน้าที่จัดการกำหนดค่าให้กับ Pin เหล่านี้ตามความเหมาะสมเอง อ่านเพิ่มเติมได้จาก Product Specification [8]
การติดตั้ง Arduino Library
อ้างอิงจาก http://playground.arduino.cc/InterfacingWithHardware/Nrf24L01 แล้วจะเห็นว่ามีผู้สร้าง Library สำหรับใช้งานหลายราย แต่หากลองดูในรายละเอียดแล้วทั้งหมดจะมีวิิธีการใช้งานเหมือนกัน และเนื่องจากผมมีแผนจะใช้งานกับ Python บน Raspberry PI ด้วย ดังนั้นผมจึงเลือกเอา Library ที่มีการ port ออกไปเป็น Python แล้วของ https://github.com/stanleyseow/RF24 ครับการติดตั้ง Libraries ให้กับ Raspberry PI
จากที่กล่าวมาแล้วข้างต้นว่า NRF24L01 ใช้ SPI bus ดังนั้นเราต้องทำให้ Raspberry PI สามารถใช้งาน SPI Bus ให้ได้เสียก่อนการเปิดใช้งาน SPI Bus
1. แก้ไข /etc/modprobe.d/raspi-blacklist.conf แล้วนำเอาเครื่องหมาย # ข้างหน้าข้อความ blacklist spi-bcm2708 ออก แล้วบันทึก หรือ2. การใช้คำสั่ง raspi-config โดยอ้างอิงจาก http://www.raspberrypi-spy.co.uk/2014/08/enabling-the-spi-interface-on-the-raspberry-pi/
3. reboot หรือ restart Raspberry PI แล้วลองพิมพ์คำสั่ง ls /dev/ ดู จะพบ spidev0.0 และ spidev0.1 ดังภาพ
ติดตั้ง py-spidev
py-spidev เป็น library ที่ทำให้เราเขียนโปรแกรมภาษา Python ติดต่อกับอุปกรณ์อื่นผ่าน SPI bus ได้ โดยสามารถใช้ได้ทั้ง Python 2.7 และ Python 31. สร้างโฟลเดอร์สำหรับเก็บ Source บน Raspberry PI แล้วดาวน์โหลด Source มาไว้ในโฟลเดอร์นี้
จะพบว่ามีไฟล์ชื่อ setup.py อยู่
2. ปรับสภาพแวดล้อม Python ให้เหมาะสมก่อน
$sudo apt-get update $sudo apt-get upgrade $sudo apt-get install python-dev
3. เร่ิมติดตั้ง
$ sudo python setup.py install
ข้อสังเกตุ
1. NRF24L01 ต้องใช้แรงดันไฟฟ้าไม่เกิน 3.3 V2. ในข่ายงานควรใช้ Firmware ที่เหมือนกัน การคละกันอาจทำให้การสื่อสารไม่มีประสิทธิผลได้
ความคิดเห็น
แสดงความคิดเห็น