« FastLED-masterにある8bit乱数関数 | トップページ | Arduinoで使える乱数の実行時間 »

2021年2月 3日 (水)

ATtiny85でカラーLEDテープを光らせてみる

attiny85 ws2812b』と検索すると、ATtiny85マイコン
カラーLEDテープを制御しているArduino環境とスケッチが見つかります。
私がトライしたのは、素の(Arduinoから離れた)ATtiny85での制御です。

ATtiny85のプログラムはAVR Studioで作成。
  ※ただ・・・使ってるのはV4.19と古~い環境
書き込みはAVRISPmk2とSTK500互換の書き込みツール。

Arduinoから離れますんで便利なライブラリは使えません。
delay関数さえもタイマー割り込みを使って作らなくて
はなりません。

LEDテープを制御する関数は、
FastLED.h」や「Adafruit_NeoPixel.h」から借りてきます。

ATtiny85をArduino環境でという記事を見てますと、
皆さん「8MHz」で動かしておられます。
しかし、ヒューズビットを書き換えれば内蔵クロックで
16MHzで動かすことができます。
5V電源で動かしますんで、電流消費は気にしない。
早いほうが良っということで。

製作の目的は(とりあえず)女房から依頼の出窓のLEDアトラクション
  ※光り物はモータ駆動のようにうるさくないので。
旧ブログの出窓記事

LEDテープをちょん切って3つだけで「色相環データ」を
ぐるぐる回して制御してます。

  ・ダウンロード - tn85_rgb1.txt
    ファイルタイプは.txtですんで.cに変更を

制御タイミングはdelayやmillisは使わずに、1msタイマー
割り込み内でセットするフラグ。
メインルーチンでこのフラグを見てタイミングを計ります。
   ※delay、簡単なテストプログラムで使うのは構わ
    ないんですがこれで待っている間は、他のことを
    何もできなくなっちゃいます。
    フラグというかイベントで処理を回すと、空き時間
    は他のことができます。

LEDテープへのデータ転送タイミング波形です。

I11_20210203161301

この部分はインライン・アセンブラで記述しています。
Cとの値の受け渡しが難しい。
AVR StudioではうまくいくのにArduino IDEに移すと
エラーが出ちゃうとか。
なかなかややこしいです。

その部分。

/****************************************/
/* LEDテープ WS2812B 制御 */
/****************************************/
// LEDの個数などデータ設定
#define LED_N 3 // LEDの数
// LED制御ポートH/L (直接アドレスを記述 asmの関係で)
#define LED_H "sbi 0x18, 4" "\n" // PB4 H/L
#define LED_L "cbi 0x18, 4" "\n"
// LEDバッファ
byte led_bff[LED_N * 3]; // G,R,B LED輝度データバッファ
// 明るさ
byte led_bright = 255; // 明るさデータ 0~255
// ledsetで使用
/***** 表示実行 *****/
// led_bffの全データをWS2812Bに転送
// LED_N : LEDの数(255コまで)
// LED_H、LED_Lで直接出力ポートの操作を記述
// 0 H:310ns L:870ns
// 1 H:750ns L:370ns
void ledShow(void)
{
byte *p;
PB3_H; // (!!!)
p = led_bff; // バッファの先頭
cli(); // 割り込み禁止
asm volatile(
"ldi r24, %0" "\n\t" // LEDの数*G,R,B
"loop1%=:" "\n\t"
"ld r25, %a1+" "\n\t" // 1バイト読み出し
"ldi r18, 8" "\n\t" // 8bit loop
"loop2%=:" "\n\t"
LED_H // ※LED出力:H
"nop" "\n\t"
"nop" "\n\t"
"sbrs r25, 7" "\n\t"
LED_L // ※0の時:L
"nop" "\n\t"
"nop" "\n\t" // 時間調整
"nop" "\n\t"
"nop" "\n\t"
"nop" "\n\t"
"nop" "\n\t"
LED_L // ※1の時:L
"lsl r25" "\n\t"
"dec r18" "\n\t"
"brne loop2%=" "\n\t" // 8回loop
"dec r24" "\n\t"
"brne loop1%=" "\n\t" // バッファバイト数loop
:
: "M" (3*LED_N), // %0:LEDの数*G,R,B
"e" (p) // %a1:バッファアドレス
);
sei(); // 割込許可
PB3_L; // (!!!)
}

時間待ちの「nop」をいくつか抜けば8MHzでも動きます。
LEDテープのバッファは1つのLEDで3バイト。
「1mで60コ」のテープだと180バイトのバッファが必要になります。
ループカウンタが8bitなんで256バイト、LEDの数で85個まで。


今回のLED照明はこのガラス製「白鳥」さん用。
B11_20210203205701

出窓は一ヶ月先の「お雛様」モードになってます。
B12_20210203205701

「跳ねるLED」 も順調に光っています。




|

« FastLED-masterにある8bit乱数関数 | トップページ | Arduinoで使える乱数の実行時間 »

出窓」カテゴリの記事

LED」カテゴリの記事

Arduino」カテゴリの記事

コメント

コメントを書く



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




« FastLED-masterにある8bit乱数関数 | トップページ | Arduinoで使える乱数の実行時間 »