[ 関連記事 ]
– ドローンにRGB LEDを搭載するもう一つの方法 <- 親記事です
– ATtiny85によるLED制御 – ハードウェア実装編
– ATtiny85によるLED制御 – BUZZパッドを利用した制御方法
– ATtiny85によるLED制御 – UART/LEDパッドを利用した制御方法
注意 : Arduino IDEに組み込むFastLEDライブラリーをバージョン3.7.4以降に更新するとこの手順で作動しなくなりました。もし動かなくなった場合は3.7.3をインストールしてください。
[ 参考記事 ]
1. VTX周波数毎に決められた色にする
2. ミニAVRマイコン『ATtiny85』にブートローダーを書き込みArduinoとして使えるようにしてみる!ATtiny85の基本的な使い方!
この二つを読んで頂ければ、このプログラムの概要とATtiny85への書き込み方法が分かります。補足的な事柄を書いておきます。
[ ATtiny85について ]
ATtiny85にはいくつかのパッケージがあります。開発用、大きめのドローンに搭載するにはDIPバッケージ、Tinyに搭載するにはさらに小型のSOPパッケージが良いと思います。SOPにプログラムを書き込む時にはDIPへの変換ソケットがあると便利です。
10MHz動作版と20MHz動作版がありますが、どちらでも大丈夫と思います。
[ ツール類 ]
PCからATtiny85に接続するために何かしらツールが必要です。上のリンクでいくつか紹介されていますが、私は手元にあるArduino Nanoを使用しました。その他にブレッドボードがあると便利です。私はAmazonで色々と部品が付属したキットを購入しました。
[ 接続 ]
上の参考記事2にある「ArduinoとATtiny85の接続」の通りに接続します。記事ではArduino Unoを使用していますが、Arduino Nanoでも全く同じです。ピンの名前を頼りに接続します。写真はDIP版ATtiny85にプログラムを書き込んでいる様子です。

[ 書き込みソフトウェアの準備 ]
ATtiny85をArduinoとして使用します。お馴染みArduino IDEを使ってソフトウェアを書き込みます。
– Arduino Nanoに書き込み用のソフトウェアを導入します。
わたしのArduino Nanoの設定はこんな感じです。

ExmapleからArduinoISPを書き込んで準備完了です。

– ATtiny85を使用するための準備
ATtiny85を使用するためにはPreference/Additional boards manager URL欄に”https://www.arduino.cc/en/software”を追加しました。参考記事2に書かれていたURLでは機能しませんでした。
Toolsメニューの設定を下のように行いBootloaderの書き込みが成功すればATtiny85がAuduinoとして使えるようになります。

[ ATtiny85へのプログラムの書き込み ]
あとはプログラムを作成し書き込むだけです。設定はBootloaderの書き込みと同じです。Sketch(プログラム)のUploadは通常の方法とは異なり”Sketch/Upload using programmer”を使用します。新しいチップに書き込む時はBootloaderの書き込みも忘れないようにしてください。

今回使用したソースコードです。ninjaMoonLightさんが書き始めて、途中から私も参加して共同作業で書いたコードです。条件コンパイルするようになっています。下の状態ではBUZZパッドもしくはスイッチを使用するプログラムになっています。7行目のコメントを外し”USE_LEDPORT”というマクロを有効にするとLEDパッドを使用するためのプログラムになります。setup()の最後にdelay(500)を入れています。これはある構成においてFCの信号が期待通りになるまでに時間がかかった時に入れたものです。現在の使用方法だと必要はないかも知れませんが安全を見込んで入れたままにしています。
2025/09/08: 4機同時飛行の可能性を見込んで黄色を増やしました。ついでに黒(消灯)も追加し、白->赤->黄->緑->青->消灯と変化します。
// Pin assign
// arduino PIN 0,button = Attiny PIN 5
// arduino PIN 4,RGB LED = ATTiny PIN 3
#include
#include
//LEDの数
#define NUM_LEDS 100
//LED信号ピン
#define DATA_PIN 3
//ボタンのピン
#define buzzButton 0 // Buzz port
#define ledButton 1 // LED/UART
#define NUM_COLORS 6
#define NUM_MODES 3
CRGB leds[NUM_LEDS];
CRGB color = CRGB::Black;
int currentColor = 0;
int currentMode = 0;
int prevColor = -1;
unsigned long prevTime = 0;
int flgTimer = 1;
unsigned long btnTimer;
const unsigned long shortPress = 30;
const unsigned long longPress = 800;
void blinking() {
unsigned long time = millis() / 100;
if (time != prevTime) {
FastLED.setBrightness( 255 );
for (int i = 0; i < NUM_LEDS; i++) {
if((time % 2) == 0){
if((i % 2) == 0){
leds[i] = color;
}else{
leds[i] = CRGB::Black;
}
}else{
if((i % 2) == 0){
leds[i] = CRGB::Black;
}else{
leds[i] = color;
}
}
}
FastLED.show();
prevTime = time;
}
}
void heartBeat() {
unsigned long time = millis() / 100;
if (time != prevTime) {
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = color;
}
FastLED.setBrightness((7 - time % 7) * 255 / 7);
FastLED.show();
prevTime = time;
}
}
void normal() {
if (currentColor != prevColor) {
FastLED.setBrightness( 255 );
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = color;;
}
FastLED.show();
prevColor = currentColor;
}
}
void setup() {
currentColor = EEPROM.read(0);
if (currentColor < 0 || NUM_COLORS <= currentColor) currentColor = 0;
currentMode = EEPROM.read(1);
if (currentMode < 0 || NUM_MODES <= currentMode) currentMode = 0;
//#ifdef USE_LEDPORT
// pinMode(myButton, INPUT); // button
//#else
// pinMode(myButton, INPUT_PULLUP); // button
//#endif
pinMode(buzzButton, INPUT_PULLUP);
pinMode(ledButton, INPUT);
///////LED
FastLED.addLeds(leds, NUM_LEDS); // GRB ordering
// following delay may not be required
delay(500);
}
void loop() {
//#ifdef USE_LEDPORT
// if (digitalRead(myButton) == HIGH) {
//#else
// if (digitalRead(myButton) == LOW) {
//#endif
if (digitalRead(ledButton) == HIGH || digitalRead(buzzButton) == LOW) {
if (flgTimer) {
btnTimer = millis();
flgTimer = 0;
}
} else {
if (!flgTimer) {
unsigned long diffTime = millis() - btnTimer;
if (diffTime > longPress) { // Long pressed
currentMode++;
if (currentMode >= NUM_MODES) currentMode = 0;
EEPROM.write(1, currentMode);
} else if (diffTime > shortPress) {
currentColor++;
if (currentColor >= NUM_COLORS) currentColor = 0;
EEPROM.write(0, currentColor);
}
flgTimer = 1;
}
}
switch (currentColor) {
case 0: color = CRGB::Red; break;
case 1: color = CRGB::Yellow; break;
case 2: color = CRGB::Green; break;
case 3: color = CRGB::Blue; break;
case 4: color = CRGB::Black; break;
case 5: color = CRGB::White; break;
}
switch (currentMode) {
case 0: normal(); break;
case 1: blinking(); break;
case 2: heartBeat(); break;
}
}
2 comments untill now