PR
スポンサーリンク

【初心者】UARTとは?仕様や仕組みをわかりやすく解説!

サムネ:UARTとは?仕様や仕組みをわかりやすく解説!

皆さんこんにちは!メカ旦那です。

電子工作やマイコンでよく聞く「UART(ユーアート)」。
シリアル通信の一種で、配線数の少なさやアドレス設定が不要という特長があり、様々なセンサに利用されている規格です。

奥が深いですが、イラストを用いてわかりやすく解説します!

伝送方式

種類

通信方式は多種多様に存在し、色々な区分けがありますが、データの伝送方式に着目すると、以下に分ける事ができます。

通信の種類:UART(ユーアート)は「デジタル、シリアル、非同期、全二重、シングルエンド、主従関係なし、1対1」の特徴をもつ通信です。

UART(ユーアート)は「デジタル、シリアル、非同期、全二重、シングルエンド、主従関係なし、1対1」の特徴をもつ通信です。

よくわかりませんね、、、一つずつ解説します!

アナログ / デジタル

アナログとデジタルの違い:アナログは連続的な値を取りますが、デジタルは0と1の2値を用います。UARTはデジタルになります。

アナログは連続的な値を取りますが、デジタルは0と1の2値を用います。電話やラジオはアナログ通信が多いですが、PC、マイコン通信だとデジタルが主流となり、UARTもデジタルになります。

パラレル / シリアル

パラレルとシリアルの違い:デジタルは0か1を多数のbitで送受信しますが、パラレルは複数の信号線でまとめて通信します。対して、シリアルは1本の信号線を用いて通信します。UARTはシリアル通信です。

デジタルは0か1を多数のbitで送受信しますが、パラレルは複数の信号線でまとめて通信します。対して、シリアルは1本の信号線を用いて通信します。その為、配線数が少なくて済むのが特長です。例としてパラレルはプリンター、シリアルはマウスやキーボードで利用されています。

一見、パラレル通信の方が一度に多くのデータを送信でき効率的に思えますが、配線が長くなると、各信号の時間ズレが発生し、上手く送受信できないことがあります。その為、最近の高速通信ではシリアルが主流になっています。UARTもシリアル通信です。

クロック同期 / 非同期

クロック同期と非同期の違い:デバイス間で送受信する際、いつ送るのか、いつ受け取るのか、といったタイミング(クロック)を両者で認識する必要があります。クロックが共有されている状態はクロック同期と呼ばれています。対して、共有はされていませんが、各々独自のクロックを持って通信することを非同期(調歩同期)と言います。UARTは非同期通信です。

デバイス間で送受信する際、いつ送るのか、いつ受け取るのか、といったタイミング(クロック)を両者で認識する必要があります。クロックが共有されている状態はクロック同期と呼ばれています。対して、共有はされていませんが、各々独自のクロックを持って通信することを非同期(調歩同期)と言います。イメージは、クロック同期が同じ壁掛け時計を見ながら通信、非同期はそれぞれの腕時計を見ながら通信、ですかね。

同期通信はクロックが共有されているため、送受信にズレが生じないです。一方、非同期はクロック専用の信号線が不要なため配線数を少なくできるのが特長です。UARTは非同期通信になります。

全二重 / 半二重

半二重と全二重の違い:データを送受信する際、2本の伝送路で別々に行う方式を全二重通信(フルデュプレックス)と呼びます。対して、1本でまとめて行う方式を半二重通信(ハーフデュプレックス)と言います。UARTは全二重になります。

データを送受信する際、2本の伝送路で別々に行う方式を全二重通信(フルデュプレックス)と呼びます。対して、1本でまとめて行う方式を半二重通信(ハーフデュプレックス)と言います。全二重は送受信を同時に行うことができるのに対し、半二重は同時に行えません。ただし信号線が1本で済むのがメリットです。UARTは全二重になります。

シングルエンド/ 差動

シングルエンドと差動:先ほどデジタル通信で「0と1の2値を用いる」と説明しましたが、何を0とするのか、1とするのかの基準があります。信号電圧が、ある基準電圧より低い状態を0、高い状態を1とする方式をシングルエンド(不平衡) と呼びます。対して、信号が2つあり、電圧の差分から0,1を判別する方式を差動(平衡)と言います。UARTはシングルエンドになります。 

先ほどデジタル通信で「0と1の2値を用いる」と説明しましたが、何を0とするのか、1とするのかの基準があります。信号電圧が、ある基準電圧より低い状態を0、高い状態を1とする方式をシングルエンド(不平衡) と呼びます。対して、信号が2つあり、電圧の差分から0,1を判別する方式を差動(平衡)と言います。

シングルエンドは信号線が1本で済むメリットがありますが、ノイズが入った時に0を1(もしくはその逆)と誤認識してしまう恐れがあります。対して差動信号は信号線は2本いるものの、電圧差を見ている関係上、ノイズによる影響が少ないメリットがあります。UARTはシングルエンドになります。 

主従関係

シリアル通信は半二重のように1本の伝送路を複数の機器で共有することがあり、「どこがいつ何のデータを送るのか」を決めないとデータ衝突(同時送信)が発生します。このルールは主従関係と呼ばれており、優先権を持つデバイス(主)をマスター、それに応じるデバイス(従)をスレーブと呼びます。具体的には、

  • マスターが通信の開始・クロック・アドレス指定を実施
  • スレーブは命令を受けて応答

します。

UARTは主従関係がありませんので、特にマスター/スレーブを決める必要はありません。

リレーション

リレーション:ユニキャスト(1対1)、マルチキャスト(1対多)、ブロードキャスト(1対多)、マルチマスター/マルチドロップ(多対多)が存在。

通信方式によって送受信できるデバイス数をリレーションと言います。

  • ユニキャスト:1対1
  • マルチキャスト:1対多(複数)
  • ブロードキャスト:1対多(全数)
  • マルチマスター:多対多

UARTユニキャストになります。

配線

メカ坊や
メカ坊や

なるほど、伝送方式の特徴はなんとなくわかったよ。で、使うにはどうやって配線すればいいの?

メカ旦那
メカ旦那

そうですね、実際の配線イメージと注意点について解説します。 

UARTの配線図:ポイントは「信号線はTx/Rxの2種類、プルアップ抵抗は不要、GNDを合わせる」です。  

配線図はこちらです。 ポイントは「信号線はTx/Rxの2種類、プルアップ抵抗は不要、GNDを合わせる」です。  

信号端子(Tx、Rx)

UARTの信号端子:信号端子はTx/Rxの2つか、RTS/CTSを加えた4つを使います。

信号端子はTx/Rxの2つか、RTS/CTSを加えた4つを使います。 それぞれの特徴は以下です。

  • Tx(Transmit、TxD):送信側の出力端子です。受信側のRxと接続します。
  • Rx(Receive、RxD):受信側の入力端子です。送信側のTxと接続します。
  • RTS(Request To Send):ハードウェアフロー制御で使う端子です。バッファの空き状況に応じて、受信側より送信許可を出します。送信側のCTSと接続します。
  • CTS(Claer To Send):ハードウェアフロー制御で使う端子です。受信側より出力された送信許可を受け取るための端子です。受信側のRTSと接続します。

UARTは前述の通り全二重方式の為、出力と入力で線が分かれています。
また、送信側のTxと受信側のRxを繋ぐクロス配線になるので、間違えないよう注意が必要です。

ハードウェアフロー制御で使うRTS、CTSについては、後ほど解説します。

プルアップ抵抗は不要

プルアップ抵抗:UARTはプッシュプルになります。つまり0(LOW)も1(HIGH)も出力できますので、プルアップ抵抗を接続する必要はありません。 

一般的にマイコンやICから信号出力する際、プッシュプル、オープンドレイン(コレクタ)の2種類があります。UARTはプッシュプルになります。つまり0(LOW)も1(HIGH)も出力できますので、プルアップ抵抗を接続する必要はありません。 

プッシュプル、オープンドレインは下記記事でも解説していますので、気になる方はぜひご覧ください。

GNDを合わせる

前述の通り、シングルエンドは信号電圧によって0、1が決まります。ここで重要なのが、接続される全デバイスのGND電位を合わせる事です。 電位が合ってない場合、例えばマスターから0を送っても、スレーブでは不安定領域の電圧で1と誤認識されることがあります。 その為それぞれで電源が異なるなどGND電位が合っていない場合、必ずGND間を配線するようにしてください。

GNDを合わせる:接続される全デバイスのGND電位を合わせる事が重要です。それぞれで電源が異なるなどGND電位が合っていない場合、必ずGND間を配線するようにしてください。

マイコンのUART端子

先ほどの配線について、ハード側に機能が無いとそもそも使う事ができません。そこで、よく使われるマイコン/コンピュータのUART用端子について解説します。

Arduino Uno

Arduino Uno:Arduino UnoはD1にTX,0にRXが割り当てられています。

Arduino UnoはD1にTX,0にRXが割り当てられています。

Raspberry Pi A+, B+, 2, 3, 4, 5

Raspberry Pi A+, B+, 2, 3, 4:一般的なラズパイ(Raspberry Pi A+, B+, 2, 3, 4, 5)はGPIO14にTxD、15にRxDが割り当てられています。

一般的なラズパイ(Raspberry Pi A+, B+, 2, 3, 4, 5)はGPIO14にTxD、15にRxDが割り当てられています。

Raspberry Pi Pico 1, 2, W

Raspberry Pi Pico 1, 2, W:ラズパイピコは他のマイコンと比較し、多数の端子にUARTが割り当てられています。更にUART0,1の2つの独立した系統があるため、2つのUARTバスを形成する事ができます。

ラズパイピコは他のマイコンと比較し、多数の端子にUARTが割り当てられています。
更にUART0,1の独立した系統があるため、2つのUARTバスを形成する事ができます。

  • UART0
    • TX:GP0,12,16
    • RX:GP1,13,17
  • UART1
    • TX:GP4,8
    • RX:GP5,9

通信方式

続いてどんなデータ、流れで通信が行われるのか解説します!

フレーム構成

UARTはフレーム単位で送受信が行われます。フレームはスタート、データ、パリティ、ストップで構成されています。

フレーム構成:UARTはフレーム単位で送受信が行われます。フレームはスタート、データ、パリティ、ストップで構成されています。
  • スタート
    • フレーム送信開始の合図です。開始前は送信側でHighになっていますが、開始時に1ビット分Lowにします。
  • データ
    • 実際に送るデータです。基本は8ビットですが、7、9の場合もあります。
  • パリティ
    • 送信中にビット化け(1→0や0→1)した時など、何らかの原因で誤送信が発生した場合に、その誤りを検出するためのビットです。
    • パリティは、偶数、奇数の2種類あります。
      • 偶数パリティ:データとパリティで1の数が偶数になるように送信側でビットを付与
      • 奇数パリティ:データとパリティで1の数が奇数となるように送信側でビットを付与
      • 例えば偶数パリティを設定していたのに、受信側で1の数が奇数だった場合、誤検知として見なします。下図がイメージです。
    • 後述の設定で、パリティなし、偶数パリティ、奇数パリティの中から選択できます(パリティなしでも通信は可能です)
  • ストップ
    • 送信側から通信終了を通知するためのビットです。1フレーム送信後に1(High)にします。
パリティビットの役割:送信中にビット化け(1→0や0→1)した時など、何らかの原因で誤送信が発生した場合に、その誤りを検出するためのビットです。

フロー制御

先ほどのフレームを送り合う事で通信しますが、送信開始、終了のタイミングを制御する場合もあります。フロー制御なし、ソフトウェアフロー制御、ハードウェアフロー制御の3つがあります。

  • フロー制御なし
    • データ量が少なく、通信速度も低い場合(9600〜115200bps程度)、フロー制御は無くても問題ありません。多くのマイコンはデフォルトでこちらになっています。
    • ただしデータ量が増えると、受信側のバッファオーバーフロー(メモリへの過剰書き込み)が発生し、データ欠落の恐れがあります。
  • ソフトウェアフロー制御
    • 受信側でバッファに空きができたらTxでXon(0x11)というフレームを出力し通信開始を通知します。逆にバッファがほぼ満杯になったらXoff(0x13)を出力し通信を終了させます。つまり先ほどのバッファオーバーを防ぐことが可能です。
    • ただし、Xon/Xoffは言わばオーバーヘッド(本来送りたいデータとは別に発生する間接的なもの)の為、データ送信量が限られます。またXoffは1バイト分のデータ量があるため、受信してから停止処理を行うまでに、数ビット分のデータが既に送信される恐れがあり、最悪バッファオーバーが発生します。
    • これらの欠点があるためソフトウェアフロー制御でも低速・少量データに限られます。
  • ハードウェアフロー制御
    • Tx、Rxの他にRTS、CTSを加えた4本で通信を行います。
    • 受信側のバッファに空きができたらRTS=0を出力し、送信許可を出します。バッファがほぼ満杯になったらRTS=1を出力し、送信停止信号を出します。
    • 専用の信号線で開始/停止制御を行う為オーバーヘッドが無く、本来送りたいデータ量を多くすることができます。またRTS/CTSで送信するのは1ビットのみの為、受信してから即座に停止処理を行う事ができ、バッファオーバーの恐れもありません。
    • ゆえに、ソフトウェアフロー制御より高速・大量データ通信が可能です。
ソフトウェアフロー制御:受信側でバッファに空きができたらTxでXon(0x11)というフレームを出力し通信開始を通知します。逆にバッファがほぼ満杯になったらXoff(0x13)を出力し通信を終了させます。つまり先ほどのバッファオーバーを防ぐことが可能です。
ハードウェアフロー制御:受信側のバッファに空きができたらRTS=0を出力し、送信許可を出します。バッファがほぼ満杯になったらRTS=1を出力し、送信停止信号を出します。

設定

UARTの通信設定は送信側、受信側で同じにする必要があります。先ほど説明したフレーム、フロー制御と、通信速度であるボーレートについてです。

送信側/受信側で合わせる設定
  • ボーレート
    • 1秒当たりのビット数(bps)になります。9600、115200bps等があります。
  • データビット数
    • フレーム内のデータのビット数になります。一般的には8bitですが、7bitもあります。
  • パリティ
    • フレーム内のパリティ有無についてです。パリティなし、偶数パリティ、奇数パリティの中から選択できます(パリティなしでも通信は可能です)
  • ストップビット数
    • 通信終了の合図ですが、1bitまたは2bitで選択できます。
  • フロー制御
    • フロー制御なし、ソフトウェアフロー制御、ハードウェアフロー制御の中から選択できます。

設定は、マイコンならプログラムで、コンピュータならGUIやコマンドで行います。
表記は例えばボーレート:9600 bps、データビット:8 bit、パリティ:なし、ストップビット:1 bit、フロー制御:なしの場合、「9600 8N1」と記載します。Nはパリティなし(None)の意味です。

UART、SPI、I2Cの違い

UARTとよく比較されるシリアル通信として、SPI、I2Cがあります。どれも多くのマイコンに付いている為、違いを知っておくことで使い分ける事ができます。表にまとめてみました。

項目UARTSPII2C
クロック同期/非同期非同期同期同期
全二重/半二重全二重全二重半二重
リレーション1対11対多1対多
配線本数
 (GNDは含めない)
2~4本
(Tx,Rx,RTS,CTS)
3本+スレーブ数分のCS
(SCLK, MOSI, MISO, CS)
2本
(SCL, SDA)
通信相手の特定不要CSで特定スレーブアドレスで特定
通信速度 [bps]中速
(9.6k~1M)
高速
(1M〜10M)
中速
(100k〜3.4M)
IO出力プッシュプルプッシュプルオープンドレイン
端子接続クロスストレートストレート
プルアップ抵抗不要不要必要
長距離配線強い
(~数百m)
弱い
(~1m)
弱い
(~0.5m)
1フレーム長さの基準設定
(データビット数)
クロック停止プロトコルで規定
(8bit+ACK/NACK)
メカ坊や
メカ坊や

なるほど、全然違いますね。でも結局どの場面でどれを使えばいいんですかね?。。。

メカ旦那
メカ旦那

基本的には接続するセンサ・モジュールがどれか1つに対応しているのでそれを使えばよいです。ただこれらはマイコン通信でよく出てくるので混同しやすい為、違いを知っておくことで配線ミスや通信不具合を防ぐことができます!SPI、I2Cはこちらでも詳しく解説していますので、ぜひご覧ください!

まとめ

UARTの特徴をまとめると、以下になります。

  • データの伝送方式:デジタル、シリアル、非同期、全二重、シングルエンド、1対1
  • 配線:端子はTx/Rxの2種類、プルアップ抵抗は不要、GNDを合わせる
  • 通信設定:両方のデバイスで同じにする必要がある(ボーレート、フレーム内容、フロー制御)

UARTは多くのマイコン、センサに搭載されているので、参考になれば幸いです!

また他のシリアル通信についても解説しているのでぜひご覧ください!

メカ旦那

旧帝大工学部を卒業後、生産設備や産業用ロボットを対象とした電気制御設計職をしています。電験三種も保持しています。電気・電子・制御・通信について初心者向けにやさしく解説します!

メカ旦那をフォローする
通信
スポンサーリンク

コメント