実現したいこと
当方初の質問となるため、不足があれば申し訳ございません。
M5Stack(Basic)を利用してSen0483(風速センサー)の値を読み取りたい。
また、M5StackとSen0483の間はRS485にて通信を行うためUARTに変換するための
変換器を使用(M5STACK-U094)。
前提
プログラムを作成したが、コマンドを送信しても送信時と同じ内容で受信する。
送信内容: byte wind_speed_ref_frame[] = {0x02, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x39};
受信内容:2 3 0 0 0 1 84 39
3番目、4番目のバッファから風速を計算するが、変動がない。
・接続について
SEN0483風速センサーのA+をM5Stack Isolated RS485ユニットのAに、B-をBに接続。
SEN0483風速センサーのV+を電源の正極に接続し、GNDを電源の接地に接続。
M5Stack Isolated RS485ユニットのVCCを電源の正極に接続し、GNDを電源の接地に接続。
M5Stack Isolated RS485ユニットのTXをM5StackのシリアルポートのRXに接続。
M5Stack Isolated RS485ユニットのRXをM5StackのシリアルポートのTXに接続。
・RS485通信について
風速センサー⇔変換器間のRS485通信のデータになります。
発生している問題・エラーメッセージ
無し
該当のソースコード
Arduino
#include <M5Stack.h> #include <SoftwareSerial.h> #define RS485_BAUDRATE 9600 // RS485通信のボーレート #define RS485_TX_PIN 17 // RS485変換モジュールのTXピン (GPIO17) #define RS485_RX_PIN 16 // RS485変換モジュールのRXピン (GPIO16) // RS485通信用のシリアルポート SoftwareSerial RS485Serial(RS485_RX_PIN, RS485_TX_PIN); void setup() { M5.begin(); Serial.begin(9600); // シリアル通信を開始 RS485Serial.begin(RS485_BAUDRATE); // RS485通信の設定 Serial.println("Start"); } void loop() { Serial.println("-----------------------------------------------"); Serial.println("Sending read request"); // 要求コマンドをRS485通信で送信 byte wind_speed_ref_frame[] = {0x02, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x39}; RS485Serial.write(wind_speed_ref_frame, sizeof(wind_speed_ref_frame)); delay(10); // 送信完了まで少し待機 // データの受信を待つ unsigned long startMillis = millis(); while (RS485Serial.available() < 8) { if (millis() - startMillis > 1000) { Serial.println("Error: Timeout waiting for response"); return; } } // 応答データをRS485通信で受信 byte buf[8]; RS485Serial.readBytes(buf, 8); // 受信したデータを16進数としてシリアルモニターに表示 Serial.println("Received data:"); for (int i = 0; i < 8; i++) { Serial.print(buf[i], HEX); Serial.print(" "); } Serial.println(); // 風速データの解析と表示 if (buf[0] == 0x02 && buf[1] == 0x03 && buf[2] == 0x04) { // 風速データが受信されたことを確認し、解析する uint16_t windSpeedRaw = (buf[4] << 8) | buf[5]; // バイト4と5から風速の生データを取得 float windSpeed = windSpeedRaw / 10.0; // データを10で割って実際の風速に変換 Serial.print("Wind Speed: "); Serial.print(windSpeed); Serial.println(" m/s"); } else { Serial.println("Error: Unexpected response format"); } delay(3000); // 3秒待機 }
試したこと
➀RS485通信には終端抵抗を入れる必要があるとのことで100Ωの抵抗をM5Stack側に入れる。
②TX,RXの通信ラインの入れ替え(逆接の確認)
③風速センサーを取り外し、M5Stackと変換器のみで動作
⇒「2 3 0 0 0 1 84 39」を受信したため、そもそも風速センサーとの通信が出来ていない?
補足情報(FW/ツールのバージョンなど)
➀M5Stack Basic
②風速センサーhttps://wiki.dfrobot.com/RS485_Wind_Speed_Transmitter_SKU_SEN0483#target_4
③変換器
https://www.switch-science.com/products/6622?_pos=2&_sid=73f0e7633&_ss=r
回答1件
あなたの回答
tips
プレビュー