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に流れて逆に今品薄になったとか、、、(ここまで完全な妄想です)。
コメントをお書きください