● RS485で通信してみる

USBとRS485への変換を行うモジュールを入手しました。

USB to 485 コンバータ USB to RS485 TTL 変換アダプタ USB 2.0 RS-485モジュール
USB部分にはCH340が使われているようで、秋月電子などのサイトでドライバーをダウンロードすればXPのような古いパソコンでも通信できるようです。


モジュールの裏側を見ると、A + と B - の端子が見えます、この端子を次のように接続します。


AはAと、BはBと、複数のモジュールとの接続が出来るので、この場合には1対2の通信が出来ます。
つまり、一つが送信すると2台が受け取る事になります。(短い距離なので終端抵抗は付けていません)

▼パソコンで接続の確認
3つのモジュールをパソコンのUSB端子に接続します、CH340のドライバによりモジュールが認識されたのか確認してみます。
パソコンのスタートメニューのとなりの検索ボックスに dev と入力してデバイスマネージャを起動し、ポートを確認してみます。

COM10 COM13 COM3 にモジュールが接続された事が確認できました。
これでお好みの通信ソフトを使えば、モジュールとの通信が出来ます。

▼通信ソフトでの通信
次に、私の作った通信ソフトを使って送受信を行ってみます。
他の通信ソフトを持っている方はそちらを使った方が良いと思います。
RS232c テスト用アプリケーション セキュリティの警告が出ると思いますので心配な方はソースからコンパイルしてください。
rs232c.exeを実行すると、このような画面が出ると思います、3つのポートで通信するのでアプリを3回実行します。

3つのポート番号を設定して接続ボタンを押します。
なんらかの文字を入力して送信ボタンを押すと、1台が送信すると他の2台が受信できる1対多の送受信の確認ができると思います。


■ Arduinoで通信モジュールを使ってみる

RS485モジュール TTL to RS-485コンバータ
RS485で通信するために安価なコンバータを入手しました。
この基板はMAX485から直接配線を引き出しているようで、MAX485のデータシートを確認しました。
データシートには次のように書かれており、

RO Receiver Output
RE Receiver Output Enable Active Low
DE Driver Output Enable Active High
DI Driver Input

データシートの内容から察する所、
RO を Arduino の RX
DI を Arduino の TX
REは受信するときにはLowにすると書いてあり、DEは送信するときはHighにすると書いてあるから、
RE と DE は接続して受信する時は - に接続、送信するときは + に接続
ということであると理解しました。
実験して気が付いたのですが、5Vで送信状態に固定するとモジュールが発熱します。
発熱を抑えるため、モジュールのVCCにArduino の3.3Vを流して実験していますが注意してください。

次のように配線しました。


実際に配線した所、この構成でモジュールへの電源が5Vで送信状態だと、モジュールが発熱します。
モジュールのVCCを3.3Vに接続する事で熱くなくなった。
本来は5Vの所、3.3Vで動作させているので通信距離はだいぶ短くなっていると思います。


▼Arduinoのプログラム

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  if (-1 == Serial.read()) {
    digitalWrite(LED_BUILTIN, LOW);
  } else {
    while(-1!=Serial.read());
    digitalWrite(LED_BUILTIN, HIGH);
  }
  Serial.print("Hello\n");
  delay(2000);
}
なんらかの文字を受信した場合には2秒間基板上のLEDを点灯させる事と、2秒毎に文字列の送信をしています。
送信と受信はREとDEの配線を、受信ならGNDへ、送信ならVCC(3.3V)へ手動で切り替えます。

▼ 送信と受信の自動切換え
送信と受信のたびに配線を切り替えるのは面倒なので自動で切り替えられるようにします。
REとDEの配線をデジタルピン2番に接続します。
2番ピンを送信の時にはHIGHに受信の時にはLOWにコントロールすれば良さそうです。
そこで、作成したのが次のプログラムです。
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(2, OUTPUT);
  digitalWrite(2, LOW);
  Serial.begin(9600);
}

void loop() {
  if (-1 == Serial.read()) {
    digitalWrite(LED_BUILTIN, LOW);
  } else {
    while (-1 != Serial.read());
    digitalWrite(LED_BUILTIN, HIGH);
  }
  digitalWrite(2, HIGH);
  Serial.print("Hello");
  Serial.flush();
  digitalWrite(2, LOW);

  delay(2000);
}
Serial.flush()ではデータの送信がすべて完了するまで待機するため、その間HIGHを保つことができます。
動作を確認するために通信線とデジタルピン2番にオシロスコープを取り付けてみました。

データの送信が終わるまで2番ピンはHIGHが保たれています。
デジタルピンによる自動切り替えにより送信と受信の両方ができるようになりました。
送信の固定でないため、モジュールのVCCを5Vに接続してもさわった感じ熱くはなかったです。
他の人の接続例を検索しても、接続方法に問題は無さそうです。
でも、連続送信するとふれられなくなるほど熱くなるんだろうね。


▲トップページ > マイコンなど