おもちゃラボ

Unityで遊びを作ってます

Arduino IDEを使ってAVRにスケッチを書き込む

f:id:nn_hokuson:20190220200250j:plain

Arduinoは回路の実験をするには便利なんですが、後々まで置いておきたいものに組み込むには、ちょっと大げさです。

組み込んで置いてても、いざ使おうとすると、ピン足が抜けててあれどこにさすんだっけ?みたいな。長期保存することを考えると、AVRにスケッチを書き込んでを半田付けしちゃうのが一番です。

ATTiny85なら秋月で100円程度なので、組み込む心理障壁もやや低め。ということで、前置きが長くなりましたが、ここではarduino で書いたスケッチをAVRに書き込む方法を紹介します。

ArduinoはAVRライターにしない!

既存のArduinoをAVRライターとして使う方法もあるっちゃぁ、あるのですけど、少しややこしい上に、 Arduino からAVRに書き込むタイミングで次のようなエラーが出て、どうしようもなくなることがあります。

avrdude: Device signature = 0x000000
avrdude: Yikes! Invalid device signature.
Double check connections and try again, or use -F to override
this check.
avrdude done. Thank you.

AVRのヒューズビットの問題のようですが、これを解決するためにヒューズリセッタを作って・・・なんてやってると終わらない。

AVRライター(USBASP V2.0)は買っても250円程度なので、エラーにハマる手間賃と思って、こっちを買うことをお勧めします。これとArduinoのスケッチさえあれば、確実にAVRにスケッチを書き込めます。

AVRライターとAVRの接続方法

AVRライターとAVRを接続します。ライター側のVCC、GND、MOSI、MISO、RST をそれぞれ、対応するピンに接続するだけです。

上記AVRライターの出力ピン配置は次のようになっています。

f:id:nn_hokuson:20190219202009p:plain:w300

Attiny85のピン配置は次のようになっているので、これをつなぎます。ほかのAVR(ATTiny2313など)でも同様です。ピン配置はデータシートを参照下さい。

f:id:nn_hokuson:20190219202356p:plain:w300

(番外編)アダプタを作る

ブレッドボードなどを使って接続しても良いのですが、いちいち組み立てるのが面倒なので、うちではTiny85用のアダプタを作りました。

f:id:nn_hokuson:20190219203241j:plain:w400

一応、マスクデータを置いておきますね。ご自由にお使いください(MOSIの配線だけはジャンプワイヤでつないでください)

f:id:nn_hokuson:20190219203615p:plain:w130

プリント基板を自作する方法は次の記事で説明しているので、参考にしてみてくださいね!

nn-hokuson.hatenablog.com

AVRにArduinoのスケッチを書き込む設定をする

次にArduino のスケッチをAVRに書き込むための設定をしていきます。Arduino IDEからAVRに書き込むにはATTinyCoreというミドルウェアを使用します。

Arduinoのメニューから環境設定を開き、メニューバーからArduino→Preferencesと進み、追加のボードマネージャのURLに http://drazzy.com/package_drazzy.com_index.json と入力してください。

f:id:nn_hokuson:20190219204319j:plain:w500

メニューバーから「ツール」→ 「ボード」→「ボードマネージャー」を選択して、ATTinyCore を選択してインストールしてください。

f:id:nn_hokuson:20190219204827j:plain:w500

次に書き込み設定を行います。メニューバーから「ツール」を選択して次のように設定してください。

ボード ATTinyCore/ATtiny85
Clock 8MHz(internal)
Chip ATtiny85
書き込み装置 USBasp

f:id:nn_hokuson:20190219205325j:plain:w300

Arduinoのスケッチを作成する

ここでは簡単にLチカのプログラムを作って・・・・と言いたいところですが、LEDを光らそうにもAVRのピン番号がわかりませんね。

AVRとArduinoのピン対応は次のサイトにまとまっているので、使用しているAVRを探してみてください。

github.com

上のサイトでArduinoとATTiny85の対応を確認したところ、次のようになっていました。

f:id:nn_hokuson:20190219211505p:plain

水色で書かれたARDUINO PINというのがピン番号です。「ディジタルピン/ アナログピン」の順番で並んでいます。ここでは3番ピンを使ってLチカするプログラムを作ってみましょう。

Arduino IDEに次のプログラムを作ってください。

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

void loop() {
    digitalWrite(3, HIGH);
    delay(100);
    digitalWrite(3, LOW);
    delay(100);
}

プログラムが作れたら、Arduinoの書き込みボタンを押してAVRに書き込みましょう。

f:id:nn_hokuson:20190220200455p:plain:w300

動作確認

AVRの書き込み装置から外して、3番ピン(Tiny85左側の上から2番目)にLEDと抵抗を接続してください。回路図は下のような感じになります。

f:id:nn_hokuson:20190220221839j:plain:w300

電源を入れると点滅することを確認しましょう!

f:id:nn_hokuson:20190220200927g:plain

(おまけ)プログラムのサイズを小さくする

Tiny85などの小さいAVRは、プログラムを配置するためのRAM容量も小さくなってしまいます。Arduinoに使われているATmega328はFlashが32KBなのに対して、Tiny85では8KBと1/4のサイズしかありません

コンパイル後のプログラムサイズはArduino IDEに表示されるので確認してみましょう。

最大8192バイトのフラッシュメモリのうち、スケッチが908バイト(11%)を使っています。
最大512バイトのRAMのうち、グローバル変数が9バイト(1%)を使っていて、ローカル変数で503バイト使うことができます。

Lチカだけで1KBちかく消費しています。なんとかプログラムのサイズを削りたい・・・そんなときの定石があります。digitalReadとdigitalWriteメソッド、あとpinModeメソットをそれぞれ次のプログラムに置き換えてみましょう。

置換前 置換後
digitalWrite(3, HIGH) PORTB |= _BV(3)
digitalWrite(3, LOW) PORTB &= ~_BV(3)
pinMode(3, OUTPUT) DDRB |= _BV(3)

置換後のプログラムは次のようになります。

void setup() {
     DDRB  |=  _BV(3);
}

void loop() {
    PORTB |=  _BV(3);
    delay(100);
    PORTB &= ~_BV(3);
    delay(100);
}

digitalWriteなどのメソッドは汎用性を考慮して、かなり大きなプログラムになっています。ここではマイコンらしくピンのオンオフだけをするように変更しました。コンパイルして容量を確認してみてください。

digitalWrite関数を使わないようにするだけで、プログラムサイズを500バイト程度減らせました。全部で8KBしかないことを考えると節約するに越したことはありません。

最大8192バイトのフラッシュメモリのうち、スケッチが490バイト(5%)を使っています。
最大512バイトのRAMのうち、グローバル変数が9バイト(1%)を使っていて、ローカル変数で503バイト使うことができます。