ตัวอย่างการรับส่งข้อมูลไร้สายระหว่างบอร์ด Micro:bit#
Keywords: BBC Micro:bit, Microsoft MakeCode, TypeScript, Wireless Data Communication, 2.4GHz Radio Interface, Event-Driven Programming
▷ บอร์ดไมโครบิตและการสื่อสารข้อมูลแบบไร้สาย#
บอร์ดไมโครคอนโทรลเลอร์ "ไมโครบิต" (Micro:bit) ทั้งรุ่นแรกและรุ่นที่สอง (v1 & v2) สามารถรับส่งข้อมูลและสื่อสารกันได้แบบไร้สาย (Wireless Data Communication) เนื่องจากใช้ชิปของบริษัท Nordic Semiconductor รุ่น nRF51822 และ nRF52833 ตามลำดับ ภายในชิปมีวงจรและเฟิร์มแวร์สำหรับการสื่อสารข้อมูลไร้สายด้วยคลื่นวิทยุย่านความถี่ 2.4GHz และรองรับโพรโตคอล Bluetooth / BLE ด้วย
บทความนี้นำเสนอตัวอย่างการเขียนโค้ดด้วย MakeCode JavaScript (JS) / Static TypeScript (STS) เพื่อรับส่งข้อมูลระหว่างบอร์ดไมโครบิต 2 บอร์ด และสำหรับการเขียนโค้ดเพื่อใช้งานกับบอร์ดไมโครบิต ก็ใช้เพียงเว็บเบราว์เซอร์ เช่น Google Chrome และไปยังเว็บไซต์ MakeCode Editor for Micro:bit (https://makecode.microbit.org/) แล้วเริ่มต้นโดยการสร้างโปรเจกต์ใหม่ (New Project) ตามลำดับ
MakeCode Editor for Micro:bit รองรับการเขียนโค้ดหลายรูปแบบ ทั้งแบบการต่อบล็อก (Block-based Coding) และการเขียนโค้ดด้วยภาษา JavaScript (JS) / Static TypeScript หรือ Python อีกทั้งยังสามารถจำลองการทำงานของโค้ดได้ (MakeCode Micro:bit Simulator) โดยยังไม่จำเป็นต้องใช้งานบอร์ดทดลองจริง
จุดเด่นของซอฟต์แวร์อีกประการหนึ่งคือ ความสามารถในการแปลงให้เป็นโปรแกรมในรูปแบบการต่อบล็อก หรือสลับไปมาระหว่างโหมดการเขียนโค้ดด้วยภาษา JS / Python ได้โดยอัตโนมัติ
▷ การใช้งาน Multi-Board Editor#
เนื่องจากจะต้องใช้บอร์ดไมโครบิต 2 จำนวนบอร์ด และทำงานพร้อม ๆ กัน ดังนั้นถ้าจะจำลองการทำงานของบอร์ดทั้งสอง จะต้องเปิดใช้งาน Multi-Board Editor (https://makecode.com/multi#)
ผู้ใช้สามารถสร้างโปรเจกต์ (กดปุ่ม "New Project") แยกกันระหว่าง 2 บอร์ดที่จะใช้งาน แล้วเปิดโปรเจกต์ใน Editor ในส่วนการทำงานทางด้านซ้ายมือ และขวามือตามลำดับ
รูป: MakeCode Multi-Board Editor
รูป: ตัวอย่างการสร้างโปรเจกต์และทดลองเขียนโค้ด JS (JavaScript)
รูป: ตัวอย่างการจำลองการทำงานของโปรแกรม (Run simulator in fullscreen) หรือ หยุดการทำงานชั่วคราว ผู้ใช้สามารถกดปุ่ม A หรือ B ได้ รวมถึงการเขย่าบอร์ด (คลิกตรงจุดสีขาวที่มีข้อความ SHAKE)
รูป: ตัวอย่างการแปลงโค้ด JS ให้อยู่ในรูปแบบการต่อบล็อก (ซ้ายมือ) และ Python (ขวามือ)
▷ ตัวอย่างโค้ดสาธิต#
การทำงานของโค้ดตัวอย่างในบทความนี้ มีลักษณะการทำงานดังนี้
- ใช้บอร์ด Micro:bit จำนวน 2 บอร์ด และใช้โค้ดเหมือนกัน
- เมื่อเริ่มต้นทำงาน โค้ดตัวอย่างตรวจสอบดูว่า มีการกดปุ่ม Button A หรือ มีการเขย่าบอร์ด (Shake) หรือไม่
- ถ้ามีการเขย่าบอร์ด ให้เลือกไอคอน (Icon) ถัดไปจากรายการที่กำหนดไว้ (มี 3 ตัวเลือก ได้แก่
Image.Heart
,Image.Happy
,Image.Sad
) และกดปุ่ม Button A ให้ส่งหมายเลขของไอคอนไปยังอีกบอร์ดหนึ่ง เพื่อนำไปแสดงผล - ถ้าบอร์ดใดได้รับข้อความจากอีกบอร์ดหนึ่ง ก็ให้แสดงรูปสัญลักษณ์หรือไอคอนตามหมายเลขที่ได้รับมา บนแผง LED 5x5 พิกเซล
- แต่ถ้ากดปุ่ม Button B ก็จะแสดงระดับความแรงของสัญญาณคลื่นวิทยุที่ได้รับจากอีกบอร์ดหนึ่ง (Received Signal Strength Indicator) โดยแบ่งค่าตัวเลขให้อยู่ในช่วง 4 ระดับ
// MakeCode Microbit Demo:
// Shake to select the next icon.
// Click to send the selected icon.
let icons = [
IconNames.Heart,
IconNames.Happy,
IconNames.Sad
]
let selectedIconIndex = 0
basic.showIcon(icons[selectedIconIndex])
// Initialize with a very low RSSI value (lowest)
let latestSignalStrength = -128
// Set the radio group to ensure both boards
// are communicating on the same channel.
radio.setGroup(1)
// Send Tx power (0=lowest, 7=highest)
radio.setTransmitPower(7)
// Function to pick and send a random icon
function selectIcon() {
// Pick the next icon
selectedIconIndex = (selectedIconIndex+1) % icons.length;
// Show the icon on the LED display
basic.showIcon(icons[selectedIconIndex])
}
// When button A is pressed
input.onButtonPressed(Button.A, function () {
// Show the icon on the LED display
basic.showIcon(icons[selectedIconIndex])
// Send the Icon index
radio.sendNumber(selectedIconIndex)
})
// When the micro:bit is shaken
input.onGesture(Gesture.Shake, function () {
selectIcon()
})
// When a number (icon) is received over the radio
// on either micro:bit
radio.onReceivedNumber(function (receivedIconIndex: number) {
serial.writeLine("" + receivedIconIndex )
// Show the received icon on the LED display
basic.showIcon(icons[receivedIconIndex])
// Get and store the signal strength (RSSI)
// of the last received message
latestSignalStrength =
radio.receivedPacket(RadioPacketProperty.SignalStrength)
// serial.writeLine("" + latestSignalStrength)
// Optional: Play a sound when an icon is received
// Plays middle C for half a beat
music.playTone(262, music.beat(BeatFraction.Half))
})
// When button B is pressed, show signal strength
input.onButtonPressed(Button.B, function () {
if (latestSignalStrength > -60) {
// Strong signal (Full 5x5 square)
basic.showLeds(`
# # # # #
# # . # #
# . . . #
# # . # #
# # # # #
`)
} else if (latestSignalStrength > -70) {
// Medium signal (3x3 square)
basic.showLeds(`
. # # # .
# # . # #
# . . . #
# # . # #
. # # # .
`)
} else if (latestSignalStrength > -85) {
// Weak signal (2x2 square)
basic.showLeds(`
. . . . .
. # # # .
. # . # .
. # # # .
. . . . .
`)
} else {
// Very weak signal (single dot in the center)
basic.showLeds(`
. . . . .
. . . . .
. . # . .
. . . . .
. . . . .
`)
}
pause(1000)
basic.clearScreen()
})
การทำงานของโปรแกรมมีลักษณะที่เรียกว่า Even-driven Programming ซึ่งจะมีการตรวจสอบเหตุการณ์ตามที่กำหนดไว้ และทำคำสั่งที่เกี่ยวข้องโดยอัตโนมัติ เช่น
- การใช้คำสั่ง
input.onButtonPressed(...)
เพื่อตรวจสอบว่า มีการกดปุ่ม Button A หรือ Button B - การใช้คำสั่ง
radio.onReceivedNumber(...)
เพื่อตรวจสอบว่า ได้รับข้อความ (ตัวเลข) จากบอร์ดอื่นผ่านทาง Radio Interface หรือไม่
ถ้ามีทำคำสั่งของฟังก์ชันภายในตามที่ได้ออกแบบไว้
input.onButtonPressed(Button.A, function () {
// perform a task or action
})
input.onButtonPressed(Button.B, function () {
// perform a task or action
})
radio.onReceivedNumber(function (receivedIcon: number) {
// perform a task or action
})
ในกรณีที่มีการสร้างสัญญาณเสียง ถ้าเป็นบอร์ด Micro:bit v1 จะต้องใช้ลำโพงเสียงมาต่อที่ขา Pin 0 และ GND ของบอร์ด แต่ถ้าเป็น Micro:bit v2 ก็มีวงจรและลำโพงเสียงขนาดเล็กอยู่บนบอร์ดแล้ว
รูป: ตัวอย่างการจำลองการทำงานของบอร์ดไมโครบิต ในกรณีที่มีการใช้คำสั่งเพื่อสร้างสัญญาณเสียง
ในกลุ่มคำสั่ง music
เช่น music.playTone(...)
รูป: ตัวอย่างการจำลองการทำงานของบอร์ดไมโครบิต 2 บอร์ดพร้อมกัน
รูป: บอร์ด Micro:bit v2.20 ที่ได้นำมาทดลอง มีแบตเตอรี่ ทำให้สะดวกต่อการนำไปทดลองใช้งาน ไม่ต้องเสียบสาย USB
รูป: บอร์ด Micro:bit แสดงรูปไอคอนที่มีการส่งระหว่างสองบอร์ด
▷ ตัวอย่างเพิ่มเติมสำหรับการใช้งาน Micro:bit Radio Interface#
บนหน้าเว็บไซต์ของ Microsoft MakeCode Project มีตัวอย่างโปรเจกต์ หรือโค้ดตัวอย่างในกลุ่มที่เรียกว่า "Radio Games" สาธิตการเขียนโค้ดเพื่อการสื่อสารข้อมูลแบบไร้สายด้วย Radio Interface
รูป: รายการโปรเจกต์ตัวอย่างแบ่งตามกลุ่มหรือหัวข้อ เช่น Radio Games
โค้ดตัวอย่างในบทความนี้ จะมีหลักการทำงานคล้ายกับตัวอย่าง Mood Radio ซึ่งมีลักษณะตามรูปของโค้ดบล็อกต่อไปนี้
รูป: โค้ดบล็อกสำหรับโปรเจกต์ Mood Radio
▷ กล่าวสรุป#
บทความนี้ได้นำเสนอตัวอย่างการเขียนโค้ด เพื่อสาธิตการใช้งานบอร์ดไมโครบิตจำนวน 2 บอร์ด สามารถรับส่งข้อมูลแบบไร้สายได้ และนำไปทดลองกับอุปกรณ์จริงได้หลังจากจำลองการทำงานของโค้ด และตรวจสอบผลการทำงานในเบื้องต้นแล้ว ในการทดลองจริง ก็อาจวางบอร์ดให้มีระยะห่างกัน และลองกดปุ่มหรือเขย่าบอร์ดเพื่อส่งสัญลักษณ์ (ไอคอน) ไปยังอีกบอร์ดหนึ่ง และดูว่า สามารถรับข้อความได้จริงหรือไม่
บทความที่เกี่ยวข้อง
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.
Created: 2024-09-28 | Last Updated: 2024-10-01