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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

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

IoT

IoT(Internet of Things)とは、インターネットがコンピュータなどの情報・通信機器のネットワークだけでなく、世の中のある様々なモノに接続されて自動認識・自動制御・遠隔計測などの能力を備えることです。「モノのインターネット」と一般的にいわれます。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

解決済

3回答

3039閲覧

無線通信で受信した値をTeraTermに表示したい

senntii

総合スコア3

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

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

IoT

IoT(Internet of Things)とは、インターネットがコンピュータなどの情報・通信機器のネットワークだけでなく、世の中のある様々なモノに接続されて自動認識・自動制御・遠隔計測などの能力を備えることです。「モノのインターネット」と一般的にいわれます。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

0クリップ

投稿2022/02/16 05:42

編集2022/02/16 23:38

IM920sLを使用して無線通信のテストをしています。
センサーの値を送信→センサー値を受信してTeraTermに表示させたいです。

~機器構成~
送信側:センサー(HC-SR04)+Arduino UNO+IM920sL
受信側:Arduino UNO+IM920sL

イメージ説明
※送信側はこれにセンサーが接続されています。

IM920cをArduinoで使う

こちらのサイトを参考に送信側、受信側のスケッチを書き込んでみましたが、受信側のTeraTermには何も表示されません。
受信側のArduinoをIM920sLスターターキット内のUSBインターフェイスボードに変えると、送信されたデータは受信できるので、送信側は問題なさそうです。

送信側、受信側のスケッチは以下のようになっています。

<送信側>

C++

1#include <SoftwareSerial.h> 2 3SoftwareSerial IM920Serial(8,9); // RX, TX 4 5int TRIG = 12; // Trig出力ピン 6int ECHO = 13; // Echo入力ピン 7 8double duration = 0; 9double distance = 0; 10double speed_of_sound = 331.5 + 0.6 * 25; // 25℃の気温の想定 11 12void setup() { 13 IM920Serial.begin(19200); //ソフトウェアシリアル開始。IM920 とは 19200 ボーを指定 14 Serial.begin(19200); 15 16 pinMode(TRIG, OUTPUT); // 出力ピンの設定 17 pinMode(ECHO, INPUT); // 入力ピンの設定 18 digitalWrite(TRIG, LOW); // 初期状態をLOWにセット 19} 20 21void loop() { 22 digitalWrite(TRIG, LOW); 23 delayMicroseconds(2); 24 digitalWrite( TRIG, HIGH ); 25 delayMicroseconds( 10 ); 26 digitalWrite( TRIG, LOW ); 27 duration = pulseIn( ECHO, HIGH ); // 往復にかかった時間が返却される[マイクロ秒] 28 29 if (duration > 0) { 30 duration = duration / 2; // 往路にかかった時間 31 distance = duration * speed_of_sound * 100 / 1000000; 32 Serial.print("Distance:"); 33 Serial.print(distance); 34 Serial.println(" cm"); 35 } 36 37 IM920Serial.print("TXDA "); 38 IM920Serial.print(distance); 39 IM920Serial.println("\r\n"); 40 41 delay(10000); 42}

<受信側>

C++

1#include <SoftwareSerial.h> 2 3SoftwareSerial IM920Serial(8, 9); 4float i; //センサーの値は小数点を含むのでfloatとする 5 6void setup() { 7 Serial.begin(19200); 8 IM920Serial.begin(19200); 9 10 pinMode(10,OUTPUT);//busy 11 digitalWrite(10, HIGH); 12} 13 14void loop() { 15 if (IM920Serial.available()) { 16 i = IM920Serial.read(); 17 Serial.print(i); 18 } 19 delay(10000); 20}

TeraTermに表示させるにはどこを修正したらよいでしょうか。

よろしくお願いいたします。

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

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

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

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

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

ozwk

2022/02/16 06:45 編集

* 受信側の配線の、どこに何がつながっているかを判別できる画像をください。 * delay(10000) が長すぎてデバッグに苦労しそうなので50程度にしてみてください * 参考サイトにて > ※予めお互いの通信モジュールがペアリングしていることを前提としています とありますが、ペアリングしてますか?
senntii

2022/02/16 09:16

写真が貼り付けられないので、文章で失礼します。 受信側ですが、ArduinoにIM無線シールド Ver.2を取り付け、そこに変換アダプタ IM920c-ADP、無線モジュールがのっかっています。 ペアリングについては説明書の通りに行い、できています。
thkana

2022/02/16 11:38

> 写真が貼り付けられないので この追記・修正依頼欄には写真は貼り付けられません。質問で不足していた情報の追記ですから、質問そのものに追記するべきで、その場合は写真を掲載できるはずですので確認してください。 > ペアリングについては説明書の通りに行い、できています。 ということは専用のUSB-UART変換アダプタもあるのですね? それで受信モジュールのUARTを観測したらどうなっているでしょう?
senntii

2022/02/17 00:15 編集

写真を追加いたしました。 delay(10000)をdelay(1000)にしたところ、TeraTermに値が表示されるようになりましたが、6.62を送信した場合、48.00しか表示されません。 UARTの観測というのはUSBインターフェイスボードを使って受信されているか確認ということでしょうか。それであれば、問題なく値は受信できており、TeraTermにも値は表示されています。
guest

回答3

0

ベストアンサー

  • Delay(10000)、つまり10秒なにもしないです。これは長すぎます。50ぐらいでいいです。(ちゃんとやるなら通信速度から逆算して決める)

  • そもそもfloatに代入する必要がありません。なぜなら送信側が送っているのは文字だからです。受信側は送信側から受け取ってPCに渡すだけなのですから、charで受け取ってそのままPCに送信すればいいです。

  • IM920sやcのデータシートを見た限り、BUSYはIM920からの出力です。(参考にしたサイトがおかしい)

投稿2022/02/17 00:44

編集2022/02/17 00:50
ozwk

総合スコア13521

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

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

senntii

2022/02/17 02:02

Delayを50にしてcharで受け取ってそれをSerial.printしたらいけました! 単に受信側のDelayが長かっただけのようです… ありがとうございました。
thkana

2022/02/17 08:38

> (参考にしたサイトがおかしい) 参照先サイトは受信のプログラムも怪しいですね。 char input[30]; // 文字列格納用 に対して input[i] = IM920Serial.read(); if (i > 30 || input[i] == '\n') { なんていう処理をしていたり...動くかというと動くのでしょうけれど。 あまり「参考」としておすすめしかねる水準と思います。
thkana

2022/02/17 08:43

> 単に受信側のDelayが長かっただけのようです… そもそもそのdelayはどういう意味があって、どういう意図で最初10000に設定したのでしょうか? ちょっと考えを整理しておいたほうがいいと思います。今回の件で「delayが長かったから」というだけでうまく行かなかった、という理解はちょっとよくないと思います。 たとえば、これだと10秒待ちでも期待の動作をしたりしないかしら? void loop() { while (IM920Serial.available()) { i = IM920Serial.read(); Serial.print(i); } delay(10000); }
guest

0

何故、何も表示されないのかは不明ですけど、文字列の処理に問題があります。
送信側のスケッチは?

※参考サイトのものは、送信側が文字列を送信(print)しています。
それを、文字配列に代入して、その文字配列をPCへと送信(print)しています。

貴方の場合は

float i; //センサーの値は小数点を含むのでfloatとする

とfloatの変数を用意して、

if (IM920Serial.available()) {
i = IM920Serial.read();
Serial.print(i);
}

としています。readは1バイト読み出す関数ですから、たとえば、1.23が送られて来たら、最初の「1」で
iにはASCIIの0x31(49)が代入されます。それをprintするとiはfloatですから49.00を送信します。
次の「.」はASCIIの0x2E(46)ですから、i=46;がされた、printすれば46.00が送信されます。

つまり、1.23が送られてきた場合は「49.0046.0050.0051.00」を送信する事になります。

で、 delay(10000); と相まって、更にバッファ溢れも起こしているのではないかな。
※たった4文字(1.23)を処理するのにも10秒*4=40秒かかる事を意味します。
まぁ、それでも何も表示されない理由にはならないけど。
そっちは、「TeraTermの使い方」の類の問題があるのかも。

char i=IM920Serial.read();
Serial.print(i);

とcharで受信したのならprint、或いはwrite

byte i=IM920Serial.read();
Serial.write(i);

とintやbyteで受信したのならwrite

arduino内部でその数値が必要なら、それなりの処理をしてからfloatへ代入。

投稿2022/02/16 16:43

nac_tnk

総合スコア463

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

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

senntii

2022/02/17 00:12 編集

1.23が送られてきた場合は「49.0046.0050.0051.00」を送信する ということは、TeraTermに「49.0046.0050.0051.00」が表示されると思うのですが、そう表示されないのは何かがおかしいですよね。 delay(10000)の部分をdelay(1000)にしたらTeraTermに値が表示されるようになりましたが、6.62を送信した場合、48.00しか表示されません。 1.23を送信した場合、ASCIIに変換されるので再度10進に変換し直してからfloatに代入すればよいということでしょうか。
senntii

2022/02/17 02:06

上の方の方法で無事出力することができました。 charならprint、或いはwrite、intやbyteならwriteで出力するということを知らなかったので勉強になりました。 ありがとうございました。
guest

0

ざっとぐぐってみたら、そのユニットからの出力はふつーにシリアル通信しているようなので、受信側の無線ユニットのシリアル送受信端子を、USB-シリアル変換ユニットを介してPCにつなげば、Teratermで表示できるようになります

投稿2022/02/16 06:16

y_waiwai

総合スコア87774

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

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

senntii

2022/02/16 09:13

USB-シリアル変換ユニットというのはUSBインターフェイスボードのことでしょうか。Arduinoではなくそれを使用するとTeraTermで表示できます。 Arduinoを介すのは難しいのでしょうか。
y_waiwai

2022/02/16 09:33 編集

ぱっとみーではコードにはあまり不都合はないように思います 受信機の出力まで信号が来ているというなら、その出力からArduinoに行くまでに異常があるということになります #あるいはArduinoからTeratermまで? 配線があっているかよくチェックしてみてはどうでしょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問