Nanobit with microPython ตอนที่ 7

สื่อสารไร้สายด้วย 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

Facebook Comments Box

Press Ctrl+C to copy the following code.
"