【観賞用】無線機能でイルミネーション

micro:bitの無線機能を使って、1台の親機で複数の子機を制御します。子機のLED画面で彩るイルミネーションをお楽しみください。このプログラムには、micro:bitが2台以上必要です。
1.楽しみ方
子機と親機の電源を入れます。親機が自動的に子機を探索します。親機に見つかった子機は、LED画面の表示が、寝顔から笑顔になります。すべての子機が笑顔になったら準備完了です。親機のAボタンを押すとイルミネーションが始まります。映像では、1台の親機で6台の子機を制御しています。
2.このプログラムの動作に必要なもの
このプログラムは、micro:bit本体のみで動作します。
- micro:bit本体(2台以上)
- パソコン(*1)
- USBケーブル(*1)
(*1):パソコン・USBケーブルは、プログラミングに必要なものです。
3.親機のサンプルプログラム(ブロック)
親機のサンプルプログラム(ブロック)です。
最初だけ実行されるプログラム
無線グループの設定と、子機を記録するための配列ChildListと子機の台数ChildNumberを初期化します。
無線で受信したときに実行されるプログラム
子機から送信されるシリアル番号を記録するルーチンです。子機から送信されるコマンド「ChildName」とシリアル番号(value値)の組み合わせを受信すると、配列ChildListに記録して、子機の台数ChildNumberをカウントアップします。その後、親機から「登録完了」を意味するコマンド「ChildAccept」とシリアル番号の組み合わせを送信します。
ボタンAが押されたときに実行されるプログラム
イルミネーションを制御するルーチンです。子機に対して、LED画面に表示するパターンをコマンドで送信します。コマンドには、LED画面を点灯する「ShowLEDsP1」~「ShowLEDsP5」と消灯する「ClearLEDsP1」があります。コマンドとシリアル番号を組み合わせて送信することで、子機別に指示することができます。また、コマンドと「0」を組み合わせて送信することで、子機全台に指示することができます。
ボタンA+Bが押されたときに実行されるプログラム
ボタンAとボタンBを同時に押すことで、子機の再登録を行うルーチンです。コマンド「ChildReset」と「0」の組み合わせを送信します。
4.親機のサンプルプログラム(JavaScript)
親機のサンプルプログラム(Javascript)です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | let WaitingTime = 0 let ChildNumber = 0 let ChildList: number[] = [] radio.onDataPacketReceived( ({ receivedString: name, receivedNumber: value }) => { if (name == "ChildName" ) { if (ChildList.indexOf(value) == -1) { ChildList[ChildNumber] = value ChildNumber += 1 basic.showNumber(ChildNumber) } radio.sendValue( "ChildAccept" , value) basic.pause(500) } }) input.onButtonPressed(Button.A, () => { radio.sendValue( "ClearLEDsP1" , 0) basic.pause(WaitingTime) for (let i = 0; i < 4; i++) { for (let Loop1 = 0; Loop1 <= ChildNumber - 1; Loop1++) { radio.sendValue( "ShowLEDsP1" , ChildList[Loop1]) basic.pause(WaitingTime) radio.sendValue( "ClearLEDsP1" , ChildList[Loop1]) basic.pause(WaitingTime) } for (let Loop2 = 0; Loop2 <= ChildNumber - 1; Loop2++) { radio.sendValue( "ShowLEDsP1" , ChildList[Loop2]) basic.pause(WaitingTime) } for (let Loop3 = 0; Loop3 <= ChildNumber - 1; Loop3++) { radio.sendValue( "ClearLEDsP1" , ChildList[Loop3]) basic.pause(WaitingTime) } for (let i = 0; i < 4; i++) { radio.sendValue( "ShowLEDsP1" , 0) basic.pause(WaitingTime) radio.sendValue( "ClearLEDsP1" , 0) basic.pause(WaitingTime) } for (let i = 0; i < 4; i++) { radio.sendValue( "ShowLEDsP1" , 0) basic.pause(WaitingTime) radio.sendValue( "ShowLEDsP2" , 0) basic.pause(WaitingTime) radio.sendValue( "ShowLEDsP3" , 0) basic.pause(WaitingTime) radio.sendValue( "ClearLEDsP1" , 0) basic.pause(WaitingTime) } for (let Loop4 = 0; Loop4 <= ChildNumber - 1; Loop4++) { radio.sendValue( "ShowLEDsP5" , ChildList[Loop4]) basic.pause(WaitingTime) } for (let Loop5 = 0; Loop5 <= ChildNumber - 1; Loop5++) { radio.sendValue( "ShowLEDsP4" , ChildList[Loop5]) basic.pause(WaitingTime) } for (let Loop6 = 0; Loop6 <= ChildNumber - 1; Loop6++) { radio.sendValue( "ShowLEDsP3" , ChildList[Loop6]) basic.pause(WaitingTime) } radio.sendValue( "ClearLEDsP1" , 0) basic.pause(WaitingTime) for (let i = 0; i < 4; i++) { radio.sendValue( "ShowLEDsP3" , 0) basic.pause(WaitingTime) radio.sendValue( "ShowLEDsP4" , 0) basic.pause(WaitingTime) radio.sendValue( "ShowLEDsP5" , 0) basic.pause(WaitingTime) radio.sendValue( "ShowLEDsP4" , 0) basic.pause(WaitingTime) } radio.sendValue( "ShowLEDsP3" , 0) basic.pause(WaitingTime) radio.sendValue( "ClearLEDsP1" , 0) basic.pause(WaitingTime) } }) input.onButtonPressed(Button.AB, () => { ChildList = [] ChildNumber = 0 radio.sendValue( "ChildReset" , 0) }) radio.setGroup(1) ChildList = [] ChildNumber = 0 WaitingTime = 500 |
5.子機のサンプルプログラム(ブロック)
子機のサンプルプログラム(ブロック)です。
最初だけ実行されるプログラム
無線グループの設定と、親機に登録を依頼するルーチンです。コマンド「ChildName」と自身のシリアル番号を組み合わせて送信します。このコマンドは、変数WaitingAcceptが偽(false)になるまで1000ミリ秒毎に送信し続けられます。なお、変数WaitingAcceptは次のルーチン内で真(true)から偽(false)へ変更されます。
無線で受信したときに実行されるプログラム
親機から送信されるコマンドを処理するルーチンです。親機から「登録完了」を意味するコマンド「ChildAccept」を受信すると変数WaitingAcceptを偽(false)にします。LED画面を点灯を意味するコマンド「ShowLEDsP1」~「ShowLEDsP5」を受信すると、それぞれに応じたパターンでLED画面を点灯します。消灯を意味するコマンド「ClearLEDsP1」でLED画面を消します。また、コマンド「ChildReset」を受信すると、リセットを行います。
6.子機のサンプルプログラム(JavaScript)
子機のサンプルプログラム(Javascript)です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | let WaitingAccept = false radio.onDataPacketReceived( ({ receivedString: name, receivedNumber: value }) => { if (name == "ChildAccept" ) { if (value == control.deviceSerialNumber()) { WaitingAccept = false } } else if (name == "ShowLEDsP1" ) { if (value == control.deviceSerialNumber() || value == 0) { basic.showLeds(` # # # # # # # # # # # # # # # # # # # # # # # # # `) } } else if (name == "ShowLEDsP2" ) { if (value == control.deviceSerialNumber() || value == 0) { basic.showLeds(` . . . . . . # # # . . # # # . . # # # . . . . . . `) } } else if (name == "ShowLEDsP3" ) { if (value == control.deviceSerialNumber() || value == 0) { basic.showLeds(` . . . . . . . . . . . . # . . . . . . . . . . . . `) } } else if (name == "ShowLEDsP4" ) { if (value == control.deviceSerialNumber() || value == 0) { basic.showLeds(` . . . . . . # # # . . # . # . . # # # . . . . . . `) } } else if (name == "ShowLEDsP5" ) { if (value == control.deviceSerialNumber() || value == 0) { basic.showLeds(` # # # # # # . . . # # . . . # # . . . # # # # # # `) } } else if (name == "ClearLEDsP1" ) { if (value == control.deviceSerialNumber() || value == 0) { basic.showLeds(` . . . . . . . . . . . . . . . . . . . . . . . . . `) } } else if (name == "ChildReset" ) { control.reset() } }) radio.setGroup(1) WaitingAccept = true basic.showIcon(IconNames.Asleep) while (WaitingAccept == true ) { radio.sendValue( "ChildName" , control.deviceSerialNumber()) basic.pause(1000) } basic.showIcon(IconNames.Happy) |
7.チャレンジ
子機にオリジナルの点灯パターンや消灯パターンを追加して、自分だけのイルミネーションを作ろう。また、LED画面の制御だけでなく、音を鳴らすにはどうすればいいかな?