- RS-485シリアル通信プロトコル
- ArduinoのRS-485
- 必要なコンポーネント
- 回路図
- RS485シリアル通信用のArduinoUNOとArduinoNanoのプログラミング
- シリアル通信RS485によるLEDの明るさの制御
マイクロコントローラと周辺機器間の通信用の通信プロトコルを選択することは、組み込みシステムの重要な部分です。組み込みアプリケーションの全体的なパフォーマンスは、コスト削減、データ転送の高速化、長距離カバレッジなどに関連するため、通信手段に依存するため、これは重要です。
前のチュートリアルでは、ArduinoのI2C通信プロトコルとSPI通信プロトコルについて学びました。現在、RS-485と呼ばれる別のシリアル通信プロトコルがあります。このプロトコルは非同期シリアル通信を使用します。RS-485の主な利点は、2つのデバイス間の長距離データ転送です。そして、それらは電気的にノイズの多い産業環境で最も一般的に使用されます。
このチュートリアルでは、2つのArduino間のRS-485シリアル通信について学習し、RS-485モジュールを介してADC値を送信することにより、マスターArduinoからスレーブArduinoに接続されたLEDの輝度を制御することによってそれを示します。マスターArduinoでADC値を変化させるために10kポテンショメーターが使用されます。
RS-485シリアル通信の仕組みを理解することから始めましょう。
RS-485シリアル通信プロトコル
RS-485は、クロックパルスを必要としない非同期シリアル通信プロトコルです。差動信号と呼ばれる手法を使用して、あるデバイスから別のデバイスにバイナリデータを転送します。
では、この差動信号転送方法は何ですか?
差動信号方式は、正と負の5Vを使用して差動電圧を生成することによって機能します。2線を使用する場合は半二重通信を提供し、全二重には4つの4線が必要です。
この方法を使用することにより
- RS-485は最大30Mbpsのより高いデータ転送速度をサポートします。
- また、RS-232プロトコルと比較して最大のデータ転送距離を提供します。最大1200メートルまでのデータを転送します。
- RS-232に対するRS-485の主な利点は、単一のマスターを備えた複数のスレーブですが、RS-232は単一のスレーブのみをサポートします。
- RS-485プロトコルに接続された最大32のデバイスを持つことができます。
- RS-485のもう1つの利点は、差動信号方式を使用して転送するため、ノイズの影響を受けないことです。
- RS-485はI2Cプロトコルと比較して高速です。
ArduinoのRS-485
ArduinoでRS-485を使用するには、1200メートルの長距離でのシリアル通信が可能で双方向であるため、Maxim MAX485ICに基づく5VMAX485 TTL toRS485と呼ばれるモジュールが必要です。半二重モードでは、データ転送速度は2.5Mbpsです。
5V MAX485 TTL-RS485モジュールは、5Vの電圧を必要とし、5Vのロジックレベルを使用するため、Arduinoなどのマイクロコントローラーのハードウェアシリアルポートとインターフェイスできます。
次の機能があります。
- 動作電圧:5V
- オンボードMAX485チップ
- RS485通信の低消費電力
- スルーレート制限トランシーバー
- 5.08mmピッチ2P端子
- 便利なRS-485通信配線
- チップのすべてのピンは、マイクロコントローラーを介して制御することができます
- ボードサイズ:44 x 14mm
RS-485のピン配列:
ピン名 |
使用する |
VCC |
5V |
A |
非反転受信機入力 非反転ドライバー出力 |
B |
受信機入力の反転 ドライバー出力の反転 |
GND |
GND(0V) |
R0 |
レシーバー出力(RXピン) |
RE |
レシーバー出力(LOW-有効) |
DE |
ドライバー出力(HIGH-Enable) |
DI |
ドライバ入力(TXピン) |
このRS-485モジュールはArduinoと簡単にインターフェースできます。Arduino 0(RX)と1(TX)のハードウェアシリアルポート(UNO、NANO)を使用してみましょう。プログラミングも簡単です。Serial.print()を使用してRS-485に書き込み、Serial.Read()を使用してRS-485から読み取ります。
プログラミングの部分については後で詳しく説明しますが、最初に必要なコンポーネントと回路図を確認しましょう。
必要なコンポーネント
- ArduinoUNOまたはArduinoNANO(2)
- MAX485 TTLからRS485へのコンバータモジュール-(2)
- 10Kポテンショメータ
- 16x2LCDディスプレイ
- 導いた
- ブレッドボード
- 接続線
このチュートリアルでは、Arduino Unoをマスターとして使用し、ArduinoNanoをスレーブとして使用します。ここでは2つのArduinoボードが使用されているため、2つのRS-485モジュールが必要です。
回路図
最初のRS-485とArduinoUNO(マスター)間の回路接続:
RS-485 |
Arduino UNO |
DI |
1(TX) |
DE RE |
8 |
R0 |
0(RX) |
VCC |
5V |
GND |
GND |
A |
スレーブRS-485のAへ |
B |
スレーブRS-485のBへ |
2番目のRS-485とArduinoNano(スレーブ)間の接続:
RS-485 |
Arduino UNO |
DI |
D1(TX) |
DE RE |
D8 |
R0 |
D0(RX) |
VCC |
5V |
GND |
GND |
A |
マスターRS-485のAへ |
B |
マスターRS-485のBへ |
16x2LCDとArduinoNano間の回路接続:
16x2 LCD |
Arduino Nano |
VSS |
GND |
VDD |
+ 5V |
V0 |
LCDのコントラスト制御用のポテンショメータセンターピンへ |
RS |
D2 |
RW |
GND |
E |
D3 |
D4 |
D4 |
D5 |
D5 |
D6 |
D6 |
D7 |
D7 |
A |
+ 5V |
K |
GND |
アナログ入力を提供するために10KポテンショメータがArduinoUNOのアナログピンA0に接続され、LEDがArduinoNanoのピンD10に接続されています。
RS485シリアル通信用のArduinoUNOとArduinoNanoのプログラミング
両方のボードのプログラミングには、ArduinoIDEが使用されます。ただし、[ツール]-> [ポートとボード]から[ツール]-> [ボード]から対応するポートを選択していることを確認してください。
デモビデオを含む完全なコードは、このチュートリアルの最後にあります。ここでは、コードの重要な部分について説明します。このチュートリアルには、Arduino UNO(マスター)用とArduino Nano(スレーブ)用の2つのプログラムがあります。
マスターのコード説明:Arduino UNO
マスター側では、ポテンショメータを変化させてピンA0でアナログ入力を取得し、Arduino UNOのハードウェアシリアルポート(0,1)を介してこれらの値をRS-485バスにシリアル 書き込みし ます。
ハードウェアシリアルピン(0,1)でシリアル通信を開始するには、以下を使用します。
Serial.begin(9600);
Arduino UNOのピンA0でアナログ値を読み取り、可変 ポットバル 用途に 保存 するには:
int potval = analogRead(pushval);
シリアルポートに potval 値を書き込む前に、RS-485のピンDEとREをHIGHにして、Arduino UNOのピン8に接続し、ピン8をHIGHにする必要があります。
digitalWrite(enablePin、HIGH);
次に、これらの値をRS-485モジュールに接続されたシリアルポートに配置するには、次のステートメントを使用します
Serial.println(potval);
スレーブのコード説明:Arduino NANO
スレーブ側では、Arduino Nanoのハードウェアシリアルポート(ピン-0,1)で利用可能なマスターRS-485から整数値を受信します。それらの値を読み取り、変数に格納するだけです。値は(0 -1023)の形式です。したがって、PWM技術を使用してLEDの輝度を制御すると、(0-255)に変換されます。
次に、それらの変換された値をLEDピンD10(PWMピン)に AnalogWriteし ます。したがって、PWM値に応じて、LEDの輝度が変化し、それらの値を16x2LCDディスプレイに表示します。
スレーブArduinoのRS-485がマスターから値を受け取るためには、RS-485のピンDEとREをLOWにするだけです。そのため、Arduino NANOのピンD8(enablePin)がLOWになります。
digitalWrite(enablePin、LOW);
また、シリアルポートで利用可能な整数データを読み取り、変数に保存するには、
int pwmval = Serial.parseInt();
次に、値を(0-1023から0-255)に変換し、変数に格納します。
int convert = map(pwmval、0,1023,0,255);
次に、アナログ値(PWM)をLEDアノードが接続されているピンD10に書き込みます。
AnalogWrite(ledpin、convert);
これらのPWM値を16x2LCDディスプレイで印刷するには、
lcd.setCursor(0,0); lcd.print( "PWM FROM MASTER"); lcd.setCursor(0,1); lcd.print(convert);
シリアル通信RS485によるLEDの明るさの制御
ポテンショメータでPWM値を0に設定すると、LEDが消灯します。
また、ポテンショメータを使用してPWM値を251に設定すると、次の図に示すように、LEDが最大輝度でオンになります。
これが、RS485をArduinoのシリアル通信に使用する方法です。