- 必要なコンポーネント
- 433Mhz RF送信機および受信機モジュール)
- STM32F103C8を使用したRF送信機の回路図
- ArduinoUnoを搭載したRF受信機の回路図
- ワイヤレスRF伝送用のSTM32F103C8のプログラミング
- ArduinoUNOをRF受信機としてプログラミング
- STM32ベースのRF送信機と受信機のテスト
組み込み電子機器でワイヤレスプロジェクトを作成することは、デバイスをより便利でポータブルにするために配線が乱雑にならないため、非常に重要で役立ちます。Bluetooth、WiFi、433 MHz RF(無線周波数)など、さまざまなワイヤレステクノロジがあります。すべてのテクノロジには、コスト、距離または範囲の転送、速度またはスループットなど、独自の長所と短所があります。今日は、STM32でRFモジュールを使用します。データをワイヤレスで送受信します。STM32マイクロコントローラーを初めて使用する場合は、Arduino IDEを使用してSTM32でLEDを点滅させることから始め、他のすべてのSTM32プロジェクトをここで確認してください。
これとは別に、RF 433Mhzワイヤレスモジュールを他のマイクロコントローラーとともに使用して、次のようなワイヤレス制御プロジェクトを構築しました。
- RF制御家電
- RaspberryPiを使用したRFリモート制御LED
- RF制御ロボット
- RFモジュールとArduinoのインターフェース
- RFモジュールを使用したPIC間通信
ここでは、433MHzRFワイヤレスモジュールをSTM32F103C8マイクロコントローラーとインターフェースします。プロジェクトは2つの部分に分かれています。送信機はSTM32とインタフェースされると、受信機は、ArduinoのUNOとインタフェースします。送信部分と受信部分の両方で異なる回路図とスケッチがあります。
このチュートリアルでは、RF送信機が受信機側に2つの値を送信します。超音波センサーを使用して測定された距離と、(0〜100)の数値としてマッピングされた電位差計ADC値(0〜4096)です。ArduinoのRF受信機は両方の値を受信し、それらの距離と数値を16x2LCDディスプレイにワイヤレスで出力します。
必要なコンポーネント
- STM32F103C8マイクロコントローラー
- Arduino UNO
- 433MhzRF送信機および受信機
- 超音波センサー(HC-SR04)
- 16x2LCDディスプレイ
- 10kポテンショメータ
- ブレッドボード
- 接続線
433Mhz RF送信機および受信機モジュール)
RF送信機のピン配列:
433MhzRF送信機 |
ピンの説明 |
蟻 |
アンテナ接続用 |
GND |
GND |
VDD |
3.3〜5V |
データ |
受信機に送信されるデータはここにあります |
RFレシーバーのピン配列:
433MhzRFレシーバー |
使用する |
蟻 |
アンテナ接続用 |
GND |
GND |
VDD |
3.3〜5V |
データ |
送信機から受信するデータ |
CE / DO |
データピンでもあります |
433 MHzモジュールの仕様:
- 受信者動作電圧:3V〜5V
- 送信機動作電圧:3V〜5V
- 動作周波数:433 MHz
- 伝送距離:3メートル(アンテナなし)から100メートル(最大)
- 変調技術:ASK(振幅偏移変調)
- データ転送速度:10Kbps
STM32F103C8を使用したRF送信機の回路図
RF送信機とSTM32F103C8間の回路接続:
STM32F103C8 |
RF送信機 |
5V |
VDD |
GND |
GND |
PA10 |
データ |
NC |
蟻 |
超音波センサーとSTM32F103C8間の回路接続:
STM32F103C8 |
超音波センサー(HC-SR04) |
5V |
VCC |
PB1 |
トリガー |
PB0 |
エコー |
GND |
GND |
10KポテンショメータはSTM32のADCピンPA0に(3.3Vに0)入力されたアナログ値を提供するSTM32F103C8に接続されています。
ArduinoUnoを搭載したRF受信機の回路図
RFレシーバーとArduinoUNO間の回路接続:
Arduino UNO |
RF受信機 |
5V |
VDD |
GND |
GND |
11 |
データ |
NC |
蟻 |
16x2LCDとArduinoUNO間の回路接続:
LCDピン名 |
ArduinoUNOピン名 |
グラウンド(Gnd) |
地面(G) |
VCC |
5V |
VEE |
コントラスト用のポテンショメータの中心からのピン |
レジスタ選択(RS) |
2 |
読み取り/書き込み(RW) |
地面(G) |
有効(EN) |
3 |
データビット4(DB4) |
4 |
データビット5(DB5) |
5 |
データビット6(DB6) |
6 |
データビット7(DB7) |
7 |
LEDポジティブ |
5V |
LEDネガティブ |
地面(G) |
コーディングについては、以下で簡単に説明します。スケッチには2つの部分があり、最初の部分が送信機セクションになり、もう1つが受信機セクションになります。すべてのスケッチファイルと作業ビデオは、このチュートリアルの最後にあります。RFモジュールとArduinoUnoのインターフェースの詳細については、リンクをたどってください。
ワイヤレスRF伝送用のSTM32F103C8のプログラミング
STM32F103C8は、ArduinoIDEを使用してプログラムできます。FTDIのプログラマやST-LinkのはSTM32F103C8にコードをアップロードする必要はありません。STM32のUSBポート経由でPCに接続し、ARDUINOIDEでプログラミングを開始するだけです。リンクをたどると、ArduinoIDEでのSTM32のプログラミングを学ぶことができます。
送信機セクションでは、超音波センサーを使用して「cm」単位の物体の距離を測定し、STM32に接続されたRF送信機を介して送信される電位差計を使用して(0〜100)の数値を設定します。
まず、レディオヘッドライブラリが含まれています。ここからダウンロードできます。このライブラリはASK(振幅偏移変調技術)を使用してデータを送受信します。これにより、プログラミングが非常に簡単になります。Sketch-> include library-> Add.zip libraryに移動して、スケッチにライブラリを含めることができます 。
#include
送信機側のこのチュートリアルのように、超音波センサーを使用して距離を測定し、トリガーピンとエコーピンを定義します。
#define trigPin PB1 #define echoPin PB0
次に、RH_ASKライブラリのオブジェクト名は、速度(2000)、RXピン(PA9)、TXピン(PA10)などのパラメーターを使用してrf_driverとして設定されます。
RH_ASK rf_driver(2000、PA9、PA10);
次に、このプログラムで必要なStrings変数が宣言されます。
文字列transmit_number; 文字列transmit_distance; 文字列送信;
次に、void setup()で、RH_ASKrf_driverのオブジェクトが初期化されます。
rf_driver.init();
その後、トリガーピンをOUTPUTピン、PA0(ポテンショメータに接続)、エコーピンをINPUTピンに設定します。シリアル通信は9600のボーレートで開始されます。
Serial.begin(9600); pinMode(PA0、INPUT); pinMode(echoPin、INPUT); pinMode(trigPin、OUTPUT);
次にvoidloop()で、入力アナログ電圧であるポテンショメータ値がデジタル値に変換されます(ADC値が見つかります)。STM32のADCは12ビットの分解能を持っているので。したがって、デジタル値は(0から4096)まで変化し、(0から100)にマップされます。
intアナログ入力= analogRead(PA0); int pwmvalue = map(analoginput、0,4095,0,100);
次に、超音波センサーを使用して、2マイクロ秒の遅延でトリガーを高低に設定して距離を測定します。
digitalWrite(trigPin、LOW); delayMicroseconds(2); digitalWrite(trigPin、HIGH); delayMicroseconds(10); digitalWrite(trigPin、LOW);
エコーピンは反射波を感知します。つまり、トリガーされた波が反射して戻る時間は、式を使用してオブジェクトの距離を計算する際に使用されます。リンクをたどって、超音波センサーが距離を計算する方法の詳細をご覧ください。
長い持続時間= pulseIn(echoPin、HIGH); フロート距離=継続時間* 0.034 / 2;
これで、測定されたデータ番号と距離の両方が文字列データに変換され、それぞれの文字列変数に格納されます。
transmit_number = String(pwmvalue); transmit_distance = String(distance);
両方の文字列が1行として追加され、送信と呼ばれる文字列に格納されます。コンマ「、」は2つの文字列を区切るために使用されます。
送信=送信= pwm + "、" +送信距離;
送信文字列は文字配列に変換されます。
const char * msg = transmit.c_str();
データが送信され、送信されるまで待ちます。
rf_driver.send((uint8_t *)msg、strlen(msg)); rf_driver.waitPacketSent();
送信された文字列データは、シリアルモニターにも表示されます。
Serial.println(msg);
ArduinoUNOをRF受信機としてプログラミング
Arduino UNOは、ArduinoIDEを使用してプログラムされます。受信機セクションでは、送信機セクションから送信され、RF受信機モジュールによって受信されたデータと受信された文字列データがそれぞれのデータ(距離と数値)に分割され、16x2LCDディスプレイに表示されます。
受信機のコーディングを簡単に見てみましょう。
送信機セクションと同様に、最初にRadiohHeadライブラリが含まれています。このライブラリはASK(振幅偏移変調技術)を使用してデータを送受信します。これにより、プログラミングが非常に簡単になります。
#include
ここでは液晶ディスプレイを使用しているので、液晶ライブラリも含まれています。
#include
また、ArduinoUNOに接続された16x2LCDディスプレイピンは、lcdをオブジェクトとして使用して指定および宣言されます。
LiquidCrystal lcd(2,3,4,5,6,7);
次に、文字列データを格納する文字列データ変数が宣言されます。
文字列str_receive; 文字列str_number; 文字列str_distance;
Radioheadライブラリのオブジェクトが宣言されています。
RH_ASK rf;
これでvoidsetup ()で、 LCDディスプレイが16x2モードに設定され、ウェルカムメッセージが表示されてクリアされます。
lcd.begin(16,2); lcd.print( "CIRCUIT DIGEST"); lcd.setCursor(0,1); lcd.print( "RF with STM32"); delay(5000); lcd.clear();
その後、 rf オブジェクトが初期化されます。
rf.init();
今で ボイドループ()、 データ送信機から送信されるようにアレイBUFを7としてサイズで宣言された「」を含む7を有しています。そのため、送信するデータに応じて変更してください。
uint8_t buf; uint8_t buflen = sizeof(buf);
文字列がrfレシーバーモジュールで使用可能な場合、if関数はサイズをチェックして実行します。 rf.recv()は 、データを受信するために使用されます。
if(rf.recv(buf、&buflen))
BUFは、 受信した文字列を有しているので、受信した文字列が中に記憶されている str_receive 文字列変数。
str_receive = String((char *)buf);
この for ループは、2つの文字列の間に「、」が検出された場合に、受信した文字列を2つに分割するために使用されます。
for(int i = 0; i <str_receive.length(); i ++) { if(str_receive.substring(i、i + 1)== "、") { str_number = str_receive.substring(0、i); str_distance = str_receive.substring(i + 1); ブレーク; }
2つの値に対して2つのchar配列が宣言され、2つに分割された文字列は、文字列を文字配列に変換することにより、尊重された配列に格納されます。
char numberstring; char distancestring; str_distance.toCharArray(distancestring、3); str_number.toCharArray(numberstring、3);
その後、atoi()を使用して文字配列を整数に変換します
int distance = atoi(distancestring); int number = atoi(numberstring);
整数値に変換した後、値の距離と数値が16x2LCDディスプレイに表示されます
lcd.setCursor(0,0); lcd.print( "Number:"); lcd.print(number); lcd.setCursor(0,1); lcd.print( "距離:"); lcd.print(distance); lcd.print( "cm");
STM32とArduinoUNOにそれぞれ送信機と受信機の両方のコードをアップロードした後、STM32を使用して測定された数や物体距離などのデータがRF送信機を介してRF受信機に送信され、受信した値がLCDディスプレイにワイヤレスで表示されます。
STM32ベースのRF送信機と受信機のテスト
1.数字が0で、物体の距離が6cmの場合。
2.47番で物体の距離が3cmの場合。