2017年1月27日金曜日

ESP-WROOM-02 で超音波センサ (HC-SR04) を使ってみた

概要

前回 まで Arduino で超音波センサを扱ってきました
今回は ESP-WROOM-02 を使って HC-SR04 を制御してみました

環境

  • ESP-WROOM-02 開発ボード
  • Arduino IDE 1.6.7
  • 超音波センサ HC-SR04
  • 温度センサ
  • 抵抗 470Ω

配線

配線の全体図は以下の通りです
wroom_with_hcsr04_circuit1.jpg

若干ごちゃごちゃしていますがそこまで難しい配線ではないと思います
HC-SR04 は VCC, GND をそれぞれ WROOM の VOUT (5V), GND に接続し、Trig をデジタルピンの 2 番、Echo をデジタルピンの 4 番に接続しています

ポイント

温度センサが若干複雑になっていて WROOM の TOUT で温度の値を取得するのですが、TOUT の入力電圧が 1.1V 以下である必要があるので、例のごとく分圧しています
その部分だけ拡大した配線は以下の通りです
wroom_with_hcsr04_circuit2.jpg

温度センサの真ん中のピンを直接 TOUT に接続するのではなく、抵抗470Ωを挟んで分圧しています

温度センサ真ん中 -> 抵抗 470Ω -> ジャンパ -> TOUT -> ジャンパ -> 抵抗 470Ω 並行 -> GND

という感じです
これで電圧を 1/3 にすることで 1.1V 以下の電圧を VOUT に入力することができます

スケッチ

今回は HC-SR04 から取得した距離情報を MQTT に Publish するところまでやっています
そこまで不要という方は必要な部分を削除してお使いください

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
extern "C" {
  #include "user_interface.h"
}

// Update these with values suitable for your network.

const char* ssid = "ssid";
const char* password = "password of ssid";
const char* mqtt_server = "yourbroker.name.server";
const int mqtt_port = 1883;
const char* mqtt_pub_topic = "topic";
const char* mqtt_username = "mqtt-user";
const char* mqtt_password = "mqtt-pass";
int duration = 0;
double distance = 0;
int trigger = 2;
int echo = 4;

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;

int getToutValue(){
  int res = system_adc_read();
  return res;
}

void setup_wifi() {
  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("ESP8266Client", mqtt_username, mqtt_password)) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.publish(mqtt_pub_topic, "hello world");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup() {
  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, mqtt_port);
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  // 温度を取得
  int ans, temp, tv;
  ans= getToutValue();
  tv = map(ans, 0, 1023, 0, 3000);
  temp = map(tv, 300, 1600, -30, 100);
  // 時間を測定
  digitalWrite(trigger, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger, LOW);
  duration = pulseIn(echo, HIGH, 5000);
  // 距離を測定し publish
  if (duration > 0) {
    distance = duration / 2;
    Serial.print("distance1: ");
    Serial.println(distance);
    float sonic = 331.5 + 0.6 * temp;
    distance = distance * sonic * 100 / 1000 / 1000;
    Serial.print("distance2: ");
    Serial.println(distance);
    dtostrf(distance, -1, 2, msg);
    client.publish(mqtt_pub_topic, msg);
  }
  delay(500);
}

若干長いですが、setup -> loop 関数と追っていけばだいたいわかると思います

まず Wifi ネットワークに接続します
接続が完了したら MQTT ブローカとの接続を行います

その後で温度センサの情報を取得し、その情報を元に光の速度を求め HC-SR04 から取得した時間情報と合わせて距離を算出しています

ポイント

Arduino と同じようなできなかった部分を紹介します

tv = map(ans, 0, 1023, 0, 3000); の最後の引数が Arduino の場合は 5000 になっていました
Arduino の場合は 5V で温度センサを動かしていたので 5000 にしていましたが、WROOM の場合分圧をしなければいけない関係で 3.3V で温度センサを動かしていたため 3000 に修正しました

dtostrf(distance, -1, 2, msg); を使って算出した距離情報を String に変換しています
Arduino の場合は Serial.write などを使って出力していたので、特に double 型のままでも問題ないのですが、今回 MQTT に publish する関係で String に変換する必要があったため dtostrf を使っています
引数の説明は以下の通りです

  • 1 つ目・・・変換する値
  • 2 つ目・・・変換後の文字数
  • 3 つ目・・・変換後の小数点以下の桁数
  • 4 つ目・・・変換した文字列を格納する変数

動作確認

スケッチを WROOM に書き込んで指定した Topic を Subscribe して待ってみましょう
以下のように受信できれば OK です
wroom_with_hcsr04_result.png

上記は mosquitto_sub コマンドを使って確認しています

最後に

スケッチも含め完全互換とまではいきませんでしたが、ほぼ Arduino で動作した制御と同じ制御で WROOM でも動かすことができました
距離の精度もほぼ変わりませんでした (同じ超音波センサなので当たり前といえば当たり前ですが)

温度センサを使わないのでもいいのであれば、もっと簡単に使うことができると思います

参考サイト

0 件のコメント:

コメントを投稿