目次
Wifi Bluetooth 付きのArduino = ESP32
ESP8266、ESP32からArduinoをいじりだしていますが、あまりこれと言ったもの作っていません(笑) だって、いろんなものが既に作られているので、新たに作ろうって気持ちがあまり出てこないというひねくれ親父なので(笑)
でもこのHPにもESP32紹介記事は、結構あります。
で。。Webサーバーリンク集などもあって。。
APサーバーを作って、WifiでAndroidやPCから操作するのは簡単だなぁ~って試していたりして遊んでいました。
こだいらあたりでCivicTechで、バリアフリーアプリを作ったので、サインカフェさんに紹介に行った時に、Arduinoで、お客さんが入ってきたときに、耳の聞こえない奥さんにもわかるような動きのあるものを作りたいんですよ!ってお話を聞き、じゃぁやってみましょうよ!!
ってことで。。今一緒にやっています(笑)
それで。。 どんな部品でできるかとか、サンプルになりそうなことこんな感じです。
【ESP32S】Fritzing(電子回路の回路図エディタ)にESP32S-HiLetgoのパーツを追加する【Arduino】
既に。。いろいろやってて。。モータ回したりもできるようになっています。
Arduinoはサンプルプログラムがインターネットに沢山あるので、自学自習しやすいんですよね。
ESP32どおしでWifiで通信するサンプル探そう!
Wifiも簡単でしょ~~ って言おうと思って、僕も調べてみたら。。できるだけシンプルなサンプルプログラムがいいんですが。。Web系は沢山あるのに。。
ググった結果(今度ググったらいいの出てくるかもですが・・(笑)
確かにESP32を2個つないで動いている っていうサンプルが出てこない(笑)
二人して、「無いね~~」(笑) になりました(笑)
動かないっていうこの記事を参考に、動かしてみました(笑)
https://teratail.com/questions/125441
これを、あれこれ弄って(笑) とりあえず動くようにしてみました。(まだちゃんと型があってないですが。。)
クライアント側から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++の基本を復習しなきゃ(笑) だれか簡単に教えて~~(笑)
https://www.arduino.cc/en/Reference/WiFiClientAvailable
だと。。
if (client.available()) { char c = client.read(); Serial.print(c); }
で読み込めるって書いてあって
https://forum.arduino.cc/index.php?topic=359732.0
では
char c[] = {'t','e','s','t'}; client.write(c);
でよさそうな感じで書いてあるんだけど。。
どうなんだろう??(笑)
https://github.com/espressif/arduino-esp32/issues/1648
では。。この使い方みたいだし(笑) よくわからない(笑)
C言語から勉強しなおしだなぁ~~(笑)
http://easylabo.com/2015/03/arduino/8478/
https://garretlab.web.fc2.com/arduino/clang/data/
https://docs.espressif.com/projects/esp-idf/en/latest/index.html
これから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 とかあったなぁ~ 忘れたけど(笑)
コメントを残していただけるとありがたいです