実験 RS-485 (1) RS-232

 Arduino UNOには0、1番ピンを使ったUARTによるシリアルと、10(Rx)および11(Tx)などを使ったソフトウェア・シリアルの二つの調歩同期式シリアル通信機能があります。0、1番ピンはUSB-シリアルで使われるので、コンソールに文字を表示したいときは、ソフトウェア・シリアル通信機能を利用してセンサなどと通信します。Arduinoのほかのボードでは、ハードでUARTをサポートしたポートが別途使える製品も多くあります。I2CやSPIのシリアル通信と比べ、通信距離が数mと長いのが特徴です。

(※)UARTは一般的な呼び名でUniversal Synchronous  Receiver and Transmitterの省略形ですが、AVRやPICではUniversal Synchronous and Asynchronous Receiver and Transmitterなので、正しい周辺機器の機能名はUSARTです。Asynchronous は使わないので、UARTという表現をします。

調歩同期式シリアル通信の波形

 オシロスコープのチャネル1をArduinoの0番ピンへ、チャネル2を1番ピンへつなぎます。コンソールに 1 という文字を表示するスケッチを動かしたときの波形を観測します。スタート・ビット'0'に続いて8ビットのデータ(アスキ・コードの'1')、1ビットのストップ・ビット'1'で1文字のデータを送信しています。送信している先は、USB経由でPCです。

 次の図は、オシロスコープのシリアル・デコードという機能で、アスキ・コード'1'をデコードして16進 '31'を表示しています。

 アスキ・コードの'1'は0x31=0b00110001です。データは正論理です。LSBからデータが送られてきます。10001100となり、オシロスコープの観測と一致します。

 スケッチです。9600ボーで通信します。ATMega328では変調がかかっていないので、bps(bit per second)とボー(baud)は数値が一致します。AVRやPICマイコンではbpsの単位は使われません。デフォルトでは、

  • データは8ビット    8
  • パリティ・ビットはなし N
  • ストップ・ビットは1  1

です。調歩同期という名称通り、信号のない状態を示すHIGHからLOWに変わったときの1ビットがスタート・ビットとして扱われ、1バイトのやり取りが始まります。1バイトのデータを送った最後がHIGHのストップ・ビットで、次のデータが送られるまでずっとHIGH状態が続きます。

 7ビット・データ、ストップ・ビット1であれば、9600の後ろに、,SERIAL_7N1を追加します。

void setup() {
Serial.begin(9600);
}

void loop() {
Serial.print("1");
}

 コンソールには1が出力され続けています。

ソフトウェア・シリアルの信号

  オシロスコープのチャネル1をArduinoの10番ピンへ、チャネル2を11番ピンへつなぎます(変更可)。コンソールに 1 という文字を表示するスケッチを動かしたときの波形を観測します。スタート・ビット'0'に続いて8ビットのデータ(アスキ・コードの'1')、1ビットのストップ・ビット'1'で1文字のデータを送信しています。

 スケッチです。

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
mySerial.begin(2400);
}

void loop() {
mySerial.print("1");
}

 2400ボー、4800ボー、9600ボー、19200ボー、384000ボーで実験して、いずれも正しく動作しています。

 2018年6月現在、arduino.ccにある次のスケッチはpinModeを指定していますが、推奨されているかは不明です。

#define rxPin 10
#define txPin 11
SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin);

void setup() {
pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
mySerial.begin(9600);
}

信号のレベルはTTL

 RS-232Cの信号レベルは+3~15Vがスペース、-3~-15Vがマークと呼ばれます。PCでは±12Vが使われていました。この10年、シリアル・ポートは実装されなくなりましたが、電源ピンには電圧が残っています。

 ロジック・デバイスのTTLは電源電圧+5Vで動作します。Arduino UNOの場合、電源が5Vなので0と5Vで、'0'、'1'を表します。この信号をTTLレベルと表現します。電源電圧3.3Vのマイコンでは、0と3.3Vで'0'、'1'を表します。語源からすればCMOSレベルというのが正しいですが、TTLレベルと表現します。

RS-485は複数接続

 RS-232は1対1の双方向(全二重)接続です。Tx/Rx信号以外にデータが用意できたか(Data Set Ready)とかステータスを表す信号も併用されるのが一般的です。ケーブルは最大10mまで伸ばせます。

(※)RSはEIAに変わっていますが、慣習的にRSが使われます。RS-232CはRS-232Eなどバリエーションがありますが、RS-232Cを通称で使う場合が多くあります。

 N対Nの接続ができる規格がRS-485です。ケーブルは最大1200mまで伸ばせ、RS-232のデータ転送速度160kbpsに比べ高速の10Mbpsの通信ができますが、多くの機器は1Mbps対応が多いようです。

 トランシーバが32台、レシーバは32台まで同じケーブルにつなげられます。ケーブルはツイスト・ペアです。GNDが併用される場合もありますが、多くは2本の配線で済みます。

 通常、RS-232で使われるマイコンのUARTのRx/Txにレベル変換と半二重であるための方向指示信号の制御が必要です。変化には専用のICが使われ、絶縁型とそうでないタイプがあります。

 通信自体は、バイト・データの送信が基本ですが、その上にプロトコルが設定されています。Modbusがよく使われるようです。そのほかには、CompoWay/F(オムロン独自)、ビルディング・オートメーション用プロトコルBACnetなどがメジャーのようです。

 RS-485は、工場などで多く使われています。イーサネットが家庭や会社では一般的ですが、時間の管理ができないため、工場や自動車内部では計測制御のために使われませんでした。最近ではEtherCATなどの規格が新たに制定され、利用が始まっています。ハブも対応品が必要です。

前へ

Blinkから始まるArduino入門 その8 AC100VのON/OFF

次へ

実験 RS-485 (2) ArduinoでRS-485に対応する その1 電力量モニタKM-N1-FLK