月刊I/O 2022年5月号『Raspberry Piで作る電子工作』に記事を掲載して頂きました!

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

Arduino Unoは、スケッチ(プログラム)を動かすマイコンチップとしてATmega328Pが使われていて、USBポートと接続しスケッチの書き込みなどシリアル通信を行うためのUSB-シリアル変換器としてATmega16U2チップも搭載されています。

また、5Vや3.3Vのレギュレーターなど電源関係のパーツも整っていて使いやすくよく出来たボードだと思います。

前回、Arduino Unoで使われているマイコンチップATmega328Pをブレッドボード上で回路を組みこのチップ単体でスケッチを動かしてみました。

【Arduino】ATmega328P単体でスケッチを動かしてみる!その① ブレッドボードでの接続&ブートローダーの書き込みなど

ATmega328Pにブートローダーが書き込まれていることが前提となりますが、ブートローダーやスケッチが書き込まれている場合、Arduinoとして動作させるには水晶振動子(16MHz)やコンデンサといった外部クロック用の少ないパーツの接続のみで動作させることが出来ました。
たったこれだけのパーツの接続のみでArduinoとして動かすことが出来るんですよね!

もちろんこの状態ではスケッチを動かすことが出来てもUSB-シリアル変換器が付いていないので新たにスケッチを書き込むことは出来ません。

前回、USB-シリアル変換モジュールを外部に繋ぎスケッチの書き込みを試みましたがどうも上手くいかなかったため、もう1台Arduinoを用意しそのボード経由でスケッチの書き込みを行いました。

これはあまりスマートな方法ではなかったので、今回は追記としてUSB-シリアル変換モジュールを使ってATmega328Pにスケッチの書き込みを行ってみたいと思います。

実はこの方法も私の知識不足のため上手くスケッチの書き込みが出来るようになるまでには非常に時間がかかりました。
備忘録として残しておきたいと思います。

USB-シリアル変換モジュールを使いATmega328PにArduinoスケッチを書き込む!

Arduino UnoやNano、Pro MiniなどのボードではAVRマイコンATmega328Pが使われています。

Arduino Uno Rev3の通常版では、このATmega328PはDIP-IC型となっておりICソケットに取り付けられているので簡単に取り外しこれ単体でArduinoとして動作させることが出来ます。

また、ATmega328Pはチップのみの販売も行われているのでArduino Unoの修理用として手元に持っておくのもよく、それを使って今回のようなテストをする事もできます。

【Arduino Uno】壊れたArduinoを修理する!マイコンチップATmega328Pの交換方法【壊れたArduinoの修復 その②】

ブレッドボードで回路を組む

少しパーツを用意する必要がありますが、接続は簡単です!

必要なパーツ

外部クロック用の水晶振動子(16MHz)と2本のセラミックコンデンサ(22pF)の接続のみでATmega328Pに書き込まれているArduinoスケッチを動かすことが出来ました。

こちらは前回組んだものですが、これだけでArduinoのスケッチが動いてくれます。

もちろんこれは、ATmega328Pにブートローダーやスケッチが事前に書き込まれていることが大前提となります。
Arduino Unoから取り外したATmega328Pチップを使う場合は、当然ブートローダーやスケッチが書き込まれた状態のものなのでこのように接続すれば動かすことが出来ます。

しかしATmega328PチップはArduino用途以外でも使われるので素の状態(空の状態)のチップも売られています。
この場合、まずブートローダーの書き込みを行う必要があります。

Arduinoブートローダーの書き込みやブレッドボードでの接続に関しては前回行ったのでこちらの記事を参考にして下さい。

【Arduino】ATmega328P単体でスケッチを動かしてみる!その① ブレッドボードでの接続&ブートローダーの書き込みなど
【壊れた?Arduinoボードの修理方法まとめ】ATmega328Pチップの交換、ブートローダーやATmega16U2ファームウェアの書き換えにより復活できる場合があります!

Arduinoブートローダーの役割

ATmega328PをArduinoとして動かすには、Arduinoブートローダーを書き込む必要があります。
スケッチの書き込みもこのブートローダーが書き込まれていないと行うことが出来ません。

そもそもブートローダーって何をしているのか?という話なんですが・・・
簡単にご説明しておきます。

ブートローダーを書き込むことによりArduinoとして機能しシリアル通信によりスケッチの書き込みなどを行えるようになります。
Arduinoブートローダーの役割は大きくこのようになります。

ブートローダーの役割
  1. 起動(リセット)時にシリアルポートを監視し、スケッチの書き込み要求があればそれを内部のEEPROMに書き込む
  2. スケッチの書き込み要求が一定時間なければ、すでに書き込まれているスケッチを実行する

電源投入時やリセットスイッチが押された時にArduinoボードに搭載されたLED(オンボードLED)が短く点滅しますが、あれがブートローダーが動いている時の動作ですね。

PC(Arduino IDE)からスケッチの書き込み要求があるとスケッチの書き込みが実行されますが、その要求がなければ既に書き込まれているスケッチを実行します。

Arduinoブートローダーが書き込まれていることにより、このような普段使っているArduinoとして動作させることが出来るということですね。

USB-シリアル変換モジュールを使いスケッチの書き込みを行う

ブートローダーが書き込まれたATmega328Pを使い前回ブレッドボード上で回路を組んで動かしてみました。
ここまでが前回の内容となります。

すでにスケッチが書き込まれたATmega328Pでは、少ないパーツのみの接続で動かすことが出来ます。
そして新たにスケッチを書き込みたい場合の話が今回の本題となります。

本来Arduino Unoでは、PCからスケッチの書き込みを行う際にボード上のATmega16U2チップがUSB-シリアル変換器として機能しているのでシリアル通信(UART)によりATmega328Pにスケッチの書き込みが出来るようになっています。

しかしブレッドボードに組んだこの状態では書き込むための装置がないため、前回はもう1台Arduinoを使いスケッチの書き込みを行いました。

しかしあまりスマートな方法ではないので、今回は外部にUSB-シリアル変換モジュールを繋ぎスケッチの書き込みを行ってみます。

USB-シリアル変換を行うためのモジュールはいろいろとあるようですが、手元にあった2つのモジュールで試してみました。

手動でリセットしてスケッチを書き込む

まず1つ目がこちらのモジュールを使ってみたいと思います。
Prolific社のPL2303というUSB-シリアル変換モジュールです。

接続端子は、3.3V/TXD/RXD/GND/5Vとなっています。

先述のようにスケッチの書き込みには、一旦ATmega328Pをリセットしブートローダーがスケッチを書き換え出来るようにするわけですが、DTR(データターミナル レディ)端子がないためスケッチの書き込みの際に手動でリセットさせる必要があります。

MEMO
PL2303チップにはDTRピンがあるようなので直接配線し引き出すことが出来るようですが・・・はんだ付けの難易度は高そうです!

タイミングよく手動でリセットさせればスケッチの書き込みは可能ですが、ちょっと面倒となります。

手動でリセットさせる必要があるので、タクトスイッチを取り付けました。
10kΩの抵抗を接続しプルアップさせているので、スイッチを押すとATmega328Pの1番ピン(RESET)がGNDレベルに落ちリセットさせることが出来ます。

その他の接続は簡単です。
USB-シリアル変換モジュールの5V/GND端子から電源を供給し、TXDをATmega328PのRXD(2番ピン)、RXDをTXD(3番ピン)に接続して完了です。
UARTの接続ですね。

ちなみにATmega328Pのピン配列はこのようになっています。(Arduino公式サイトより)

USB-シリアル変換モジュールATmega328P
5Vブレッドボードの5Vライン
GNDブレッドボードのGNDライン
TXDRXD(2番ピン)
RXDTXD(3番ピン)

 

スケッチの書き込みには上手くタイミングを合わせリセットスイッチを押す必要があります。

リセットスイッチを押した状態でArduino IDEからスケッチの書き込みを開始します。
アップロードが開始されるタイミングでリセットスイッチを離すと上手くタイミングが合えばスケッチの書き込みを行うことが出来ます。

毎回スケッチを書き込む際にこの手動リセットスイッチを押すのは正直面倒となります。

FT-232RQ USB-シリアル変換モジュールを使ってみる

次に別のモジュールを使ってスケッチの書き込みをやってみます。

こちらは秋月電子さんのFT-232RQ USB-シリアル変換モジュールとなります。
Arduino Pro Miniにスケッチを書き込む際にピンの配列が同じとなっていて接続が簡単なので使っているものです。

RTSピンがあるのでこれをATmega328Pのリセットピンに繋げれば、先程のような手動リセットの必要がなく上手くいくだろう・・・なんて思っていたのですが、これがどうにも上手くいかず・・・
そのため前回ご紹介できませんでした。

いろいろ調べてみると、どうやらリセットピンに0.1μFのコンデンサを挟む必要があるようです。

組んだ回路がこちらとなります。

先程の接続とほぼ同じですが(リセットスイッチは必要ないですが一応残しています)、USB-シリアル変換モジュールのRTS端子を0.1μFのコンデンサを挟んでATmega328Pのリセットピンに繋いでいます。

FT-232RQモジュールATmega328P
5Vブレッドボードの5Vライン
GNDブレッドボードのGNDライン
TXDRXD(2番ピン)
RXDTXD(3番ピン)
RTS0.1μFコンデンサ→RESETピン(1番ピン)

はじめはこのコンデンサを入れずにRTSからの信号を直接リセットピンに繋いでいましたが、上手くスケッチの書き込みが出来ませんでした。

Arduino公式サイトからArduino Uno Rev3の回路図を見てみると0.1μF(100nF)のコンデンサが入っています。

秋月電子さんのFT-232RQ USB-シリアル変換モジュールの接続例を見てもこのコンデンサが入っていました。

どうやらこのコンデンサがポイントのようですね!
リセットのタイミングに大きく関わっているようです。

単純にリセットピンをLOWに落とすだけでは上手くスケッチの書き込みが出来ないようですね。
「リセット」には再起動させることも含んでいるようです。

スケッチの書き込みの際にRTSピンがHIGHからLOWに落ちプルアップされたATmega328PのリセットピンがLOWに落ちリセットされます。
そこでブートローダーがシリアル通信(UART)によりTXD/RXDからの信号を読み取りスケッチを書き換える作業に入ります。
そして再起動させるためにリセットピンをHIGHにする必要があるためこのコンデンサが入れられているようですね。
コンデンサが充電されて5Vになった時点でリセットピンがHIGHに戻るということです。

理屈は分かりましたがあまりこのコンデンサについて解説されているサイトが見つからず、非常に手こずりました。

このコンデンサについて詳細に解説されているこちらのサイトを参考にさせて頂きました。

参考 Arduino互換機を作りたい(3)つしたねこのTinkering,Tinkering and Obliquity

また、このコンデンサが充電され5Vになった後でRTS端子が5V(HIGH)に戻ったら、リセットピンには5V+5Vの10Vがかかってしまう・・・上記サイトではこのことに関しても解説されています。

Arduino Unoの回路図を見るとプルアップ抵抗の横に1本ダイオードが入っていますが、そのためなんですね!
非常に参考になりました。

・・・ということで、上記のような接続で手動でリセットすることなく通常のArduinoボードのようにスケッチの書き込みが出来るようになりました。

最後に!

普段あまり意識することなくスケッチの書き込みや動作をさせていたArduinoボードに関して少し理解する事ができました。

ATmega328PはArduino Uno Rev3ではDIP-IC型となっており(通常版です)簡単に取り外しが出来るので、ブレッドボードで組んで今回のように動かしてみるのも面白く、また理解も深まるのでいいかと思います。

しかしながら、そのような知識がなくても動かすことが出来るように設計されているArduinoボードってやはり便利なマイコンボードですよね!

コメントを残す