Arduino Pro Mini 5V/16MHz、Nano 5V/16MHz、Uno R3の各互換機を使って『AVRマイコン・AVRマイコン搭載Arduino用書き込み装置』を自作してみるページ。
いわゆるArduinoISPのことであり、ArduinoISPとは、FTDI232(FT232)などのシリアル書き込み機能をArduinoボードで代替できるもの。
作ると言ってもスケッチは、Arduino IDEでサンプルとして提供されていて、公式サイトのArduinoISPガイドもあり、検索すればArduino UNOや中にはPro Mini 3.3V/8MHzを使ったArduinoISPの記事もすぐに見つかるので目新しいわけではありませんが、Pro Mini 5V/16MHzやNano 5V/16MHzだとガイドにも注記のあるUNO同様、10μFのコンデンサが必要みたいだったよという話。
Pro Miniだけでなく、Nano、Unoも含んでおり、追記もしているため、前段で一部文章追記およびページタイトルを『Pro Mini 5V版ArduinoISPを作る』から『Pro Mini 5V版/Nano 5V版/Uno版ArduinoISPを作る』へ変更。
この3つならArduinoISPには、ブレッドボード実装でさえ、最も嵩張らず小型化できるNanoが最適。
ArduinoISP用回路を作る(作るというほどではないですが)に至った理由は、先日、複数持っていたPro MiniやESP8266の書き込みに手持ちのFTD1232(FT232/FTDI232互換)が使えず、検証のため、追加で複数個のFTD1232やFT232RL(FTDI232)、USB(A-ミニ)ケーブル、ESP8266などを買ってみましたが、これらが壊れているわけではなく、もしかして何かやっている時にうっかりブートローダを消してしまったのか?とあたりをつけ、結果、原因はこれだったのですが、FTDIでは、やはりブートローダを書き込めず、一方で、UNOを使ってArduinoISPを試してみたら、なぜか、ブートローダを書き込むことができ、その後はArduinoISP、FTDIモジュール共にスケッチを書き込むことができるようになったということがあったから。
書き込み装置の小型化を図るため、UNOは現状2個あるとはいえ、1個はマイコンが外れるタイプ(Atmega16U2)で他方は違うというのもあるし、何か始める際は、とりあえず、UNO、実装・作り置きしておく試作品にはPro Miniを使おうと思っていることもあってUNOをフリーにしておくため、複数持っているPro Miniの1つをArduinoISPにしておこうかと。
尤も何度かやっていると覚えてしまえるくらいの配線・回路なので余程、しょっちゅう使うというのでもなければ、そもそも作り置きしておくまでもないといえばないですが。
Pro Mini 5VをArduino ISPとすべく使ったのは、5個200円のミニブレッドボード1個と40ピンで105〜120円のジャンパワイヤ(オス-オス/オス-メス)計16本(8本でも可)、各種120個で180円のコンデンサ(10μF)1個、ArduinoISPとする278円のPro Miniが1個、これ用で245円のUSBシリアル変換モジュール(FTDI)1個、100円ショップSeriaにもあるUSB(Aオス-ミニBオス)ケーブル1個、スケッチを書き込むマイコンかArduinoボード、今回は610円のAtmega16U2 UNO 1個を想定。
書き込まれるUNOを入れても約1330円、UNOを除いて書き込み装置の試作品としてみると720円、ジャンパワイヤ8本にすれば...というわけで激安品を使って単価割りするとこんな感じ。
ごちゃごちゃしているのは、ブレッドボードとジャンパワイヤを使っている、かつ、ArduinoISPとしたPro Miniとこれを使ってスケッチを書き込むことを想定しているUNOを直結せず、ブレッドボードを介している(ジャンパワイヤを分けて7本と6本+1本配線している)からですが、実際には配線は8本だけ。
具体的な配線は以下の通り(ArduioISP側とスケッチを書き込む側の違いはあれど、Arudino IDEのサンプルスケッチArduinoISPをそのまま使う場合、何れがPro MiniでもUNOでも配線は同じ)。
あとは、ISP側のArduinoボード(ここではPro Mini)をPCにUSB接続し、Arduino IDEの[ツール]メニューでボードとして書き込む側のArduinoボード(ここではUno)を、[書込装置]に[Arduino as ISP]を選択しておき、ブートローダを書き込む場合は、同じく[ツール]メニュー内の[ブートローダを書き込む]、スケッチを書き込む場合には、[スケッチ]メニュー内の[書込装置を使って書き込む]を選択・実行するだけ。
5V版だからなのか、Pro MiniをArduinoISPとする場合には、UNO同様、10μFのコンデンサがないと書き込みに失敗(Pro Mini 5VのRSTとGND間に10μFコンデンサを入れればArduinoISPとして機能)する模様。
ちなみにPro MiniをArduinoISPとするにあたり、ピンヘッダを初めてはんだ付けしてみました。(機能するという意味では一発OKだったものの、これまた初めてはんだごてのピン先を尖ったのに替えてみたのですが、ピンヘッダのはんだ付けは、思いの外、難しく、見た目上は、納得いく仕上がりにはなりませんでした。)
やっぱり、すっきりさせた方がよいかということでコンデンサをミニブレッドボード上に直接挿し、ジャンパワイヤ(オス-オス)の他方を書き込み側に挿すべく想定するとUNOをArduinoISPとする場合と同様にジャンパワイヤ6本で済むのですが、実際のところ、無理っぽい。
というのも互換モジュールであるFTD1232は、ピンがはんだ付けされた状態でPro Miniと直結しようとすると表裏反対になる恰好で差し込むことになるのですが、そうなると差し方は、FTD1232を実装面を表にしてPro Miniの後ろかから挿すか、裏にして前から挿すかの2パターンしかなく、このシンプルな方法でFTD1232実装面を裏にしてPro Miniの前から挿すパターンだと通電はしますが、書き込みが、うまくいかず、前述の複雑な配線で取り回してみましたが、やはり、FTDI互換モジュールをこのパターンで挿すと、どうにも書き込みがうまくいかない。
よってFTD1232を使ってPro MiniをArduinoISPとする場合には、先の配線がベターな模様。
専用にすべくFTDI互換モジュールは複数個買ってあるのですが、何れにしてもFTD1232とPro Miniの接続は微妙なので微調整するという意味でも、今回は、これら2つのはんだ付けはしていません。
FTD1232とPro Miniをジャンパワイヤでつなぐ方法も考えられますが、その場合、更に嵩張ってしまうし、Pro Miniの垂直方向に並ぶ6ピン穴と他のピン穴の位置関係からして6穴はPro Mini表面側にピンを出すようなはんだ付けを要することになる可能性が高い、かと言って直結すべくブレッドボードの端を利用しようにもPro Miniのホールをすべて活かそうとすると干渉して無理があり、ユニバーサルボードでもカットしたとしてもギリギリいけるかどうか、一部ホールを犠牲にすれば、なんとかなるかもしれませんがスマートとは言い難い。
ブレッドボード上でPro Mini+FTD1232を使ったArduinoISPにおいて固定するなら直結ではなく配線コードを這わせれば、多少すっきりする可能性もありますが、FTDIモジュールと接続する6ホール分も配線コードを引き回すとなるとミニブレッドボードでは厳しく、400穴あたりが必要となるとUNOより嵩張ることになってしまう。
となるとユニバーサルボード上でラッピングワイヤ、錫メッキ線や繋ぎのはんだ(はんだブリッジ)などを介してFTD1232、ヘッダピンを介して書き込む側のArduinoボードなどと接続するようにするのが良さ気な一方、ヘッダピンに都度挿すのもなんだからと予めジャンパワイヤを挿しておくとなると、やはり嵩張る。
結果、どれも一長一短で、もしかするとUNOをArudinoISPとするのが最もシンプルでスマートなのかもと思わなくもありません。
いや、待てよ、今までUSBポートを要する実装品を考えていなかったこともあり、小型かつUSBポートを持つNanoを使う機会がなかったのですが、こういうケースこそ、FTDIモジュール同様、Mini B用ながらUSBポートを標準で持つArduino Nanoを使うのがベストプラクティスか。。。1個これ用に買ってみよう。。。う、たかだか50円だが値上がりしてる。。。と言っても380円だけど。
Nanoを2個買ってやってみたのですが、どっちもデフォルトのBlinkは機能し、スケッチも書込み可能なことは確認済みも、なぜか、NanoをArduinoISPとして機能させることができませんでした。。。
あ、Nanoでも(当然ながら)ArduinoISPとすることができました。
購入した2個の内、1個はハンダ済み、もう1個は未ハンダで前者はピンヘッダが斜めにハンダ付けされブレッドボードに刺さらず、ジャンパワイヤで試行するも、後者ははんだせずにブレッドボードにピンヘッダを挿しNanoを載せただけだったから不安定だったのか、何れもスケッチのアップロードはできたものの、ArduinoISPとしては機能させることができなかったのですが、前者のピンヘッダを指で均してブレッドボードに挿して再度ArduinoISPとして使ってみたら、あっさりできました。(この時、10μFのコンデンサを追加したからかも。やっぱり5VだとUno/Pro Mini/Nanoに関わらず、これが必要な模様。)
というわけで作り置きしておくArduinoISPは、Nanoに決定。
常備しておくことにしたNano+ミニブレッドボード版ArduinoISPを100円ショップSeriaで買った『約100枚収納可能トレーディングカードケース』に収納してみました。
電源5V(赤)/GND(黒)/RST用D10(白)と橙/青/黃で11〜13のジャンパワイヤ計6本をケース外に出せるようにしてあります(当然、しまうこともできます)。
ただ、このケースArduinoISPだけを収めるには有り余る、複数つなげることも想定して凹凸のあるミニブレッドボードを長手方向に2個接続したら、このケースにピッタリだったので同じミニブレッドボードを使ったESP8266への書き込み簡易回路(FTDIモジュール+GPIO0ボタン+RST/Resetボタン+ジャンパワイヤのセット)も併設、図らずも何れの回路も同じ側にミニUSBポート用の穴を空けるに至り、フタにある突起は、ESP8266用回路のボタンスイッチ(内1個は飾りという名の失敗の名残)。
ブレッドボード自体は、元々付いている両面テープで貼っただけ、なんならグルーガンで補強してもよいかとも思っています。
とはいえ、2つまとめてみたところでArduinoISPも頻繁に使うものでもないし、Wifi自体のチャネル数や無線親機やアクセスポイントの対応端末数などもあって、そんなに次から次へとESP8266を買うわけでも、同じESP8266のスケッチをとっかえひっかえアップロードしまくるわけでもありませんが...。
前述の通り、同じことですが、ついでにUNOをArduinoISP、任意のスケッチをPro Miniと想定して配線した画像も添付しておきます。
何れにしても仮にスケッチ書き込み側の入力が3.3Vなら降圧レギュレータを使えばよいでしょう。(例えば、5V => 3.3V専用なら5個175円といった破格の降圧モジュールもあります。)
この3ピンから成るモジュールは完結明瞭でVCCに5V、そしてGNDをそれぞれつなぐだけでOUTに3.3V前後の出力を得ることができます。
気を取り直してというわけでArduinoISPとする方(今回はNano/Uno/Pro Mini+FTDIモジュール)にサンプルスケッチArduinoISP、他方のAVRマイコンやArduinoボード(今回はUNO)に任意のスケッチを書き込むまでの手順は以下の通り。
ちなみにマイコンやArduinoボードにブートローダが書き込まれていないのであれば、スケッチを書き込む以前にArduino IDEの[ツール]メニューから[ブートローダを書き込む]を選択してブートローダの書き込みをしておく必要があります。
マイコンは普通ブートローダは書き込まれていないはずなのでブートローダの書き込みは、たぶん必須、一方、Arduinoボード(上のマイコンに)はデフォルトで書き込まれているはずですが、もし、ブートローダを消してしまったなど何らかの事情で、これがない場合、ブートローダを書き込んでおかないと電源を入れてもマイコンやボードが起動しないため、スケッチを書き込むことができません。
今回、Blinkを書き込んでみたところ、ArduinoISPとしているPro MiniとUNOのLEDが同時に点滅していたため、一瞬失敗したか?と思いましたが、ジャンパワイヤを外して他のボードのアップロードを試してみるとPro MiniはArduinoISPのまま、実は、それまでArduinoISPスケッチを書き込んであって今回、Blinkを書き込んだUNOをLANケーブルでPCにつないだらLEDが点滅、というわけで成功していました。
ArduinoISPに限ったことではありませんが、スケッチの書き込みが終わったら、配線を外さないと(書き込み時と実行時には、それぞれ適切な配線にしないと)本来の機能はしない模様。(あれ、当たり前のこと言ってる!?)