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)
「表示器制御関連」カテゴリの記事
- Raspberry Pi Pico MicroPython用のマルチフォントライブラリ(2023.02.09)
- MicroPython(Raspberry Pi pico)で8x8ドットNeoPixcel文字表示(2023.02.08)
- M5Stackで日本語表示(2)(2020.02.04)
- M5stackで日本語表示(2020.01.18)
- NeoPixel(WS2812B)の制御 その4(2020.01.09)
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分
初めまして。
Arduino初心者です。8x8マトリクスLEDの記事を探してたどり着きました。
美咲フォントでひらがな表示ができ、すばらしいソフトと感動しております。
ありがとうございます。
というわけで、赤外線リモコンでメッセージボードのようなものを、たま吉さん
のソフトを変更させて使用できるよう試作しました。
変更したソフトをyoutubeで紹介してもよろしいでしょうか?
初心者なので、それなりですが。
もちろんたま吉さんの名前は残したままで、コメント欄にリンクを張らせて
いただきたいと思います。よろしくお願いいたします。
投稿: konan0119 | 2023年2月23日 (木) 22時09分
早速の返信ありがとうございます。
「該当する記事に直接コメント」失礼しました
私も仕事でシステム開発もしていましたがaduinoスケツチは初心者です
「PIC電子工作ブログさん」の「WS2812BマトリクスLEDで電光掲示板」
見たのですが、希望するイメージはズバリそれでよいのですが
BMPから読み込むPRGが私にはまだまだレベルが高くて分かりません(^^;)
------------------------------------
NeoMsg("かんたんなかんじの表示ができます。",16, 4, 4, 100,4);
のようにフォントを直接書き込みするのが簡単で分かりやすいです
NeoScrollInChar(fnt, R, G, B, tm, y);の
左からR, G, B,は色指定/tmは左スクロール速度/yは上からの位置
はわかりました
希望するフォントの拡大はどのprg部分を変えればよいでしょうか?
よろしくお願いします。
投稿: old_papa | 2023年6月 9日 (金) 10時31分
old_papaさん
まずArduinoについてですが、
「PIC電子工作ブログさん」の「WS2812BマトリクスLEDで電光掲示板」の記事では、
利用しているマイコンボードは、ESP32のようですが、
old_papaさんが利用しているマイコンボードは、Arduino Uno( ATmega328ベース)として説明します。
本サンプルスケッチではフォントとして8x8ドットの
「Arduino用 美咲フォントライブラリ 教育漢字・内部フラッシュメモリ乗せ版」を利用しています。
フォントの拡大としては、8x8ドットフォントをベースに倍角(8x8→16x16変換)でよろしいでしょうか?
16x16ドットのフォントを期待している場合は、外部メモリの実装が必要となります。
投稿: たま吉さん(管理者) | 2023年6月 9日 (金) 18時48分
old_papaさん
やり方としては、2つあると思います。
①8x8ドットフォントから16x16ドットフォントを生成し、
16x16ドットフォントをスクロール表示(データ送信)する
②8x8ドットフォントを表示する際、1ドットにつき4ドットを送信する
処理としては①が簡単だと思います。
この場合、NeoScrollInChar()は、現状8x8ドットフォントにしか対応していないので、
別途16x16ドットに対応しているNeoScrollInChar()を作成した方が良いと思います。
この関数をNeoScrollInCharEx()とします。
現状のNeoScrollInChar()は横8回x縦8回の2重ループですが、
NeoScrollInCharEx()は横16回x縦16回の2重ループにすれば良いでしょう。
8x8ドットフォントから16x16ドットフォントを生成処理はarduinoとは関係なく、
C言語での単純なデータ変換処理なので実装は簡単だと思います。
16x16のビットビット処理を考えると16x16ドットのデータはuint8の配列ではなく、
uint16の配列データが良いと思います。
投稿: たま吉さん(管理者) | 2023年6月 9日 (金) 19時17分
方針としては、
・NeoMsg()の16x16ドット版を作成 ⇒ NeoMsgEx()
・NeoMsgEx()ではて8x8ドットのフォントから16x16ドットのフォントデータを作成し、
NeoScrollInCharEx()を呼び出す。
・NeoScrollInCharEx()では、16x16ドットフォントの表示処理を行う。
投稿: たま吉さん(管理者) | 2023年6月 9日 (金) 19時27分
丁寧なご説明ありがとうございます。
早速やってみたいと思います
定年後の今年後期高齢者です(時間はたっぷりありますのでじっくりやってみます)
すもうを見ていた時ウチワにこのようなLEDpanelを使っていた人を見て
これは孫の行事応援に使ったら[目立ちすぎますかねー(笑)]と思った次第です
時間かかるとおもいますが結果またご連絡いたします
感謝です!!
投稿: old_papa | 2023年6月10日 (土) 09時36分