RS485の差動の波形を実際に測定・解析してみました。
電圧レベル・差動信号をオシロスコープで確認しています。
RS485通信の基礎を実際の波形交えて、初心者の方にも分かりやすく紹介します。
RS485通信の電圧と波形をオシロスコープで確認してみた
RS485の差動の波形をオシロスコープで測定してみました。
電圧レベルが「-7V~+12Vの範囲」「200mV以上の差動振幅」で規格内を確認しています。
ラズベリーパイからUSB-RS485変換モジュールを使ってPythonで通信しています。
終端抵抗は120Ωを接続しました。
USB-RS485変換モジュールの中身も調査しました。
RS485トランシーバーICはMAXIM製のMAX485を確認しています。
RS485通信テスト内容の詳細を紹介していきます。
USB-RS485変換モジュールを購入してみた
今回テストに使ったのはUSB-RS485変換モジュールです。
PCやラズパイにUSB接続するだけでRS485通信が出来るようになります
裏面の写真がこちらになります。
コネクタのどちらがポートA,Bか分かるようにシルクされています。
よく市販に売られているUSBシリアル変換ケーブルと同類のものとなります。
USBシリアル変換ケーブルの詳細・仕組みに関しては下記記事で紹介しています。
よろしければ一緒にご覧ください。(リンク先はこちらから)
RS485のボードは通販などで購入できます
今回筆者が使用したのは一番簡易的なUSB-RS485変換モジュールです。
AmazonなどでRS485と調べれば色々な形状・IFのモジュールがあります。
RS485のボード・基板も最近は通販で簡単に購入可能です。
筆者同様にRS485に興味ある方・遊んでみたい方は確認してみてください。
RS485のICを確認してみた
変換モジュールを分解・ドライバの情報からRS485のICを確認してみます。
RS485変換モジュールのカバーを外すと下記形になります。
抵抗・コンデンサ・発振子もあるのですが重要な部品をピックアップすると下記になります。
- USBコネクタ
- USBシリアル変換IC (WCH製_CH341)
- RS485トランシーバIC (MAXIM製_MAX485)
- RS485ポートA,Bコネクタ
重要な部品だけの簡易的な回路図を記載すると下記形です
(あくまで筆者のイメージ図で配線もかなり省略しています)
簡易的な回路イメージ図を含めた形で写真を載せますと下記になります。
RS485のドライバIC_(CPU視点)
今回のUSB-RS485変換は「USBシリアル変換→RS485変換」の2段階の変換をしています。
2段階の変換の後にコネクタからRS485のポートA,Bが出力されています。
ホスト視点のドライバICとしてはUSBシリアル変換ICになります。
つまり通信テストで使うラズベリーパイはUSBシリアル変換ICと通信します。
USBシリアル変換ICがCH341と分かったのはラズパイ(Linux)で簡単に調査できるためです。
USBデバイスに何のICが搭載されているかは下記コマンドで調査できます
参考までにコマンド結果のUSB箇所の切り取りを下記に貼り付けておきます。
7行目の「usbcore」の箇所でCH341のICを使用していることが分かります。
1 2 3 4 5 6 7 8 9 |
[ 106.788675] usb 1-1.3: new full-speed USB device number 3 using xhci_hcd [ 106.924972] usb 1-1.3: New USB device found, idVendor=1a86, idProduct=7523, bcdDevice= 2.54 [ 106.924988] usb 1-1.3: New USB device strings: Mfr=0, Product=2, SerialNumber=0 [ 106.925001] usb 1-1.3: Product: USB2.0-Serial [ 107.020400] usbcore: registered new interface driver usbserial_generic [ 107.020465] usbserial: USB Serial support registered for generic [ 107.022877] usbcore: registered new interface driver ch341 [ 107.022984] usbserial: USB Serial support registered for ch341-uart [ 107.028052] usb 1-1.3: ch341-uart converter now attached to ttyUSB0 |
RS232CとRS485のUSB変換は共通箇所もある
また今回使われているICのCH341に関してはUSB-RS232C変換ケーブルでも使用されていました。
トランシーバー箇所のICがRS232C変換のICになっています。
USB変換のケーブルでは色々なケースで使用されているICのようです。
RS232C変換に関しては下記記事で詳細に紹介しています。(リンク先はこちらから)
RS485のトランシーバーIC
今回の変換モジュールのRS485トランシーバーICはMAXIM製MAX485です。
変換モジュール内には120Ωの終端抵抗がありませんでした。(未実装でした)
そのため今回はドライバ側でも外部終端が必要になります。
MAX485はシリアル変換をRS485通信に変換するICです。
MAX485のデータシートを確認したい場合MAXIMのHPに載っています。リンク先はこちらから。
RS485の終端抵抗は120Ωを接続
変換モジュール先のRS485の終端抵抗を接続していきます。
RS485に関してはドライバ側・レシーバ側共に終端抵抗が必要です。
今回はトランシーバーICのMAX485のデータシートの参照回路と同様に120Ωを接続します。
RS485の終端抵抗は120Ωが多いと思われます。(100Ωのケースもあるようですが…)
実際に使う際は機器のデータシート・ケーブルのインピーダンスは確認お願いします。
終端抵抗120Ωをジャンパー線とブレッドボードで接続
今回はコネクタからジャンパー線で終端抵抗を接続しました。
(120Ωの抵抗が無かったので)100Ωと10Ω×2本の抵抗を直列にブレッドボードで接続しています。
RS485の配線
今回のRS485トランシーバーICのMAX485は半二重通信用(HALF DUPLEX)です。
ドライバ・レシーバの相互通信が1つの差動線で対応できます。
今回のRS485通信テストの半二重通信の差動線はジャンパー線で接続しているだけです。
(本当はインピーダンス整合やツイストされたケーブルを使用した方が良いと思います)
またレシーバ側はICは無しで測定用の終端抵抗120Ωだけ接続しています。
ラズベリーパイでRS485通信をさせる
以前に下記記事でラズベリーパイとPythonでUSBシリアル出力しました。
USB経由ならばRS485でもシリアル通信と同じ対応が可能です。リンク先はこちらです。
今回もラズパイとPythonでUSB-RS485通信を行います
pyserialをインストール
Pythonでシリアル通信するために「pyserial」のパッケージをインストールします。
下記コマンドで簡単にインストールできました
ラズパイでPythonのプログラムを用意する
PythonでRS232C通信するプログラミングを行っていきます。
ラズベリーパイ(raspberry pi)は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)を使うように定義します
- RS485通信で「Hello World」とWrite(出力)します。
RS485の通信速度を変更する方法
Pythonを使ったUSB-RS485通信の速度変更の仕方は簡単です。
プログラム内の数字を変更するだけです。
9600bpsに速度を遅くしたいのであれば「9600」にすればOKです
RS485のA Bの電圧レベルをオシロで確認してみる
測定環境も整いましたので、オシロスコープでRS485の電圧レベルを確認していきます。
プローブ位置は回路のイメージ図で示しますと下記になります。
レシーバの終端抵抗のA,Bの電圧を測定しています。
今回測定した結果はあくまで筆者の1例ということをご了承ください。
使用するトランシーバーIC、終端抵抗の値、回路構成で値は簡単に変わります。
RS485の差動電圧
今回の差動電圧はオシロスコープの「MATH」機能を使って算出しています。
差動電圧A-Bは約2.24Vとなりました。(下記波形の紫箇所です)
RS485 のレシーバの規定は「200mV以上の電圧差」ですので十分にHi/Lowを認識できます。
ちなみにICのデータシートを見るとRS485の差動出力電圧(VOD2)は1.5V~5Vでした。
当たり前ですがICの出力範囲内にも入っている形になります
MAX485のデータシートのリンク先はこちらから。
RS485の電圧範囲
RS485のA,Bの電圧範囲を確認します。規格では-7V~+12Vの範囲にいる必要があります
今回の波形ではBの箇所で範囲内に入っているか確認しました。(特にAでも問題無し)
最大電圧でも3.56Vで特に問題有りませんでした。
RS485の通信速度
RS485の最大伝送速度は10Mbpsですが、今回は9600bpsで確認しました。
Pythonの設定を9600にして、実速度でも9600bpsを確認できました。
RS485の原理・プロトコルについて
最後に少し補足になりますが、RS485は物理層(電気的)な仕様の規格です。
特に明確な通信プロトコルはありません。
今回のRS485通信テストの場合は、単純にシリアル通信を差動にしたイメージです。
そのため今回の場合だとシリアル通信の解析(デコード)機能を使えば信号解析も可能です。
RS485の機器を使うときには何のデータ通信されているかは把握するのが良いと思います。
トラブルが起きた時に信号解析も楽になるはずです。
まとめ
今回はRS485通信に関して紹介させていただきました。
記事をまとめますと下記になります。
筆者のRIGOL DS1054Zは今回のRS485通信レベルならば十分に測定が可能です。
趣味にちょうど良いオシロスコープだと思います。
下記記事でも紹介していますので、よろしければご覧ください。(リンク先はこちらから)
コメント