Arduino IDE から、生の AVR に ISP でスケッチを書き込む方法(ArduinoIDE 1.6.4以降版)

※検索性向上のためタイトル変更しました(旧:Arduinoに慣れたら小さくて安くて最高な生AVRも使ってみてはいかがでしょうか)

Arduinoに入ってるマイコンあるじゃないですか、あれがAVRです。逆にいうとAVRの周りにいろんな部品がついたのがArduinoです。
いろんな部品がついてるおかげでいろいろ便利になってるわけですが、普通にスイッチでLEDの制御するとかサーボ動かすだけとかの用途であれば、あのへんの部品はべつに要らないんですね。
なのでAVRだけで使いたいわけです。

f:id:slideglide:20160620205212j:plain
上からArduino Uno、Arduino Nanoの互換品、AVR(ATmega88)

Arduinoを買うと3000円くらいしますがAVRだけなら150~250円くらいで買えます。金額的にArduinoだと使い回し前提の使い方になりますが、AVRならマイコンごと基板にはんだ付けしちゃっても惜しくないです。
あとAVRは小さいのでポケットサイズのデバイスが簡単に作れます。5x7cmのユニバーサル基板(Arduino Uno本体とほぼ同じ大きさ)でそこそこ凝ったものが作れる。

f:id:slideglide:20160620233603j:plain
自作のサーボテスター。つまみでパルス幅を変えてサーボの角度をチェックできる。1台でサーボ2つ接続可能。AVRは液晶の下についてる。

マイコンのプログラムというとアセンブラC言語で書かないといけないイメージですが、AVRにはArduinoの開発環境からArduino言語で書いたスケッチを書き込むことができます。これを使わない手はありません!

我々はもう設定ファイルをいじらなくていい

というわけでここからが本題で、Arduino IDE から、生の AVR にスケッチを書き込む方法(ArduinoIDE 1.6.4以降版)の紹介です。
検索するとやり方はけっこうヒットするんですけど、ArduinoIDE 1.0.xだったりArudinoIDE 1.6.0だったりの情報がほとんどで最新版で試してもなかなかうまく動かず、ここにたどり着くまで真面目に3か月くらいかかりました。やっとC言語書かなくて済むぞ!!!という喜びの気持ちでいっぱいです。
そのやり方を共有するのが本稿の目的です。

まず、以下のやり方はもうやらなくていいです。

  • Arduino/hardware 以下にファイルを配置する
  • 配置したファイルの board.txt とか platform.txt をいじる

もしかしたら1.6.4以降でも上記のやり方でいける場合もあるのかもしれませんが、僕の環境では avrdude がエラーを吐いてうまく動作しませんでした。
仮に動作したとしてもわざわざやる必要はなく、今や設定ファイルをいじらなくてもGUIだけでいけます。

要るもの

  • 書き込み対象のAVR
  • Arduinoひとつ
  • ブレッドボード
  • ジャンパ線

手順としては、まずIDEの環境設定(対応ボードに生AVRを追加)をして、それからArduinoを使ったAVRライター(プログラムを書き込む装置)を構築、最後に実際にプログラムを書き込みます。
ちなみに、類似のトピックとして「AVRをArduino化する(AVRにBootloaderを書き込む)」という作業もあるのですが、今回はBootloaderを書き込まずにあくまでAVRマイコンのままプログラムだけを書き込む方法を紹介します。*1

やり方(開発環境編)

IDE側の設定です。ここに書いてあることは最初の1度だけやればよいです。

1.

まず使いたいマイコンを決めます。僕はATtiny2313とATmega88Vを使うことにしました。前者は20ピンの程よいサイズのやつ、後者はArduino Unoに使われてるやつの下位互換品(ピン配置互換)です。前者は容量が少ないので、初めて試そうと思っている方はATmega168P/328Pあたりが無難です。

2.

Unofficial list of 3rd party boards support urls · arduino/Arduino Wiki · GitHubこのページから、使用したいマイコンの品番を検索します。ATtiny2313の場合は、そのまんま ATtiny というのがありました。このJSONのURLをコピーしておきます。
github.com
使用したい品番が見つからない場合は、「Arduino Board Manager 品番」とかでGoogle検索してみましょう。ATmega88/168P/328P用のファイルは先ほどのページにはありませんでしたが、Redditで公開してる人がいました。これもJSONのURLをコピーします。
※末尾にPがつく品番とつかない品番は互換性がないので注意してください。Vの有無は互換性があります。詳しくはこちら

3.

ArduinoIDEを起動して、メニューから、File>Preference と開きます。

4.

f:id:slideglide:20160620220716p:plain
ここにさっきのJSONを追記します。すでに何か入っている場合はカンマ区切りで追記するか、右のボタンを押すと大きいウィンドウが開いて、改行区切りで入力できるようになります。入力後、OKを押して閉じます。

5.

f:id:slideglide:20160620221916p:plain
Tools>Board>Bords Manager... を選択します。

6.

f:id:slideglide:20160620221825p:plain
ボードマネージャが開くので、先ほど入れた設定ファイルを名前で検索します。なんだか最初に見たページと表示名が違いますが、それっぽいのを見つけたら選択し、INSTALLボタンが出てくるので押します。終わったらCLOSEを押して閉じます。

7.

ふたたび Tools>Board を選んで、新しいボードが増えていることを確認してください。

やり方(接続編)

ハード面の準備です。Arduinoを使ったAVRライターを構築します。

1.

ArduinoをPCに接続します。

2.

メニューから File>Examples>11.ArduinoISP を選択して、ISP用のプログラムをロードします。ISPというのはマイコンにプログラムを書き込む方式の名前です。
Toolsメニューから接続したArduinoボードとポートを選んで、書き込みボタンでプログラムをArduinoに書き込みます。

3.

ブレッドボードにAVRを差し込み、Arduinoと接続します。
以下は接続先の例です。
Arduino Unoを使う場合は、以下に加えてArduinoのリセットピンとGNDの間に10uFのコンデンサをつなぐ必要があるそうです

Arduinoのピン AVRのピン名 例)ATmega88/
168P/328Pなど
例)ATtiny2313
D10 RESET 1 1
D11 MOSI 17 17
D12 MISO 18 18
D13 SCK 19 19
5V VCC,AVCC 7,20 20
GND GND 8,22 10

※雑に書き写しただけなので間違ってたら教えてください
※ピン名とAVRのピン番号の対応は、データシートを見るか、「品番 pin」とかで画像検索すると出てきます。

f:id:slideglide:20160620225630p:plain
参考)Arduino - PinMappingより。ここでは赤文字は無視して黒文字だけ見てください

f:id:slideglide:20160620225244p:plain
例えばこういう風につなぎます。これはATmega88/88P/168P/328Pなどの例。Arduino - ArduinoISPより。上にも書きましたが Arduino Uno を使う場合はArduinoのRESETとGNDの間に10uFのコンデンサを入れること。


余談ですが、
f:id:slideglide:20160620205025j:plain
毎回これを作るのは面倒なので、僕はArduino Nano(互換品)を使ってユニバーサル基板に実装してしまいました。
ICソケットにAVRを刺すだけで書き込みできます。便利。

(追記)わざわざ自作しなくてもAmazonArduino用シールドになったものが売ってました

これを使うと上記3の作業は不要です。(ATmega88/168P/328P用)


やり方(書き込み編)

いよいよAVRにプログラムを書き込んでいきます。

1.

書き込みたいプログラムを準備します。
適当にLチカとか準備してみましょう。後述の「スケッチ上でのピン指定のしかた」も参考にしてください。

2.

f:id:slideglide:20160620231301p:plain
書き込み対象に応じて赤枠の部分を設定してください。
Boardでは、Arduinoではなく書き込み対象のAVRを選択すること。
それ以下に表示される項目はBoardの選択内容により変わるみたいです。
注意点としては、クロック数に関する項目にexternalを選んでしまうと発振器がないと書き換えできなくなるので、使わない場合は必ずinternalを選びましょう。(ATtiny2313、ATmega88Vはいずれも工場出荷時1MHz internalです)

f:id:slideglide:20170327125027p:plain
Use Bootloader という項目がある場合、かならず「No」にしましょう。これをYesにすると、書き込み対象のAVRでなく、Arduinoに内蔵されたほうのAVRが書き変わってしまいます。(Yesでやってしまった場合はArduinoISPを書き込むところからやり直しです。)

Programmerの設定も忘れないでください。「Arduino as ISP」を選びます。

3.

Tools>Burn Bootloader を実行します。ISPを使う場合、実際にブートローダが書き込まれるのではなく、上で選択した設定項目がAVRのヒューズビット(動作設定)に反映されるみたいです。
場合によってはこの操作は不要かもしれません。
※追記:いくつかのマイコンで試したらうまく実行完了しない場合がありましたが、その場合はこのステップを飛ばしてもOKでした。(2.の設定が正しい前提です)

4.

いつもどおり、スケッチをアップロードします。これでArduinoにスケッチが書き込まれる代わりに、AVRに書き込まれます。

書き込み完了です!あとは適当にLEDでもつないで動作確認をしてください。

おまけ:スケッチ上でのピン指定のしかた

書き込み方法が分かったところで、いざスケッチを書こうとするとピン番号の対応がわからず途方にくれます。
「品番 Arduino pin」等で画像検索すると見つかると思いますが、とりあえずネットで見つけたものを2つほど掲載しておきます。


f:id:slideglide:20160620225630p:plain
ATmega88/88P/168P/328Pなど。Arduino - PinMappingより

f:id:slideglide:20160620230845p:plain
ATtiny2313。AVRISP mkIIでArduinoのスケッチを書き込む | なんでも独り言より

使うとき、各入出力ピンはArduinoと同じ感覚で使えますが、電源の取り方は少しArduinoと勝手が違うかもしれません。VCCとかAVCCとか書いてあるところに5V(マイコンによっては3.3Vも可)を入れて、GNDと書いてあるところをGNDにつなげばいいです。それぞれ複数ある場合は全部つなぎましょう。

おまけ:普通のArduinoに戻りたい

Tools>Boardで使いたいArduinoを選ぶほか、Programmerを「AVRISP mkII」に戻すのを忘れないでください!
取り消し線部分はやんなくていいそうです( @maris_HY さん情報ありがとうございます)

おまけ:デメリット(一般的なAVR開発と比べて)

このやり方だとArduino言語でスケッチが書けて大変便利なんですが、デメリットもあります。同じ処理でも、AVR STUDIO+C言語で書いた時よりかなりプログラムのサイズが大きくなります。
ATtiny2313くらいだと容量的にあんまり大したことできないかもしれません。ご注意ください。

おしらせ

ヘボコン・ワールドチャンピオンシップを開催します!!!!

www.youtube.com

告知記事も見てね(明日21日公開です)
http://portal.nifty.com/kiji/160620196811_1.htm

*1:Bootloaderを書き込むとAVR自体がArduino化するため、2度目以降の書き込みは単体で行えます(別途Arduinoを用意しなくてもよくなります)。ただしBootloaderのぶんプログラム領域が減りますし、どうせ1回目は別途のArduinoが必要なのでこちらの方式のほうがメリットが多いように思います。