สื่อสารไร้สายด้วย radio
ความพิเศษของไมโครคอนโทรลเลอร์ nRF51822 ที่อยู่บนบอร์ด Nanobit อีกอย่างคือมีโมดูลบลูทูธแบบกินกำลังงาน (BLE) ซึ่งนอกจากจะทำงานในโหมดบลูทูธได้แล้ว ยังทำงานในโหมดไร้สายเพื่อสื่อสารระหว่าง Nanobit ด้วยกันได้อีกด้วย
งานนี้ต้องมี Nanobit 2 ชุดขึ้นไปเพื่อทดลอง
จากรูป Nanobit 2 ตัว สามารถให้ตัวที่ 1 เป็นตัวส่งและให้ตัวที่ 2 เป็นตัวรับ หรือสลับกันทั้งรับและส่งข้อมูลก็ได้
ชุดคำสั่ง radio สำหรับการสื่อสารไร้สายimport radio #เพื่อผนวกโมดูล radio ในตอนต้นของโปรแกรม radio.on() #สำหรับเปิดการใช้งานสื่อสารไร้สาย radio.off() #สำหรับปิดการใช้งานสื่อสารไร้สาย radio.send(msg) #ส่งข้อมูลแบบ broadcasts msg คือข้อมูลแบบ String radio.receive() #สำหรับอ่านข้อมูลที่ได้รับเข้ามาและคืนค่าเป็นสตริงข้อมูล |
เตรียม Python Editor สำหรับการต่อ Nanobit 2 ตัวพร้อมกัน
เพื่อให้สามารถแยกกันดาวน์โหลดโค้ด สำหรับชุดบอร์ด Nanobit ตัวที่ 1 และตัวที่ 2 สามารถเสียบบอร์ด Nanobit เข้ากับคอมพิวเตอร์ทั้งสองตัวได้พร้อมกัน ทำตามขั้นตอนดังนี้
1. เสียบบอร์ด Nanobit ตัวที่ 1 และตัวที่ 2 เข้ากับช่อง USB ของคอมพิวเตอร์
2. ที่ Browser Google Chrome หรือ Microsoft Edge เข้าไปที่ https://python.microbit.org ไว้ทั้งสอง หน้าต่าง
3. กดปุ่ม เพื่อเชื่อมต่อบอร์ด Nanobit
4. หน้าต่างจะแสดงอุปกรณ์ขึ้นมา 2 ตัวด้วยรหัสเลขตามหลังที่แตกต่างกัน สำหรับหน้าต่าง Python Editor ชุดที่ 1 ให้เลือกเชื่อมต่อกับตัวบน ส่วนหน้าต่าง Python Editor ชุดที่ 2 ให้เชื่อมต่อกับตัวล่าง
5. พิมพ์คำสั่งทดสอบสั้นๆ จากนั้นดาวน์โหลดลงไปที่บอร์ด Nanobit เพื่อดูว่าดาวน์โหลดตรงกับบอร์ดที่ต้องการหรือไม่
บอร์ดที่ 1 ให้พิมพ์
from microbit import *
display.show(‘1’)
บอร์ดที่ 2 ให้พิมพ์
from microbit import *
display.show(‘2’)
ถ้าการเชื่อมต่อถูกต้อง บอร์ดที่ 1 จะแสดงเลข 1 ส่วนบอร์ดที่ 2 จะแสดงเลข 2
ตัวอย่างที่ 30 รับส่งข้อมูลเมื่อมีการกดสวิตช์
ตัวอย่างนี้ จะให้โปรแกรมเดียวกัน ทำหน้าที่ทั้งรับและส่งข้อมูล ดังนั้นบอร์ด Nanobit ทั้ง 2 บอร์ดจะใช้โปรแกรมเดียวกัน
from microbit import * import radio radio.on() while True: #ส่ง if button_a.was_pressed(): radio.send('A') elif button_b.was_pressed(): radio.send('B') #รับ x=radio.receive() if x=='A': display.show(Image.HEART,clear=True) elif x=='B': display.show(Image.DUCK,clear=True)
การทำงาน
ในช่วงแรกของโค้ดจะตรวจสอบการกดสวิตช์ ถ้าสวิตช์ A ถูกกดให้ส่ง ‘A’ ออกอากาศไป ถ้าสวิตช์ B ถูกกดให้ส่ง ‘B’ ออกอากาศไป
ช่วงที่2 โค้ดจะรับข้อมูลที่ส่งออกอากาศเก็บในตัวแปร x จากนั้นตรวจสอบ ถ้าค่าที่อ่านได้เท่ากับ ‘A’ จะให้แสดงรูปหัวใจที่ LED 5×5 ถ้าอ่านค่าได้เท่ากับ B จะแสดงรูปเป็ดออกมา
การกำหนดค่าคอนฟิกให้กับการสื่อสาร radioสามารถเรียกใช้งานผ่าน radio.config() เช่น กำหนดช่องความถี่สัญญาณในการสื่อสาร จะกำหนดเป็น radio.config(channel=42) length ความยาวสูงสุดของข้อมูลที่จะส่งหน่วยเป็นไบต์ (ค่าตั้งต้น = 32) สามารถกำหนดได้สูงสุดคือ 251 ไบต์ queue จองพื้นที่เก็บคิวข้อมูลสำหรับรับข้อความที่ส่งเข้ามา (ค่าตั้งต้น = 3) ถ้าไม่มีพื้นที่เหลือข้อมูลใหม่ที่ส่งเข้ามาจะหายไป channel เป็นค่าจำนวนเต็มตั้งแต่ 0-83 (ค่าตั้งต้น = 7) สำหรับเป็นช่องสัญญาณในการสื่อสารย่านความถี่ 2.4GHz โดยแต่ละช่องจะกว้าง 1MHz ทั้งภาคส่งและภาครับจะต้องใช้ช่องสัญญาณเดียวกันจึงจะสื่อสารกันได้ power (ค่าตั้งต้น=6) เป็นค่าเลขจำนวนเต็ม 0-7 สำหรับกำหนดค่าความแรงในการส่งข้อมูล ซึ่งให้ค่าความแรงของสัญญาณในหน่วย dBm เดซิเบลมิลลิวัตต์ มีค่าเป็น -30,-20,-16,-12,-8,-4,0,4 ตามตัวเลข 0-7 address (ค่าตั้งต้น=0x75626974) เป็นค่าข้อมูลตำแหน่งแอดเดรสขนาด 32บิต เพื่อจะกรองข้อมูลที่รับเข้ามาในระดับฮาร์ดแวร์ group (ค่าตั้งต้น=0) เป็นค่าข้อมูล 8 บิต (0-255) ใช้ร่วมกับ address เพื่อกรองข้อมูลที่รับเข้าเช่น กลุ่มอุปกรณ์ที่บ้าน กลุ่มอุปกรณ์ที่ทำงาน เพื่อส่งข้อมูลให้ถูกกลุ่ม data_rate (ค่าตั้งต้น=radio.RATE_1MBIT) ใช้กำหนดความเร็วในการสื่อสารข้อมูล ประกอบด้วย RATE_250kBIT, RATE_1MBIT และ RATE_2MBIT ถ้าไม่มีการเรียกใช้งาน config ค่าตั้งต้นต่างๆ จะถูกเรียกใช้งาน |
ตัวอย่างที่ 31 การส่งข้อความและประมวลผลข้อความ
รูปแบบการส่งข้อมูลขอ Radio จะอยู่ในรูปของ String หรือข้อความเท่านั้น ดังนั้นถ้าข้อมูลเป็นตัวเลขจะต้องแปลงให้อยู่ในรูปของ String ก่อนส่งออกไป ดังนั้นสำหรับภาครับก็ต้องแปลงค่าสตริงกลับให้เป็นตัวเลข เช่นใช้คำสั่ง float () เพื่อแปลงให้เป็นตัวเลขทศนิยม และ int () เพื่อแปลงให้เป็นเลขจำนวนเต็ม
โค้ดสำหรับภาคส่ง
from microbit import * import radio radio.on() radio.config(channel = 42) msg1 = '1,2' msg2 = '3,4' while True: if button_a.was_pressed(): radio.send(msg1) if button_b.was_pressed(): radio.send(msg2) sleep(10)
การทำงาน
ข้อความ msg1 และ msg2 จะเป็นตัวเลขที่คั่นด้วยเครื่องหมาย , เพื่อแยกตัวเลขออกจากกัน ตัวอย่างนี้จะใช้พารามิเตอร์ของ radio.config ด้วยสำหรับการกำหนดค่าช่องในการสื่อสารข้อมูล ซึ่งภาครับที่มีช่องตรงกันเท่านั้นจึงจะรับข้อมูลได้ เมื่อสวิตช์ A ถูกกดจะเป็นการส่งข้อความ msg1 ถ้าสวิตช์ B ถูกกดจะเป็นการส่งข้อความ msg2
โค้ดสำหรับภาครับ
from microbit import * import radio radio.on() radio.config(channel = 42) dat = 0 while True: x = radio.receive() if x != None: dat = x.split(",") x1 = int(dat[0]) x2 = float(dat[1]) display.show(x1) sleep(1000) display.scroll(x2)
การทำงาน
ภาครับจะต้องกำหนดค่า channel เป็นค่าเดียวกันกับภาคส่ง โดยข้อมูลที่รับเข้ามาจะเก็บในตัวแปร x และตรวจสอบว่ามีข้อมูลส่งมาจริงหรือไม่ จากนั้นใช้ฟังก์ชั่น split เพื่อแยกข้อความออกมาซึ่งคีย์เวิร์ดที่ใช้แยกคือเครื่องหมาย , นั่นเอง ค่าที่แยกจะเก็บในตัวแปร dat เป็นแบบ list เมื่อต้องการให้ค่าที่แยกออกมานี้เปลี่ยนกลับเป็นตัวเลขก็ใช้ฟังก์ชั่น int และ float แปลงค่ากลับก่อนนำค่าที่ได้ไปแสดงที่ LED 5×5