フォト
2020年8月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
無料ブログはココログ

« 明けましておめでとうございます。 | トップページ | ココログの不具合治らず.. 過去記事を修正中です »

2020年1月 9日 (木)

NeoPixel(WS2812B)の制御 その4

ArduinoによるNeoPixel(WS2812B)の制御の続きです。質問があり、折角なので
以前作成した、8x8ドットマトリックスタイプのNeoPixelを制御するスケッチを汎用化(任意のサイズ対応)しました。
とりあえず手持ちの16x16ドットモジュールで試してみました。

動いている様子


利用したモジュールは、Aliexpressにて入手しまた。

1 pcs/lot DC5V 16x16 Pixel WS2812B LED Digital Flexible Individually addressable Panel light
04_20200109194301

このモジュールのNeoPixelの並びは次のようになっています。
05_20200109195701

接続
    Arduino:D11   -  NeoPixel:DIN
    Arduino:5V     -  NeoPixel:5V
    Arduino:GND  -  NeoPixel:GND

スケッチ


スケッチは、16x16ドットマトリックスに対応するように作成していますが、
下記の横ピクセル数、縦ピクセル数を変更することで、横8x縦8ドット、横32x縦8ドットにも対応出来ると思います。
  #define PXCEL_W  16    // 横ピクセル数
  #define PXCEL_H   16    // 縦ピクセル数

また、メッセージ表示の縦位置は NeoMsg()関数の最後の引数で指定出来ます。
スケッチは、Githubのgistにて公開しています。スケッチ表示の下部の帯のリンクから参照出来ます。
スケッチのコンパイルには、別途下記のライブラリが必要です。

   ライブラリ
   ・Arduino用 美咲フォントライブラリ 教育漢字・内部フラッシュメモリ乗せ版
     https://github.com/Tamakichi/Arduino-misakiUTF16

関連記事
 NeoPixel(WS2812B)の制御 その4(2020.01.09)  ・・・ 16x16マトリックスの制御(この記事です)  
 
NeoPixel(WS2812B)の制御 その3(2018.05.30)  ・・・ 8x8マトリックスの制御
 NeoPixel(WS2812B)の制御 その2(2018.05.22)   ・・・ SPIを使った制御
 NeoPixel(WS2812B)の制御(2018.05.20)            ・・・ GPIOを使った制御

« 明けましておめでとうございます。 | トップページ | ココログの不具合治らず.. 過去記事を修正中です »

arduino」カテゴリの記事

表示器制御関連」カテゴリの記事

コメント

LEDマトリクスに日本語を表示したく、こちらのページ参考にさせていただいております。
横32x縦8ドットのWS2812Bマトリクスを使用して上記のプログラムを試させていただきました。

縦位置が若干ずれていたのは、 NeoMsg()関数の最後の引数で修正することができたのですが、流れる日本語文字が鏡文字のように反転してしまいました。(左から右へ流れる)
このような症状に対処できるなにか良い方法ありましたら教えていただけないでしょうか?

akatsukipapaさん

ピクセル座標(横、縦)をNeoPixelのピクセル番号に変換する関数 XYtoNo() の修正で対応できるかもしれません。

(修正前)
// PXCEL_W×PXCEL_Hドットマトリックス 指定座標ピクセル番号変換
inline uint8_t XYtoNo(uint8_t x, uint8_t y) {
return y&1 ? PXCEL_W*y + x : PXCEL_W*y + (PXCEL_W-1) -x;
}

akatsukipapaさんのモジュールはNeoPixelの番号並びが1ライン目が右向き、次が左向き、右、左・・ となっていると思われます。
なので三項演算子の真偽のそれぞれの処理を入れ替えれるだけでいけるかもしれません。

(修正後)
// PXCEL_W×PXCEL_Hドットマトリックス 指定座標ピクセル番号変換
inline uint8_t XYtoNo(uint8_t x, uint8_t y) {
return y&1 ? PXCEL_W*y + (PXCEL_W-1) -x : PXCEL_W*y + x ;
}

試していないので、動くかは保証出来ません。

判定部の修正の方が簡単ですね。

return !(y&1) ? PXCEL_W*y + x : PXCEL_W*y + (PXCEL_W-1) -x;

たま吉さん
ピクセルの番号変換等、修正を示して頂きありがとうございます。早速、修正後のものと、その後のコードも置き換えてみたのですが、LEDには 出だしの1行だけが光る状態になってしまいました。お手間を取らしてしまい申し訳ありません><

コメントを書く

(ウェブ上には掲載しません)

« 明けましておめでとうございます。 | トップページ | ココログの不具合治らず.. 過去記事を修正中です »