micro:bit 拡張ボードで クリスマスオーナメントを作ってみた
DFRobot社の micro:bit Circular RGB LED Expansion Board を使ってクリスマスツリーに飾るオーナメントを作りました。
拡張ボード詳細については以下参照ください。micro:bitを拡張します。
スイッチサイエンスでもお取り寄せ購入できるようです。1,428円。
目次
クリスマスオーナメント
早速完成品を御覧ください。
micro:bit Circular RGB LED Expansion Board でクリスマス オーナメントを作ってみました!#DFRobot #microbit #Xmas #クリスマス pic.twitter.com/5WlLGZNH7U
— HomeMadeGarbage (@H0meMadeGarbage) 2018年12月7日
Aボタンを押すと、拡張ボード搭載のブザーからクリスマスソングが流れます。micro:bitのLEDマトリクスには音譜が表示され、NeoPixelは赤と緑に光ります。
Bボタンを押すと、音で反応するモードになります。拡張ボード搭載のマイクを使用しています。音を検知するとNeoPixelが黄色く光り、LEDマトリクスには”Merry Xmas”と表示されます。
MakeCode
コーディングにはMakeCodeを使用しました。
https://makecode.microbit.org/
MakeCodeについては以下でも書いていますのでご参照ください。
MakeCode ブロック
以下が作成したクリスマスオーナメントのMakeCodeブロックです。
①初期化
変数の初期化、NeoPixelの入力ピンとセル数と輝度、メロディ再生の際のBPMを指定しています。
Aモード
Aボタンを押すと実行される動作です。
② Aボタン検出
micro:bitのAを押すと変数stateを1にします。
③NeoPixel点灯設定
変数stateが1のとき(Aボタンが押されたとき)、拡張ボードのNeoPixelを交互に赤/緑の点滅を繰り返します。
④LEDマトリクス設定
変数stateが1のとき(Aボタンが押されたとき)、micro:bitのLEDマトリクスに音譜を2種類交互に表示させます。
⑤音声再生
変数stateが1のとき(Aボタンが押されたとき)、拡張ボードのブザーからクリスマスソングをリピート再生します。変数stateが1以外になるとループを抜けて音声再生をストップします。
Bモード
Bボタンを押すと実行される動作です。
⑥Bボタン検出
micro:bitのBを押すと変数stateを0にしてLEDマトリクス表示をリセットします。
⑦音声検出
変数stateが0のとき(Bボタンが押されたとき)、拡張ボードのNeoPixelをリセットしてMIC検知をオンします。
MICで音声を検出(アナログ値で200以上)したら変数stateを2にして、NeoPixelを9個分黄色に点灯します。
変数stateが2のとき(音声検出時)、NeoPixelの9個黄色点灯を回転させます。
⑧LEDマトリクス設定
変数stateが2のとき(音声検出時)、micro:bitのLEDマトリクスに文字列 “Merry Xmas”と表示します。
表示が終わると変数stateを0にして、音声検知待ち状態します。
⑨リセット
A, Bボタン同時押しで、NeoPixelとLEDマトリクスをリセットして動作を止めます。
MakeCode 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 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
let sound = 0 let state = 0 input.onButtonPressed(Button.A, function () { state = 1 }) input.onButtonPressed(Button.B, function () { state = 0 basic.showLeds(` . . . . . . . . . . . . . . . . . . . . . . . . . `) }) input.onButtonPressed(Button.AB, function () { state = 3 strip.clear() strip.show() basic.showLeds(` . . . . . . . . . . . . . . . . . . . . . . . . . `) }) let range: neopixel.Strip = null let strip: neopixel.Strip = null state = 3 strip = neopixel.create(DigitalPin.P2, 24, NeoPixelMode.RGB) strip.setBrightness(30) music.setTempo(52) basic.forever(function () { while (state == 1) { strip.clear() for (let index = 0; index < 24; index+=2) { range = strip.range(index, 1) range.showColor(neopixel.colors(NeoPixelColors.Red)) } for (let index2 = 1; index2 <= 24; index2+=2) { range = strip.range(index2, 1) range.showColor(neopixel.colors(NeoPixelColors.Green)) } basic.pause(500) for (let index3 = 0; index3 < 24; index3+=2) { range = strip.range(index3, 1) range.showColor(neopixel.colors(NeoPixelColors.Green)) } for (let index22 = 1; index22 <= 24; index22+=2) { range = strip.range(index22, 1) range.showColor(neopixel.colors(NeoPixelColors.Red)) } basic.pause(500) } }) basic.forever(function () { while (state == 1) { basic.showLeds(` . . # . . . . # # . . . # . # # # # . . # # # . . `) basic.pause(500) if (!(state)) { break } basic.showLeds(` . # # # # . # . . # . # . . # # # . # # # # . # # `) basic.pause(500) } }) basic.forever(function () { while (state == 1) { music.playTone(196, music.beat(BeatFraction.Quarter)) music.playTone(330, music.beat(BeatFraction.Quarter)) music.playTone(294, music.beat(BeatFraction.Quarter)) music.playTone(262, music.beat(BeatFraction.Quarter)) if (!(state)) { break } music.playTone(196, music.beat(BeatFraction.Whole)) music.playTone(196, music.beat(BeatFraction.Quarter)) music.playTone(330, music.beat(BeatFraction.Quarter)) music.playTone(294, music.beat(BeatFraction.Quarter)) music.playTone(262, music.beat(BeatFraction.Quarter)) if (!(state)) { break } music.playTone(220, music.beat(BeatFraction.Whole)) music.playTone(220, music.beat(BeatFraction.Quarter)) music.playTone(349, music.beat(BeatFraction.Quarter)) music.playTone(330, music.beat(BeatFraction.Quarter)) music.playTone(294, music.beat(BeatFraction.Quarter)) if (!(state)) { break } music.playTone(247, music.beat(BeatFraction.Whole)) music.playTone(392, music.beat(BeatFraction.Quarter)) music.playTone(392, music.beat(BeatFraction.Quarter)) music.playTone(349, music.beat(BeatFraction.Quarter)) music.playTone(294, music.beat(BeatFraction.Quarter)) if (!(state)) { break } music.playTone(330, music.beat(BeatFraction.Whole)) } }) basic.forever(function () { if (state == 0) { strip.clear() strip.show() sound = pins.analogReadPin(AnalogPin.P1) if (sound > 200) { state = 2 strip.range(0, 9).showColor(neopixel.colors(NeoPixelColors.Yellow)) } } if (state == 2) { strip.rotate(1) strip.show() basic.pause(50) } }) basic.forever(function () { if (state == 2) { basic.showString("Merry Xmas") strip.clear() strip.show() state = 0 } }) |
動作
クリスマスツリーにかけると非常に可愛いです♪
かわいい♪ #DFRobot #クリスマスツリー #microbit pic.twitter.com/iYObiPYPX8
— HomeMadeGarbage (@H0meMadeGarbage) 2018年12月8日
音声検出モードもバッチリです。
音に反応して光るバージョン
拡張ボードにマイクやブザー、NeoPixel載ってて便利です。#DFRobot #クリスマスツリー #microbit pic.twitter.com/wIZ5TCKyfn— HomeMadeGarbage (@H0meMadeGarbage) 2018年12月8日
micro:bit Circular RGB LED Expansion Boardはマイク、ブザー搭載なのでmicro:bitの有用性をさらに高めて楽しいものがすぐにつくれちゃいますね!