【ESP32】6軸センサ・加速度・ジャイロセンサー MPU6050のライブラリー VL53L1X TOFセンサ HY-SRF05超音波センサ【Arudino】

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);
}

 

 

投稿者 tom2rd

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

Loading Facebook Comments ...

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください