- RS-485シリアル通信
- 必要なコンポーネント
- 回路図
- RS485シリアル通信用のSTM32F103C8とArduinoUNOのプログラミング
- STM32F103C8とArduinoUNO間のRS485通信のテスト:
通信プロトコルは、デジタル電子機器と組み込みシステムの不可欠な部分です。複数のマイクロコントローラーと周辺機器のインターフェースがある場合は常に、大量のデータを交換するために通信プロトコルを使用する必要があります。利用可能なシリアル通信プロトコルには多くの種類があります。RS485はシリアル通信プロトコルの1つであり、産業プロジェクトや重機で使用されます。
前のチュートリアルで、ArduinoUnoとArduinoNano間のRS485シリアル通信について学びました。このチュートリアルは、STM32F103C8マイクロコントローラーでのRS-485シリアル通信の使用に関するものです。STM32マイクロコントローラーを初めて使用する場合は、Arduino IDEを使用したSTM32入門:LEDの点滅から始めて、ここですべてのSTM32プロジェクトを確認してください。
このチュートリアルでは、マスターSTM32F103C8には、RS-485シリアル通信を使用してスレーブArduinoUnoに存在する3つのLEDのステータスを制御するために使用される3つのプッシュボタンがあります。
RS-485シリアル通信の仕組みを理解することから始めましょう。
RS-485シリアル通信
RS-485は、クロックを必要としない非同期シリアル通信プロトコルです。差動信号と呼ばれる手法を使用して、あるデバイスから別のデバイスにバイナリデータを転送します。
では、この差動信号転送方法は何ですか?
差動信号方式は、正と負の5Vを使用して差動電圧を生成することによって機能します。2線を使用する場合は半二重通信を提供し、4線を使用する場合は全二重通信を提供します。
この方法を使用することにより:
- RS-485は最大30Mbpsのより高いデータ転送速度をサポートします。
- また、RS-232プロトコルと比較して最大のデータ転送距離を提供します。最大1200メートルまでのデータを転送します。
- RS-232に対するRS-485の主な利点は、単一のマスターを備えた複数のスレーブですが、RS-232は単一のスレーブのみをサポートします。
- RS-485プロトコルに接続された最大32のデバイスを持つことができます。
- RS-485のもう1つの利点は、差動信号方式を使用して転送するため、ノイズの影響を受けません。
- RS-485はI2Cプロトコルと比較して高速です。
RS-485モジュールは、シリアルポートを備えた任意のマイクロコントローラに接続できます。マイクロコントローラでRS-485モジュールを使用するには、Maxim MAX485ICに基づく5VMAX485 TTLからRS485と呼ばれるモジュールが必要です。これは、1200メートルの長距離でのシリアル通信を可能にし、双方向であり、半二重のデータ転送速度は2.5です。 Mbps。このモジュールには5Vの電圧が必要です。
RS-485ピンの説明:
ピン名 |
説明 |
VCC |
5V |
A |
非反転受信機入力 非反転ドライバー出力 |
B |
受信機入力の反転 ドライバー出力の反転 |
GND |
GND(0V) |
R0 |
レシーバー出力(RXピン) |
RE |
レシーバー出力(LOW-有効) |
DE |
ドライバー出力(HIGH-Enable) |
DI |
ドライバ入力(TXピン) |
RS485モジュールには次の機能があります。
- 動作電圧:5V
- オンボードMAX485チップ
- RS485通信の低消費電力
- スルーレート制限トランシーバー
- 5.08mmピッチ2P端子
- 便利なRS-485通信配線
- チップのすべてのピンは、マイクロコントローラーを介して制御することができます
- ボードサイズ:44 x 14mm
このモジュールをSTM32F103C8およびArduinoUNOで使用するのは非常に簡単です。マイクロコントローラのハードウェアシリアルポートが使用されます。STM32とarduinoUNOのハードウェアシリアルピンを以下に示します。
- STM32F103C8の場合:ピンPA9(TX)およびPA10(RX)
- Arduino Unoの場合:ピン0(RX)および1(TX)
プログラミングだけの使用も簡単ですSerial.printを() RS-485およびへの書き込みにSerial.Read() RS-485およびピンから読み取るDE&REのRS-485が行われ、データを受信するためのLOWをして作られたにHIGHをRS-485バスにデータを書き込みます。
必要なコンポーネント
- STM32F103C8
- Arduino UNO
- MAX485 TTLからRS485へのコンバータモジュール-(2)
- 10Kポテンショメータ
- プッシュボタン-3
- LED-3
- 抵抗器
- ブレッドボード
- 接続線
回路図
このチュートリアルでは、STM32F103C8が1つのRS-485モジュールでマスターとして使用され、ArduinoUNOが別のRS-485モジュールでスレーブとして使用されます。
RS-485とSTM32F103C8(マスター)間の回路接続:
RS-485 |
STM32F103C8 |
DI |
PA9(TX1) |
DE RE |
PA3 |
R0 |
PA10(RX1) |
VCC |
5V |
GND |
GND |
A |
スレーブRS-485のAへ |
B |
スレーブRS-485のBへ |
3つのプッシュボタンを備えたSTM32F103C8:
10kの3つのプルダウン抵抗を備えた3つの押しボタンがSTM32F103C8のピンPA0、PA1、PA2に接続されています。
RS-485とArduinoUNO(スレーブ)間の回路接続:
RS-485 |
Arduino UNO |
DI |
1(TX) |
DE RE |
2 |
R0 |
0(RX) |
VCC |
5V |
GND |
GND |
A |
マスターRS-485のAへ |
B |
マスターRS-485のBへ |
330オームの抵抗を備えたLEDのアノードがArduinoUNOのピン4、7、8に接続され、LEDのカソードがGNDに接続されている場合、3つのLEDが使用されます。
RS485シリアル通信用のSTM32F103C8とArduinoUNOのプログラミング
Arduino IDEは、STM32とArduinoUNOの両方のボードの開発とプログラミングに使用されます。ただし、[ツール]-> [ポートとボード]から[ツール]-> [ボード]から対応するポートを選択していることを確認してください。問題や疑問を見つけた場合は、ARDUINOIDEでのSTM32のプログラミングを参照してください。このチュートリアルのプログラミングは、STM32F103C8(マスター)用とArduino UNO(スレーブ)用の2つのセクションで構成されています。両方のコードを以下に1つずつ説明します。
マスターとしてのSTM32F103C8マスター側では、プッシュボタンのステータスが読み取られ、STM32F103C8のハードウェアシリアルポート1(PA9、PA10)を介してRS-485バスにシリアルに書き込まれます。また、現時点では外部ライブラリは必要ありません。Arduinoには、シリアル通信に必要なすべてのライブラリがあります。
9600のbuadrateでハードウェアシリアルピン(PA9、PA10)を使用してシリアル通信を開始します。
Serial1.begin(9600);
STM32F103C8のピンPA0、PA1、PA2で押しボタンのステータスを読み取り、それらを変数button1val、button2val、button3valに格納します。ボタンが押されている場合は値がHIGHになり、押されていない場合はLOWになります。
int button1val = digitalRead(button1); int button2val = digitalRead(button2); int button3val = digitalRead(button3);
ボタンの値をシリアルポートに送信する前に、RS-485のピンDEおよびREは、STM32F103C8のピンPA3に接続されているHIGHである必要があります(ピンPA3をHIGHにするには)。
digitalWrite(enablePin、HIGH);
次に、これらの値をシリアルポートに配置し、押されたプッシュボタンに応じて値を送信します。ifelseステートメントを使用して、ボタンが押されたときに対応する値を送信します。
最初のボタンが押されると、条件が一致し、値「1」がArduinoUNOが接続されているシリアルポートに送信されます。
if(button1val == HIGH) { int num1 = 1; Serial1.println(num1); }
同様に、ボタン2を押すと、値2がシリアルポートを介して送信され、ボタン3を押すと、値3がシリアルポートを介して送信されます。
else if(button2val == HIGH) { int num2 = 2; Serial1.println(num2); } else if(button3val == HIGH) { int num3 = 3; Serial1.println(num3); }
また、ボタンが押されていない場合、値0がArduinoUnoに送信されます。
else { int num = 0; Serial1.println(num); }
これで、STM32をマスターとして構成するためのプログラミングが終了します。
スレーブとしてのArduinoUNOスレーブ側では、Arduino UNOは、RS-485モジュールが接続されているArduino UNOのハードウェアシリアルポート(P0、1)で利用可能なマスターSTM32F103C8から送信される整数値を受信します。
値を読み取り、変数に格納するだけです。受信した値に応じて、対応するLEDがオンまたはオフになり、ArduinoGPIOに接続されます。
マスターから値を受け取るには、RS-485モジュールのピンDEとREをLOWにします。そのため、Arduino UNOのピン2(enablePin)はLOWになります。
digitalWrite(enablePin、LOW);
次に、シリアルポートで利用可能な整数データを読み取り、それらを変数に格納します。
int receive = Serial.parseInt();
受信した値(0、1、2、3)に応じて、対応する3つのLEDの1つがオンになります。
if(receive == 1)//受信した値に応じて、対応するLEDがオンまたはオフになります { digitalWrite(ledpin1、HIGH); } else if(receive == 2) { digitalWrite(ledpin2、HIGH); } else if(receive == 3) { digitalWrite(ledpin3、HIGH); } else { digitalWrite(ledpin1、LOW); digitalWrite(ledpin2、LOW); digitalWrite(ledpin3、LOW); }
これで、ArduinoUNOのプログラミングとスレーブとしての構成が完了しました。また、これでArduinoUNOとSTM32の完全な構成が完了します。作業ビデオとすべてのコードは、このチュートリアルの最後に添付されています。
STM32F103C8とArduinoUNO間のRS485通信のテスト:
1.マスターSTM32に接続されているプッシュボタン-1を押すと、スレーブArduinoに接続されているLED1がオンになります。
2.マスターSTM32に接続されているプッシュボタン-2を押すと、LED2がオンになります。スレーブArduinoに接続されています。
3.同様に、プッシュボタン-3を押すと、スレーブArduinoに接続されたLED3がオンになります。
これで、STM32F103C8とArduinoUNO間のRS485シリアル通信が終了します。Arduino UNOおよびSTM32ボードは、ラピッドプロトタイピングに広く使用されているボードであり、これらのボードで多くの有用なプロジェクトを行ってきました。疑問や提案がある場合は、以下に書き込んでコメントしてください。