- RS-485シリアル通信
- RS-485とArduinoの接続
- USBからRS-485へのコンバータモジュール
- 単にModbusマスターソフトウェア
- 必要な工具
- 回路図
- RS-485MODBUSスレーブ用のArduinoUNOのプログラミング
- ArduinoUNOをRs485Modbusスレーブとしてテスト
Modbusは、 1979年にModiconによって発見されたシリアル通信プロトコルであり、産業用電子機器間でシリアル回線を介してデータを送信するために使用されます。RS-485 Modbusは、伝送ラインにRS-485を使用します。Modbusはソフトウェアプロトコルであり、ハードウェアプロトコルではないことに注意してください。ModbusマスターとModbusスレーブなどの2つの部分に分かれています。RS-485 Modbusネットワークには、それぞれ1〜127の一意のアドレスを持つ1つのマスターと127のスレーブがあります。このMAX485 Arduino プロジェクトでは、シリアル通信のスレーブとしてArduinoUnoを使用します。
Modbusは主にPLC(プログラマブルロジックコントローラー)で使用されます。これとは別に、Modbusはヘルスケア、輸送、ホームオートメーションなどでも使用されます。Modbusには255の機能コードがあり、Modbusには主に3つの人気のあるバージョンがあります。
- MODBUS RTU
- MODBUS ASCII
- MODBUS / TCP
ModbusASCIIとModbusRTUの違いは何ですか?
ModbusRTUとModbusASCIIは同じプロトコルを話します。唯一の違いは、有線で送信されるバイトがRTUではバイナリとして表示され、ModbusRTUでは読み取り可能なASCIIとして表示されることです。このチュートリアルでは、ModbusRTUを使用します。
このチュートリアルは、ArduinoUNOをスレーブとしてRS-485Modbus通信を使用する方法について説明しています。ここでは、Simply Modbus Master SoftwareをPCにインストールし、RS-485を伝送ラインとして使用して2つのLEDとサーボモーターを制御します。これらのLEDとサーボモーターはスレーブArduinoに接続され、マスターModbusソフトウェアを使用して値を送信することによって制御されます。このチュートリアルではRS-485を使用しているため、最初にArduinoUnoとArduinoNano間のRS485シリアル通信を実行することをお勧めします。RS485は、シリアル通信用の他のコントローラーと一緒に使用することもできます。
- RaspberryPiとArduinoUNO間のRS-485シリアル通信
- RS-485を使用したSTM32F103C8とArduinoUNO間のシリアル通信
RS-485とModbusについての背景を探ることから始めましょう。また、さまざまなシリアル通信プロトコルの詳細については、こちらをご覧ください。
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プロトコルと比較して高速です。
RS-485とArduinoの接続
RS-485モジュールは、シリアルポートを備えた任意のマイクロコントローラに接続できます。マイクロコントローラでRS-485モジュールを使用するには、1200メートルの長距離でのシリアル通信が可能であるため、Maxim MAX485ICに基づく5VMAX485 TTL toRS485と呼ばれるモジュールが必要です。双方向で半二重であり、データ転送速度は2.5Mbpsです。このモジュールには5Vの電圧が必要です。
RS-485のピン配列:
ピン名 |
ピンの説明 |
VCC |
5V |
A |
非反転受信機入力 非反転ドライバー出力 |
B |
受信機入力の反転 ドライバー出力の反転 |
GND |
GND(0V) |
R0 |
レシーバー出力(RXピン) |
RE |
レシーバー出力(LOW-有効) |
DE |
ドライバー出力(HIGH-Enable) |
DI |
ドライバ入力(TXピン) |
USBからRS-485へのコンバータモジュール
これは、WIN7、XP、Vista、Linux、Mac OSをサポートし、コンピューターのCOMポートを使用して使いやすいRS485インターフェースを提供するUSBからRS485へのコンバーターアダプターモジュールです。このモジュールはプラグアンドプレイデバイスです。コマンド構造はありません。仮想COMポートに送信されたものはすべて自動的にRS485に変換され、その逆も同様です。モジュールはUSBバスから完全にセルフパワーです。 そのため、動作のために外部電源は必要ありません。
シリアル/ COMポートとして表示され、アプリケーションまたはハイパーターミナルからアクセスできます。 このコンバータは、半二重RS-485通信を提供します。ボーレートの範囲は75bps〜115200 bpsで、最大6Mbpsです。
このデバイスを使用するには、インターネットで利用可能なさまざまなModbusソフトウェアがあります。このチュートリアルでは、Simply ModbusSoftwareというソフトウェアを使用します。
単にModbusマスターソフトウェア
COMを介してスレーブModbusRS-485 Arduinoデバイスにデータを送信するには、Modbusマスターソフトウェアアプリケーションが必要です。
単にModbusマスターはデータ通信テストソフトウェアです。所定のリンクからSimplyModbusマスターをダウンロードし、ソフトウェアマニュアルを参照して詳細を確認できます。
ソフトウェアを使用する前に、次の用語を理解することが重要です。
スレーブID:
ネットワーク内の各スレーブには、1〜127の一意のユニットアドレスが割り当てられます。マスターがデータを要求すると、マスターが送信する最初のバイトはスレーブアドレスです。このようにして、各スレーブは最初のバイトの後でメッセージを無視するかどうかを知ることができます。
機能コード:
マスターから送信される2番目のバイトは機能コードです。この番号は、どのテーブルにアクセスするか、およびテーブルから読み取るか、テーブルに書き込むかをスレーブに指示します。
サポートされているレジスタ機能コード:
機能コード |
アクション |
テーブル名 |
04(04 hex) |
読んだ |
アナログ入力レジスタ |
03(03 hex) |
読んだ |
アナログ出力保持レジスタ |
06(06 hex) |
シングルを書く |
アナログ出力保持レジスタ |
16(10ヘクス) |
複数書く |
アナログ出力保持レジスタ |
サポートされているコイル機能コード:
機能コード |
アクション |
テーブル名 |
02(02 hex) |
読んだ |
ディスクリート入力接点 |
01(01 hex) |
読んだ |
ディスクリート出力コイル |
05(05 hex) |
シングルを書く |
ディスクリート出力コイル |
15(0F hex) |
複数書く |
ディスクリート出力コイル |
CRC:
CRCは巡回冗長検査の略です。これは、エラー検出のためにすべてのModbusメッセージの最後に追加される2バイトです。
必要な工具
ハードウェア
- Arduino UNO
- MAX-485TTLからRS-485へのコンバータモジュール
- USBからRS-485へのコンバータモジュール
- LED(2)
- 1k-抵抗(2)
- 16x2LCDディスプレイ
- 10kポテンショメータ
- サーボモーターSG-90
ソフトウェア
- 単にModbusマスター
回路図
MAX-485TTLからRS-485へのコンバータモジュールとArduinoUNO間の回路接続:
Arduino UNO |
MAX-485TTLからRS-485へのコンバータモジュール |
0(RX) |
RO |
1(TX) |
DI |
4 |
DE&RE |
+ 5V |
VCC |
GND |
GND |
MAX-485 TTL-RS-485モジュールとUSB-RS-485コンバータ間の回路接続:
MAX-485TTLからRS-485 コンバータモジュール |
USB-RS-485モジュール PCに接続 |
A |
A |
B |
B |
ArduinoUNOと16x2LCDディスプレイ間の回路接続:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
16x2LCDのコントラスト/輝度制御用のポテンショメータのピンを制御します |
RS |
8 |
RW |
GND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
A |
+ 5V |
K |
GND |
2つのLED、サーボモーターとArduino UNO間の回路接続:
Arduino UNO |
LED1 |
LED2 |
サーボモーター |
2 |
1k抵抗を介したアノード |
- |
- |
5 |
- |
1k抵抗を介したアノード |
- |
6 |
- |
- |
PWMピン(オレンジ) |
+ 5V |
- |
- |
+ 5V(赤) |
GND |
カソードGND |
カソードGND |
GND(ブラウン) |
RS-485MODBUSスレーブ用のArduinoUNOのプログラミング
ArduinoUNOはModbusスレーブとして構成されています。また、ArduinoUNOには2つのLEDと1つのサーボモーターが取り付けられています。したがって、スレーブArduinoはマスターModbusソフトウェアから制御されます。Arduino UNOとModbusマスターソフトウェア間の通信は、RS-485モジュールを使用して行われます。PCとの接続には、USB-RS-485コンバータモジュールを使用しています。また、MAX-485TTLからRS-485へのコンバータモジュールを備えたArduinoUNOの場合、セットアップ全体は次のようになります。
ライブラリであるArduinoUNOでModbusを使用する場合
最初に、必要なライブラリを含めます。ModbusRTUライブラリはRS-485Modbus通信を使用するためのものであり、液晶ライブラリはArduino UNOでLCDを使用するためのものであり、サーボライブラリはArduinoUNOでサーボモーターを使用するためのものです。
#include
これで、Arduinoのピン2と5に接続されているLEDアノードピンがLED1とLED2として定義されます。
#define led1 2 #define led2 5
次に、液晶クラスにアクセスするためのオブジェクトは、Arduino UNOに接続されているLCDピン(RS、E、D4、D5、D6、D7)で宣言されます。
LiquidCrystal lcd(8,9,10,11,12,13);
LCDが完了したら、クラスServoのサーボオブジェクトを初期化します。また、クラスModbusのバスオブジェクトを初期化します。
サーボサーボ; Modbusバス;
次に、Modbus通信の値を格納するために、ゼロで初期化された3つの値を使用して配列が宣言されます。
uint16_t modbus_array = {0,0,0};
では 、セットアップ 機能は、まずLCDは16×2モードに設定され、ウェルカムメッセージが表示され、クリアされます。
lcd.begin(16,2); // 16x2モードで設定されたLCD lcd.print( "RS-485 Modbus"); //ウェルカムメッセージ lcd.setCursor(0,1); lcd.print( "Arduino Slave"); delay(5000); lcd.clear();
この後、LED1とLED2のピンが出力ピンとして設定されます。
pinMode(led1、OUTPUT); pinMode(led2、OUTPUT);
ArduinoのPWMピン6に接続されたサーボパルスピンが取り付けられています。
Servo.attach(6);
これで、Modbus通信用に次のパラメータが設定されます。最初の「1」はスレーブIDを表し、2番目の「1」はRS-485を使用してデータを転送することを表し、「4」はArduinoUNOに接続されたRS-485DE&REピンを表します。
バス= Modbus(1,1,4);
Modbusスレーブは9600ボーレートに設定されています。
ループはバスポーリングの定義から始まり、 bus.poll() を使用してマスターModbusから値を読み書きします。
bus.poll(modbus_array、sizeof(modbus_array)/ sizeof(modbus_array));
このメソッドは、シリアルポートで使用可能なデータがあるかどうかを確認するために使用されます。
シリアルポートで利用可能なデータがある場合、Modbus RTUライブラリはメッセージをチェックし(デバイスアドレス、データ長、およびCRCをチェックします)、必要なアクションを実行します。
たとえば、マスターから任意の値を読み書きするには、ModbusRTUはマスターModbusから符号なし16ビット整数配列とその長さを受信する必要があります。この配列は、マスターから書き込まれたデータを伝送します。
このチュートリアルでは、LED1、LED2、およびサーボモーター角度用の3つのアレイがあります。
最初にLED1をオンまたはオフにするためにmodbus_arrayが使用されます。
if(modbus_array == 0)//マスターModbusによって書き込まれたmodubus_arrayの値に依存 { digitalWrite(led1、LOW); // 0の場合はLEDオフ lcd.setCursor(0,0); lcd.print( "L1:OFF"); } else { digitalWrite(led1、HIGH); //値が0以外の場合はLEDが点灯します lcd.setCursor(0,0); lcd.print( "L1:ON"); }
次に、LED2modbus_arrayをオンまたはオフにします。
if(modbus_array == 0)//マスターによって書き込まれたmodbus_arrayの値に依存しますModbus { digitalWrite(led2、LOW); // 0の場合はLEDオフ lcd.setCursor(8,0); lcd.print( "L2:OFF"); } else { digitalWrite(led2、HIGH); //値が0以外の場合はLEDオン lcd.setCursor(9,0); lcd.print( "L2:ON"); }
次に、使用するmodbus_arrayと値が16x2LCDディスプレイに出力されるサーボモーターの角度を設定します。
int pwm = modbus_array; Servo.write(pwm); lcd.setCursor(0,1); lcd.print( "サーボ角度:"); lcd.print(pwm); delay(200); lcd.clear();
これで、ArduinoUNOをMODBUSスレーブとして動作させるためのプログラミングが完了しました。次のステップは、Modbusスレーブとしてテストすることです。
ArduinoUNOをRs485Modbusスレーブとしてテスト
回路接続が完了し、コードがArduino UNOにアップロードされたら、Simple ModbusMasterソフトウェアがインストールされているPCでUSBをRS-485モジュールに接続します。
デバイスマネージャを開き、USB-RS-485モジュールが接続されているPCに応じてCOMポートを確認し、その後、Simply Modbus Master8.1.1ソフトウェアを開きます。
1. Simply Modbus Software を開い たら 、書き込みオプションを開きます。
2. 単にModbusマスター 書き込みが開かれた後。パラメータを設定します
RTUのモード、PCに応じたCOMポート(私の場合はCOM6)、9600のボー、データビット8、ストップビット1、パリティなし、スレーブIDは1。
3.その後、最初のレジスタを40001に設定し、書き込む値を3、機能コードを16(書き込み保持レジスタ)に設定します。
その後、1〜40001(LED1オンの場合)、1〜40002(LED2オンの場合)、90〜40003(サーボモータ角度の場合)と書き込み、送信ボタンをクリックします。
LEDステータスがオンでサーボ角度が90度であることがわかります。
4.その後、40001を1、40002を0、40003を180と入力し、[送信]ボタンをクリックします。
5.ここで、135から40003および40001を0として、40002を1として書き込みます。
これは、RS-485ModbusをスレーブとしてArduinoUNOとのシリアル通信で使用する方法です。次のチュートリアルでは、ModBUSコミネーションのマスターとしてArduinoUnoを使用します。
以下の完全なコードとデモンストレーションビデオを見つけてください。