USBaspでATtiny84A/841に書き込み

USBaspを書込装置として、Arduino IDEからATtiny84A/841へプログラムを書き込む。

昔から小さいものが好きだ。夜店でひよこが群がってぴよぴよしているのを見ると、たまらなくなる。文房具や小物などもそう。Mini、Tinyという言葉につい惹かれてしまう。そこで、書込装置にArduino UnoではなくUSBaspを用い、ATmega328PではなくATtiny84A/841の14ピン勢でLEDをちかちか(Lチカ)させてみる。

Google検索すると、ATtiny84A/841に関する情報はたくさん見つかる。本投稿はこれらのまとめ的存在であることを予めお伝えしておく。USBasp6ピン変換ボードは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ビット目を「落とす」。