NeoPixel(WS2812B)の制御 その5
「NeoPixel(WS2812B)の制御 その4」に関して質問がありました。
流通しているNeoPixelマトリックの配列には様々なタイプがあるようです。
そこで、前回のスケッチをもう少し見直して、 XYtoNo()関数の修正でレイアウトの差異を吸収できるよう、修正しました。
スクロール処理を行うNeoScroll()関数を、処理速度を少々犠牲にしてXYtoNo()を使って処理を行うようにしました。
試した感じでは、処理速度的には問題ないようです。
修正版
■ 修正の補足
NeoScroll()関数は、縦x横のドットデータを左に1ドットずらす処理を行っています。
従来版は速度重視のためmemmove()、memset()を使っていたのですが縦並びのLEDに対応出来ません。
そこで XYtoNo()を使てのデータ操作に修正しました。
これにより、XYtoNo()関数にてパネルのレイアウトに対応するだけで差異を吸収できます。
文字の縦の表示開始位置は、次の定数を変更することで調整出来ます。
#define Y_OFFSET 0 // フォントの縦先頭位置
ここで、「NeoPixel(WS2812B)の制御 その4」でZuhiさんがご質問されました、
横32ドットx縦8ドットで「パネルの左上起点に下上になっている」パネルについて対応してみましょう。
256個のLEDが数珠つなぎ(0~255)になっているのですが、並びは次の感じだと思われます。
左上が起点で↓向きでスタート、8個目で↑向きに折り返しで256個がつながっています。
上記において、任意の(x,y)の位置のLEDを操作するためには、そのLEDの先頭からの番号が必要となります。
計算式としては、次のようになります。
xが偶数の場合:
no = x * 8 + y
xが偶数の場合:
no = x * 8 -y + 8 -1
定数を踏まえると..
xが偶数の場合:
no = x * PXCEL_H + y
xが偶数の場合:
no = x * PXCEL_H -y + PXCEL_H - 1
となります。
修正版のスケッチをZuhiさんのパネルに対応する場合、以下の修正でいけると思います。
①定数の変更
#define PXCEL_W 32 // 横ピクセル数
#define PXCEL_H 8 // 縦ピクセル数
②XYtoNo()の変更
noを参考にして修正すると、関数内のreturn文を下記のように修正します
return x&1 ? x*PXCEL_H-y+PXCEL_H-1: x*PXCEL_H+y; // 左上起点下上方向並び
(※修正版にコメント化して記述しています)
横32ドットx縦8ドットパネルは所有していないので、動作確認出来ないのですが、たぶん大丈夫でしょう(;^_^
(うまくいかない場合、連絡ください)
最近のコメント