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テープへのデータ転送タイミング波形です。
この部分はインライン・アセンブラで記述しています。
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照明はこのガラス製「白鳥」さん用。
出窓は一ヶ月先の「お雛様」モードになってます。
「跳ねるLED」 も順調に光っています。
| 固定リンク
「出窓」カテゴリの記事
- 「壊れたオルゴールの人形」を回せ!(2022.05.17)
- 「ダイソーの観覧車」を回せ! 回路図(2022.05.08)
- 緊急指令! 「ダイソーの観覧車」を回せ!(2022.05.04)
- 温湿度センサーDHT11、ライブラリを使うと氷点下の温度がおかしくなるぞ!(2022.03.10)
- DHT11を使った出窓の結露対策用ヒータ制御回路 この1週間(2022.03.08)
「LED」カテゴリの記事
- あちゃ~。電池押さえのスポンジがモロモロに(2021.11.16)
- LED劣化調査実験、新回路案(2021.10.16)
- 顕微鏡用LEDリングライトのLED交換(2021.10.04)
- 顕微鏡用LEDリングライトのLED、そろそろ交換か(2021.09.27)
- 「ぶつかるLED」(2021.04.16)
「Arduino」カテゴリの記事
- 「UART←→IrDA」変換IC、MCP2122のクロック供給(2022.06.20)
- 秋月の赤外光送受信モジュール(AE-RPM851A)を使ってみる(IrDAを試す) #2(2022.06.18)
- 秋月の赤外光送受信モジュール(AE-RPM851A)を使ってみる(IrDAを試す)(2022.06.17)
- 4046・VCO回路の直線性改善方法その2(2022.06.13)
- 「ダイソーの観覧車」を回せ! 回路図(2022.05.08)
コメント