RS232Cの電圧をオシロスコープで測定してみました。また通信プロトコルも確認しています。
市販のUSB-RS232C変換ケーブルの電圧波形を実際に確認しています。
RS232C通信の基礎を初心者の方にも分かりやすく紹介します。
RS232Cの電圧レベルをオシロスコープで測定してみた
日本メーカーのUSB-RS232C変換ケーブルをオシロで出力電圧レベルを確認しました。
オシロでRS232Cの出力電圧を測定するとHigh(1)が「+10.8V」、Low(0)が「-10.8V」でした。
RS232Cの出力電圧の規定として「H_+5V~+15V」「L_-5V~-15V」ですので範囲内でOKです。
また通販で購入した格安のUSB-RS232C変換ケーブルの出力電圧も確認してみました。
なんと海外製の格安品は出力電圧が規格外でした!Lowが全く満たせていません。
(HIghは+5Vをギリギリ満たせていましたが…)
今回実施したオシロの測定方法やRS232C通信の解析方法含めて紹介していきます。
RS232CのUSB変換ケーブルの電圧測定する準備
RS232C通信の基礎に関しては以前に下記記事でアナライザを使って解析しました。
リンク先はこちらから
まだその際はオシロスコープを使った電圧測定は出来ていませんでした。
しかし下記記事で紹介したように最近オシロを購入しました!(リンク先はこちら)
オシロスコープを使ってRS232Cの電圧測定を実施してみます
RS232Cのピンアサインを確認する
今回使うRS232CのD-Sub9ピン(メス)のピンアサインを確認します。
TXD(送信)とGND間で電圧測定できるように準備します。
ジャンパー線で信号を引き出してプローブと接続します。
これでオシロでRS232Cの出力電圧を測定できるようになりました。
RS232C変換ケーブル(バッファロー製)
今回一番メインに測定で使うのはバッファロー製 RS232C変換ケーブルです。
型式は「BSUSRC06SV」です。
昔からよくある変換ケーブル、かつ日本メーカーのため信頼できます。
RS232C変換ケーブル(Amazonの海外製_格安品)
比較対象のケーブルとして海外製 格安品_RS232C変換ケーブルを用意しています。
どれぐらい安いのかというと、先述した日本メーカー品と比べて1/3程度の価格で買えてしまいます。
UART変換ケーブル
また今回折角ですのでUARTの電圧レベルも一緒に確認してみます
こちらもAmazonで購入したUART-USB変換ケーブルにジャンパーで線でプローブと接続します
UART通信の波形も以前にアナライザで解析しました。
下記記事です。よろしければご覧ください。(リンク先はこちら)
ラズベリーパイでRS232Cの出力する
電圧測定をする上で、RS232Cの信号出力をする必要があります。
今回はラズベリーパイとPythonでRS232Cの出力を行います。
以前に下記記事でラズベリーパイとUARTでシリアル出力しました。
UARTでもRS232Cでも同じ対応が可能です。リンク先はこちらです。
pyserialをインストール
PythonでRS232C(シリアル)通信するために「pyserial」のパッケージをインストールします。
下記コマンドで簡単にインストールできました
プログラムを実行する前に変換ケーブルを挿しておく
これからプログラムを作成しますがRS232C-USB変換ケーブルはラズパイに挿しておきます。
予め変換ケーブルを挿しておかないと、プログラム実行時にエラーになります。
ラズパイでPythonのプログラムを用意する
PythonでRS232C通信するプログラミングを行っていきます。
ラズベリーパイはPythonがデフォルトでインストールされています。
一度もプログラミング・Pythonを使ったことが無い方でも大丈夫です。
下記記事でラズパイで簡単なプログラムの作成・実行方法を紹介しています
(リンク先はこちらから)
「~~.py」というファイルを作って、Pythonの環境開いて3行書いて実行すれば完了です。
下記プログラムをコピペしてもらっても構いません。
1 2 3 4 |
import serial ser = serial.Serial('/dev/ttyUSB0', 115200) ser.write(b'Hello World') |
Pythonのプログラムの内容
実際作成したプログラム内容も非常に簡単です。下記の2手順となっています
- 「pyserial」をインポートしてusb-シリアル変換(/dev/ttyUSB0)を使うように定義します
- RS232C(シリアル)通信で「Hello World」とWrite(出力)します。
今回の通信速度は115200bpsですが、9600bps,403200bps,3Mbpsの波形も確認しました。
下記記事で紹介してます。よろしければご覧ください。(リンク先はこちら)
オシロスコープでRS232Cの電圧を測定する
準備は整いましたのでオシロスコープで電圧測定を行っていきます。
ただし、今回の筆者が購入したオシロのRIGOL DS1054ZはRS232Cのデコード機能があります。
折角なのでデコード機能を使ってRS232C通信のプロトコルも確認していきます。
今回の測定の場合、デコード機能でPythonから出力した「Hello World」を解析できています
オシロスコープのデコード機能の使い方
今回は筆者のオシロのRIGOL DS1054Zでのデコード機能の使い方を紹介します。
MATH(演算)の機能を使う
オシロスコープのMATH(演算)を押します
Decode(デコード)1を選択する
「Decode1」を選択します。
RS232C以外のI2C・SPIも同様にデコード可能ということです。
またI2C・SPIも別に記事を書きたいと思います。
デコードの詳細設定を行う
どのようにシリアル波形をデコード(復号)したいかの設定を行います。
今回筆者の場合は下記設定になりました。
- Decoder(デコーダの種類) → RS232C
- Decode(復元した機能を使うか) → ON
- TX(送信信号を受けるオシロのプローブCH) → CH1
- Baud・Preset(RS232Cの通信速度) → 115200bps
立ち上がり・立ち下がりの極性を設定
シリアル波形の立ち上がり・立ち下がりの極性を設定します。
RS232Cの場合は「未送信時_Low(0)」「送信時_Hi(1)」となります。
そのため立ち上がりでデコードする必要があります
UARTの場合は「未送信時_Hi(1)」「送信時_Low(0)」となります。
そのため立ち下がりでデコードする必要があります
その他の設定
LSB,データ幅,ストップbit,パリティビットはデフォルト設定で今回は測定しています。
もし設定必要な方は適宜修正をお願いします。
また今回はTXのみを測定していますが、RXも測定可能です。
RS232Cの電圧測定の結果
デコード機能もONにして、RS232Cの電圧を測定した結果を記載していきます。
※ジャンパー線も使っており、またデバッグレベルの測定である旨をご了承ください。
RS232Cの電圧レベル(バッファロー製)
バッファロー製のRS232C変換の電圧レベルを確認しました。
電圧レベルを測定するとHigh(1)が「+10.8V」、Low(0)が「-10.8V」でした。
RS232Cの出力電圧の規定として「H_+5V~+15V」「L_-5V~-15V」ですので範囲内でOKです。
RS232Cの電圧レベル(Amazonの海外製_格安品)
Amazonで購入した格安品のRS232C変換電圧レベルも確認しました
海外製の格安品は出力電圧が規格外でした!特にLow(0)がマイナスの電圧を満たせていません。
(HIghは+5Vをギリギリ満たせていましたが…)
UARTの電圧レベル
参考までにUARTの電圧レベルも確認しました。
UARTの電圧レベルの3.3Vを確認できました。
論理もRS232Cと逆のアクティブLowを確認できています。
かなり今回は適当に測定していますので、波形がかなりギザギザになっています。
OS(オーバーシュート),US(アンダーシュート)がひどいです。
RS232CのD-Sub9ピンの電圧の仕組み
なぜ格安品のRS232C変換ケーブルが電圧レベルを満たせていないか追加調査します
RS232CのD-Sub9ピンの変換ケーブルの仕組みを確認していきます。
USBシリアル変換ICを調べる
今回測定した格安品のケーブル内のUSBシリアル変換のIC含めて考察していきます。
ラズパイで下記コマンドを打ち込めば可能です。USB関連の情報を取得できます。
wch製のCH341というUSBシリアル変換ICを使っていることが分かりました。
実際の調査結果のログは下記になります。
1 2 3 4 5 6 7 8 9 |
[ 77.791640] usb 1-1.3: new full-speed USB device number 3 using xhci_hcd [ 77.927951] usb 1-1.3: New USB device found, idVendor=1a86, idProduct=7523, bcdDevice= 2.54 [ 77.927967] usb 1-1.3: New USB device strings: Mfr=0, Product=2, SerialNumber=0 [ 77.927980] usb 1-1.3: Product: USB2.0-Ser! [ 78.020775] usbcore: registered new interface driver usbserial_generic [ 78.020839] usbserial: USB Serial support registered for generic [ 78.023195] usbcore: registered new interface driver ch341 [ 78.023289] usbserial: USB Serial support registered for ch341-uart [ 78.026426] usb 1-1.3: ch341-uart converter now attached to ttyUSB0 |
CH341のデータシートを確認してみる
CH341のデータシートを確認してみました。(データシートのリンク先はこちらから)
本来のRS232C変換ケーブルをCH341のICを使って構成すると下記形になります。
※上記回路図はあくまでデモ用です。多くの信号を省略しています
概略ですがRS232C変換ケーブル内のICのイメージを紹介します。
※この時点でプロトコルとしてはRS232Cになっています。(電圧レベルは5V)
※電圧レベルを5VからRS232Cの±5V~15Vに変換します。
CH341でRS485通信もできる
ちなみ今回ののCH341のICを使ってRS485通信の回路構成も可能です。
下記記事でRS485通信の測定と一緒にICの調査もしています。
よろしければ一緒にご覧ください。(リンク先はこちらから)
RS232Cのトランシーバ・レシーバがない
今回の格安品にはRS232Cトランシーバ・レシーバが載っていないと思われます。
(あくまで筆者の見解です。ご了承ください)
回路図イメージで言うと下記イメージです。
恐らくコストダウンのためにMAX232のICを省略していると思われます。
CH341からの信号を直接D-Sub9ピンに接続している様子です
今回の格安品の波形は「Highが5V」「Lowが0V」でしたので辻褄が合います。
(プロトコルとしては一応RS232C通信にはなっていますが…)
RS232C通信は可能なのか?
この波形で「RS232C通信ができるのか?」の疑問に関しては「不明」という回答になります。
RS232Cレシーバとしては±3Vの範囲はHighかLowか定まらない「不定」箇所になるためです。
※RS232Cの規格詳細についてはTI社のデザインノートを参考お願いします。
(英語ですがリンク先はこちらから)
結局のところ格安品の変換ケーブルでRS232C通信が正常に可能かは運次第となります。
(実力でRS232C通信が動いてしまうケースも多いとは思います)
※あくまで今回の検討は筆者の個人的な考えという旨をご了承お願いします
まとめ
今回の記事をまとめますと下記になります。
今回オシロで電圧測定だけでなく、デコード機能を使うことで効率よく通信解析できました。
筆者のRIGOL DS1054Zは標準でRS232C含めてデコード機能が付いており非常に便利です。
よろしければ皆さまもオシロスコープを触ってみてください
コメント