M5Stackを利用した風速センサー(SEN0483)の動作方法、RS485通信について

実現したいこと

当方初の質問となるため、不足があれば申し訳ございません。
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

コメントを投稿

0 コメント