いよいよ、本題です。ブートローダ書き込み回路を、シールドの形に固定して、使いやすく、信頼性の高いブートローダライタに仕上げましょう。
基本的に、ブレッドボード上に組んだ回路をシールドに固定するだけなので、そんなに難しくありません。ただ、前のページで紹介したブレッドボードの回路では、ArduinoISP(ブートローダー書き込み用のスケッチ)の機能で、一部使っていない機能があります。具体的に言うと、書き込みの状態を示す、インジケーター用LEDが、前のページの回路には付いていませんでした。
ブレッドボードに回路を組むなら、必要最低限の回路にして配線の数を減らしたいですが、今回は半田付けしてシールドを作るので、ArduinoISPの機能を最大限に生かす方向で考えます。
ArduinoISPのソースリストを見ると、9番ピン、8番ピン、7番ピンにLED(と電流制限抵抗)を付けるように書いてあります。
各ピンの信号の名称と意味を、次の表にまとめます。
Arduinoのピン番号 | 信号の名称 | 信号の意味 |
---|---|---|
9 | Heartbeat | ArduinoISPが動作していることを表わす信号。analogWrite関数を使い、LEDをじわじわと明るくしたり暗くしたりをを繰り返すように制御する。その明るさの変化の様子はHeartbeat(心拍)という言葉を連想させる。 |
8 | Error | 書き込み中に何かエラーが発生するとLEDが点灯する。ソースコード中のコメントには、このLEDを赤色にすると意味が分かりやすいと書いてある。 |
7 | Programming | ブートローダを書き込むターゲットのマイコンと交信している時にLEDが点灯する。 |
今回は、これらのLEDに加えて、電源が入っていることを示すPOWER LEDを付ける事にします。
前のページで組んだブレッドボードの回路では、ATmega328Pの21番ピン(AREF)をオープンにしていましたが、なんとなく気持ち悪いので、今回は5Vにつなぐことにします。
さらに、ArduinoのRESET-GND間に入る10μFの電解コンデンサは、スイッチで無効にできるようにし、シールドをArduino Unoに接続したままで、ArduinoISPのスケッチの書き込みと、ブートローダ書き込みの両方をできるようにします。
既に基板上に半田付けされたATmega328Pのにブートローダを書き込む可能性を考え、ICSP端子も設けます。この端子を設けておくと、ATmega328P-AUの様な表面実装しなければならないマイコンでも、基板上でブートローダを書き込めます。(実際にこの機能はグラフィックLCDシールドで使いました)
ブレッドボードの回路では、5VとGNDの間にパスコンが入っていませんでしたが、今回は、動作を安定化させるため、0.1μFのセラミックコンデンサを入れることにしました。
以上のような方針で設計した回路が次の回路です。
S1にはただ単にIC_SOCKET_DIP28_600MIL(対面のピンの距離が600mil、つまり15.24mmのDIP28ピンのICソケット)としか書いてありませんが、汎用のバネ式のICソケットや、丸ピンICソケットよりも、ゼロプレッシャーソケットを是非使ってください。耐久度が違います。ゼロプレッシャーソケットを使わない場合は、対面ピンの距離が300milの物を使ってください。
R1の1MΩは、なくてもいい部品なのですが、Arduino Unoの回路図を見ると、ここに1MΩの抵抗が入っているので、それにならって1MΩを入れてみました。1MΩを入れても弊害はないはずです。
部品表をまとめると、次の様になります。
部品番号 | 数量 | 品名 | 型番/仕様 | メーカー | 備考 | 参考単価 |
---|---|---|---|---|---|---|
S1 | 1 | ICソケット | ZERP-28-600MIL | ゼロプレッシャーソケット | 500円 | |
X1 | 1 | 水晶振動子 | 16MHz | 負荷容量が十数~20pF程度の物 | 100円程度 | |
R3~6 | 4 | カーボン抵抗 | 1kΩ,1/8W | 実装面積に余裕があるなら1/4W品でも可 | 10円程度 | |
R2 | 1 | カーボン抵抗 | 10kΩ,1/8W | 実装面積に余裕があるなら1/4W品でも可 | 10円程度 | |
R1 | 1 | カーボン抵抗 | 1MΩ,1/8W | 実装面積に余裕があるなら1/4W品でも可 | 10円程度 | |
C1,C2 | 2 | セラミックコンデンサ | 22pF,50V | 10円程度 | ||
C3 | 1 | セラミックコンデンサ | 0.1μF,50V | 20円程度 | ||
C4 | 1 | 電解コンデンサ | 10μF,50V | 10円程度 | ||
LED1~4 | 4 | LED | 直径3mmの物ならたいていOK | 20円程度 | ||
SW1 | 1 | スライドスイッチ | SS12D01G4 | 回路図に書いたJS102011CQNは手に入りにくい | 50円程度 | |
CN1 | 1 | ピンヘッダ | 2X3ピン、2.54mmピッチ | 2X32ピンのピンヘッダを折って使う | 40円 | |
M1 | 1 | ユニバーサル基板 | UB-ARD01WH | サンハヤト | 600円程度 | |
2 | ピンヘッダ | 1X8ピン、2.54mmピッチ | 1X40ピンのピンヘッダを折って使う | 20円程度 | ||
2 | ピンヘッダ | 1X6ピン、2.54mmピッチ | 1X40ピンのピンヘッダを折って使う | 20円程度 |
組み立てたシールドの写真を次に示します。
組み立てる際に、Arduino UnoのUSBコネクタやDCジャックと干渉する部分には、部品を配置したり、配線を伸ばしたりしない注意が必要です。
部品の配置は次の様になっています。
本来は、4つのLEDの色を別々にすると、遠目にもシールドの状態が把握しやすいのですが、手持ちの部品の関係で全て赤色にしてしまいました。色を別々にする場合は、電流制限抵抗(R3~6)を同じ1kΩにせずに、発光色に応じて調整しましょう。色によって発光感度が異なるので、同じ電流制限抵抗を使ったのでは、明るいLEDと暗いLEDができてしまいます。具体的に何Ωにすればよいかは、ブレッドボードで発光回路を仮組みしてみて調整すると良いでしょう。
それでは、先ほど製作したブートローダライタシールドを使って、ATmega328P-PUにArduino Unoのブートローダを書き込んで見ましょう。以下に説明する手順でブートローダが書き込めます。
注:上の図ではCOM15を選んでいますが、皆さんの環境に合わせて、COM番号を選んでください。
ArduinoISPのスケッチが正常に書き込めると、HeartbeatのLEDが明るくなったり暗くなったりを繰り返します。
ゼロプレッシャーソケットを使っている場合は、下の写真のように、ICをソケットに挿入してから、レバーを倒して固定します。
ブートローダの書き込み中は、ProgrammingのLEDが点灯します。
しばらくすると、ブートローダが書き込めるはずです。
ブートローダの書き込みが終わったら、ProgrammingのLEDは消えます。
もし、ブートローダの書き込みに失敗すると、Errorのランプが点灯して書き込みが中断します。その場合は、正しい手順で書き込んでいるか再確認の上、もう一度ブートローダを書き込んでください。(私の場合、よくブートローダの書き込みをするつもりで、スケッチを書き込んでしまい、ErrorのLEDを点灯させてしまいます)
ゼロプレッシャーソケットを使っている場合は、レバーを立ててからICを外してください。
続けて別のATmega328P-PUにブートローダを書き込む場合は、ATmega328P-PUを新しいものに交換して、手順10を実行すればOKです。
この記事では、ICSP端子(CN1)の使い方を説明していませんが、グラフィックLCDシールドの記事の方で、ICSP端子の使い方を説明しています。
Arduino IDEの画面に「ブートローダの書き込みが完了しました。」と表示され、シールドのErrorのLEDが点灯していなければ、基本的には正常にブートローダが書き込めているはずですが、実際にブートローダを起動して動作を確認する方法を説明します。
そのための一番簡単な方法は、Arduino Unoに載っているATmega328P-PUを、自分でブートローダを書き込んだ物に交換して見る方法です。ただし、Arduino Unoでも、表面実装のATmega328Pを使用しており、交換できないものもありますので、その場合にはここで説明する方法は使えません。
下の写真を参考に、ATmega328P-PUを交換して、何か適当なスケッチを書き込んでみてください。ブートローダが正常に機能していれば、スケッチが書き込めて、その後、そのスケッチが動作し始めるはずです。(スケッチの例の中にある01.BasicsのBlinkという、Arduino内蔵LEDを点滅させるスケッチを書き込めば、Arduino単体でスケッチの動作まで確認できるのでお勧めです)
ICの交換時にリード(足)を傷めないように気をつけることが重要です。
ICを引き抜くための工具も市販されていますが、100円ショップの精密ドライバーセットに入っている小型のマイナスドライバーでも綺麗にICを引き抜けます。ICソケットとICの間にマイナスドライバーをこじ入れて、少しずつICを浮かせていきます。ICの両端を交互に少しずつ浮かせていくのがコツです。
また、新品のICは、両側のリードが平行になっておらず、ハの字型に広がっています。あらかじめ平行に整形しないと、ICソケットに挿入できません。ICのリードを整形する工具もあるのですが、私は机の平面を使って、ICとリードが垂直になるように整形しています。ただし、静電気でICを壊す恐れがあるので、机にICのリードを押し当てるのは本来好ましい方法ではありません。
ATmega328P-PUを交換してみて、無事にスケッチが書き込めるようなら、元のATmega328P-PUに戻してもいいですし、新しい方のATmega328P-PUをそのままArduino Unoで使ってもいいです。(ICの交換回数が減るので、後者がお勧め)
もしスケッチがうまく書き込めないなら、元のATmega328P-PUに戻してください。ブートローダがうまく書き込めていないATmega328P-PUは、もう一度ブートローダを書き直して見ましょう。それでダメなら、故障しているものとしてあきらめましょう。
なお、Arduino Unoに使われているバネ式のICソケットは、あまり耐久性がなく、何回もICの交換を繰り返していると接触不良などの不具合が発生します。そういう意味では、Arduino Unoをブートローダの動作試験に使うのは好ましくありません。2、3回ブートローダの書き込みと動作試験をやってみて、書き込みに自信が出てきたら、Arduino Unoを使って動作試験をするのは止めましょう。
なお、このページで紹介したブートローダライタシールドを使って、Arduinoのスケッチを書き込むことも可能です。ブートローダを使わずにArduinoのスケッチをATmega328Pに書き込むの記事で紹介していますので、是非そちらもご覧ください。
次のページでは、Arduino Unoとブートローダライタシールドを使ってArduino Leonardoのブートローダを書き換える方法について説明します。
商品名 | Arduino Uno用ブートローダスケッチライタシールドキット | |
税抜き小売価格 | 1440円 | |
販売店 | スイッチサイエンス | |
サポートページ | Arduino Uno用ブートローダライタシールドキットサポートページ |
商品名 | Arduino用ブートローダ/スケッチライタキット | |
税抜き小売価格 | 3000円 | |
販売店 | スイッチサイエンス | |
サポートページ | Arduino用ブートローダ/スケッチライタキットサポートページ |
商品名 | Arduino用ブートローダ/スケッチライタ(完成品) | |
税抜き小売価格 | 3600円 | |
販売店 | スイッチサイエンス マルツ | |
サポートページ | Arduino用ブートローダ/スケッチライタ(完成品)サポートページ |