Translate

ページ

2016年1月17日日曜日

nRF52832 + WS2812B その4 : というわけで、ライブラリ化しイルミネーションっぽいの作ってみました

安心してください!(電波)吹いてませんよ(^^♪

先日の作品は実現性の確認のための酷い出来でしたので、ライブラリ化して作品作ってみました。
演出は即興です。



これまでの経緯もご覧ください

注意!!電源について

万が一真似してひ弱な電源を壊す人がいると恐いので、最初にこれを書いておきます。

WS2812Bは最高輝度でドライブすると、1つ当たり約50mA消費します。
今回使用した240個のLEDテープですと、12A近く消費する計算となります(購入元のスイッチサイエンス社調べで12.72A)。

今回、私は試験段階で5V20Aの電源を用意して使用しました(秋月の5V 20A電源をケースに入れた自作品)。LED専門サイトの電源を使った方が簡単かもしれません。

今回作成したライブラリには、LED設定値と消費電流の最大値(mA)を設定して呼び出すと、その電流値を超えた場合に、全体を暗くして最大値を超えない値に設定しなおすサブルーチンを準備しています。(http://aid.her.jp/uratan/led/index.html#currentを参考にしました。uratanさん、すばらしい!)

void ws2812b_driver_current_cap(rgb_led_t * led_array, uint16_t num_leds, uint32_t limit);
led_array : LEDの輝度データ配列
num_leds : LEDの数
limit : 電流制限値(mA)

ただし、このルーチンの効果に頼りすぎないで下さい。
制御信号が乱れると、設定以上の輝度でLEDが光ることが結構あります。このような現象が発生した場合は、すぐにLED用の電源を切ってハードとソフトを確認して下さい(配線を伸ばそうとしたらいきなり高輝度でちらつき、消費電流がいきなり通常の5倍位になって慌てたことがあります)。

今回の作品は、十分動作確認を行ったのち、モバイルバッテリー(5V 2A供給タイプ)やPCのUSB端子から電源供給して動かしています(実測で0.5A以下)。

また、激しくドライブしたときに、LEDテープの後ろの方が追随しなかったり、異常点灯することがあります。
どうも、カスケードしている電源の電圧が揺らいでいるのではないかと思っています。
電源を供給するポイントを増やしてあげれば、安定動作するのではないかと思います。

ハードウェア概要

LEDテープを味付け海苔の空き容器に巻きつけています(一周約19個です)。
プログラムはこちらに公開しています。

  • ボードはnRF52 DK
  • P0..25 (SPI0のMOSIピン)をレベル変換IC(ブレッドボード上のTXB0104) ICを使ってLEDテープDinへ(ブレッドボードには、比較試験に利用したFET, 74LS00も乗っています)
  • 電源はLED用に別途準備必要です。
    • 試験段階は20Aのスイッチング電源、調整完了後モバイルバッテリー(5V2A)利用




ソフト概要


今回作ったプログラムはgithubに載せました。
https://github.com/takafuminaka/nrf52832-spi_ws2812b_flashing_random

nRF5 SDK 11.0.0-2.alpha_bc3f6a で動作させています。

W2812Bの制御に必要なルーチンはws2812b_driverディレクトリに集約しています。

main.cで、led_array_work配列にRGBの各輝度を設定して、更新処理を繰り返し呼び出しています。

処理の流れ

  • spi_buffer_t spi0_buffer; // ws2812b制御用のSPIバッファの定義
  • alloc_spi_buffer(&spi0_buffer, NUM_LEDS); // SPIバッファの初期化
  • rgb_led_t led_array_work[NUM_LEDS]; // 輝度設定用LED配列の準備
  • 以下をループで実行
    • led_array[*].green, led_array[*].red, led_array[*].blueに各要素の輝度(0~255)を設定
    •  ws2812b_driver_current_cap(led_array_work, NUM_LEDS, CURRENT_LIMIT); // 電流制限のための輝度調整
    • ws2812b_driver_xfer(led_array_work, spi0_buffer, spi0); // LED更新
    • nrf_delay_ms(DELAY_MS); // 次の更新までの待ち


調整パラメータ
・DELAY_MS                 (5) LEDの更新待ち時間(m秒)(小さいほど激しく更新)
・NUM_LEDS (240) LEDの数
・MAX_INTENSE (16) 暗いLEDの最大輝度
・MAX_INTENSE2 (255) 明るい流れる効果のLEDの最大輝度
・MIN_INTENSE (1) 各LEDの最低輝度
・DECAY_STEP (30) 明るい流れるLEDの更新毎の減衰ステップ
・PRAB_FLASH (5000) 明るい流れるLEDの発生頻度(確率の逆数に比例。小さくすると出現頻度が上がる)
・ROW_SIZE (19) 一行当たりのLEDの数
・STEP_SRIDE1 (-(ROW_SIZE+1)) 明るい流れるLEDの更新毎の移動ステップ1
・STEP_SRIDE2 (-(ROW_SIZE-1)) 明るい流れるLEDの更新毎の移動ステップ2
・CURRENT_LIMIT (1000) 最大電流制限値 

* 当初の公開版から、拡張しました。デモンストレーションを複数用意し、時間差で切り替えるようにしました。また、SPIを8Mhzで動かすように変更しました。

今後の予定

制御ルーチンについて以下を改良していきたいと考えています。
  • ルーチン名、構造体の名称の調整(ws2812b_drv_*に統一するなど)
  • 割り込み処理を工夫し、伝送終了まで待たずにメインルーチンに戻るようにする
  • 3系統のSPIをすべてWS2812B点灯に使えるようにする
  • (日本国内で電波を吹けるnRF52モジュールがにゅうしゅできたら)BLE通信と連携しながらドライブできるようにする



0 件のコメント:

コメントを投稿