【ESP32】ESP32間で相互Wifi通信をやってみる 意外にサンプルがないですね。型変換忘れた【Arduino】

スポンサーリンク
広告

Wifi Bluetooth 付きのArduino = ESP32

ESP8266、ESP32からArduinoをいじりだしていますが、あまりこれと言ったもの作っていません(笑) だって、いろんなものが既に作られているので、新たに作ろうって気持ちがあまり出てこないというひねくれ親父なので(笑)

でもこのHPにもESP32紹介記事は、結構あります。

で。。Webサーバーリンク集などもあって。。

【サンプルリンク】ESP32 で Webサーバー を 作るリンク 【Arduino】
ESP32の情報などのリンク集 Arduino含めて、日本語のリファレンスなどがきれいに整備されています。 本家のリファレンス類 ...

APサーバーを作って、WifiでAndroidやPCから操作するのは簡単だなぁ~って試していたりして遊んでいました。

こだいらあたりでCivicTechで、バリアフリーアプリを作ったので、サインカフェさんに紹介に行った時に、Arduinoで、お客さんが入ってきたときに、耳の聞こえない奥さんにもわかるような動きのあるものを作りたいんですよ!ってお話を聞き、じゃぁやってみましょうよ!!

ってことで。。今一緒にやっています(笑)

それで。。 どんな部品でできるかとか、サンプルになりそうなことこんな感じです。

【ESP32S】忘備録 人感センサと360度回転サーボと、ジャンバーワイヤーと。。【Arduino】
サインカフェVery youのマスターに バリアフリーマップのチラシをもっていった時に、プログラムやるんですか? Arduinoとか、...
【ESP32S】Fritzing(電子回路の回路図エディタ)にESP32S-HiLetgoのパーツを追加する【Arduino】
Fritzing ほぼArduino用のブレッドボードそのまんまを回路図のようにしてかけるエディタです。ちょっとメモとして、ブレッドボード...

既に。。いろいろやってて。。モータ回したりもできるようになっています。

Arduinoはサンプルプログラムがインターネットに沢山あるので、自学自習しやすいんですよね。

ESP32どおしでWifiで通信するサンプル探そう!

Wifiも簡単でしょ~~ って言おうと思って、僕も調べてみたら。。できるだけシンプルなサンプルプログラムがいいんですが。。Web系は沢山あるのに。。

ググった結果(今度ググったらいいの出てくるかもですが・・(笑)

確かにESP32を2個つないで動いている っていうサンプルが出てこない(笑)

二人して、「無いね~~」(笑) になりました(笑)

動かないっていうこの記事を参考に、動かしてみました(笑)

2つのESP32でwifiを用いてデータのやり取り|teratail
 前提・実現したいこと二つのesp32を用意して、片方をAPモードでサーバーとし、片方をクライアントとしてデータのやり取りをしたいと思っています。クライアント側で適当なピンをAD変換しそのデータをサーバー側に送ろうと思います。適当なピンをanalogReadでデジタル値として読み取ります。

これを、あれこれ弄って(笑) とりあえず動くようにしてみました。(まだちゃんと型があってないですが。。)

クライアント側から1文字送って、サーバーで1文字受けて、コンソールに文字を出す

コードは、Githubにおいてあります。

サーバー側コード

これのこの部分が、それ。。

size_t value; ←この型がたぶんCharにすればちゃんと動くはずなんですが(笑)

void loop()
{
 //接続したクライアントの情報を得る。
 WiFiClient client = server.available();
 if(client){
  Serial.println("new client");
  while(client.connected()){
   if(client.available()){
    value=client.read(); ← クライアントから文字を読んでくる
    Serial.println(value);
    delay(1000);
   }
  }
 }
}

クライアント側は、

//単純に一文字送っています
const char *value="L";
void loop()
{
 delay(1000);
 if(client.connected()==true)
 {
 client.write(value,1); ←サーバーへ一文字送る
 //Serial.println(value);
 }
}

これができるまで、小一時間かかりました(笑)

こういうのが出た時 親父二人で、「おぉぉぉおぉぉぉぉ~」って喜ぶのです(笑)

動かない分からない時に。。

で。。。これを動かすようにした時に、どうしたか??っていうのを書きとめておきます。

もしエラーが出たら、そのエラーそのものを、ググります(笑) たいてい出ますが。。出ないものも多い。。

今回、このWifi.h を読んでみることにしました(笑) 急がば回れなんです。オープンソースのいいところです。

今回は、何がしらべたいか?というと。。client.write(value,1) と value=client.read() でこれが正しいのか??ってことがまず知りたくなりました。

Wifi.hを見てみると、シンプルで、それに使ってるファイルが見つかります(笑)

ディレクトリは、こんな感じのところにあると思います。

C:\Users\ユーザーの名前\ドキュメント\ArduinoData\packages\esp32\hardware\esp32\1.0.2\libraries\WiFi\src
#include <stdint.h>

#include "Print.h"
#include "IPAddress.h"
#include "IPv6Address.h"

#include "WiFiType.h"
#include "WiFiSTA.h"
#include "WiFiAP.h"
#include "WiFiScan.h"
#include "WiFiGeneric.h"

#include "WiFiClient.h"  ← たぶんこれだろうとあたりを付けて
#include "WiFiServer.h"
#include "WiFiUdp.h"

WiFiClient.hを見てみると、関数の定義が書かれています。

writeの方は、見てみると。。ん?? 結構ある(笑)

size_t write(uint8_t data);
size_t write(const uint8_t *buf, size_t size);
size_t write_P(PGM_P buf, size_t size);
size_t write(Stream &stream);

unit8_t は 符号なし8ビット整数を表す型ですね。 どうやら。。

8ビットの整数を1つ送る

8ビットの整数の配列(アドレス)と、その文字数を 送る

PGM_Pってなんや?? (笑) なんかバッファー的なもので送る

Streamってなんや?? その中身を送るっていう構造になってます。

で、この2つ目のやつを使おうと。。

こんどは、Readを見てみます。

int read();
int read(uint8_t *buf, size_t size);

これは、引数なしで書くと、整数が出てくるんですね。。

文字を渡す時は、配列と、サイズを知っていないとちゃんとわからないってことですね。

上のサンプルプログラムは一応動いていますが。。間違いがありますね。

value=client.read();

これだと、整数しか戻ってきませんね。

uint8_t  *value;
size_t  size;

と例えば定義して

value=client.read(value, size);

って読み込んでこないとダメですね。

あはは。。

もうポインタとか、忘れちゃったので、CとC++の基本を復習しなきゃ(笑) だれか簡単に教えて~~(笑)

Arduino - WiFiClientAvailable

だと。。

 if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

で読み込めるって書いてあって

ESP8266, Arduino IDE and client.write() problem
ESP8266, Arduino IDE and client.write() problem

では

char c[] = {'t','e','s','t'};

client.write(c);

でよさそうな感じで書いてあるんだけど。。

どうなんだろう??(笑)

WifiClient write is slow · Issue #1648 · espressif/arduino-esp32
Hardware: Board: ESP32 Dev Module C Core Installation/update date: 10/jul/2018 IDE name: Arduino IDE 1.8.5 IDF from 10 Jul 2018 Flash Frequency: 40Mhz Upload Sp...

では。。この使い方みたいだし(笑) よくわからない(笑)

C言語から勉強しなおしだなぁ~~(笑)

Arduino入門:ポインタ演算子
ArduinoのSketch(スケッチ)では、C言語と同様にポインタ演算子が使用できます。
データ操作
ESP-IDF Programming Guide — ESP-IDF Programming Guide v4.1-dev-141-ga7e8d87d3 documentation

これから2週に1回くらいでサインカフェでもくもく会しようと思います。一緒にやる人いませんか??(笑)


read関数の引数無しは、バッファサイズを取るためにあるのでは?

size_t bufsize=read()
char* buf = new char[bufsize+1]
read( buf, bufsize)
buf[bufsize]=null
printf(buf)
delete buf[]

こんな感じかなぁ by 中野 さん

確かに。。こういう使い方なんだろうな。。 最初にバッファサイズととって、その分の配列(アドレス空間)を取得して、データを取得して、バッファを綺麗に消しておく。。

malloc とかあったなぁ~ 忘れたけど(笑)

コメントを残していただけるとありがたいです

Loading Facebook Comments ...
%d人のブロガーが「いいね」をつけました。