NeoPixel(WS2812B)の制御 その4
ArduinoによるNeoPixel(WS2812B)の制御の続きです。質問があり、折角なので
以前作成した、8x8ドットマトリックスタイプのNeoPixelを制御するスケッチを汎用化(任意のサイズ対応)しました。
とりあえず手持ちの16x16ドットモジュールで試してみました。
動いている様子
利用したモジュールは、Aliexpressにて入手しまた。
1 pcs/lot DC5V 16x16 Pixel WS2812B LED Digital Flexible Individually addressable Panel light
このモジュールのNeoPixelの並びは次のようになっています。
接続
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」カテゴリの記事
- 豊四季Tiny Basic for micro:bit のマニュアルを更新しました(2020.11.21)
- 豊四季タイニーBASIC for Arduino 機能拡張版 V0.08の更新(2020.07.27)
- Arduino IDE 1.8.13が公開されています(2020.07.24)
- SPI接続フラッシュメモリモジュールを入手しました(2020.05.13)
- 豊四季タイニーBASIC for Arduino 機能拡張版 フルスクリーンエディタ対応(2020.02.20)
「表示器制御関連」カテゴリの記事
- M5Stackで日本語表示(2)(2020.02.04)
- M5stackで日本語表示(2020.01.18)
- NeoPixel(WS2812B)の制御 その4(2020.01.09)
- IchigoJamのファームウェア 1.4.1が正式に公開されました(2019.12.10)
- SSD1322搭載3.12インチ OLEDの動作確認(2019.08.02)
LEDマトリクスに日本語を表示したく、こちらのページ参考にさせていただいております。
横32x縦8ドットのWS2812Bマトリクスを使用して上記のプログラムを試させていただきました。
縦位置が若干ずれていたのは、 NeoMsg()関数の最後の引数で修正することができたのですが、流れる日本語文字が鏡文字のように反転してしまいました。(左から右へ流れる)
このような症状に対処できるなにか良い方法ありましたら教えていただけないでしょうか?
投稿: akatsukipapa | 2020年6月18日 (木) 23時19分
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 ;
}
試していないので、動くかは保証出来ません。
投稿: たま吉さん(管理者) | 2020年6月19日 (金) 19時25分
判定部の修正の方が簡単ですね。
return !(y&1) ? PXCEL_W*y + x : PXCEL_W*y + (PXCEL_W-1) -x;
投稿: たま吉さん(管理者) | 2020年6月19日 (金) 19時29分
たま吉さん
ピクセルの番号変換等、修正を示して頂きありがとうございます。早速、修正後のものと、その後のコードも置き換えてみたのですが、LEDには 出だしの1行だけが光る状態になってしまいました。お手間を取らしてしまい申し訳ありません><
投稿: akatsukipapa | 2020年6月24日 (水) 22時17分
たま吉様
Neopixel 16x16を使用例のご投稿楽しく拝見させて頂きました。早速理髪店の待ち時間を表示するものを下記Youtubeのとおり作成することができました。
https://youtu.be/nnjbN09hwXI
Blynkで表示を制御したのですが、現行Blynkの廃止に伴い再作製が必要となりました。
RF-Nano(ArduinoにNRF240Lの無線モジュールがついたもの)を使用し遠隔制御しようとしたのですが、RF-Nanoの11ピンが無線モジュールのインターフェイスと競合しており使うことができません。他のPWMピンの6ピンがNeopixel 制御用ピンに使えるのであれば問題が解決するのですが、スケッチの11を6に変えてNeopixcelのDINも6番に変えたのですが作動しません。Neopixcelの制御用ピンをArduinoの6番に変更することはできますでしょうか。
下記スケッチはBlynkから移行するためのテストのためBlynkでなくIRで表示を制御しているものです。このNeopixcelのDINをArduinoの6番ピンに変えたいのですがご教示いただけると大変助かります。
https://75.gigafile.nu/1020-3491c02c58ed75fb237306f73f11e293
お忙しいなかお手数ながらよろしくお願いします。
関口 隆
投稿: 関口隆 | 2022年10月13日 (木) 16時51分
関口隆さん
Neopixelの制御にSPIを利用しています。
11番ピンはSPIのMOSIであり、データ出力に利用していますので、残念ながら6番ピンへの変更は出来ません。
関連記事でSPIを使わない方法では、任意のピンへの変更が可能かと思いますが、
https://nuneno.cocolog-nifty.com/blog/2018/05/neopixelws2812b.html
正確なタイミングを得るために割り込み禁止を行っており、無線モジュールとの通信に問題が生じる可能性があります。
Neopixelの制御用ライブラリとしては、下記のAdafruitがよく使われているようです。
https://github.com/adafruit/Adafruit_NeoPixel
ESP8266、ESP32にも対応しているようですので、上記のライブラリの利用も良いかもしれません。
ご検討願います。
投稿: たま吉さん(管理者) | 2022年10月13日 (木) 20時44分