สร้างระบบสือสารไร้สายให้กับ Raspberry PI กับ Arduino ด้วย NRF24L01 Module

ระบบสื่อสารไร้สายระหว่าง Raspberry PI กับ Arduino มีหลายวิธี ผมเคยเขียนถึงการใช้ Bluetooth มาแล้ว มาคราวนี้จะกล่าวถึงการใช้คลื่นวิทยุ[1,2]บ้างครับ  พยายามหาข้อมูลอุปกรณ์ที่มีจำหน่ายในประเทศไทยก็จะพบ Zigbee หรือ Xbee [3] และ  NRF24L01 [4] หากเทียบกันทางเทคนิคแล้ว Zigbee มีอะไรเยอะแยะกว่า ์NFR24L01 แต่ก็ราคาสูงกว่ามาก ดังนั้นหากมองว่า NRF24L01 เป็นทางเลือกสำหรับระบบสื่อสารที่ไม่ต้องการความซับซ้อนเชิงเทคนิคและต้นทุนต่ำก็ไม่ผิดนักนะครับ


รู้จักกับ NRF24L01


NRF24L01 ใช้ช่วงความยาวคลื่นที่ 2.4 GHz [5] ซึ่งเป็นย่านความถี่เดียวกับ WiFi, GPS หรือวิทยุสมัครเล่น  ในไทยเราผมเห็นมีจำหน่ายสองรูปแบบคือแบบที่มีเสาอากาศแบบ zig-zag (ซ้ายมือ) และแบบที่มี Power Amplifier (ขวามือ) ซึ่งมีราคาแตกต่างกัน แต่การใช้งานและตำแหน่งของ pin เหมือนกัน




NRF24l01 Nordic Semiconductor radio

NRF24l01-pa-lna-duck


ที่แตกต่างคือตัวเลขระยะห่างหรือ 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 PlusArduino Mega 2560
VCC3.3V
GRDGRD
CE9
CSN10
SCK52
MOSI51
MISO50
IRQNo use

NRF24L01 PlusRaspberry PI
VCC3.3V (pin 1)
GRDGRD (pin 6)
CEGPIO 25 (pin 22)
CSNGPIO 8 (pin 24)
SCKGPIO 11 (pin 23)
MOSIGPIO 10 (pin 19)
MISOGPIO 9 (pin 21)
IRQGPIO 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 3

1. สร้างโฟลเดอร์สำหรับเก็บ 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 V 
2. ในข่ายงานควรใช้ Firmware ที่เหมือนกัน การคละกันอาจทำให้การสื่อสารไม่มีประสิทธิผลได้

 

 ตัวอย่างโปรแกรม

code ตัวอย่างทั้ง Arduino Sketch และ Raspberry PI มีที่ Github 

ความคิดเห็น