ATmega・ATtinyにブートローダ・スケッチ書き込み

2018年3月24日

今回は、秋月電子通商で購入した部品「ATmega168P」と「ATtiny85」にブートローダーを書き込んで、

Arduinoの互換ICとしてスケッチを書き込めるようにしようと思います。

 用意するもの  数
 ArduinoUno実機  1台
 PCとUnoを接続するUSBコード  1本
 ATmega・ATtiny  お好み(1個~)
 ブレッドボード  1個(小さいものでもOK)
 ジャンパーワイヤー  10本程度あればOK
 動作確認用LED  1個(何色でもOK)
 LED用抵抗  1個(※1)

※1:LEDによって抵抗値が異なりますので必ず計算してください。(→抵抗値計算ソフト[無料])

 必要なソフトウェア  公式サイトURL
 ArduinoIDE  https://www.arduino.cc/en/Main/Software

注意:最新のArduinoIDEは使用しないでください。正しく書きこめなかったり、誤作動する可能性があります。
    (ダウンロードするIDEバージョンは順を追って説明します。)

ここから順番に説明します。
http://make.kosakalab.com/make/electronic-work/arduino-ide-arduinoisp/のページを参考にさせていただきました。)
今回やることは ブートローダーを書き込む→内部クロックを8MHzに切り替える→スケッチを書き込む の順番で説明します。
※説明内の画像はすべてクリックすると拡大します。
※すべてWindowsの場合で説明しています。Macなどの別のPCでもできると思いますが
 (ArduinoIDEがMac等にも対応しているので…)、正しく動作するかどうかは保障しません。

*+:。.。 。.。:+* *+:。.。 。.。:+* *+:。.。 。.。:+* *+:。.。 。.。:+* *+:。.。 。.。:+* *+:。.。 。.。:+* *+:。.。 。.。:+*

 お知らせ (2016/09/04追記)

ArduinoIDE Version.1.6.xでATtiny/ATmegaの書き込みができる追加パッチを作成しました。
詳しくは下記のページをご覧ください。

ArduinoIDE1.6.xでATtiny/ATmegaにスケッチを書き込む
http://etfsresearch.cf/developer/electronicwork_research/arduino/arduino_atmegatiny_write/

*+:。.。 。.。:+* *+:。.。 。.。:+* *+:。.。 。.。:+* *+:。.。 。.。:+* *+:。.。 。.。:+* *+:。.。 。.。:+* *+:。.。 。.。:+*

【ブートローダーを書き込もう!】
必要なソフトをダウンロードする
(普段Arduino1.0.x以外のバージョンを使っている方も、新しく1.0.5をダウンロードしてください。)
1.上記の公式サイトを開いて、「PREVIOUS RELEASES」の欄にある「Arduino 1.0.x」をクリックします。

 
2.画像のようなページに移動したら、「1.0.5」の欄の「Windows」をクリックしてArduinoIDE 1.0.5をダウンロードします。
(名前をつけて保存でデスクトップ等適当な場所にダウンロードしてください)

3.ダウンロードした「arduino-1.0.5-r2-windows.zip」をダブルクリックして適当な場所に解凍します。

4.解凍したフォルダー内にある「arduino.exe」をダブルクリックして起動します。

5.起動したら、「ファイル」メニュー→「環境設定」をクリックします。

「スケッチブックの保存先」に書かれているフォルダーのパスを覚えておいてください(メモってください)。
※初期値はだいたい「C:\Users\(ユーザー名)\Documents\Arduino」だと思います
そしてArduinoIDEは一度閉じてください。

6.このページを開きます。(←リンクをクリックしてください)
少し下にスクロールして「用意するもの・ソフト関連」の欄にある「ATmega/ATtiny記述ファイルアーカイブ」をダウンロードします。
「ここからダウンロード」の文字をクリックして適当な場所にダウンロードしてください。


(リンク先ページ)

7.ダウンロードした「hardware.zip」を開いて「hardware」フォルダーを5で調べたパスのフォルダー内に解凍します。


(パスのフォルダー内に解凍された様子。画像の「hardware」フォルダーが「hardware.zip」から解凍したものです。)

8.再度ArduinoIDEを起動します。
すると「ツール」メニュー→「マイコンボード」に画像のようなATmega・ATtiny等のメニューが追加されているはずです。
※注意
画像のようにATmega・ATtinyのメニューがない場合は、もう一度5からの手順をやり直してみてください。
解凍先フォルダーを間違えていないかなどを確認してみてください。
また、もし一度もArduinoIDEを終了していない場合は、一度閉じてからソフトを再起動してください。

 

ブートローダーを書き込む

(この時点ではまだATmegaやATtinyは接続しないでください。ArduinoUnoのみで行います。)
1.「ファイル」メニュー→「スケッチの例」→「ArduinoISP」を選択します。

2.「ツール」メニュー→「マイコンボード」→「Arduino Uno」を選択します。

3.「ツール」メニュー→「シリアルポート」で、書き込むArduinoUnoのポートを選択します。

4.「ツール」メニュー→「書込装置」→「AVRISP mkII」を選択します。
 ※2016/09/01修正:書き込み装置は「AVRISP mkll」ではなくメニュー最下部の「Arduino as ISP」を選択してください
  「AVRISP mkll」を選択してしまうと、後にスケッチを書き込む際、エラーになってマイコン(ATmegaなど)に書き込めません。

4.チェックマークの隣にある「→」マークの丸いボタンをクリックして書きこみます。
書き込みが成功したら画像のように表示されます。

 

5.Arduinoを一度パソコンから取り外します。(USBケーブルを抜いてください。)
そして、画像のようにブレッドボードとArduinoUnoを配線します。

 ATmega168Pの接続方法
(ATmega88P・ATmega328Pも共通です)
 ATtiny85の接続方法
(ATtiny13・ATtiny45も共通です)
 

 

このページの中間くらいに、ATmega644P・ATmega1284PやAATtiny2313の接続方法も記載されています。

6.配線が完了したら、再度ArduinoUnoをパソコンと接続してください。
そしてArduinoIDEに次のプログラムを入力します。

サンプルプログラム1
// ここから

int led = 0;

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

void loop() {
  digitalWrite(led, HIGH);
  delay(125);
  digitalWrite(led, LOW);
  delay(125);
}

// ここまで

 
7.「ツール」メニュー→「マイコンボード」で、書き込む互換ICの名前を選択してください。

ATmega168Pに書き込む場合:「ATmega168P / Int.8MHz」を選択
ATtiny85に書き込む場合:「ATtiny85(internal 8MHz Clock)」を選択
そのほかのATmegaに書き込む場合:「ATmega○○○ / Int.8MHz」を選択
そのほかのATtinyに書き込む場合:「ATtiny○○○ (internal 8MHz Clock)」を選択
(○○○とは、書き込むICの名前です。)

※メニューの下部にもATmegaなどの選択肢がありますが、今回はメニューの上部にあるものを使用します。

8.「ツール」メニュー→「シリアルポート」で、ArduinoUnoのポートを選択します。

9.「ツール」メニュー→「書込装置」→「Arduino as ISP」を選択します。

10.プログラムを書き込みます。
チェックマークの右にある「→」ボタンをクリックして書き込みを開始してください。
※書き込む前にもう一度「マイコンボード」と「書込装置」のメニューを確認しておくことをお勧めします。
  別のものが選択されていたりした場合、最悪ATmegaやATtinyは壊れて二度と使えなくなってしまいます。

(画像は書き込みが完了した様子です。)

11.書き込みが完了したら、ブレッドボード上のLEDが点滅します。

ブレッドボード上のLEDが1秒間隔で点滅したら、書き込み成功です!

ですが、まだやることはあります。
それは、内部クロックを初期状態(1MHz)から8MHzに切り替えることです。
なぜこんなことをやらないといけないのか?LED点滅したからそれでいいのではないのか?と思うかもしれませんが、先ほど書き込んだプログラムをよく見ると、delayが「125」になっています。
通常のArduino実記の場合は、「delay(1000)」で1秒間隔に点滅するはずですが、ここでは「delay(125)」にもかかわらず「delay(1000)」のときと同じように1秒間間隔に点滅ししまっています。
つまり動作が実機と比べて1/8倍の速度になってしまっていると言うことです!
これでは以降プログラムを書き込むときに支障が出てしまいますので、8MHzという実機と同じ内部クロックに切りかえる必要があるのです。

と、いうことで……

内部クロックを8MHzに切り替える
(やることはブートローダーの書き込みに比べるととても簡単です。)

1.「ツール」メニュー→「マイコンボード」が「ATmega○○○ / Int.8MHz」または「ATtiny○○○ (internal 8MHz Clock)」、(○○○とは、書き込むICの名前です。)
「書込装置」が「Arduino as ISP」になっていることを確認してください。

2.「ツール」メニュー→「ブートローダーを書き込む」をクリックしてください。
(あれっ?もう書き込んであるんじゃないの?と思った方、ここでのブートローダーとは1の手順で選択したメニューの通り「internal 8MHz Clock」(つまり日本語で「内部8MHzのクロック」です。)で、その8MHzを書き込むということです。)

3.書き込み(8MHzへの切り替え)が完了すると、下の画像のように表示されます。

4.初期状態(1MHz)から8MHz(通常)に切り替わったかどうかの確認方法としては、ブレッドボードを見てみてください!
同じプログラムのはずなのに、LEDが以前より高速に点滅していると思います。
以前より高速に点滅していれば、8MHzに切り替わった証拠です。
(もししっかりと確認したいならば、先ほどのプログラムの「delay(125)」の部分を「delay(1000)」にして書き込んでみてください。
LEDが1秒間隔に点滅していたら成功です。)

ATmega・ATtinyへのスケッチ書き込み方法

1.以前の手順を参考にして、ATmega・ATtinyは接続しない状態でArduinoUnoに「ArduinoISP」を書き込んでください。
(「ツール」メニュー→「マイコンボード」が「Arduino Uno」、「書込装置」が「AVRISP mkII」になっていることを確認してから書き込んでください。)

2.一度ArduinoUnoをパソコンから取り外してATmega・ATtinyを配線します。
配線が完了したら再度パソコンに接続します。

3.書き込みたいスケッチを入力します。(または読み込みます。)

4.「ツール」メニュー→「マイコンボード」が「ATmega○○○ / Int.8MHz」または「ATtiny○○○ (internal 8MHz Clock)」、(○○○とは、書き込むICの名前です。)
「書込装置」が「Arduino as ISP」になっていることを確認してください。

5.プログラムを書き込みます。
チェックマークの右にある「→」ボタンをクリックして書き込みを開始してください。

6.完了したらATmegaやATtinyを配線しなおしてプログラム通りに単体で動作していれば成功です。
(各ICのピン割り当てはこのページに分かりやすく載っています。)

参考までに…

ATtiny85にスケッチを書き込んだ後、いつも書きのようなエラーがでました。
ですが、実際に書き込んだICを使ってみると、何の異常もなく動作しますので、このエラーは無視してもいいと思います。

いかがだったでしょうか?
正しく書き込め、単体で動作させることに成功しましたでしょうか?
私はこの方法を知る前、検索してたくさんのサイトを参考に書き込んでみましたが、失敗ばかりでした。
ですがこのページに出会ってからは、正しく書き込めるようになりました。
もしかしたら書き込めなかった理由としては使用しているArduinoUnoが「SainSmartUno」という互換ボードだということが関係しているのかもしれませんが…
なので、このページを参考にしても正しく書き込めないという方がいるかもしれませんが、そういうときにはまず配線を確認してみてください!
(私もこれで何度かエラーになってあせっていたことがありました。)
ショートや配線場所のミス、またICの向きを間違えている等、考えられることはたくさんありますので、是非ご確認ください。
(また、下記の「よくあるエラー」には、エラー文字とその意味が書かれていますのでそちらも参考にどうぞ。)

いざというときのためにこのページの印刷をオススメします。

よくあるエラー
・「avrdude: stk500_getsync(): not in sync: resp=0x00」
意味:ArduinoUno実機に「ArduinoISP」が書き込まれていません。
    ATmegaやATtinyを接続している場合は取り外して再度ArduinoUnoに「ArduinoISP」を書き込んでください。
    (この時に「ツール」メニュー→「マイコンボード」が「Arduino Uno」、「書込装置」が「AVRISP mkII」※「Arduino as ISP」になっていることを確認してください。)

※追記個所は文中「※」で解説を記入しています