UARTによるデータ通信で気をつけることについて調べてみたので整理しました。
UARTとは
UART – Wikipediaによると、UART (Universal Asynchronous Receiver Transmitter) は「調歩同期方式によるシリアル信号をパラレル信号に変換したり、その逆方向の変換を行うための集積回路」のことだとあります。USART (Universal Synchronous Asynchronous Receiver Transmitter) は「UARTに、同期方式のシリアル信号を変換するための回路を追加したもの」だということで、どちらも集積回路で、マイコン間のデータ通信などに利用されていることがわかります。
USARTは同期方式の回路をUARTへ追加したものなので、UARTとしても利用することができます。どのように利用するかは、初期設定時にどのように動作するかを指定するので、そこで決めることができます。
最初はPICの専門書籍などを読んでみていたのですが、UARTやUSARTについては知っているという前提での説明でわかりにくかったので、インターネット上で良い資料を探してみたところ、「電子工作の知恵袋 > 通信規格 > UART その1 基本」がまとまっていて、わかりやすかったです。
電圧が一致していないマイコン間の接続
ここで、3.3Vで動くPICマイコンのUARTと5Vで動くArduino UNOのUARTとを直接ジャンパーなどで接続してデータ通信をさせると、信号の電圧が一致していないため問題が起きます。こういった電圧が一致していないマイコン間やデバイスと接続するには、2つの方法があるそうです。
- ロジックレベル変換モジュールを組み込む
- それぞれのUARTを一度共通の規格(RS-232Cなど)に対応させてから接続
電圧レベルの差を吸収するロジックレベル変換モジュールを通信するマイコンの間に組み込んで接続させることができますし、共通の規格に対応させても接続させることができます。
マイコン間がつながれば良いだけならロジックレベル変換モジュールを採用、汎用性を高くするならPCなどにも接続可能なRS-232Cインタフェースを採用とするのが良さそうです。
ロジックレベル変換モジュール(レベルシフト回路)
色々調べてみたところ、電圧差を吸収するための変換モジュールというのがあって、ロジックレベル変換モジュールと呼ばれています。レベルシフト回路を自分で実装しなくても、これを入手して利用するのが楽そうです。レベルシフト回路については「レベルシフト回路(level shifting circuit)とは: 半導体・電子部品の用語検索 - ELISNET –」が参考になります。
- 8ビット双方向ロジックレベル変換モジュール: 半導体 秋月電子通商 電子部品
- TXB0108搭載8CH双方向ロジックレベルコンバータ – スイッチサイエンス:
- TXB0104搭載4CH双方向レベルコンバータ – スイッチサイエンス
- Logic Level Converter Bi-Directional – BOB-12009 – SparkFun Electronics:
RS-232C
RS-232CはRS-232 – Wikipediaによると「RS-232 (Recommended Standard 232) は、シリアルポートのインターフェース規格」のひとつだということです。Cはバージョンです。
使用する電圧が決まっているのと、普及していて採用しているデバイスや対応しているデバイスが数多くあります。PCでも対応しているので、資料もたくさんありそうです。
回路としては、UARTを持つマイコンにはMAX232互換のICを使ってRS-232Cインタフェースを実現する事が多いようです。少し調べると、いろいろと出てきます。UARTによるデータ通信はノイズに弱いのでデバイス間をつなぐケーブルの距離は短い方が良いのですが、RS-232Cはノイズに強いので10メートル程度まで大丈夫だということです。
下記などを使えば良さそうです。
- ADM3202 3V・3.3V・5V系-RS232レベル変換基板: 半導体 秋月電子通商 電子部品
- MAX3232 Breakout – BOB-11189 – SparkFun Electronics
USBシリアル変換
さて、最近はRS-232CはノートPCでは使われなくなってきていて、USBの方が人気が高く、ケーブルなども入手が簡単です。USBは使えないのでしょうか。USBについては、ユニバーサル・シリアル・バス – Wikipediaを調べると、「コンピュータ等の情報機器に周辺機器を接続するためのシリアルバス規格の1つ」だということで、こちらも利用できそうな感じはあります。ただ、マイコン間のUARTをUSBで接続する例(両方のUARTへUSBシリアル変換をつけて、USB経由で接続する)というのは、見かけませんでした。
とはいえ、USBホストとなるものがある場合は、手軽に使えるはずです。たとえば、PCならUSBホストになるので、USBシリアル変換をすればマイコンのUARTへ接続できます。これでシリアル通信のデバッグができるはずです。自作プログラムで手元ではまだ試していませんが、例えば、Raspberry PiではUSBシリアル変換モジュール(FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き) – スイッチサイエンス)やUSBシリアル変換ケーブル(FTDI USB・シリアル変換ケーブル(3.3V): 電子工作便利商品 秋月電子通商 電子部品 ネット通販)を使って、UARTのピン(RXD:GPIO15とTXD:GPIO14)へLinuxマシンなどを接続してscreenコマンドを使うとシリアルコンソールが利用できます。同様のことが他のデバイスでも可能だと考えています。
なお、Raspberry Piではデフォルトでは、これらのピンはシリアルコンソールとして利用できるように設定されているので、自作プログラムで利用したい場合はHow to use GPIOs on raspberry pi (Simple I/O, PWM and UART) – Semillero: Advanced Digital Technologies – UPB Bucaramanga, Colombiaを参考にして、/boot/cmdline.txtと/etc/inittabを編集する必要があります。
マイコン側につけてしまう場合は下記あたりを用意すれば良いはず。マイコン側の電圧レベルに合っているものが必要なので、そのあたりは確認が必要でしょう。
「怪しいけどベンリなUSB-シリアル変換ツール | mixture-art@Q」も参考になります。
ちなみに本稿の内容とは関係ないのですが、USB-シリアル変換ツールの3.3Vピンは使わないからArduinoのリセット用ピンにしてしまうという記事もあるそうです(Using PL2303 based USB to TTL converter with Arduino | Kaushlesh Chandel)。いろいろ理解してくると、こういったこともできるようになるのですね。
USB周りはもう少し調べてみるつもりです。
その他の参考URL
下記も参考にしました。
- PIC AVR 工作室別館 ”arduinoの館 - 標準機能 シリアル入出力”
- Raspberry PiからArduinoを制御する(シリアル通信,I2C通信) – Programming Log
- Raspberry Pi and Arduino Connected Over Serial GPIO – OscarLiang.net
- Raspberry Pi でシリアル通信 Chick Lab
- Code and Life – Raspberry Pi as Arduino HDMI Shield:
- Code and Life – Raspberry Pi Serial Console With MAX3232CPE
その他
I2Cでも同じように電圧レベルには気をつけないといけないので、下記のようなモジュールがありますね。