Grove Inventor Kitとは?

 Grove Inventor Kit for micro:bitはマイクロビットで手軽に複数のセンサーを使えるようにしたキットです(以下Grove Kitと表記)。

micro:bit用 Grove Inventor Kit
・製造元seeedstudio
・スイッチサイエンスWebサイト内販売ページ https://www.switch-science.com/catalog/3389/

Grove Kitは専用のシールド(ボード)をマイクロビットに装着することで複数のセンサーを簡単につなげて同時に使うことができます。便利なのは配線を考えなくてもよく、単純に対応するソケットに差し込むだけでよいという点です。 Grove Kitの箱の中にはセンサーと説明書が入っています。説明書は英語ですが、図入りなので図を見ながら学習することができます。

センサー等は以下の7つが用意されています。これらのセンサーをうまく組み合わせていろいろ作れるようになっています。なお、I/O端子はシールドの横にも用意されているので他のセンサーをつなぐこともできます。電源はマイクロビットだけでなくシールド側にも用意されています。

  • LED(明るさ調整可能)
  • ジェスチャーセンサー
  • 超音波距離センサー
  • 7セグメントLED(4桁)
  • スピーカー
  • 光センサー
  • フルカラーテープLED

Grove Kitのセットアップ

 Grove Kitを使うためには、まずマイクロビットにシールドを装着します。

 以下のようにマイクロビットを差し込みます。

 あとは必要に応じてセンサーを接続します。

 次にGrove Kitを使うために拡張機能を読み込む必要があります。まず、「拡張機能」の項目をクリックします。

拡張機能一覧が表示されます。

Grove Kitは出てきませんので、読み込む拡張機能名かURLを指定します。検索欄にgroveと入力し検索ボタン(虫眼鏡ボタン)をクリックします。

するとGrove Kitに関するいくつかの拡張機能のリストが表示されます。groveと書かれた矢印で示す拡張機能をクリックして読み込ませます。

拡張機能が読み込まれるとGroveという項目が追加されます。

拡張機能が表示されない場合や、読み込んだ拡張機能がうまく動作しない場合は検索欄に以下のURLを入れてください。

github.com/seeed-studio/pxt-grove

検索ボタン(虫眼鏡ボタン)をクリックすると図のように表示されます。クリックして拡張機能を読み込ませます。

これでプログラムを作る準備は完了です。

LEDモジュールを使う

 それでは最初に赤色LEDを点灯させてみましょう。袋からLEDモジュールを取り出します。袋の中には赤色LEDが入っています。もし、手持ちのLEDがあれば、それを差し込んで使うこともできます。LEDを差し込む場合は±があるので注意してください。なお、このモジュールでは逆に差し込んでも壊れないようです。
 LEDモジュールはLEDの明るさを調整することができます。マイナスのドライバーで写真の矢印で示す部分を回転させます。時計まわりに回すと暗くなり、反時計まわりに回すと明るくなります。

 LEDモジュールとシールドを接続します。

LEDの点灯/消灯はP0端子に1か0の信号を出力することで行うことができます。このLEDモジュールの場合、専用のブロックは存在しません。すでにある入出力端子のカテゴリあるデジタル出力ブロックを使います。
 0.1秒ごとにLEDを点滅させてみましょう。以下のようにブロックを組みます。

 JavaScriptコードの場合は以下のようになります。

basic.forever(function () {
    pins.digitalWritePin(DigitalPin.P0, 1)
    basic.pause(100)
    pins.digitalWritePin(DigitalPin.P0, 0)
    basic.pause(100)
})

プログラムをダウンロードしマイクロビットに転送して動作を確認します。LEDモジュールに接続されている赤色LEDが点滅します。なお、LEDが光らない場合は逆に差し込んでいるか、明るさの調整でもっとも暗い状態になっている可能性があります。確認してみてください。

ジェスチャーセンサーを使う

 次にジェスチャーセンサーを使ってみましょう。ジェスチャーセンサーは「Grove - Gesture」と書かれたビニールの小袋に入っています。ジェスチャーセンサーとシールドをケーブルで接続します。接続する場所はI2Cと書かれたところです。他のところに差し込んでも動作しません。
 準備ができたら以下のようにブロックを組みます。ジェスチャーのブロックはGroveのカテゴリをクリックすると表示されます。

 JavaScriptコードの場合は以下のようになります。

grove.onGesture(GroveGesture.Right, function () {
    basic.showArrow(ArrowNames.East)
})
grove.onGesture(GroveGesture.Left, function () {
    basic.showArrow(ArrowNames.West)
})
grove.onGesture(GroveGesture.Up, function () {
    basic.showArrow(ArrowNames.North)
})
grove.onGesture(GroveGesture.Down, function () {
    basic.showArrow(ArrowNames.South)
})
grove.onGesture(GroveGesture.Wave, function () {
    basic.showIcon(IconNames.Heart)
})

プログラムをダウンロードしマイクロビットに転送して動作を確認します。センサー上で手や物体を横切るように動かすとマイクロビットのLEDに動かした方向を示す矢印が表示されます。手をうまく振るとハートマークが表示されますが、ちょっと難しいかもしれません。

7セグメントLEDを使う

 次に7セグメントLEDモジュールを使ってみましょう。このモジュールは4桁の表示を行うことができます。

7セグメントLEDモジュールはP0端子に接続します。なお、必ずしもP0端子でなくP1、P2端子でも構いません。

それでは、この7セグメントLEDモジュールに数値を表示してみましょう。4桁なので0〜9999まで表示できます。また、時計のように時刻を表示することもできます。
最初に7セグメントLEDモジュールの接続先などの設定を行います。今回はP0端子、P14端子に接続しているので、最初に用意されているブロックをそのまま使う事ができます。この7セグメントLEDモジュールの情報を変数(strip)に入れておきます。今回はこの変数に7セグメントLEDモジュールの接続先などの情報を入れておきます。この設定は最初に一度だけ行います。

次に数値を表示します。が、普通に数値を表示するのは面白くないのでマイクロビットが起動してからの時間を表示させてみましょう。マイクロビットが起動してからの時間(ミリ秒)は「稼働時間(ミリ秒)」ブロックに入っています。7セグメントLEDモジュールに表示する場合、秒数に直して表示したいので1000で割ります。これで秒数になります。

ただし、ここで注意点があります。マイクロビットの古いブロックエディタでは単純に1000で割り算した結果を出力すればよいのですが、現在のブロックエディタでは小数点以下を切り捨てる処理をした後に結果を出力しないと一部の値(9とか)が正しく表示されません。これは、古いブロックエディタは整数値しか扱えなかったのですが、現在のブロックエディタは小数点計算ができるようになっています。このため、整数化しないと期待するように値が表示されません。

 実際のプログラムは以下のようになります。

 JavaScriptコードの場合は以下のようになります。

let strip: grove.TM1637 = null
strip = grove.createDisplay(DigitalPin.P0, DigitalPin.P14)
basic.forever(function () {
    strip.show(Math.trunc(input.runningTime() / 1000))
})

プログラムをダウンロードしマイクロビットに転送して動作を確認します。7セグメントLEDに表示される値が1秒ごと増えていきます。なお、マイクロビットをリセットすると0になります。マイクロビットの基板上にあるリセットボタンを押して確かめてみるとよいでしょう。

スピーカーモジュールを使う

 次にスピーカーモジュールを使ってみましょう。スピーカーは接続する端子がP0と決まっています。他のモジュールと組み合わせて使う場合は注意してください。
 Groveのスピーカーモジュールはボリューム(音量)を調整することができます。もし、音が出ない場合は小さいマイナスドライバーを使って調整してください。

 スピーカーモジュールは専用のブロックは用意されていません。すでにあるマイクロビット標準の音楽ブロックをそのまま使うことができます。簡単なところで音楽を演奏させてみましょう。以下のようにブロックを組みます。

 JavaScriptコードの場合は以下のようになります。

music.beginMelody(music.builtInMelody(Melodies.Ode), MelodyOptions.Once)

プログラムをダウンロードしマイクロビットに転送して動作を確認します。指定した音楽が演奏されます。

3分タイマーを作る

 それでは最後にスピーカーモジュールと7セグメントLEDモジュールを組み合わせてタイマーを作ってみましょう。ここでは3分経過したらスピーカーから音楽を演奏することにします。
 スピーカーモジュールをP0端子に、7セグメントLEDモジュールをP1端子につなぎます。

 準備ができたらプログラムを作成します。まず、初期設定です。7セグメントLEDモジュールはP1端子とP15端子につなぐように設定します。これを変数stripに入れます。
 次に7セグメントLEDの中央にあるコロン(:)を点灯するように設定します。初期値では「偽」になっているので「真」を選択します。
 3分経ったら音楽を演奏しますが、最初にスピーカーから音がでないようにしておく必要があります。これはP0端子にデジタル値で0を出力します。これで、不要な音が出なくなります。

 次に時刻表示です。稼働時間から秒数を計算します。これは前で説明した通りです。異なるのは分と秒の処理です。分は60で割り小数点を切り捨て、さらに60で割った余りにします。秒は60で割った余りにします。
 あとは7セグメントLEDに時刻を表示しますが、数値として表示すると1桁の数値、例えば3秒の時に03秒のように先頭に0が表示されません。やはり、ここは一般的なデジタル時計と同じように表示します。そこで、7セグメントLEDの桁ごとに数値を表示するブロックを使います。このブロックに分や秒の数値を桁ごとに出力します。

 最後に3分(180秒)になったら音楽を演奏するように論理ブロックを使って処理します。なお、以下の場合、何度か条件を満たしてしまうため、曲の出だしが数回演奏されてしまいます。気になる場合は、フラグとして使う変数を用意し、すでに演奏している場合は演奏しないようにするとよいでしょう。

 実際のプログラムは以下のようになります。

 JavaScriptコードの場合は以下のようになります。

let 分 = 0
let 秒 = 0
let strip: grove.TM1637 = null
let time = 0
strip = grove.createDisplay(DigitalPin.P1, DigitalPin.P15)
strip.point(true)
pins.digitalWritePin(DigitalPin.P0, 0)
basic.forever(function () {
    time = Math.trunc(input.runningTime() / 1000)
    秒 = time % 60
    分 = Math.trunc(time / 60 % 60)
    strip.bit(Math.trunc(分 / 10), 0)
    strip.bit(分 % 10, 1)
    strip.bit(Math.trunc(秒 / 10), 2)
    strip.bit(秒 % 10, 3)
    if (time == 180) {
        music.beginMelody(music.builtInMelody(Melodies.Ode), MelodyOptions.Once)
    }
})

プログラムをダウンロードしマイクロビットに転送して動作を確認します。3分経過すると音楽が演奏されます。

Grove Kitには他にもセンサーが用意されています。同梱されているマニュアルにも面白いサンプルが掲載されていますので、いろいろ試してみると面白いでしょう。

著者 古籏一浩
プログラミングをベースにして面白そうなものはとりあえずやってみるというスタンス。複雑なものよりシンプルで楽しめるものが好み。最近は30年前に移植したゲーム(mz-700版 SPACE HARRIER)の話などを書いたりしています。
著者サイト:http://www.openspc2.org/