「ものづくり:make」を楽しみながら学ぶ人へ向けた独習サポートサイト。

micro:bit Lab.【マイクロビット】

micro:bit Lab.では、micro:bit【マイクロビット】に関する情報を紹介しています。

親機で複数の子機を制御する
付録2-7

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

2018-03-302018-11-24

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を初期化します。

図3-1.最初だけ実行されるプログラム
図3-1.最初だけ実行されるプログラム

無線で受信したときに実行されるプログラム

子機から送信されるシリアル番号を記録するルーチンです。子機から送信されるコマンド「ChildName」とシリアル番号(value値)の組み合わせを受信すると、配列ChildListに記録して、子機の台数ChildNumberをカウントアップします。その後、親機から「登録完了」を意味するコマンド「ChildAccept」とシリアル番号の組み合わせを送信します。

図3-2.無線で受信したときに実行されるプログラム
図3-2.無線で受信したときに実行されるプログラム

ボタンAが押されたときに実行されるプログラム

イルミネーションを制御するルーチンです。子機に対して、LED画面に表示するパターンをコマンドで送信します。コマンドには、LED画面を点灯する「ShowLEDsP1」~「ShowLEDsP5」と消灯する「ClearLEDsP1」があります。コマンドとシリアル番号を組み合わせて送信することで、子機別に指示することができます。また、コマンドと「0」を組み合わせて送信することで、子機全台に指示することができます。

図3-3.ボタンAが押されたときに実行されるプログラム
図3-3.ボタンAが押されたときに実行されるプログラム

ボタンA+Bが押されたときに実行されるプログラム

ボタンAとボタンBを同時に押すことで、子機の再登録を行うルーチンです。コマンド「ChildReset」と「0」の組み合わせを送信します。

図3-4.ボタンA+Bが押されたときに実行されるプログラム
図3-4.ボタンA+Bが押されたときに実行されるプログラム

4.親機のサンプルプログラム(JavaScript)

親機のサンプルプログラム(Javascript)です。

表4-1.親機のサンプルプログラム(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)へ変更されます。

図5-1.最初だけ実行されるプログラム
図5-1.最初だけ実行されるプログラム

無線で受信したときに実行されるプログラム

親機から送信されるコマンドを処理するルーチンです。親機から「登録完了」を意味するコマンド「ChildAccept」を受信すると変数WaitingAcceptを偽(false)にします。LED画面を点灯を意味するコマンド「ShowLEDsP1」~「ShowLEDsP5」を受信すると、それぞれに応じたパターンでLED画面を点灯します。消灯を意味するコマンド「ClearLEDsP1」でLED画面を消します。また、コマンド「ChildReset」を受信すると、リセットを行います。

図5-2.無線で受信したときに実行されるプログラム
図5-2.無線で受信したときに実行されるプログラム

6.子機のサンプルプログラム(JavaScript)

子機のサンプルプログラム(Javascript)です。

表6-1.子機のサンプルプログラム(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画面の制御だけでなく、音を鳴らすにはどうすればいいかな?

この記事を読んだ人は、こんな記事にも興味があります。
スポンサーリンク
TOPへ移動
目次へ移動