n:bitⅡ Nコンパス(ナナイロコンパス)

24個の円型フルカラーLEDを利用して、コンパス(方位磁針)を作ります。
北を白LEDで示し、さらにプログラム改良してLED全体をナナイロに光らせます。
n:bitⅡとNコンパスは頒布販売していますので、NPO法人nextday1までお問い合わせください。

※n:bitのコンパス作りは、「n:bit コンパスを作ろう」も参照してください
※地磁気センサを利用した、磁石さがしプログラムは「n:bit 磁力センサでお宝をさがせ!」を参照してください

※円型フルカラーLEDの参考部品(スイッチサイエンス社のオンライン販売のページへのリンクです)
https://www.switch-science.com/products/3484


▪️Nコンパス▪️


北を示すColorLEDの場所を白色で点灯させるプログラムです

地磁気センサーの方位の値から、点灯するLEDの場所を計算するために「数値をマップする」ブロックを使うのがコツです。

1.変数[strip]を設定する

「最初だけ」ブロックでは、Color LEDを使うための準備をします。
NeoPixelの拡張機能をあらかじめセットしておいてください。
n;bitⅡでは、LED24個をP1端子にて使います。

2.NeoPixel(strip)の[点灯LED]番目のLEDを[black]にする

「ずっと」ブロックでは、北を光らせるための手順を作っていきます。
 まず最初に、「点灯LED」番目のLEDを[black]にします。[black]とは、光らせない=消灯するということです。
 これは、いままで北を示していた白LEDを消す動作になります。
「最初から消すの?」と不思議に思うのかもしれませんが、プログラムは繰り返し実行されるので、「最初に消しておく」という考え方が必要なのです。

LED番号と位置の関係は、図1を見てください。
0番を指定すると、その場所のLEDを光らせたり色をつけたりすることができるのです。

変数[点灯LED]には、北を示すLED番号が入ります。

図1.LED番号と位置の関係
  方角(°)  LED番号
0-140
15-291
30-442
45-593
60-744
75-895
90-1046
105-1197
120-1348
135-1499
150-16410
165-17911
180-19412
195-20913
210-22414
225-23915
240-25416
255-26917
270-28418
285-30919
310-32420
325-32921
330-34422
345-35923
図2.方角とLED番号の関係

3.変数[点灯LED]を[数値[方角]をマップする]

[マップする]ブロックによって、[方角]から北方向に相当するLED番号を求めます。
ひとつのLEDが受け持つ角度範囲は、360°÷24個=15°となります。
[方角]とLED番号の関係は、図2を見るとわかるでしょう。

ここで、[方角]の範囲は0から359までなのですが、[マップする]ブロックに指定する元の上限は360としました。
同じく[点灯LED]は0から23までなのですが、結果の上限を24としました。
実は、元の上限を359、結果の上限を23にしてしまうと不都合が生じるのです。
これは、[方角]が359度のとき[点灯LED]の値が22.99となるのですが、NeoPixelではLED場所指定に小数を使っても、小数点以下は切り捨てられます。
したがって、この場合のLED場所は22となります。つまり23番目のLEDはいつまで経っても点かなくなるのです。

今回のマップ条件である、[方角]が0から360、[点灯LED]が0から24であれば、[方角]が359度のときは[点灯LED]の値は23.98になるので、小数点以下が切り捨てられても23番目として扱われます。
[方角]が決して360にならないことも考慮済みです。

4.NeoPixelの[点灯LED]番目のLEDを[白]にする
新しいLED点灯場所となるLEDを白に設定します。
実はこのブロックは設定するだけなのでLEDは光りません。
このあと続けて「点灯する」ブロックを実行して、初めてLEDが光ります。

5.NeoPixelを点灯する
このブロックを実行して初めて、実際にLEDが光ります。
NeoPixelのプログラムを作ってみると、このブロックが抜けていることがよくあります。
「光らないなあ」と思ったときは、思い出してみてください。

「ずっと」ブロック内の、2から5を繰り返します


▪️ナナイロコンパス▪️

Nコンパスのプログラムを改良して、北を示す白LEDに加えてColorLEDをレインボーカラーで点灯させるプログラムです。
さらに、ボタンを押すことで、レインボーカラーを左右に回転できるようにします。

Nコンパスのプログラム(灰色部分)にナナイロのプログラム(色付き部分)を追加して作ります。

変数が必要になりますので、あらかじめ作っておきましょう


プログラム説明

「ずっと」ブロックへの追加

1.[strip]の明るさを(10)に設定する
北を示す白LED以外のLEDを同じ明るさにしてしまうと、北がわかりづらくなってしまいます。
そこで、色をつける部分のLED輝度を低くして目立たないようにします。

2.[strip]をレインボーパターン(色相 1 から 360) に点灯する
このブロックを実行すると、24個のColor LEDがナナイロ(虹色)に点灯します。
この時点では北を示す白LEDも消えてナナイロの1色に置き換わります。
NeoPixelでの注意点として、色相範囲は1から360の範囲になります。
Wikiなどで色相を調べると範囲は0から360と表現しているものがありますが、NeoPixelでは、0を360と同じ意味で扱います。
したがって、「色相0から360」としてしまうと「色相360から360」と処理されて、すべてのLEDが赤となってしまいます。
NeoPixelのブロックを使うときは色相の範囲に気をつけてつかいましょう。
参考wiki:「色相とは」

3.変数[回転数]を[回転方向分]だけ増やす
4.変数[strip]に設定されている色を LED[回転数]個分ずらす(ひとまわり)
この2つのブロックで、ナナイロの光の動きを計算式で作っています。詳しくは、次の「ボタンが押された時」ブロックにて説明します。

5.[strip]の明るさを(255)に設定する
このブロックでは、この後に続く北を示すLED処理のブロックで、白LEDが明るく光るようにします。
NeoPixelのプログラミング全てに言えることなのですが、「〜設定する」というブロックは、今光っているLEDには影響せず、これから設定するブロックや新たに光らせるブロックに影響していきます。
この辺りのプログラムの動き方は、なんどか使ってみて確かめていくのがよいでしょう。


6.ロゴが(長くタップされた)とき
ColorLED全体を青色に点灯して、コンパスの調整(較正)をします。
較正とは、地磁気センサの誤差や周りの強い磁気によって本来の北方向を示していないときに、方位の再確認と正しい方向に修正することです。


  1. n:bitⅡの注文について ↩︎

この教材は「Creative Commons — CC BY-SA 4.0」の下に提供されています。