質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
M5Stack

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

1回答

684閲覧

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

mameta0509

総合スコア1

M5Stack

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

1クリップ

投稿2024/04/04 06:50

編集2024/04/08 02:05

実現したいこと

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

補足:簡易回路図
イメージ説明
イメージ説明

オシロスコープ
➀センサー側
イメージ説明
②M5側
イメージ説明
イメージ説明
③M5側 センサー取り外し
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2024/04/04 07:30

送信したデータと同じデータの後にさらにデータあったりしませんか?
mameta0509

2024/04/04 07:48

回答ありがとうございます。下記内容の繰り返しになります。 16:42:43.867 -> Sending read request 16:42:43.899 -> Received data: 16:42:43.899 -> 2 3 0 0 0 1 84 39 16:42:43.931 -> Error: Unexpected response format 3,4バイト目が風速センサーの返り値になるのですが、常時同じ値が返ってきています。
ozwk

2024/04/04 08:46 編集

変換ユニットのGNDはuart側とRS485側がありますが両方とも繋いでいますか?
mameta0509

2024/04/04 14:33

GNDは共通にしております。
ozwk

2024/04/04 16:40

それは両方のGNDから線を出して同じところに繋いでるという意味ですか 終端抵抗はAB間に入れるものですが入れるとどうなりますか センサーの電源電圧はいくつですか 配線にミスがないか疑っています。配線図か写真はありますか
mameta0509

2024/04/04 21:40

その通りです。M5側のGNDと風速センサ側のGNDを繋げており、そこからRS485,UART側に繋いでおります。
ozwk

2024/04/04 22:25

終端抵抗はAB間に入れるものですが入れるとどうなりますか。 センサーの電源電圧はいくつですか。 配線にミスがないか疑っています。配線図か写真はありますか。
mameta0509

2024/04/05 06:44 編集

申し訳ありません。配線の写真については月曜日撮影して送らせていただきます。 終端抵抗に関してはAB間に100Ω、M5側のTX,RX間に100Ωそれぞれ入れています。 追記、回路図画像追加しました。手書きなのと外で書いているため汚くて申し訳ありません。 月曜日実物を見ながら改めておくります。
tmp

2024/04/05 08:36

ozwkさんが言ってるように8バイトの後に8バイトありませんか? 通信線が1対なので自分が送信したデータは自分自身も受信すると思うのですが また、オシロをよく見ると3秒間隔で、2本の線があり、 1本目がM5からの送信で2本目がセンサーの送信と見えるのですが、 2本線を拡大することはできますか? とりあえず8バイト待って、8バイト表示、バッファ等を16するとHEX表示はどうなりますか?永久に待ち続けますか?
thkana

2024/04/06 00:41 編集

せっかくオシロがあるのだから100us/divぐらいで取って、通信線に何が載っているのか目でデコードしてみたら良いのでは? (オシロにUARTのデコード機能も付いてるかな?) 485のラインと、UARTの(マイコンから見て)RXのラインとをそれぞれ。 あと、センサを外してRS485コンバータだけで動かしたらどうなるか、というのもちょっとだけ興味があるけれど。
thkana

2024/04/06 00:46

それと、投稿時のソースコード部分の記述のしかたが間違っているようです。 ``` ソースコード ``` となるように、行頭からの```でソースコードを囲むようにしてみてください。
thkana

2024/04/06 00:50

(本題とは関係ありませんが、UARTのRX/TXを任意のGPIOピンに割り当てられるESP32でSoftwareSerialを使うことなんてないのに...とは思います)
mameta0509

2024/04/08 02:01

申し訳ありません。文章の見落としもあり、回答させていただきます。 ・センサー電源電圧について センサー電源電圧については12Vで行っています。 ・オシロ測定間隔変更 オシロスコープの測定を100μsに変更し、再度測定しました。 測定したデータは補足に追加致します。 ・プログラムについて プログラムについて、完全に独学で見様見真似でやっているところがあり、少々粗は多いかもしれません。申し訳ありません・・・
ozwk

2024/04/08 02:41

やっぱり送信と同じ内容のデータの後ろに応答があるような気がするので15バイト受信してみてください。(コマンドの応答は7バイトです。)
ozwk

2024/04/08 02:45 編集

あと if (buf[0] == 0x02 && buf[1] == 0x03 && buf[2] == 0x04) とありますが2バイト目の0x04は0x02かと思います。
tmp

2024/04/08 03:26 編集

何故、風速センサーのYellow(RS485+/A/T+),Green(RS485-/B/T-)をA,Bに接続しないのですか? また、M5Stack用絶縁型RS485ユニット 「絶縁型」なのに、RS475側のGNDとM5のGNDをつなげているのですか?
mameta0509

2024/04/08 04:18

>>やっぱり送信と同じ内容のデータの後ろに応答があるような気がするので15バイト受信してみてくださ>>>い。(コマンドの応答は7バイトです。) 下記のような変更ということでしょうか? byte buf[8];  RS485Serial.readBytes(buf, 8); ⇩ byte buf[15]; RS485Serial.readBytes(buf, 15); >>if (buf[0] == 0x02 && buf[1] == 0x03 && buf[2] == 0x04) >>とありますが2バイト目の0x04は0x02かと思います。 おっしゃる通りです。修正致します。 >>何故、風速センサーのYellow(RS485+/A/T+),Green(RS485-/B/T-)をA,Bに接続しないのですか? >>また、M5Stack用絶縁型RS485ユニット 「絶縁型」なのに、RS475側のGNDとM5のGNDをつなげ>>ているのですか? ⇒申し訳ありません。写真だと取り外しているのですが、実際には接続しています。M5と変換器の単独試験後に写真を撮ったため、外れていました・・・GNDを繋げている理由は最初切り離していたのですが、A,Bの波形を見た際にノイズになっていたため、繋げました。 追記になります。シリアル通信でログを見ていて思ったのですが、受信するバッファはズレているよな現象が発生します。これはプログラムのミスでしょうか? 12:00:14.631 -> ----------------------------------------------- 12:00:14.664 -> Sending read request 12:00:14.696 -> Received data: 12:00:14.727 -> 2 3 2 0 0 FC 44 2 12:00:14.727 -> Wind Speed: 25.20 m/s 11:59:55.110 -> ----------------------------------------------- 11:59:55.197 -> Sending read request 11:59:55.199 -> Received data: 11:59:55.207 -> 3 2 0 0 FC 44 2 3 11:59:55.207 -> Error: Unexpected response format 1:59:58.193 -> ----------------------------------------------- 11:59:58.225 -> Sending read request 11:59:58.257 -> Received data: 11:59:58.257 -> 2 0 0 FC 44 2 3 2 11:59:58.288 -> Error: Unexpected response format 2 3 2が頭にくると思うのですが・・・
ozwk

2024/04/08 04:50 編集

> 下記のような変更ということでしょうか? はい。 風速のデータは後ろ7バイトですのでデータの取得も適宜直してください ログを見るとちゃんと後ろにデータが来ていますね。 > これはプログラムのミスでしょうか? はい。送信したものがそのまま戻って来る8バイトと風速センサが返す7バイトを受信しなければならないのですが、プログラムは8バイトを読むので1つずれているように見えますね。
mameta0509

2024/04/08 05:17

15バイト受信にして動作させてみたところ無事通信と風速が出るようになりました!が、最初の8バイトが送信した物がそのまま帰ってきているような感じではなく、どちらかというと2回連続で受信しているような印象を受けます。 14:13:28.522 -> Sending read request 14:13:29.502 -> Received data: 14:13:29.502 -> 2 3 2 0 0 FC 44 2 3 2 0 16 7D 8A 3F 14:13:29.572 -> Wind Speed: 25.20 m/s 14:13:32.518 -> ----------------------------------------------- 14:13:32.549 -> Sending read request 14:13:33.504 -> Error: Timeout waiting for response 14:13:33.569 -> ----------------------------------------------- 14:13:33.599 -> Sending read request 14:13:34.611 -> Received data: 14:13:34.611 -> 2 3 2 0 16 7D 8A 2 3 2 0 15 3D 8B 3F 14:13:34.643 -> Wind Speed: 575.70 m/s あと、このままだと風速が早すぎる感じもしますね(笑)。回していない初期状態で風速25.20msあるのもきになりますが・・・
guest

回答1

0

ベストアンサー

RS485通信部分は送受信共通の線を使っていて、モジュールの回路図を見る限り送信したデータをそのままUART側に返します。したがって、
送信したデータと同じ8バイトの後に、風速のデータ7バイトが来ています。
送信のあとは15バイト受信するようにして後ろ7バイトを解析するようにしてみてください。


写真見るとUART側のT/RX間に100Ωが入っていそうなので多分このせいで送ったデータがそのまま戻ってきているのかと思います。
これは不要ですので外せば返答だけ受信できるかと思います。外してください。

投稿2024/04/08 04:56

編集2024/04/09 07:39
ozwk

総合スコア13551

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mameta0509

2024/04/08 06:26

回答ありがとうございます。 試したところ問題が解決しました! 実際に動かしたところ風速の数値だけえらい事になりますが、一先ずRS-485通信を利用して風速データの取得が出来たのでベストアンサーに選ばせていただきました。 引き続き進めて参ります。ありがとうございます。
thkana

2024/04/08 13:51

> モジュールの回路図を見る限り送信したデータをそのままUART側に返します。 私もそれを真っ先に疑って回路図を調べたのですが、そうはならないはずです。 https://docs.m5stack.com/en/unit/iso485 マイコンのUARTのTXをDEと/REに突っ込むことで半二重の送受切り換えもやっていることになっています。TX側がマイコンからのデータでマークになっているときは受信がディスエイブルになっているので、その信号はマイコンのRXに伝わらないはず...なのですが。 元のプログラムでセンサーを外して、送信したデータがそのまま受信出来ているようであれば485変換器の不良と考えられるかも知れません。
thkana

2024/04/08 14:18 編集

それを疑った故に、質問へのコメントに > 485のラインと、UARTの(マイコンから見て)RXのラインとをそれぞれ。 と書いたのですが...
mameta0509

2024/04/09 00:24

ありがとうございます。485変換器を新たにネットで購入した為、届き次第、交換動作も確認してみます。
ozwk

2024/04/09 01:24

> 私もそれを真っ先に疑って回路図を調べたのですが、そうはならないはずです。 言われてみるとそうなのでよく見てみましたが UART側でTXRX間に100Ωを入れてるので多分このせいかなと思います。
thkana

2024/04/09 07:03

確かに写真で見ると入ってますねぇ...写真から回路を追え、なんていうのは回答者に対するいじめだと思っているのでちゃんと見てませんでした。期待通りに動かないときは全てを疑って見ざるを得ないのですが... > 不要ですので 優しいですね。普通は「そんなの入れちゃダメ」って言いませんか? そもそもそこに抵抗を入れる理由なんてないはずですし、3.3VでHの出力->Lの出力が100Ωで繋がれたら33mAも流れちゃいます。ESP32のGPIOの電流定格が仕様書のバージョンによって記述が違うみたいで大きい側の記述をとれば「壊れる」とまでは言えないようですが、マイコンに対して常識的に「流しすぎ」な電流であることは確かです。 間違ったハードによる間違った動作にソフトで現物合わせの修正をするのも原則として「やってはいけない」ことだと思います。製品化していてモノは組み上がっちゃっていて回路修正ができない、なんていう時に間違いが見つかるとそうならざるを得ないときはありますけれど、そういう話でもなさそうですし。 (teratailが「ITエンジニア特化型Q&Aサイト」なので参加者はなべてエンジニアかそれを目指す者であるという前提で話していますよ)
ozwk

2024/04/09 07:16

> 優しいですね。普通は「そんなの入れちゃダメ」って言いませんか? 厳しいですねぇ、普通は手心を加えません? 冗談はさておき「不要」ってのは確かに「なくてもいい」ぐらいの印象を与えかねないので 内容については否はないです。そのとおりだと思います。
mameta0509

2024/04/10 02:58

抵抗をマイコン側に入れていた理由として、RS-485通信は両端に100~120Ω程度の抵抗をノイズ対策として入れるという調べて行くうちに知り、通信がうまくいかなった事からUART通信側にも入れたほうがいいのかな?とあまり考えず入れていました。エンジニアとしてもまだまだ初心者かつ、Q&Aサイトの利用も初めてだったため、勝手が分からず失礼なことを致しました。申し訳ございません。
thkana

2024/04/10 09:51

回路の接続や素子それぞれにちゃんと意味があるので、「あまり考えずに入れて」は慎むべき行為と思います。 そもそもRS485は1Kmとかの伝送距離を謳う規格です。そういう距離になれば、周波数が低めの領域でも分布定数の伝送路となり、インピーダンスの不整合による反射だとかが問題になってきます。その意味での「ノイズ対策」としての終端抵抗ですから、数十cmとかの距離の配線であればあってもなくても多分実用上差は見えてこないかと思います。そして、RS485では差動(信号の振幅を逆にした2線を使うことで信号伝送の能力を上げる)の2線間に抵抗を入れているのであって、決して送信と受信の間に抵抗を入れているわけではありません。
mameta0509

2024/04/11 04:41

2線式RS-485通信の場合、TX,RX間に入れるもの終端抵抗を入れるものと認識しておりましたが、考え方として誤っていたでしょうか?
ozwk

2024/04/11 05:13

2線+GNDのRS-485はTXとRXは共通です。そこから認識を間違ってます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問