マイクロビットを使ってみる 〜LEDをホタルのように明滅させる

スポンサーリンク
電子工作の作例

マイクロビットによる制御で、LEDをホタルのようにゆっくり明滅させてみたいと思います。
また、この明滅の間隔を、外部からの制御で変更してみたいと思います。


具体的には、以下のようなものをつくります。

  • ふたつのマイクロビットを使います。両者は無線通信を行います。一方を送信機、もう一方を受信機とします。
  • 送信機は、0.5秒間隔で無線で数値(値は 0)を送信します。
  • 受信機のP1端子にはLED(と47Ω抵抗)がつながっています。普段このLEDは1分間に50回の間隔で明滅しています。
  • 受信機が無線で数値を受信したとき、その信号強度に応じて明滅間隔を変更します。最も信号強度が大きいとき1分間に150回の間隔で明滅させます。

LEDが心臓のドキドキをあらわしており、他のマイクロビットが近づいてきたらドキドキがはやくなるというイメージです。

まずは無線などは関係なく、1台のマイクロビットでLEDをゆっくり明滅させてみます。

最初に、マイクロビットとLED(と47Ω抵抗)を以下のようにつなぎます(なお、実際には今回の接続の仕方は図とは若干異なります。今回はマイクロビットのP1端子にLEDをつなぎます。ブレッドボードでつかう端子の場所も、今回は写真と異なっています)。

プログラムはこちらです。

1分間に50回の間隔で明滅させたいので、「周期」変数は「1200(ms)」にします。
P1端子からのアナログ出力値を更新する間隔は「処理する間隔(ms)」変数で設定します。今回は「50ms」にしておきます。
LEDを明滅させるのに「sin」ブロックを使います。サイン波の形状どおりにLEDの明るさを変化させたいと考えています。
「sin」ブロックでは、入力を「0→0.5π→1π→1.5π→2π」と変化させると、出力が「0→+1→0→-1→0」とサイン波の形状どおりに変化します。
「sin」ブロックの入力は「位相」変数で設定します。「位相」変数の値は、1回の処理ごとに「2π x 処理する間隔 / 周期」だけ増やします。つまり「処理回数 x 処理する間隔 」が「周期」と同じになったとき「位相」は「2π」になり、サイン波がひとまわりします。「位相」が「2π」以上になったら「0」に戻しておきます。
「sin」ブロックの出力範囲は「-1」〜「+1」ですが、アナログ出力の設定範囲は「0」〜「1023」です。このため「sin」ブロック出力(-1〜+1)を「0〜1023」にマッピングした上でP1端子からアナログ出力しています。

なお、LEDの明滅処理とは関係ありませんが、今回は「処理する間隔」を制御するのに「現在の時間」「前回の処理時間」変数を使っています。
簡単にしようとすれば、「ずっと」ブロックで処理を行った後に「一時停止 処理する間隔」と入れておけばよいのですが、今回は「現在の時間」-「前回の処理時間」が「処理する間隔」以上になったときのみ処理するようにしています。
「一時停止」を使うと、「ずっと」ブロックに他の処理を加えることができなくなりますが、今回のやり方なら「ずっと」ブロックで他の処理も行うことができます。

こんな感じで明滅します。

次に、送信機から送られてきた信号強度に応じて明滅間隔を変更してみます。

送信機のプログラムはこちらです。

0.5秒ごとに無線で数値を送信しているだけです。送信する数値自体に意味はないので、毎回「0」を送信しています。送信したことが分かるように、送信時にアイコンを点灯させています。

受信機のプログラムはこちらです。

送信機から送られてきた信号強度(≈送信機との距離)を調べるのに「受信したパケットの信号強度」ブロックを使います。
「受信したパケットの信号強度」の値は「-127〜0」の範囲になりますが、実際にはふたつのマイクロビットをすぐ近くに置いたときに「-45程度」、数メートル離したときに「-80程度」になります。
今回は「信号強度」の数値として「-70〜-40」の範囲をつかいます。信号強度が「-70」以下のときに「周期」を1200(1分間に50回の間隔で明滅)、「-40」以上のときに400(1分間に150回の間隔で明滅)になります。中間の値は「1200〜400」にマッピングされます。
これで、マイクロビットが近づくと「周期」が短くなり、それによりLEDの明滅がはやくなることになります。

結果はこんな感じになります。

結構いい感じに明滅しています。人の心臓のドキドキを表現したような作品をつくるときに使えそうです。

 

なお、私がマイクロビットの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。


初心者向けから、比較的高度なものまで、さまざまな情報が記載されているだけでなく、子供向けの作例も多数掲載されていますので、「プログラミング教育」のための題材さがしなどにもおすすめです。