USBaspを書込装置として、Arduino IDEからATtiny84A/841へプログラムを書き込む。
昔から小さいものが好きだ。夜店でひよこが群がってぴよぴよしているのを見ると、たまらなくなる。文房具や小物などもそう。Mini、Tinyという言葉につい惹かれてしまう。そこで、書込装置にArduino UnoではなくUSBaspを用い、ATmega328PではなくATtiny84A/841の14ピン勢でLEDをちかちか(Lチカ)させてみる。
Google検索すると、ATtiny84A/841に関する情報はたくさん見つかる。本投稿はこれらのまとめ的存在であることを予めお伝えしておく。USBaspと6ピン変換ボードはAmazonで購入した。 なお、本稿ではAtmel Studioを用いたATtiny1614の開発も扱う予定であったが、下書きを1年近く放置している間にmegaTinyCoreが出てArduino IDE上で開発可能となったため、記載済みの部分を見切り発車させた。
ATtiny84A/841でLチカ
Arduino IDEでスケッチをコンパイルし、Arduino( ArduinoISP)経由でhexファイルをATtiny84A/841に書き込む方法は、参考サイトがたくさんある。ところが、ひとたびAtmel Studioをインストールすると、この方法は使えなくなる。Arduino IDEとAtme Studioで使用するUSBドライバーが異なるためだ。都度ドライバーを入れ替えながら使用するのも煩雑である。そこで、ここではUSBasp経由でATtiny84A/841に書き込む方法を記す。USBaspのUSBドライバーをインストールする方法は、dekoさんの「USBasp」が詳しい。
まずは、ATtinyに特化した、出来上がりのバイナリが小さくなるコアATTinyCoreをインストールする。方法は、@tadfmacさんの「Arduino と ATtinyを使って I2C Slaveデバイスを作ってみる (1) 準備編」が詳しい。次に、USBaspに6ピン変換ボードを接続し、以下のとおりATtiny84A/841と接続する。ATTinyCoreで述べられている最小配線要求では、バイパスコンデンサーが必須とされているので倣った。
- VCC(赤)を1番ピンと接続し、0.1 µFのバイパスコンデンサーでGNDに接続する
- RST(灰)を4番ピンと接続する
- MOSI(黄)を7番ピンと接続する
- MISO(緑)を8番ピンと接続する
- SCK(青)を9番ピンと接続する
- GND(黒)を14番ピンと接続する
- LEDを3番ピンとGNDに接続する
正しく配線できたらUSBaspをPCと接続し、Arduino IDEのメニューバー「ツール」から以下のとおり設定する。 「書込装置」は、“(ATTinyCore)”で終わっているものを選択するのをお忘れなく。
- ボード: “ATtiny24/44/84”または “ATtiny441/841 (no bootloader)”
- Chip: “ATtiny84”または“ATtiny841”
- Clock: “8 MHz (internal)”
- B.O.D. Level: “B.O.D. Disabled”(ATtiny84の場合)または “B.O.D. Enabled (1.8v)”(ATtiny841の場合)
- B.O.D. Mode (active): “B.O.D. Disabled”(ATtiny841の場合のみ)
- B.O.D. Mode (sleep): “B.O.D. Disabled”(ATtiny841の場合のみ)
- Save EEPROM: “EEPROM retained”
- Pin Mapping: “Counterclockwise (like old …”
- LTO (1.6.11+ only): “Disabled”
- 書込装置: “USBasp (ATTinyCore)”
#define LED_PIN 1
void setup() {
pinMode(LED_PIN, OUTPUT);
}
void loop() {
digitalWrite(LED_PIN, HIGH);
delay(200);
digitalWrite(LED_PIN, LOW);
delay(200);
digitalWrite(LED_PIN, HIGH);
delay(200);
digitalWrite(LED_PIN, LOW);
delay(1000);
}
おなじみLチカのスケッチを作成する。ピン1は、LEDを接続した物理3番ピンに対応している。その他はピンマッピングを参照されたい。メニューバーの「スケッチ」→「書き込み装置を使って書き込む」を選択すると、期待どおりちかちか始まる・・・あれ?
実は、デフォルトでは内部クロックは8分周されているため、実行速度は8倍遅くなってしまう。“Clock”を“1 MHz (internal)” とすると、想定した速度でちかちかする。変更ついでに、上記のスケッチは966バイトを要したが、 “LTO (1.6.11+ only)” を“Enabled” とすると、278バイト削減されて688バイトで済む。LTOは、文字どおり最適化に効果的のようである。
クロック分周させずに内部クロック等倍の8 MHzで動作させるには、ヒューズビットの変更が必要となる。操作を誤ると、以後書き込みができなくなる可能性があるので、自己責任で慎重に行っていただきたい。
クロック8分周を解除するには、ATtiny84A/841とも、low fuseの7ビット目を「立てる」。デフォルトのlow fuseは0b01100010
なので、arvdudeで 0b11100010
を設定する。arvdudeは、Arduinoをインストールしたディレクトリ下のhardware\tools\avr\bin\avrdude.exeを使用する。
(Arduinoインストールディレクトリ)\hardware\tools\avr\bin\avrdude -C (Arduinoインストールディレクトリ)\hardware\tools\avr\etc\avrdude.conf -v -c usbasp -p attiny84 -b 19200 -U lfuse:w:0b11100010:
ATtiny841の場合は、-p
スイッチをattiny841
にする。また、クロック8分周に戻すには -U
スイッチをlfuse:w:0b01100010:
として、 low fuseの7ビット目を「落とす」。
コメント