n:bit信号機(歩行者信号つき)

n:nitを接続して信号機をつくりましょう。
n:bitのLEDは車用、micro:bitのLEDは歩行者用の信号にします。
信号機の設計図はIchigoJam信号機(こちら参照)と同様にしました。

プログラム設計

n:bitのLED(緑、黄、赤)は車用、micro:bitのLED(5×5dot)は歩行者用として使用します。

・最初は、車用LEDは「青色」、歩行者用は「止まれ」表示します。

・Aボタンが押したら、歩行者が渡れるよう信号を切り換えます。
・車用LEDを「黄色」にします。
・2秒後に車用LEDを「赤色」にします。
・さらに2秒後に歩行者用表示を「すすめ」にします。
・5秒後に歩行者表示を6回点滅させます。
・歩行者用表示を「止まれ」にします。
・1秒後に車用LEDを「緑色」にします。


プログラムの作成

input.onButtonPressed(Button.A, function () {
pins.digitalWritePin(DigitalPin.P0, 0)
pins.digitalWritePin(DigitalPin.P1, 1)
basic.pause(2000)
pins.digitalWritePin(DigitalPin.P1, 0)
pins.digitalWritePin(DigitalPin.P2, 1)
basic.pause(2000)
images.createBigImage(
. . . . . # . # . .
. . . . . . # # # .
. . . . . . . # . #
. . . . . . # # . .
. . . . . # . . # #
).scrollImage(1, 200)
basic.pause(5000)
for (let index = 0; index < 6; index++) {
led.setBrightness(0)
basic.pause(200)
led.setBrightness(255)
basic.pause(500)
}
images.createImage(
. . # . .
. # # # .
. . # .
. # # # .
. # . # .
).showImage(0)
basic.pause(1000)
pins.digitalWritePin(DigitalPin.P2, 0)
pins.digitalWritePin(DigitalPin.P0, 1)
})
pins.digitalWritePin(DigitalPin.P0, 1)
images.createImage(
. . # . .
. # # # .
. . # . .
. # # # .
. # . # .
).showImage(0)


でじたるかくれんぼ

プログラムを設計する

micro:bitには、ブルートゥースという無線機能が標準で備わっており、同じ無線機能がある装置と通信をすることができます。
もちろん、 micro:bitどうしの通信もできます。
この機能を利用して、隠されたmicro:bit(子:hider)から発信される電波を、もう一台の探索用micro:bit(鬼:seeker)で受信して、電波の強弱を見分けて探し当てるプログラムをつくります。


HIDERの作成

・1秒に1回電波を発信する(数字の1を送信する)。
・音を鳴らす。

radio.setGroup(9)
basic.showNumber(9)
basic.forever(function () {
radio.sendNumber(1)
music.playTone(523, music.beat(BeatFraction.Sixteenth))
basic.pause(1000)
})

隠すmicro:bitのプログラムです。
まず、 「最初だけ」 のブロックを用意します。
「無線のグループ」命令で、相手と通信するための番号を決めます。
micro:bitでは、グループIDと呼びますが、テレビのチャンネルと同じと考えてよいでしょう。
つまり同じ グループID (チャンネル)同士で通信するための番号です。
グループIDは、0~255までの範囲で任意に決めることができますが、今回は9にしました。
グループIDは、「最初だけ」で一度設定するだけで機能します。

つぎに、「ずっと」のブロックを用意します。
このなかで「無線で数値を送信」命令を実行したとき、 micro:bit から電波が発信されます。
このときに、指定した(数値)の値を送信しています。
今回は1を送信するようにしましたが、このかくれんぼプログラムでは送信した値は使わないので、実際にはどんな値でもよいでしょう。
本来の通信の処理では、送信した数値や文字を相手が受信することで、いろいろなことをおこなうようにつくります。

この処理を1秒ごとに繰り返します。

これで、 隠すmicro:bitのプログラムは終わりです。
ダウンロードをしてmicr:bitにプログラムを保存してください。


SEEKERの作成

・受信した電波の強さを計測してグラフ(LED)で表示する。
・電波の強さに応じて、高い音、低い音を鳴らす。

radio.onReceivedNumber(function (receivedNumber) {
led.plotBarGraph(
150 + radio.receivedPacket(RadioPacketProperty.SignalStrength),
110
)
music.playTone(-20 * radio.receivedPacket(RadioPacketProperty.SignalStrength), music.beat(BeatFraction.Eighth))
basic.clearScreen()
})
radio.setGroup(9)
basic.showNumber(9)

無線のグループIDをHIDERと同じ9にします。
これも「最初だけ」で設定すればOKです。

「無線で受信したとき-(receivedNumber)」命令で、 電波を一度でも受信したときの処理を行います。
電波が受信できなければ、処理は行われません。つまり、「最初だけ」で実行した命令のままの状態になりますので、9を表示したままの状態になります。
「ずっと」の青色ボックスは使いません。

.

グラフの表示

「受信したパケットの(信号強度)」では、電波強度 (単位はdb(デシベル))によって-42から-128までの値が入ります。
-42は電波が強いので、 すぐそばに電波を発信しているmicro:bitがあることになります。
-128に近いならば電波が弱いことになります。
グラフ表示するためには、この電波強度のマイナス値のままだと不便です。
そこで 150をたすことによって、 値が108から22まで変化するようにしています。
グラフの最大値は110にしています(なぜか考えてみてください)。

左:電波の強さが-強いとき(-42db) 右:電波が弱いとき(-128db)


音を鳴らす

「音を鳴らす」命令で音が鳴るのですが、 micro:bit単体では音はなりません。そこで、n:bitというシールド基板を接続してそちらのスピーカーで音を出しています。
 音は、周波数を設定することで鳴るのですが、人間が聞こえる音は、一般的に20から20000Hz(ヘルツ)と言われています。
周波数が低いほど音も低く、高いほど高音になります。
「音を鳴らす」命令 の(真ん中のド)は、262Hzになります。

さて、今回の 「音を鳴らす」命令 では、受信した電波の信号強度に-20を乗算しています。
これは、840から2560Hz(電波強度は-42から-128)の音を出すこと意味します。
したがってHIDERが近いときは、だいたい上のラ(880Hz)の音になり、
離れるほど高い音が鳴ることになります。


かくれんぼ探し

さあ、それでは隠れているHIDERを、SEEKERで探索して見つけましょう。
まず、 HIDERのmicro:bitを外観では見えないように隠します。隠すときはスピーカも切っておいたほうがよいでしょう。
n:bit基板のP0 Selectorスイッチを、SからPに切り替えると音は鳴りません(代わりに緑LEDが点滅します)。 

電波は壁などの通り抜け、上下方向にも発信されますので、いろいろ試して探しましょう。