umtkmの忘備録

【ISP】Arduino Pro MicroでArduinoにプログラムを書き込む

 Arduino Pro Micro (ATmega32u4搭載)を用いてISPで他のArduinoに書き込む方法を紹介します.ブートローダーの書き込みにも応用できるでしょう.

環境

  • macOS
  • Arduino IDE 1.8.4

用いるプログラム

 Arduino IDE に付属するサンプルプログラム”Arduino ISP”は,ProMicroの場合ピン番号の不一致のため動作しません.そこで,このプログラムを改変して”ArduinoProMicroISP”を作成しました.ISP機能に加え,printfデバッグ等のためのシリアル通信バイパス機能も追加してあります(後述).

https://github.com/umtkm/ArduinoProMicroISP

 git clone あるいは Download して手元に置いておいてください.README.mdには雑な使い方の説明が書かれています,それでわかるのならそちらを参照すれば良いでしょう.この記事では画像を交えてわかりやすく説明しようと思います.

Pro MicroのISP化

 まずはPro MicroとPCを,USBケーブルで接続します.次に,先ほど手元に落としてもらったものから,”ArduinoProMicroISP.ino”をArduino IDEで開いてください.書き込み用の設定は以下のようにします.

  • メニューバーの [ツール] > [ボード] で”Arduino Leonardo”を選択
  • メニューバーの [ツール] > [シリアルポート]でPro Microが接続されたポートを選択

通常通りPro Microに書き込みを行うときと特に変わりません.あとは,メニューバーの [スケッチ] > [マイコンボードに書き込む] (あるいは⌘U)を押して書き込みましょう.これでISP化は完了です.簡単ですね!

Pro MicroとターゲットのArduinoを接続する

 書き込みを行うには,当然ISP化したProMicroと書き込み対象のArduino(以下,ターゲット)を接続する必要があります.ISPでの書き込みですから,ターゲットのICSP端子(6ピン)と結線します.

出典1, 2

ProMicro ターゲット
VCC -> VCC
GND -> GND
16 -> MOSI
14 -> MISO
15 -> SCK
10 -> RST

また,ジャンパピン等を用いて,ProMicroの8番ピンと9番ピンを短絡(接続)してください.これは今回用いるプログラム”ArduinoProMicroISP”の独自仕様で,短絡した状態にするとISPによる書き込みが可能になります.

シリアル通信のバイパス機能を使いたい場合は次も結線してください.ProMicro側は固定ですが,ターゲット側はシリアル通信(UART)が使えるところなら自由に選択していただいて構いません.SoftwareSerialでもOKでしょう.

ProMicro ターゲット
TX (pin 1) -> RX
RX (pin 0) -> TX

これにて結線は完了です.

Pro MicroからターゲットのArduinoに書き込む

 さあ,準備は整いました.早速ターゲットに書き込みましょう! まずは

  1. PCとISP化したProMicroが接続されているか
  2. ProMicroとターゲットの接続が行われているか
  3. ジャンパピンで8番ピンと9番ピンを短絡したか

を確認しましょう.

 確認ができ,書き込みたいプログラムを開いたら,書き込み用の設定を次のように行います.

  • メニューバーの [ツール] > [ボード] でターゲットのボードを選択 (ex: Arduino Mega)
  • メニューバーの [ツール] > [シリアルポート] で Pro Microが接続されたポートを選択
  • メニューバーの [ツール] > [書込装置]“Arduino as ISP” を選択

こんな感じでしょうか.これができたら,メニューバーの [ツール] > [書込装置を使って書き込み] (または”shift+⌘+U”)で書き込みを行うことができます.通常の書き込みでは書き込むことができないので注意してください.

シリアル通信バイパス機能を使う

 普通のArduinoであれば何も考えずにPCとシリアル通信できますが,ISP経由で書き込む際にはそれができません.printfデバッグとかできないのは多分不便ですよね.そこで,今回公開したプログラムにはシリアル通信のバイパス機能をもたせました.デフォルトでは,115200 bps の速度で通信を行うことができます.

 この機能を有効化することは簡単です.8番ピンと9番ピンを短絡させているジャンパピンを取り除けば,バイパス機能が有効化されます.有効化すれば,普通のArduinoと同様にシリアルモニタでの受信/送信が可能となります.ジャンパピンを元に戻すと無効化され,再びターゲットに書き込みができるようになります.

バイパス機能のサンプル

 シリアル通信バイパス機能の簡単なデモです.Arduino Megaを用いてやってみましたが,多分UNOとかでもできます.シリアルモニタ上部から打ち込んだ文字が返ってくることが確認できます.

1
2
3
4
5
6
7
8
9
10
void setup() {
Serial.begin(115200);
}

void loop() {
if (Serial.available()) {
Serial.print("Detected: ");
Serial.println((char)Serial.read());
}
}

まとめ

 一度書き込みができさえすれば,以降はその手順で簡単に書き込んだり,シリアル通信を覗いたりできます.USB経由での書き込みが不可能な場合,この方法を試してみてください.