はじめに
太陽光発電所や、蓄電所、住宅に設置されるエッジデバイスの組み込みエンジニアとして働く中で、
文脈から何を話しているかはわかるが、他者に説明すると考えた際に理解しきれていないテーマがたくさんあることに気づきました。
それらを自分の血肉にするために記事に落としてみたいと思います。
今後も業務上必要となった技術や、記事を書くタイミングでの心の赴くままに
組み込み開発に何らかの形で関連するものを勉強して発信していきたいと考えています。
初回はシリアル通信に関してです。
仕様書や現場の会話で「RS-485」「RS-232C」「UART」「I2C」といった通信規格の用語が飛び交います。
「出力形式はRS-485で、デバッグポートはUARTで通信」などと言われた際、それぞれの違いや役割が曖昧になりがちだったので、改めて基本的な概念を整理してみました。
シリアル通信とパラレル通信の違い
通信の前提として、コンピュータは電圧の変化(High/Low)を「1」と「0」として情報を伝達します。
わざわざシリアル(=直列な)通信と名付けられている以上、「並列な」通信もあるはずです。
「並列な」通信はどういったものか、「直列な」通信とはどういった違いがあるのかから始めたいと思います。
パラレル通信
パラレル通信といわれている通信が、シリアル通信と対になる概念です。
これは複数の通信線を使い、横に並べて同時にデータを送る方式を指します。
- 特徴: 1クロックあたりに送れるデータ量が多く、理論上は高速です。(CPU内部やメモリとの通信などでは現在も主流です)
- 弱点: 通信が高速化すると、複数の線を通る信号の到着タイミングにわずかなズレ(スキュー)が生じやすくなります。また、長距離になるほど配線コストやノイズの影響を受けやすくなります。
シリアル通信
1本の通信線(または1対の線)を使い、データを1ビットずつ直列(連続)に送る方式です。
- 特徴: スキューの問題が発生しにくく、配線がシンプルで済みます。現代では技術の進歩によりシリアル通信でも十分な高速化が可能になったため、外部機器との通信の主流となっています。
パラレル通信 vs シリアル通信
| パラレル通信 | シリアル通信 | |
|---|---|---|
| 特徴 | クロック周波数あたりの伝送量が大きい | 接続がシンプル ノイズに比較的強い 長距離伝送可能なものもある |
| 弱点 | 周波数が高まると、経路差により正しく伝送できない(スキュー) ノイズの影響を受けやすい |
クロック周波数あたりの伝送量が小さい |
| ユースケース | クロック周波数が低かった際の機器間通信 CPU内部等伝送距離が短く高速通信が求められる通信 |
ノイズの影響がある現場での通信 長距離通信が必要な環境 |
パラレル通信はCPUなどのクロック周波数が低かった際は、高速伝送が可能な画期的な通信として登場しました。
しかし、高速通信が可能になる中、徐々に弱点が目立つようになり現在ではシリアル通信との住み分けがされています。
UARTとは?
エッジデバイスの開発をしていると「シリアルケーブル」を使ってデバイスと通信するタイミングが多々ありました。
ここまでの内容を踏まえると、CPUなどはパラレルで処理しているはずなのに、なぜデバッグ等ではシリアルケーブルでつなぐのか?
また、CPUはパラレル通信のはずなのにいつの間にシリアル通信に変わっていたのだろうという疑問が生まれました。
ここで登場するのが UART (Universal Asynchronous Receiver-Transmitter) です。
UARTは「汎用非同期送受信回路」と呼ばれ、機器内部のパラレル信号と外部向けのシリアル信号を相互に変換する役割を担います。昔は専用のICチップでしたが、現在はマイコンの機能ブロックの一部であることが一般的です。
通信が高速化された現代において、パラレル通信のデメリットが大きくなる外部通信では、UARTによってシリアル通信と双方向に変換することで、
シリアル通信のメリットを最大限享受して通信を行っています。
「UARTで通信している」という言葉は、厳密には「UART回路によって変換されたシリアル信号を、規格変換用のトランシーバーIC等を通さず、そのままの電圧レベルで通信している」という意味合いで使われることなんだなと今回理解しました。
マイコンから出力される電圧(3.3Vや5.0Vなど)は使っているICに依存するため、相手側と電圧が異なる場合は「レベルシフタ」を挟んで調整する必要があります。
「調歩同期式(非同期式)」の仕組み
そもそも同期式とは?
UARTは「非同期」のシリアル通信とパラレル通信を双方向に変換してくれますが、何が非同期なのでしょうか?
そして「同期」式のシリアル通信は何を同期しているのでしょうか?
その答えがここまで沢山出てきた言葉である「クロック」となります。
- 同期式(クロック同期式): I2CやSPIなどで使われます。専用のクロック線を用意し、お互いの通信タイミングを合わせます。
- 非同期式(調歩同期式): UARTなどで使われます。クロック線を持たない代わりに、あらかじめ決めた「ルール(通信フォーマット)」に従ってお互いがデータを解読します。
同期式の理解のために、メトロノームをイメージするのが分かりやすいと思っています。
クロックが無い場合は、電圧がずっと1の場合にその1の間に何bitのデータが送られていたのかわかりませんが、
クロック線で送信されるクロックを基準とすることで、その振動に合わせたbit数分だけの1が送られていたということが分かります。
調歩同期式(非同期式)を構成する通信パラメーター
一方、調歩(ちょうほ)同期式とも呼ばれる非同期式ではどうやってお互いの通信を解釈するのでしょうか?
調歩同期式では通信を解読するためのルールとして、以下の項目が登場します。
- ボーレート(Baud rate): 通信速度。1秒間に何ビット送受信するか(例:9600bps, 115200bps)。
- スタートビット: データ送信の開始を示す合図。
- データ長: 1文字(1フレーム)を何ビットで構成するか(現在は8ビットが主流です)。
- パリティビット: エラーチェック用。1の数が偶数(Even)か奇数(Odd)かを判定し、誤りを検知します。送りたいデータ中の1の個数が設定と一致しない場合は、パリティビットを1として送ることで調整しています。
- ストップビット: データの区切りを示す合図。一般的には1, 1.5, 2が使われますが個人的には1が多い印象を持っています。
電文の概要
| スタートビット | メインの電文 | パリティビット | ストップビット | |
|---|---|---|---|---|
| 長さ | 通常1ビット | データ長に従う | Even or Odd : 1ビット None : 0ビット |
ストップビットに従う |
| 送信値 | Low | 送りたいデータ | データ部の合計とパリティの設定次第 | High |
データ長について
データ長は8ビットのものを多く目にしますが、まれに7bitのものも見かけます。
これはなぜなのだろうと思ったので少しだけ深堀りします。
これは送るデータの形式や、伝送速度と深いかかわりがあるようです。
例えばASCIIコードは数値データで文字を表す一般的なコードですが、数値、文字、記号を7bitで表現します。
これをクロック周波数が遅い環境で1文字あたり8bitのデータとして送ろうとすると、毎回無駄なbitを送ることで伝送量が落ちてしまいます。
少しでも、通信を高速化するための仕組みとして、そもそも無駄なbitであれば送る必要が無いという考えで使用されるパラメータのようです。
パリティについて
現代の通信ではパリティをNoneとして通信している機器も目にします。
こちらもデータ長と同じく、伝送速度を上げるための工夫と理解しています。
そもそもパリティはノイズ等によって間違った情報が伝送されることを防ぐ仕組みです。
パリティのためにわざわざ毎回1bit使うのであれば、ノイズに強い仕組みを使用し通信することができているのであれば、
わざわざパリティビットを付与しない方が無駄なbitを省いて通信の高速化が可能になります。
RS-232C と RS-485 の違い
UARTが「信号の変換(論理レベル)」をIC、ブロックであるのに対し、RS-232CやRS-485は「電気的な信号の規格(物理レベル)」を指します。
UARTから出た低電圧の信号を、長距離通信やノイズ耐性を高めるために専用のトランシーバーICで各規格の電圧に変換します。
RS-232C
- 方式: グランド(0V)を基準とし、プラスの電圧(+3~+25V)を論理「0」、マイナスの電圧(-3~-25V)を論理「1」としたシングルエンド。
- 最低ケーブル数: 3本(送信用、受信用、SG)
-
弱点:
- 原則として1対1の通信しかできない。
- ノイズに弱く、伝送距離が短い(一般的に15m程度)。
- 比較的通信速度が遅い。
RS-485
産業用機器やエネルギー管理の現場で非常によく使われる規格です。
- 方式(差動信号): D+、D- という2本のケーブル間の電位差(200mV以上など)で0/1を判定します。
- 最低ケーブル数: 2本
-
特徴・メリット:
- ノイズに強い: ツイストペアケーブルを使用し、2本の線に同時にノイズが乗っても電位の「差」は変わらないため、ノイズを打ち消すことができます。
- 長距離・高速: わずかな電位差で判定できるため、信号が減衰しても読み取れます。条件によっては1km以上の長距離通信も可能です。遠距離通信する場合はボーレートは下げる必要があります。
- 1対Nの通信: 複数の機器を数珠つなぎ(マルチドロップ)で接続できます。
RS-485の特徴をもたらす要因に関して
RS-485は前述の特徴があるということは知っていたのですが、なんでという点をこれまで考えたことが無かったので少し深堀りします。
RS-485の特徴の一つが判定電圧が200mVと小さいことです。
こちらにより、以下の様な特徴が生まれます。
高速化
1つの信号を送信するのために必要な電圧の振動幅が小さいことが寄与します。
RS-232Cが頑張って3V以上電圧を変化させないといけないことに対して、
RS-485は変化させる電位差が小さいので、その間で複数回振動することができます。
これにより高速化に寄与します。
いい例えかはわかりませんが、糸の長さが短い振り子の周期が短くなることイメージは同じかなと理解しています。
遠距離化
電気はすべて一定の式に従って減衰するので、なぜRS-485だけが長距離伝送ができるのかが疑問でした。
遠距離化に関しては、検出電圧が小さいことよりも差動信号であるということが寄与します。
差動信号は前述の通り、ノイズが2本の通信線双方に乗る可能性が高いため、受信側で引き算することで実質ノイズの影響を無視できます。
長い距離を通信するということは、ノイズが乗る可能性も大きくなりますが上記よりノイズの影響を無視できます。
全二重通信と半二重通信
通信の方向についても整理しておきます。
- 全二重(Full Duplex): 送信用と受信用の経路(線)が分かれており、同時に送受信が可能な方式。
- 半二重(Half Duplex): 送信と受信を同じ経路で行うため、同時には通信できない方式。一方が送信している間、他方は受信に徹します。
おわりに(今後の学習テーマ)
元々の経験から身近な存在のRS-485を一つの帰着として、シリアル通信の基礎を整理しました。
ここからさらに上のレイヤーや周辺技術について、以下のようなテーマも今後深掘りしていきたいと考えています。
- Modbus RTUなど、具体的な通信プロトコルの仕組み
- クロック同期方式(SPIやI2C)の詳細
- USBが内部で行っているシリアル変換の仕組み
- なぜ歴史的にパラレル通信ではなくシリアル通信が主流になったのか(通信の歴史)
日々の業務で何気なく使っている言葉も、一度全体像を整理してみると周辺知識とのつながりが見えてきて面白いですね。
参考資料
RS-232C、RS-422、RS-485 (コントロール機器共通の用語解説)
シリアル通信
チュートリアルRS-485:今なお最も堅牢な通信
よく分かる! シリアル通信基礎講座