LoginSignup
2

More than 3 years have passed since last update.

micro:bitでクリスマス飾りを無線操作

Last updated at Posted at 2018-11-12

はじめに

某科学館さんから「プログラミングショーをしたい」と相談されました。
聞くと、サイエンスショーのようなスタイルで行いたいらしい。
100人の子供に講師役が1-2人。
確かに効率は良いです。
でもプログラミングは「体験」することがとても大事です。
また、理解する速度も人それぞれ。
画一的な「ショースタイル」には難しい面が多すぎます。

10分プログラミング体験

それならば、「(1)誰にでも講師役ができて、(2)子供たちも短時間で体験できるコンテンツ」をと考えまました。
アルバイトさんでも講師ができるほど簡単なことなら、スタッフの手配も楽ちん。
スタッフ手配が楽なら体験できるコーナーも増やせる。
体験できるコーナーが複数あれば、子供たちも複数で体験できる。
さらに、体験時間が短いなら気軽に何度でも試してもらえる。

micro:bitからの文字列を無線通信経由でUnityアプリで受信する

一つ目のコンテンツとしてモニターを使って色名を送ってダイナミックに文字が表示されるものを作りました。
「micro:bitからの文字列を無線通信経由でUnityアプリで受信する」
今回は2つ目のコンテンツです。送信側のロジックはどちらも一緒。
受信側をモニターから、LED照明に変えました。

開発環境

Window 10
micro:bit 3台
ZIP Halo - micro:bit用円型フルカラーLED
イルミネーションライト3つ(点滅なし。色違いがきれい。100円ショップや秋月に売ってます)

完成動画

機器構成

★クリスマスツリー側
(1)micro:bit + イルミネーションライト3つ(0-2端子に接続)
(2)micro:bit + ZIP Halo
IMG_4350.JPG

★送信側
(3)iPad + micro:bit
IMG_4269_.JPG

micro:bitとは

micro:bitはカードサイズのマイコンボードです。英国で開発され、BLEや各種センサーが搭載されています。
プログラミングは、USBポート経由でWindowsやMac、BLEによるペアリング経由でiPadやAndoridタブレットを利用できます。
プログラミングが書き込んであるmicro:bit端末同士でも文字列の送受信が可能です。
micro:bitについては、こちらをご覧ください→https://microbit.org/ja/

micro:bitをiOSで操作するときの基本操作

動画で説明していますので、参考にしてください



Script:(1)micro:bit + イルミネーションライト3つ(0-2端子に接続)

20181112.png

blinkLight.js
let stopTime = 0
function blink() {
    pins.digitalWritePin(DigitalPin.P0, 1)
    pins.digitalWritePin(DigitalPin.P1, 0)
    pins.digitalWritePin(DigitalPin.P2, 0)
    basic.pause(500)
}
function stopFunc() {
    pins.digitalWritePin(DigitalPin.P0, 0)
    pins.digitalWritePin(DigitalPin.P1, 0)
    pins.digitalWritePin(DigitalPin.P2, 0)
    basic.pause(2100)
    stopTime = 0
}
function blink2() {
    pins.digitalWritePin(DigitalPin.P0, 0)
    pins.digitalWritePin(DigitalPin.P1, 1)
    pins.digitalWritePin(DigitalPin.P2, 0)
    basic.pause(500)
}
radio.onReceivedString(function (receivedString) {
    stopTime = 1
})
function blink3() {
    pins.digitalWritePin(DigitalPin.P0, 0)
    pins.digitalWritePin(DigitalPin.P1, 0)
    pins.digitalWritePin(DigitalPin.P2, 1)
    basic.pause(500)
}
radio.setGroup(1)
stopTime = 0
basic.forever(function () {
    if (stopTime == 0) {
        blink()
        if (stopTime == 0) {
            blink2()
            if (stopTime == 0) {
                blink3()
            } else {
                stopFunc()
            }
        } else {
            stopFunc()
        }
    } else {
        stopFunc()
    }
})

イルミネーションと端子の接続に悩んだら、こちらの記事をご覧ください。
「MICRO:BITと百円ショップ商品で作る、クリスマスツリーイルミネーション」
わかりやすいです。ただし、イルミネーションの電池は単三が3本のものでも2本と同じように使えます。ただやはりmicro:bitからの出力は3V弱なのでしょう。輝度が多少弱まります。
昇圧モジュールを挟むともっと良い感じに光りそうです。

Script:(2)micro:bit + ZIP Halo

こちらは設定前にmakecodeにてNeopixelの拡張パッケージを追加してください。
micro:bitにはLower関数がないため、とても長い条件文になっていますが、やっていることは単純です。
通常はフルカラーが回転しながら光っていて、無線で指定の色名が送られてきたらその色で点滅するだけです。
■設定してある色
red
black
blue
green
pink
yellow
orange
purple

20181111.png

neopixelBleControll.js
let PushColor = 0
let neopixel2: neopixel.Strip = null
function setRainbow() {
    neopixel2 = neopixel.create(DigitalPin.P0, 24, NeoPixelMode.RGB)
    neopixel2.showRainbow(1, 360)
}
radio.onReceivedString(function (receivedString) {
    if (receivedString == "RED" || (receivedString == "Red" || receivedString == "red")) {
        PushColor = neopixel.colors(NeoPixelColors.Red)
        playColor()
    } else if (receivedString == "BLACK" || (receivedString == "Black" || receivedString == "black")) {
        PushColor = neopixel.colors(NeoPixelColors.Black)
        playColor()
    } else if (receivedString == "BLUE" || (receivedString == "Blue" || receivedString == "blue")) {
        PushColor = neopixel.colors(NeoPixelColors.Blue)
        playColor()
    } else if (receivedString == "GREEN" || (receivedString == "Green" || receivedString == "green")) {
        PushColor = neopixel.colors(NeoPixelColors.Green)
        playColor()
    } else if (receivedString == "PINK" || (receivedString == "Pink" || receivedString == "pink")) {
        PushColor = neopixel.rgb(255, 105, 180)
        playColor()
    } else if (receivedString == "YELLOW" || (receivedString == "Yellow" || receivedString == "yellow")) {
        PushColor = neopixel.colors(NeoPixelColors.Yellow)
        playColor()
    } else if (receivedString == "ORANGE" || (receivedString == "Orange" || receivedString == "orange")) {
        PushColor = neopixel.colors(NeoPixelColors.Orange)
        playColor()
    } else if (receivedString == "PURPLE" || (receivedString == "Purple" || receivedString == "purple")) {
        PushColor = neopixel.colors(NeoPixelColors.Purple)
        playColor()
    } else if (receivedString == "WHITE" || (receivedString == "White" || receivedString == "white")) {
        PushColor = neopixel.colors(NeoPixelColors.White)
        playColor()
    }
})
function SetColor() {
    neopixel2.rotate(1)
    neopixel2.show()
}
function playColor() {
    neopixel2.showColor(neopixel.colors(NeoPixelColors.Black))
    basic.pause(50)
    for (let i = 0; i < 7; i++) {
        neopixel2.showColor(PushColor)
        basic.pause(150)
        neopixel2.showColor(neopixel.colors(NeoPixelColors.Black))
        basic.pause(150)
    }
    neopixel2.showColor(PushColor)
    basic.pause(500)
    setRainbow()
    SetColor()
}
radio.setGroup(1)
setRainbow()
basic.forever(function () {
    SetColor()
})

Script:(3)iPad + micro:bit

子供が実際に体験するプログラミングなのでできるだけ単純にしてあります。
文字を入力するのと、ボタンの設定を覚えるだけですね。
イベントで利用するときは、前の人が作ったプログラミングがそのまま残っていますので、実際は色名を変えるだけで完了すると思います。
■変更可能な色名
red
black
blue
green
pink
yellow
orange
purple
※イベントで利用するときは、これらを紙に印刷しておくとよいと思います。

20181111_3.png

SendColor.js
input.onButtonPressed(Button.A, function () {
    radio.sendString("pink")
})
input.onButtonPressed(Button.B, function () {
    radio.sendString("blue")
})
input.onButtonPressed(Button.AB, function () {
    radio.sendString("orange")
})
radio.setGroup(1)

まとめ

また10分プログラミングがネタが思いついたら書きます。
アイディア募集中です。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2