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

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

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

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

Q&A

解決済

2回答

6886閲覧

ESP-DevKitC3台を通信させる方法

LivingDays24_7

総合スコア13

Arduino

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

0グッド

1クリップ

投稿2019/03/25 07:06

前提・実現したいこと

ESP32-DevKitCを3台使用し、2台でそれぞれがロータリーエンコーダを用いて値を取りもう1つとLEDテープを繋ぎ、色を2つのロータリーエンコーダの数値をもとに変化させる、というものをつくりたいです。また、それぞれが有線接続できない場所でも数値がやり取りできるようにしたいです。
本当に始めたばかりで、的外れなことを言っているかもしれません...
しかしこれ以上何を試せばいいかわからず、完全に詰まってしまいました。
「わからないことが分からないから何を聞けばいいのかわからない」状態です。
情けないことこの上無いですが、お力添えしていただければ助かります。よろしくお願いします。

試したこと

ライブラリにあるSimpleWifiSeverを試しました。このようにそれぞれの開発ボードが優先接続不可能な離れた場所でも数値のやり取りが出来るようにしたいです。このライブラリはなんとな~~~く理解できた気がするので、これを応用して作ることが出来ればうれしいです。
回答よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

y_waiwai

2019/03/25 07:17

いまいち意味不明ですが、Wifiでは通信はできないという前提なんでしょうか?
dodox86

2019/03/25 07:40

最終的にやりたいことが盛りだくさんな訳ですが、それぞれはできているのでしょうか。あるいは全てできていないけど、最終的に3台で相互に通信できる必要があるので、それがそもそもできるかどうか心配で質問されているとか。今のままだとほぼ丸投げに近く、回答がつきづらいと思います。ひとつひとつ課題を片付けてはいかがでしょうか。
LivingDays24_7

2019/03/25 08:28

ありがとうございます。 仰る通り、最終的に3つを相互で通信させる必要があるけれどそもそも出来るのかということが質問意図です。
y_waiwai

2019/03/25 08:39

近距離ならWifiを使う、Wifiが使えない程遠いなら、有線でつなぐ、有線でも無理な距離(数百メートル以上?)なら、手はないでしょうね
thkana

2019/03/27 14:56

「数値のやり取り」と書いているけど、本当に「やり取り」? それとも、ロータリーエンコーダを繋いだヤツからLEDテープを繋いだのに一方的にデータが流せればいいだけ? ロータリーエンコーダとかLEDテープの操作には問題ないとして、 面倒だからUDPを使うとして、LEDテープを繋いだ1台のWifiをAPに設定、2台をそれに接続してデータを送信、受けた側はWiFiUDP::remoteIP();でデータの送信元を区別しながら適宜データを処理してやれば...とか思うのだけど。 (質問に回答というよりは自分で試してみたいけど週末までは無理だ。)
LivingDays24_7

2019/03/28 04:23

おっしゃる通りロータリーエンコーダ側からLEDテープ側の一方通行で問題ありません。 ありがとうございます。
guest

回答2

0

いまさらになっちゃいますが、3台接続の部分をやってみたのでとりあえず。ちょっと勘違いがあってえらく時間かかっちゃいました...

1台をWifiのAPで、通信上のサーバにします。
これに対して、他の2台がWiFiで接続し、UDPで適宜データを送信します。
サーバ側では、どちらの子機からデータを受け取ったかはIPアドレス情報で判別出来ます。

手持ちの基板の関係で、ESP32とESP8266を混ぜて/入れ替えて実験しました。
ESP8266をAP/Serverにしたとき、やたらにUDPの取りこぼしがあるのが気になりますが、ESP32をAP/Serverにしたときは見ている範囲では取りこぼしは見えなかったので、ESP32で使っている範囲では大丈夫なのではないか、と思います。

Arduino

1// 共通ヘッダ 2const unsigned int UDP_PORT = 55555; 3 4const char* SSID = "ESP32-WiFi"; // SSID 5const char* PASS = "esp32wifi"; // password 6 7const IPAddress SERVERIP(192, 168, 20, 254); // サーバのIP 他の機器と重ならないこと 8const IPAddress SUBMASK(255, 255, 255, 0); // subnetmask 9 10const IPAddress CLIENTIP_1(192,168,20,1); // 子機1のIP 11const IPAddress CLIENTIP_2(192,168,20,2); // 子機2のIP

Arduino

1// AP/Server 2// ESP32シンボルはESP32ライブラリで定義される 3ifdef ESP32 4#include <WiFi.h> 5#else 6#include <ESP8266WiFi.h> 7#include <Wifiudp.h> 8#endif 9#include "addr.h" 10 11WiFiUDP Udp; 12 13IPAddress myIP; 14 15//WiFiをアクセスポイントとしてオープン 16void wifiInit(String ssid, String pass, IPAddress ip, IPAddress subMask) { 17 WiFi.softAP(SSID, PASS); 18 delay(100);//安定化 19 WiFi.softAPConfig( ip, ip, subMask); 20 delay(100); 21 myIP = WiFi.softAPIP(); 22 Udp.begin(UDP_PORT); 23} 24 25void setup() { 26 wifiInit(SSID, PASS, SERVERIP, SUBMASK); 27 28 Serial.begin(115200); 29 /* 各種情報を表示 */ 30 Serial.print("SSID: "); 31 Serial.println(SSID); 32 Serial.print("AP IP address: "); 33 Serial.println(myIP); 34} 35 36void loop() { 37 if (Udp.parsePacket())//UDP受信あり? 38 { 39 char rd[4] = {0}; 40 Udp.read(rd, 4); 41 IPAddress rmt = Udp.remoteIP(); 42 Udp.flush();//残データがあったら捨てる 43 Serial.print(rd); 44 Serial.print(" from "); 45 Serial.println(rmt); 46 } 47}

Arduino

1// 子機側 2// 2台めはCLIENTIP_2にする 3#define CLIENT CLIENTIP_1 4#ifdef ESP32 5#include <WiFi.h> 6#else 7#include <ESP8266WiFi.h> 8#include <WifiUDP.h> 9#endif 10#include "addr.h" 11 12WiFiUDP Udp; 13 14IPAddress myIP; 15void wifiInit(const char* ssid, const char* pass, IPAddress ip) { 16 delay(100); 17 WiFi.mode(WIFI_STA); 18 WiFi.begin(ssid, pass); 19 20 WiFi.config(ip, SERVERIP, SUBMASK); 21 do { 22 delay(100); 23 } while (WiFi.status() != WL_CONNECTED); 24 delay(100); 25 myIP = WiFi.localIP(); 26} 27 28void setup() { 29 Serial.begin(115200); 30 Serial.println("\nWiFi Connecting"); 31 wifiInit(SSID, PASS, CLIENT); 32 Serial.print("Connected.\nI AM "); 33 Serial.println(myIP); 34 35 Udp.begin(UDP_PORT); 36} 37 38void loop() { 39 char buf[16]; 40 if (WiFi.status() == WL_CONNECTED) { 41 if (Udp.beginPacket(SERVERIP, UDP_PORT) != 0) { 42 sprintf(buf, "%03d", (int)(millis() % 1000)); 43 Udp.write((uint8_t*)buf, 4); 44 Udp.endPacket(); 45 Serial.print("Send: "); 46 Serial.println(buf); 47 } 48 } else { 49 Serial.println("Disconnected"); 50 } 51 delay(501); 52}

投稿2019/04/07 02:31

thkana

総合スコア7639

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

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

dodox86

2019/04/07 02:43

回答者のひとりですが、参考になるフォローありがとうございます。取りこぼしの差は多分にESP32とESP8266のCPU性能からする基本性能の違いな気がしますが、UDPなのでそもそも取りこぼしあっても仕方ないかなとは思います。(ブロードキャスト系で取りこぼし無しを前提にする仕様は、ハード/ソフト共に酷かと)
thkana

2019/04/07 03:00

自分でやってみたいお題として頂いただけですので...で、せっかくやったから晒しておこうと。 私も深追いはしていないのですが、いくらUDPとはいえ、上記プログラムで500ms毎に4byteのデータを送って数回に一回は取りこぼすという状況なので激しすぎ。CPU性能のせいに出来るレベルじゃなく、なにか間違ってる感があります。Arduino用ボードライブラリも最新(ESP8266 2.50)になってることを確認したし、あと何だろう...って、ここが何の場かを考えれば別途質問を立てるのが筋かな。もう少し足掻いてみてからそうしようかしら。
dodox86

2019/04/07 03:13

> 500ms毎に4byteのデータを送って数回に一回は取りこぼすという状況なので激しすぎ。 確かにそれはちょっとひどいですね。今後、発展した他の処理を追加するのもままならない。
thkana

2019/04/07 15:02

ESP8266のWifiをステーションモードにしてUdpを受けさせてみると特にはこぼさない。AP処理が重いのかな。目的を果たすという点では既存のWifiネットワークがあるならそれを使うとか、あるいはTCPを使うとかの対応もあり、ということで回答としてはこの辺までで。
guest

0

ベストアンサー

最終的に3つを相互で通信させる必要があるけれどそもそも出来るのかということが質問意図です。

心配せずとも、3台が同時に送受信すること自体はプログラミング次第でどうにでもなるので大丈夫です。

お試しになったSimpleWiFiServerと思わしきコードをgithubで読ませていただきましたが、TCPのサーバー、WEBサーバーと言っても良いですが、それをシンプルに実装したサンプル例のようです。こちらで考えると、3台の内1台をサーバーにして、残りの2台をクライアントにすれば必要に応じて接続、切断あるいは繋ぎっぱなしで1対2で通信の連携は取れそうです。

WiFiの接続とは別のレベルになるので、3台がWiFiでアクセスポイントに接続。接続成功したら1台がTCPサーバーになって残り2台がTCPクライアントになるようなかたちです。それぞれがサーバーとクライアントになれば数珠繋ぎで通信することだってできます。

WEBで検索すると、HTTP(WEBサーバー)ではなく、WebSocketで実装してリアルタイムにデータ通信している例もありました。TCPではなく、データを相互に投げっぱなしで良いのであればUDPで良いかもしれませんし、MQTTなんて通信方法もあります。処理したい内容次第です。ご自分でとにかく作って課題をひとつずつ解決して、コピペで終わらず内容を理解すればその先の応用もできるのではないでしょうか。

投稿2019/03/25 09:51

dodox86

総合スコア9183

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

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

LivingDays24_7

2019/03/26 03:39

このような丸投げ質問に対して非常に丁寧なお返事をありがとうございます! 先行きが少し見えたので実践してみようと思います。 ありがとうございました!
dodox86

2019/03/26 03:50

今のご心配が少しでも解消できたようで良かったです。今回のご質問として終わったのであれば閉じていただければ幸いです。(BAを催促しているわけではありませんw)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問