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

【Arduino/ 小ネタ④】Arduinoのスケッチ書き込みが上手くいかない!シリアル通信(UART)で使われるTX/RX端子に何か接続されていませんか?

Arduinoはよく出来たマイコンボードです。
マイコンを使った電子工作初心者の方でも難しい知識が無くても比較的扱いやすく使えるように出来ています。
これまでArduinoに関するご質問等を多く頂き、特に多かったものに関してこちらのカテゴリにまとめています。

Arduinoにスケッチを書き込む時にコンパイルは問題なく出来るのにボードに書き込む際にエラーが発生するといったご質問は多く頂きました。

これはArduinoのシリアル通信(UART)でも使われるデジタル端子D0(RX)/D1(TX)に何かしらの回路が接続されているため起こるのが原因の大半だと思います。

そんな事で今回はArduinoのシリアル通信(UART)で使われているデジタル端子D0(RX)/D1(TX)端子についての話となります。

Arduinoのシリアル通信(UART)はTX/RX端子が使われている!

各種Arduinoボードには入出力端子としてデジタル入出力端子とアナログ入力端子が搭載されています。

そしてデジタル入出力端子を見ると、例えばArduino Unoではデジタル入出力端子として使えるのはD0~D13までの計14本使うことが出来ます。

このデジタル入出力端子にLEDを繋ぎ点灯や消灯させたりスイッチを繋ぎON/OFFの判定、またセンサーを繋げて信号のやり取りなどが行なえます。

MEMO
アナログ入力端子もデジタル入出力端子として使うことが出来ます。
【Arduino/ 小ネタ①】アナログ入力端子はデジタル入出力端子として使うことも出来ます!

そして大抵のArduinoボードのデジタル入出力端子のD0端子とD1端子にはRX/TXと書かれています。(ボードによってはRXD/TXDと書かれているものもありますが意味は同じです)
Arduino Unoではこの部分ですね。

TX/RXとはUART通信で使われる信号線となります。

送信:TX(Transmitter)
受信:RX(Receiver)

これらの端子は通常のデジタル端子として使う以外に、シリアル通信(UART)を行う用途でも使われるためArduinoのマイコンチップ(UnoではATmega328P)やUSB-シリアル変換チップ(UnoではATmega16U2)のTX/RXラインに直接繋がっています。

スケッチの書き込みの際にArduinoをUSBケーブルでPCと接続して行いますが、普段あまり意識することはないのですが実際にはこの端子を使って行われています。(内部的な話です)

また実行中のスケッチ内で使われている変数の値などをシリアルモニタに表示させデバッグ等で使用することがありますが、このシリアルモニタとのデータのやり取りもこの端子が使われています。

このようにArduinoのデジタル端子D0/D1は少し特殊と言いますか、UART通信をするためマイコンチップのTX/RX端子と直結していることを知っておく必要があります。

ArduinoのUART通信に関してはこちらの記事も参考にして下さい!

【Arduino入門編㉖】UARTシリアル通信の基礎知識!Arduino間でのデータのやり取りなどをやってみる!

冒頭でお話したコンパイルは上手くいくけどスケッチ書き込みの際にエラーが出てしまう。
この原因の多くは、D0端子またはD1端子に何かしらの回路が接続されている場合が多くなります。
D0/D1端子に接続された回路やセンサー、モジュールなどが影響し上手くUARTでのデータのやり取りが出来なくなっているためですね!

スケッチを一旦書き込んでしまうと基本的にArduinoのD0/D1端子は他のデジタル端子と同様に使うことが出来ます。
しかしスケッチの書き込みやシリアルモニタを使いたい場合などUART通信を行う用途でも使われる端子となるので極力空けておくのが望ましくなります。

どうしてもデジタル端子としてこのD0/D1端子が使いたい場合は、少し面倒となりますがスケッチ書き込みの時だけD0/D1端子に接続されている回路を一旦外し、スケッチ書き込み後もう一度接続するなどの対応が必要となります。

また逆にシリアル通信でD0/D1端子を使いたい場合もあります。
何かしらセンサーやモジュールなどを接続したい場合などです。

ArduinoはMegaのように多くのシリアル端子が使えるボードもありますが、Arduino Unoなど大抵のボードではマイコンチップと直結したハードウェアシリアル端子(RX/TX端子)はD0/D1の1系統しかありません。
そのため当然スケッチ書き込みの際にこの端子に繋がれているモジュールなどを同様に外して行う必要が出てきます。

これでは面倒になる場面も出てきます。
Arduinoには他の空いているデジタル端子を任意にRXやTX端子に割り当てることが出来るソフトウェアシリアル(SoftwareSerial)を使うことも出来ます。

ソフトウェア(ライブラリを使用)によりUART通信を可能にするもので、上記のように物理的にマイコンチップのTX/RX端子に接続されたハードウェアシリアルに対してソフトウェアシリアルと呼ばれるものとなります。
例えば空いているD2端子をRX、D3端子をTXに割り当てシリアル通信をするといった感じです。

マイコンチップのTX/RXラインと直結しているハードウェアシリアル端子となるD0(RX)/D1(TX)を使わず他のデジタル端子を使ってUART通信を行うというものです。

詳しくはこちらの記事も参考にして下さい!

【Arduino入門編㉘】ソフトウェアシリアルを使ってみる!

最後に!

Arduinoのスケッチ書き込み時に起こるトラブル、特にコンパイルは成功するのにボードに書き込む際にエラーが出てしまう・・・この原因の多くは、ArduinoのTX端子またはRX端子に何かしらの回路が繋がっていることが原因で起こることが多いと思います。

ArduinoボードのTX端子・RX端子(Arduino UnoではD0/D1端子)はArduinoのマイコンチップやUSB-シリアル変換チップの物理的なTX/RXラインとも直結しています。
そしてスケッチの書き込みやシリアルモニタを使う時にこれらの信号線が使われます。

普段あまり意識することはありませんが、この事を知っておくと今回のようなトラブルを回避することが出来ますね!


【これから始めるArduino】ELEGOO Arduinoスターターキットを比較!多くの作例を試せる『Arduinoスターターキット』からArduinoに触れてみるのはオススメです!

コメントを残す