当サイトは広告が表示されます。

WRX micro:bitを車両で使う その41 フルカラーLEDマトリックス(WS2812B)で時計を作る

Ad,micro:bit,動画,社外部品・DIY

前回はリング形状のフルカラーLEDを使用しましたが、今回は行列のマトリックス形状に配置されたフルカラーLEDパネルを使用してみます。micro:bit本体には行列で5×5の赤色LEDがありますが、簡単なアルファベットや数字、記号しか表示出来ません(任意に作成も出来ますが)。フルカラーLEDパネルを使用すると、色でも様々な表示が可能になり、一見文字表示も簡単に出来ると思いきや、意外に大変な作業になりました…。

スポンサーリンク

フルカラーLEDマトリックス

micro:bitで使用出来るフルカラーLEDマトリックスは、前回のリング形状のLEDと同様に「WS2812B」が使用されています。micro:bit用の製品もありますが汎用製品も使用出来ます。前回のリング形状のLEDではKitronik社のmicro:bit用製品を購入しましたが、今回は汎用製品を購入しました。Kitronik社のmicro:bit用製品(ZIP Tile)はこちら。日本国内ではスイッチサイエンス等で購入出来ます。

LEDの数は5×5や8×8、16×16など色々とありますが、micro:bitで使用する場合は制御への負担や消費電力を考えると、あまり大きなサイズは厳しそう?と思い、8×8で64個のLEDが搭載されたパネルを4枚購入しました。8×8で試してみて、次に4枚を組み合わせて16×16にしてみようと思います。

配線

汎用製品の場合、電源と信号用の配線がされていない物もあります。今回購入した汎用製品も配線は無く、基板上に半田付け用のパターンがあり、ここに配線を半田付けする必要があります。今回はオスメスのジャンパ線を切断して利用しました。※なお電源は「5V」の別電源が必要です。中には3.5Vで動作する物、あるいはKitronik社のZIP Tileでは1枚であればmicro:bitの3Vで動作する様ですが、LEDの消費電力が大きいので別電源での利用が推奨されます。

また半田付け用のパターンは2か所あり、1つは入力用、もう1つは出力用で、複数のLEDマトリックスを使用する場合に、IN→OUT→IN→OUT…と数珠繋ぎする事でmicro:bitからは1つの出力で制御が可能になります(出力を分けて個別に制御も可能です)。複数使用しない(8×8のLEDマトリックス1枚)場合は、出力側の半田付けは不要ですが、16×16では電源供給の為に出力側の電源配線のみ配線が必要かもしれません。

LEDマトリックスのLED配置

前回のリング形状LEDは1列に並んだLEDテープを円形に配置した物で、円周上にLEDの先頭と後尾が存在します。先頭から後尾まで点灯させた後、再び先頭から点灯させる(繰り返し)制御にすれば、先頭と後尾の「切れ目」は分からないので違和感はありませんが、今回のマトリックス形状のLEDパネルではどのようにLEDが配置されているのでしょうか?

購入したパネルでは基板上のプリントを見ると上記の様になっています。左上の電源と信号の入力から右方向に8個、1行下がって再び左から右へを繰り返し、右下に電源と信号の出力があります。マトリックス形状のLEDパネルも、結局は1列にLEDが並んでいる形です。

この時点で嫌な予感がします。8×8のパネルを4枚組み合わせて16×16にした場合と、初めから16×16になっているパネルを使用した場合では、同じプログラムで同じ表示は出来ないのでは?という事です。

LEDマトリックス用のプログラム

Kitronik社の製品(ZIP Tile)用拡張機能

Kitronik社の「ZIP Tile」ではmicro:bit用の拡張機能も公開されています。またデータシート(リンク先はpdf)では同製品を2つ、あるいは4枚組み合わせる場合の配置方法も記載されていますが、入出力の位置から少々特殊な配置です。ちなみにZIP Tileも「WS2812B」の仕様に合わせた製品なので、汎用製品(8×8)でもこの拡張機能を利用出来ますが、複数組み合わせる場合はZIP Tileの仕様に合わせる必要があります。

Kitronik社ZIP Tileデータシートより引用

複数を組み合わせた場合、拡張機能のブロックで縦横の「パネル数」を指定します。基本はあくまで「ZIP Tile(LEDが8×8)」なので、5×5や16×16の製品には対応しません。またLEDの接続先としては「P0」固定で、他の端子指定は出来ません。

ZIP Tile用の拡張機能ではX,Yで任意のLEDを点灯する他、文字(数値・アルファベット)をスクロール・表示出来るブロックもあります(日本語は不可)。製品サイトにサンプルプログラムもあります。

文字表示は大きさやフォントは選択出来ないので、あまり表現の自由度はありません。ちなみにプログラム上では日本語も入力できますが、実際の表示は文字(アスキー)コードになってしまいます。

拡張機能「Neopixel」

前回のリング形状のLEDでも利用しましたが、Microsoft Makecodeでは「WS2812B」のLED制御用として、「Neopixel」という拡張機能があります。こちらにも「set matrix width」というブロックがあるので、マトリックス形状のLEDでも利用出来る事が分かります。

端子に接続したLEDの合計数を指定した上で、マトリックス形状の横方向のLED数を指定する形です。ZIP Tileとは異なり任意のサイズで指定が可能ですが、一方でZIP Tileの様な8×8等のパネルを組み合わせた場合では、ちゃんと表示出来ない事も想像出来ます(8×8のパネル1枚であればZIP Tile、Neopixelのどちらでも可能)。

従ってNeopixel拡張機能でもマトリックス形状のX,YによるLED指定が可能ですが、ZIP Tileの様な文字表示機能はありません。文字表示を行うには1点ずつX,Y指定するしかない…?

LEDマトリックスでの文字表示

現状、micro:bitの拡張機能で、ZIP Tile用やNeopixel以外で任意の文字や数値表示する機能を持つものは見つけられませんでした。先の通りX,Yで1点ずつ指定して文字を作るという、ピクセルアートの制作と同様の作業が必要になってきます。

注記

フルカラーLED(WS2812B)はデフォルトでは最大光度で点灯します。非常に、というよりも目には危険なレベルの明るさなので、プログラム作成の際は明るさ設定のブロックを利用する事をお勧めします。最大光度の設定数値は「255」ですが「20」もあれば十分です。また明るいほど消費電力も大きいので別電源が必要です。

時計を作る

今回は8×8のLEDマトリックスを4枚購入しているので、これを横に並べて時計を作ってみようと思います。必要な文字(数値)は0~9の10個ですが、最大で文字1つあたり8×8=64個、10文字で640個、さらに4桁分で640×4=2560個…のX,Y値をプログラム上に用意するのは現実的ではありません(micro:bitでそこまでのプログラム量も書けないと思いますが)。従ってなるべく少ないプログラム量で文字を表示出来る方法を考えます。

0と1で文字を表す

先に書いた通り、マトリックス形状のLEDも先頭から後尾まで1列に繋がっています。従って8×8=64個のLEDの内、点灯するLEDは「1」、消灯するLEDは「0」とする事で「1011000…」と64個の1と0で表現出来ます。

こちらのサイトではArduino用にLEDマトリックスの表示プログラムを作成出来ますが、このサイトを利用して0~9用に各64個の「1」と「0」を作成します。

通常は中央にあるマトリックスをクリックして、自由に文字や記号などをデザイン出来ますが、左上(赤枠)に予め数字等が用意されています。また複数のデザインを用意してアニメーション用のプログラムも作成出来ます。上記では既に1~0の10個が用意されています。マトリックスの下部にある「Insert」や「Delete」で追加や削除が可能です。

「1」と「0」で表現する為に、矢印の「As byte arrays」にチェックを入れます。次にコード(黄枠)で表示されている「0b」から始まる行を全て選択してコピー(Ctrl+C)します。なお上記では1~0の10個全てがコードに含まれています。

コピーした内容をメモ帳等にペースト(貼り付け・Ctrl+V)します。次に置換機能で「0b」や「,」を削除(空欄で置き換える)します。

とりあえず、上記の形までに修正しました。選択されているのは「1」を表す部分ですが、よく見れば形状も「1」と読み取れます。メモ帳の段階で横1列にしてしまっても良いのですが、この内容を再びメモ帳からコピーします。

配列として各文字を置く

ここからはMicrosoft Makecodeでの作業ですが、今回は「Neopixel」の拡張機能を利用します。基本となる設定プログラムは、ここでは省略します。

Microsoft Makecodeの変数に配列を利用します。次にその配列にメモ帳からのコピー内容をペーストします。上記では1~0の10個を各配列に割り当てています。ただし配列は「0番目」から始まるので一番上を「0」、一番下を「9」の内容としています。またここでスペース等を削除して、最終的に64個の「1」と「0」が並ぶ形にしています(もちろん先のメモ帳内で行っても可)。

配列を読んで「1」を点灯

実際にLEDマトリックスで表示するには、上記の様に表示したい数値○に対して○番目の配列(○は同じ数値)から64個の「1」と「0」を読み(64回繰り返す)、その順番で「1」の場合は点灯、「0」の場合は消灯とします。ここでの注意点として、LEDの順番も「0番目」からです。

RTC(リアルタイムクロック)を利用

micro:bitの内部機能から時計を作る事も可能ですが、少々面倒な上に正確ではありません。そこで今回は以前にも利用したRTC(リアルタイムクロック)モジュールを使います。このRTCの詳細については以下の記事を見て下さい。

時計(桁)表示にする

4枚のLEDマトリックスで時計表示を行うには、それぞれのパネルで例えば12時の「1」や「2」、34分の「3」と「4」といった異なる「桁」の表示が必要です。

まず上記の様に最初の設定で、P0に接続した全LEDマトリックス(LED256個)に対して、LEDマトリックスの1枚ずつに範囲分けします(LED64個)。範囲分けをする事でLEDマトリックスを個別に扱い易くなります。「Neopixel」の拡張機能ではこの範囲分けが可能なので便利です。

次にRTCから得られる「時」や「分」、「秒」を表示する桁の内容に合わせて値を修正します。今回はLEDマトリックスが4枚しか無いので、「時+分」と「分+秒」で表示内容を選択出来る様にしています。

コロン(:)を付ける

時計表示にする場合、コロン(:)が無いと分かり難くなってしまいます。しかしLEDマトリックス4枚ではコロンを表示する余裕がありません。そこで「3桁目」は別途64個の0と1で、コロンを含んだ数字を用意しました。

表示遅れの改善

さて、ここまででLEDマトリックス4枚での時計表示は完成しました。しかし時間が経過して表示内容が変わると全く表示出来ない桁や、「秒」の表示が追い付きません(上記gifアニメ、「時:分」から「分:秒」への切替)。合計で256個のLEDをP0の1つの出力で制御するには限界を超えている(RTCやプログラム全体の処理を含めて)様子です。

幸い、「Neopixel」の拡張機能ではLEDを複数の出力で同時制御可能なので(厳密には同時ではありませんが)、先の範囲分けではなく、4枚のLEDマトリックスをP0~P3に分けて接続する形にしてみました。結果として、出力を分ける事で多少の遅れはあるものの、表示の問題は無くなりました。

完成形

上記gifアニメは「分:秒」を表示しています。数字が下へ落ちるのはプログラム処理によるもの(演出)ですが、新たに表示する数字が上から表示されるのは、処理の遅さによるものです。

「時:分」にすると、動いているのか分からないので、右下に1秒間隔で青色に点滅するLEDを1個付けました。しかし数字に関しては赤の1色のみなので、次回、4枚のLEDマトリックスを縦横2枚ずつに並べて16×16の形にし、異なる色も使ったピクセルアートアニメーションを表示させてみます。

動画

今回の動画です。動画前半は次回記事で扱っているピクセルアートアニメーションについて。時計表示については「3:34」からです。

ブログ記事公開後に再び同じ内容(翌年に同じ場所を走行など)の動画を作成・公開している場合があります。記事内の動画もなるべく最新を掲載する様にしていますが、最新や過去・その他の動画を見る場合はYoutubeを見て下さい。

「micro:bit」関連記事

以下は「micro:bit」タグの記事一覧です(投稿順)。現在の記事とこれ以降に投稿した記事も含みます。「その24」までの記事ではmicro:bit本体のバージョン「1.5」を使用しています。
micro:bit関連記事
クリックで開きます
「micro:bit+プラレール」も始めました。
プラレール関連記事

その他

FA用PLCとELM327を使用した「OBD2」関連の記事は以下の記事から始まります。

注記

    • このブログ内で書いている内容はあくまで私の利用する製品(アプリ含む)や機器での場合です。他メーカーの製品や機器をはじめ、同じメーカーの製品・機器であってもバージョン違い等の場合もあるので、記事内容の保証や責任を負う事は出来ません。
    • 記事内で紹介している製品や、その他の類似製品を購入・利用する場合はそのメーカーや購入先で仕様等を確認し、自己判断と自己責任の下で利用して下さい。
    • 記事内で公開しているmicro:bit用プログラムは自由に利用・改変して頂いて構いません。ただし不具合やバグもありますので、プログラムを利用した際の故障や事故等についての保証や責任を負う事は出来ません。自己判断と自己責任の下で利用して下さい。
    • micro:bit製品やプログラミング、その他記事内容について個別の問合せや依頼を頂いても回答する事は出来ませんので、予め御了承下さい。
    • BBC micro:bitは、micro:bit教育財団の登録商標です。その他のブランド名または製品名は各所有者の商標です。