11月25日発売 書籍『Arduinoと3Dプリンタでロボットを作ろう』を出させて頂きました!

【Arduino】USB-シリアル変換モジュール(USB-TTLコンバータ)からArduinoにスケッチを書き込む方法!

通常Arduinoはボードに付いているUSB端子をPCと接続してスケッチを書き込むことが出来ます。
またArduinoにはUSB端子が搭載されていないArduino Pro Miniなどの一部ボードもあります。

USB端子が付いていないArduinoボードではPCとシリアルでのやり取りを行うためのUSB-シリアル変換を行うためのチップが搭載されていないため、外付けでモジュールを接続してスケッチの書き込みを行う必要があります。

以前、壊れた?Arduinoボードを修理&修復する方法として以下記事をご紹介しました。
上手く機能(動作)しなくなったArduinoの原因がソフトウェア的な問題であれば、ブートローダーやUSB-シリアル変換を行うチップに書き込まれているファームウェアを新たに書き換えることによりArduinoを復活させることが出来る場合があります。

またArduinoの故障原因がハードウェア的な問題であれば、Arduinoのマイコンチップや電源系統のパーツを交換することにより直すことが出来る場合もあります。

【壊れた?Arduinoボードの修理方法まとめ】ATmega328Pチップの交換、ブートローダーやATmega16U2ファームウェアの書き換えにより復活できる場合があります!

上記記事にArduinoにUSB-シリアル変換モジュールを外付けで接続した時のスケッチ書き込み方法に関してご質問頂いたので追記記事としてご紹介します。

USB-シリアル変換モジュールを接続しArduinoにスケッチを直接書き込む方法!

Arduinoのボードには頭脳となるマイコンチップ(MCU)の他にスケッチの書き込みなどシリアルでのやり取りを行うためのUSB-シリアル変換チップが搭載されています。

Arduino UnoではMCUにATmega328P、そしてUSB-シリアル変換を行うもう一つのマイコンチップとしてATmega16U2が搭載されています。

このようにマイコンチップとUSB-シリアル変換を行うチップが繋がれているので、PCと接続してUSB端子からスケッチを書き込んだり、またシリアルモニタを使うといったシリアルでのやり取りが出来るようになっています。

そして冒頭でご紹介した記事でこのような質問を頂きました。

UNOのATmega16U2が壊れたみたいでファームウェアを書き換えても復旧しませんでした。
そこで外付けシリアル通信基盤を使おうと思いますが、DTR端子があるものを使う場合この端子はUNOのどの端子に接続したらよいのでしょうか。
リセット端子に接続したらよいのでしょうか?

私もこれまでArduinoを使っていて経験したことがありますが、USB-シリアル変換を行うチップの物理的な破損でUSB端子経由でのスケッチ書き込みが出来なくなってしまったというものです!

USB-シリアル変換を行うモジュールはマイコンを使った電子工作では必須アイテムとなり持っている方も多いと思います。

これらモジュールをArduinoに外部接続することにより、ボードに搭載されているシリアル変換チップを介すことなくスケッチの書き込みを行うことが出来ます。

USB-シリアル変換モジュールを外部接続してArduinoにスケッチを書き込む

USB-シリアル変換モジュールにはチップにCH340やFTDI232が使われたものなど様々なものが販売されています。
これらモジュールをArduinoに外部接続してスケッチを書き込むにはUARTでのやり取りとなります。
その接続や書き込み方法は簡単です!

基本的な接続はこのようになります。
UART(TX/RX)でのデータのやり取りとなるので、USB-シリアル変換モジュールのTX(またはTXD)/RX(またはRXD)端子をArduinoのRX(D0)/TX(D1)に接続する形となります。

Arduino Unoを例にすると接続はこのようになります。

USB-シリアル変換モジュールArduino
TX(TXD)D0(RX)
RX(RXD)D1(TX)
VCC5V
GNDGND

基本的な接続は上記のようになりますが、Arduinoへのスケッチの書き込みはブートローダーが関係してきます。

ブートローダーとは?

ブートローダーはArduinoのマイコンチップ、Arduino UnoならATmega328Pに書き込まれている小さなプログラムです。

通常Arduinoは電源投入時やリセット端子が押されるとブートローダーがまず動きます。
ブートローダーは一定期間(短い時間)UART(TX/RX)からデータが送られてきたかを確認します。

データが送られてきた場合、つまりスケッチを書き込むためのデータが送られてくるとATmega328Pに新たなスケッチを上書きする動作をします。
また一定期間UARTからのデータがなければ既に書き込まれているスケッチを実行します。

普段Arduinoを使っていてあまり意識することはありませんが、このような通常のArduinoの動作はブートローダーが行っています。

そして上記の接続です。
データのやり取り(TX/RX)ラインは問題ありませんが、上記の接続ではスケッチをコンパイルして書き込みに移る際にはブートローダーは一定期間経過しているので既に書き込まれているスケッチを実行するモードに移ってしまい書き込みエラーとなってしまいます。

そのため上記回路ではコンパイルが終わりスケッチを書き込む動作に移る際に手動でArduinoのリセットスイッチを押す必要が出てきます。
つまり書き込みに移る際に手動でリセットしてブートローダーを再度動かして書き込みモードにするということです。

実際にこれでスケッチの書き込みは出来ますが、手動でリセットするので上手くタイミングが合わないとブートローダーは既に書き込まれているスケッチを実行するモードに移ってしまい書き込みエラーとなることもあり面倒となります。

DTR(RTS)で自動リセットをかけてArduinoにスケッチを書き込む

ようやくですがここからが今回の本題、冒頭でご質問頂いた内容となります。

USB-シリアル変換モジュールには古いタイプのものには付いていないものもありますが、リセットをかけるためのDTRやRTS端子が付いているものがほとんどです。

この端子を使えば上記回路のように手動でリセットする必要がなく、Arduinoに外部接続したUSB-シリアル変換モジュールから自動でスケッチの書き込みが行なえるようになります。

上記回路をDTRまたはRTS端子を使った接続にするとこのようになります。
スケッチ書き込みの際に再度ブートローダーを動かす、つまりArduinoをリセットするための接続(DTR-RESET)を追加しています。

USB-シリアル変換モジュールArduino
TX(TXD)D0(RX)
RX(RXD)D1(TX)
DTR—0.1μF—RESET
VCC5V
GNDGND

ここでDTR端子-ArduinoのRESET端子間には0.1μFのコンデンサを入れています。
このコンデンサは非常に重要な役割をしています。

MEMO
このコンデンサがないとリセットのタイミングが合わず書き込みエラーとなります!

以前このコンデンサに関して少し検証した事があります。
詳しくはこちらの記事も見て頂ければと思います。

【Arduino】ATmega328P単体でスケッチを動かしてみる!その② USB-シリアル変換モジュールを使ってスケッチを書き込む!

全てのArduinoボードのリセット端子とシリアル変換チップとの間にはこのコンデンサが入っています。
例えばArduino Nanoではこの部分です。

今回外部接続したUSB-シリアル変換モジュールを使っているのでこのコンデンサも外付けで必要となってきます!

ちなみに、USB-シリアル変換チップが搭載されていないArduino Pro Miniでは今回の方法でスケッチを書き込む必要があります。
Pro Miniではボードの書き込み用端子のDTR端子直前にこのコンデンサがボードに搭載されているので直結で問題ないということになります。

書き込む際のボード設定

上記Arduino Unoの接続例でのArduino IDEの書き込み設定はこのようになります。

[ボード]Arduino Uno
[シリアルポート]接続しているUSB-シリアル変換モジュールを選択

Lチカスケッチを書き込みオンボードLEDが1秒間隔で点滅すれば成功です!

最後に!

外部接続したUSB-シリアル変換モジュールからのスケッチ書き込みに関してご質問を頂いたのでこちらの記事の追記的な内容として書いてみました。

物理的なチップの破損によりシリアルでのやり取りが出来なくなったArduinoボードでも外付けでモジュールを接続することによりスケッチの書き込み等を行えるようになります。

あまり使われる方法ではない?かもしれませんが、理屈が分かるとオリジナルのArduinoボードを作る際など何かと応用も出来ると思います。

4 COMMENTS

kiyosan

お騒がせしてすみません。書き込みできない原因が判明しました。
ATmega16U2が故障しているから書き込みができないであろうことまでは
分かっていました。しかし、16U2のファームウェアの書き換えはできて
いたのでちょっと不思議でした。
書き込みできない原因は16U2のリセット信号が出っぱなしでした。
テスターで測定すると書き込み時5ボルトから0ボルトに落ちたままでした。
どのようにしようかと回路図と本体をにらめっこをしばらくしてC5のコンデンサ
を取り外してリセット信号を遮断しまして、フレッドボードにコンデンサを
設置して動作テストを行いましたが書き込みはされませんでした。
ここのサイトの回路図に10Kのプルアップ抵抗が入っているのを見つけて
プルアップ抵抗を挿して書き込みテストをしましたところうまく書き込み
できるようになりました。本当にありがとうございました。
ここのサイトの記事説明がなければ諦めていたところでした。
良い勉強になりました。

返信する
東京バード

上手く書き込めたようでなによりです(^o^)

プルアップ抵抗はボードのリセット端子に付いたものを生かしコンデンサだけ外付けでという考えでしたが・・・なるほど、そういうパターンだったんですね!
逆に勉強させて頂きました。

ちなみに完全に16U2チップの破損?で復活しなかったUnoが1台あったのですが、最近ヒートガンを導入したのでチップ単体で購入し取り替えて復活させることが出来ました。
16U2単体だと互換ボードとあまり変わらない単価となりコスパは悪かったですが・・・

詳細なご報告、ありがとうございました。
こちらこそ勉強させて頂きましたm(_ _)m

返信する
kiyosan

以前質問をしたものです。arduino uno の16U2が故障したとのコメントです。
CH340Cのシリアル変換基盤を手に入れてDTR出力にコンデンサを挿入して
書き込みができるかテストをしましたが書き込みできませんでした。
UNO本体のリセットスイッチをコンパイル終了時に押すと書き込みができます。
FT232RL基板でもおこないましたが書き込みできませんでした。
一つ質問があります。上記ポート設定で”/dev/cu———-“となっていますが
これはどのように設定したらよいのでしょうか。また、どこの情報でしょうか。
通常はCOM3とかだと思うのですけど。
いきずまってしまって次に何をしたらよいのやら。上記でつかっているシリアル変換
基盤を購入してテストをしてみるかなと思っています。

返信する
東京バード

なぜでしょうかね?
今自作Arduinoを作ろうとしていて手元にあるCH340EやCH340C、FT232RLを使ったモジュールなどを試してみましたが特に問題なく書き込めるようです。
またCH340CやCH340Eチップを使い単体で同様の回路を組んで書き込みを試してみましたが、どれも上手くいくようでした。

自分の環境では書き込めないという再現が出来ないのでなんともなんですが・・・・
ATmega328PのデータシートによるとRESET端子は2.5μS以上LOWになるとリセットが働くみたいです。
簡易オシロでリセット端子の電位を見てみましたが、DTR端子がLOWに落ちた瞬間RESET端子もLOWになり4mSほどでHIGHに戻り上手くリセットされているようです。
手動リセットでは問題ないということなのでコンデンサの容量を少し変えて試してみるのも手かと。

ちなみにポートの表示はMacだと上記のように表示され、WindowsだとCOMポートが出て表示が違うだけなので問題ないですよ。

返信する

kiyosan へ返信する コメントをキャンセル