· 

ATtinyソフトをArduinoで開発

ATtinyのArduino化。今まで何回かやったことあったんだけど、まったく記録を残していない。ボードマネジャーもいくつかあるし、で、それで、Arduino環境でコードを書くのはまぁそうだとして、書き込みはどうしていたのか、、、

改めて今回あちこち調べながら記録とともに取り組んでみる。なお、うちにはAVRマイコンのライターがいくつかあるけど、できればこいつらを使わないでやりきりたい。

今回はATtiny84(DIP14ピン)を使います。ATtiny85の参考サイトはいくらかあるけど、ATtiny85はピン数が少なすぎる、、、ので。ATtiny84で挑戦だー。

ATtinyのArduino環境として、ATTinyCore(by SpenceKonde)を使う。他にもいくつかあるっぽいけど、サポートするデバイスが多いし。では、ボードマネジャからボードサポートをインストールする、、、がそのままではATTinyCoreは出てこないので、追加のボードマネジャのURLに

http://drazzy.com/package_drazzy.com_index.json
を追加する。

そすっとボードマネジャにATTinyCoreが現れるが、後で見る。

で、次にbootloader書き込みのための配線をしていきます。

まぁこんな感じでつなぐ。 

Arduino ATMEGA328P ATtiny84
10 PB2(SS) RESET
11 PB3(MOSI) PA6(MOSI)
12 PB4(MISO) PA5(MISO)
13 PB5(SCK) PA4(SCK)

このブログで表の書式がうまいこと設定できないので、この表が何を示しているかについてメモっておくと、

 Arduinoのデジタル端子10が実はATMEGA328PのPB2であり、これをATtiny84のRESETにつなぐってこと。

ついでに公式ページの絵を貼っておく

さて、今回は、ArduinoUNOではなくて、Arduino Pro 8MHz 3.3Vのクローンを使うことにします。最終的にはATtiny84を3.3Vで使いたい。で、すべてブレッドボードでやるので、bootloader書き込み時5Vでその後3.3Vに変更するのがかったるい、、、怠惰の極み

となると、ArduinoのpinoutよりもATMEGA328Pのpinoutが重要なので、データシートから拝借して貼っておく。

、、、こねくりまわして、

こんなもんすかね、、、

右のモジュールが秋月のFT231Xモジュール。中央のDIP28がATMEGA328P。左のDIP14がATtiny84。ATMEGA328PにはすでにArduino Pro 3.3V 8MHz のbootloaderが書き込まれています。、、、それをどう準備するのかって?ATMEGA328Pにbootloaderを書き込む記事があちこちあるので、それを参照してください(無責任)。

 

で、まずはArduino ProをAVRマイコン用ISPライターにする。

ArduinoIDEで、ボードとしてArduino Proを選んで、ICはATmega328p(3.3V, 8MHz)を選んで、ポートは刺さっているところを選ぶ。

で、書き込むソフトはこちらを選ぶ。

そして、普通に書き込み。これでArduino ProになっているATMEGA328PはAVR-ISPライターになったってわけだ。

終わったら、ボードを最初のほうで追加したATTinyCoreにする。今回使うATtiny84を選ぶ。が、いくつかあるのでOptibootってやつを選ぶ。作者のページによると、Arduinoっぽくシリアルで書き込むのはこれらしい。

ボードの設定は適当にする。

書き込み装置は"Arduino as ISP"を選ぶ。

そしてブートローダーを書き込む。

完了したらしい、、、あっけない。

 

では回路をつなぎかえて、ATtiny84のArduinoにしていく。

まずはATMEGA328Pをとっぱらって、ATtiny84のTX, RX, RESETをATMEGA328Pの跡地につなぐだけにしておく。

むりやりやってこんな感じになる。

で、新規ファイルで、こんなの

#define LED_PIN 8

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_PIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(500);                       // wait for a second
  digitalWrite(LED_PIN, LOW);    // turn the LED off by making the voltage LOW
  delay(500);                       // wait for a second
}

つくって、(書き込めるかどうかドキドキしながら)書き込む。

で、

できたよー(ピン8にLEDと抵抗つなぎました)。

で、何に使うか、、、タイマーでポートを読み取ったり、タイマーでポートを上げ下げしたり、、、ATtiny84だとUSIがあるので、それ使って、、、

ようやく秋月でATmega328P-AU(QFP32)が買えるようになった。と思ったらATmega64とかATmega1284とかが品切れに。ATmega328PがなくなったときにATmega32U2とかに行かずに、移植が容易なAtmega64,1284に流れて逆に今品薄になったとか、、、(ここまで完全な妄想です)。