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」 も順調に光っています。
| 固定リンク
「出窓」カテゴリの記事
- ステッピングモータ駆動回路を24Vだけで #2(2024.10.31)
- ステッピングモータ駆動回路を24Vだけで(2024.10.29)
- 人感センサー用オフディレータイマー回路(2023.08.26)
- 『きもだめし』に人感センサー(2023.08.19)
- 出窓の夜間照明用LEDを交換(2023.06.04)
「LED」カテゴリの記事
- 12年前に改造した卓上ランプを点検(2024.08.26)
- 松下の「ホロホロブザー」つながりで(2024.06.19)
- ダイソー SHOOTING LIGHT:撮影用ライト LEDの輝度変化を探る #2(2024.05.03)
- 赤外線リモコン受信モジュールの不思議(2024.02.02)
- ダイソー SHOOTING LIGHTLED:撮影用ライト LEDの輝度変化を探る(2024.01.24)
「Arduino」カテゴリの記事
- 1/nカウント方式とDDS方式の2相パルス発生回路(2024.10.13)
- おっと。map関数の計算桁に注意(2024.10.06)
- DDS方式の2相パルス発生回路、周波数スキャン機能を付ける(2024.10.05)
- 1クロックでも速くしたい 割込を「ISR_NAKED」で(2024.09.30)
- 1クロックでも速くしたい DDS方式の2相パルス発生器(2024.09.27)
コメント