ESP32Sというモジュールで遊んでいます
【( ..)φメモメモ】HiLetgo® ESP32 ESP-32S NodeMCU開発ボード2.4GHz WiFi + Bluetoothデュアルモード【安いなぁ】
こやつ、BlueToothもちゃんと動くし、Wifiもちゃんと動く。。BluetoothだとUARTのような感じで動かせるし、Wifiだと、ServerになってHTTPでアクセスして、ブラウザーで中身をみるとか操作もできるので、面白いので、こないだから、もちろんGPSもですけど。。いろんなセンサーを付けて遊んでいます。
でもESP8266やArduino本体と、ESP32Sは少し違うので、そのあたりいろいろ調べたりしないと動かないことや、センサーも安物ばかり買っているので、説明書もなく。。しかも。。動くかどうか分からない状態から動かすので。。次動かす時に忘れそうなので、その忘備録です。
ESP32S Sketch書き込みでの注意
☆書き込めないエラーの時は、IO0スイッチを押しながら書き込む
☆5V供給のセンサなどをつけたままにしていると書き込めない時がある。 5V供給を外す
I2Cのピン
僕のもっているESP32Sは、ESP32 DEV MODULEやNODE 32sという種類のボードらしいです(笑)
http://wiki.ai-thinker.com/esp32/boards/nodemcu_32s
このピン配置で、Wire SCL Wire SDAってなっている GPIO 22、21が Wire.hで使う時にデフォルトのI2CのTX,RXになるようです。 書いてある通りなんですが(笑) GPIO1、3でも動きそうな気がするからって、動作確認のためにサンプルのSketchでサクッと動かそうとすると、ハマります(笑)
ESP8266だと、IO4、IO5で、Arduinoだと、A4、A5とかの表記になっているものが多いですね。
センサーのI2Cのアドレスを探すSketchは、こんなのですが、どこにもピンの位置を指定するところがないですもんね(笑)
/* this program is to detect IC2 device connected to Arduino */ #include <Wire.h> void setup() { Wire.begin(); Serial.begin(115200); Serial.println("\nI2C Scanner"); } void loop() { byte error, address; int nDevices; Serial.println("Scanning..."); nDevices = 0; for(address = 1; address < 127; address++ ) { // The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C device found at address 0x"); if (address<16) Serial.print("0"); Serial.print(address,HEX); Serial.println(" !"); nDevices++; } else if (error==4) { Serial.print("Unknow error at address 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); } } if (nDevices == 0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); delay(1000); // wait 5 seconds for next scan }
I2Cで動くものは、まずこれで、アドレスを探すってことをします。
これでも動かない時は、Raspberry Piに接続して。。
<sudo apt-get install i2c-tools>が入っている前提ですが。。
sudo i2cdetect -y 1
で調べます(笑) これで動かなければ、センサー死んでます(笑) で、Raspberry Piで動くのにArduinoで動かないって時は、ライブラリーを疑います。というかArduinoやESP8266、ESP32関係のライブラリー多すぎて、分からなくなりますねぇ~ メーカーの正式なサイトの情報が間違っていたりするし(笑)
VL53L1X TOFセンサの場合
こいつI2Cアドレスを書き換えられるようなことが書かれていますが、いろいろやってみましたが、書き換えられないですね。 何個も使う場合は、PCAL9555などを使うしかないですね。
http://trac.switch-science.com/wiki/PCAL9555APW
それと、Arduinoライブラリーの方も、Pololuという方を選ばないと動かないですねぇ。。 Sparkfunにもあるので、そっちでやろうとして、うまく動きませんでした。
https://github.com/pololu/vl53l1x-arduino
MPU6050の場合
GY521と表記があるので、それで調べるといいのかもしれないですが。。
これにはいろいろハマりました(笑) なぜかは分かっていませんが、現時点では、このライブラリーなら動きます(笑)
https://github.com/jarzebski/Arduino-MPU6050
Arduino Play Groundというサイトの情報だと
http://playground.arduino.cc/Main/MPU-6050#sketch
I2Cdevlib.hにMPU6050があったので、これにかなり引きずられてしましました(笑)
https://iot.keicode.com/arduino/arduino-gy521.php
ESP8266やArduinoなら上記のように、これで動くみたいで、Googleで検索すると、これで動くように書かれております。
また、それを改造したものが、Arduino IDE のライブラリーマネージャーにも出てくるので、ややこしいんですが。。
https://github.com/Tockn/MPU6050_tockn
でも、これのサンプルがもう動かないんですよねぇ~ 中身までしっかり読み込んでないので分からないですけど。。とりあえず、間違わないように覚えておかないと(笑)
でも、センサーから出てきた値、なんかおかしいような気もする(笑)
200円くらいなもんなんで、仕方ないのか?(笑) それとも。。何か裏技あるのかも(笑)
HY-SRF 05超音波センサ の場合
https://www.instructables.com/id/Pocket-Size-Ultrasonic-Measuring-Tool-With-ESP32/
https://www.hackster.io/Nicholas_N/distance-measurement-with-an-ultrasonic-sensor-hy-srf05-64554e
HY-SRF05 | ESP32S |
VCC | 5V |
GND | GND |
Trig | GPIO2 |
Echo | GPIO5 |
スケッチは 以下で ㎝単位で測れます。
4mまでとありますが、3mくらいまでの感じです。3つ買いましたが3つとも全然違う値を出しているところは、個性というべきか??(笑)おいおぃ。。
// defines pins numbers const int trigPin = 2; const int echoPin = 5; // defines variables long duration; int distance; void setup() { pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output pinMode(echoPin, INPUT); // Sets the echoPin as an Input Serial.begin(115200); // Starts the serial communication } void loop() { // Clears the trigPin digitalWrite(trigPin, LOW); delayMicroseconds(2); // Sets the trigPin on HIGH state for 10 micro seconds digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // Reads the echoPin, returns the sound wave travel time in microseconds duration = pulseIn(echoPin, HIGH); // Calculating the distance distance= (duration/2)/29; if (distance >=300 || distance <=0){ Serial.println("Out of range"); } else{ // Prints the distance on the Serial Monitor Serial.print("Distance: "); Serial.print(distance); Serial.println(" cm"); } delay(60); }
コメントを残していただけるとありがたいです