パーキングセンサーを作ってみた

 

ESP32とHC-SR04の超音波センサーと10KΩのボリューム抵抗を使ってパーキングセンサーを作ってみました。

ESP32とボリューム抵抗の使い方は過去動画で紹介していますが、今回は、ボリューム抵抗で障害物の探知開始距離を設定して

設定距離以内に近づいた場合、ブザーで知らせるように作成しました。


ST7789カラーディスプレイを使用するにあたり、TFT_eSPIライブライをインストールする必要があります。
詳しくは過去動画で紹介していますのでそちらを参照してください。

 

【過去動画】

・ESP32にHC-SR04(超音波センサー)を繋いでカラーディスプレイ ST7789 に表示する

 

 

TFT_eSPIライブラリには高速に描画するスプライト機能を使用できますので
今回は、この機能を障害物の探知する距離を表示するときに使用しています。
 

【過去動画】

・ESP32とボリューム抵抗を使ってST7789カラーディスプレイにアナログメーターを表示する

 



【機能】
・ボリューム抵抗でセンサーの動作距離を設定
・設定距離より近づくと接近距離に応じでブザー間隔を調整して知らせる
・5cm以内になったらブザーが鳴り続ける



【プログラム】
ArduinoIDEで作成しています。

ESP32の開発環境のインストールが必要ですので最初にインストールしておいてください。

/***********************************************************
 * HC-SR04を2個使って、接触回避ツールを作成します。
 * 車やフォークリフトなどは、壁や障害物にぶつかって傷がついたりへこませたりと
 * 色々問題がでます。そこで音波センサーを使って障害物を回避するツールを作成します。
 * ボリューム抵抗で距離を設定(1cm~150cmまで)して、障害物に近づくとブザーがなる仕組みです。
 * 
 * 
 * ESP32側とHC-SR04,Buzzer,VolumeのPIN配置
 * 
 *ESP32側 音波1 音波2 volume Buzzer    
 * 3.3V                        右pin
 * VIN         VCC   VCC    
 * GND       GND   GND       左pin      -(短いPin)
 * D13       Targ1    
 * D12       Echo1
 * D25                                            +(長いPin)
 * D26                Targ2
 * D27                Echo2
 * D33                               中間Pin     
 **********************************************************/
 
#include <SPI.h>
#include <TFT_eSPI.h> // TFT_eSPIライブラリの使用宣言
TFT_eSPI tft = TFT_eSPI();       // インスタンスの生成
TFT_eSprite spr = TFT_eSprite(&tft);

#define WIDTH  200
#define HEIGHT 80
#define ADC_PIN 33 // アナログ入力端子


//超音波センサーの使用するピンの設定(2個使用)
int Trig1 = 13;  //超音波センサー用(arduino nano側のpin) Trigger Pin
int Echo1 = 12;   //超音波センサー用(arduino nano側のpin) Echo Pin

int Trig2 = 26;  //超音波センサー用(arduino nano側のpin) Trigger Pin
int Echo2 = 27;   //超音波センサー用(arduino nano側のpin) Echo Pin

int max_dist = 150; //探知最長距離を設定(最大350cmまで)

//Buzzerの制御PIN
int Buzzer = 25;    //Buzzer制御用

void setup()
{
  Serial.begin(9600);
  tft.init();   // initialize a ST7789 chip, 240x240 pixels
  tft.setRotation(0);   //画面の表示向き
  tft.setTextWrap(false);
  tft.fillScreen(TFT_BLACK);

  pinMode(ADC_PIN, ANALOG); // アナログ入力(今回はD33を設定)

  pinMode(Trig1, OUTPUT);    //trigerr Pin
  pinMode(Echo1, INPUT);     //reseive Pin 
  pinMode(Trig2, OUTPUT);    //trigerr Pin
  pinMode(Echo2, INPUT);     //reseive Pin
  pinMode(Buzzer, OUTPUT);    //Buzzer制御Pin
  
  set_main_disp();            //初期の画面表示
  spr.createSprite(WIDTH, HEIGHT);   //スプライトのエリアサイズの設定
  spr.fillSprite(TFT_BLACK);   //スプライトのスクリーンの色を設定
  
}


void loop() 
{
  int beep_set;                   //ブザーの鳴動時間用
  int dist1,dist2;                //超音波センサーの距離を格納する(dist1:音波センサー1、dist2:音波センサー2)
  int val=analogRead(ADC_PIN);    //ボリュームの値を取得する処理(アナログ入力値(0〜4095)を取得)
  //volume抵抗の値をブザー動作距離に変更する
  val = map(val,0,4095,1,max_dist);    //アナログリードでは、0~4095までの値が取得可能なためmap関数でその値を1cm~150cmの値に変換する
  dist_disp(val);                 //ボリュームでセットした距離を表示する処理

  dist1 = dist_set(Trig1,Echo1);    //超音波センサーで距離を測定
  dist2 = dist_set(Trig2,Echo2);    //超音波センサーで距離を測定

//どちらか接近値が小さい方を取得する
  if(dist1 > dist2){
    beep_set = dist2;
  }else {
    beep_set = dist1;  
  }

  Serial.println(dist1);
  Serial.println(dist2);
  
  //セットした距離より接近した場合ブザーを鳴らす
  if(beep_set <= val){         //設定した距離に接近したらブザーを鳴らす処理
    if(beep_set >=5){         //距離が5cmより離れているか否かでブザー音を調整する
      digitalWrite(Buzzer,HIGH);
      delay(beep_set*2);                          //距離に応じてブザーの間隔を調整
      digitalWrite(Buzzer,LOW);
      delay(beep_set*2);                          //距離に応じてブザーの間隔を調整
    }else {
      digitalWrite(Buzzer,HIGH);                  //連続音にする
    }
  }
  delay(10);
}


/********************************************************
 * set_main_disp()
 * 概要:最初の表示枠を表示
 * 引数:なし
 * 戻値:なし
 * 
 *******************************************************/
void set_main_disp(){
  tft.setCursor(50, 8);       //カーソル位置
  tft.setTextColor(TFT_WHITE);    //テキストの色
  tft.setTextSize(2);           //テキストのサイズ
  tft.print(F("Distance Disp"));         //文字表示
  //枠表示
  tft.fillRoundRect(10,50,220,170,20,TFT_WHITE); //角が丸い四角表示
  tft.fillRect(20,70,200,130,TFT_BLACK);
  tft.setTextColor(TFT_WHITE);    //文字の表示色
  tft.setCursor(57,100);       //カーソル位置
  tft.setTextSize(2);           //テキストのサイズ
  tft.print(F("Set Distance"));         //文字表示
}



/********************************************************
 * dist_set(int dist)
 * 概要:ボリューム抵抗で設定した値を距離として表示する処理
 *    
 * 引数:dist:ボリューム抵抗で取得した値(1cm~150cm)
 * 戻値:なし
 * 
 *******************************************************/
void dist_disp(int dist){
  spr.fillSprite(TFT_BLACK);   //スプライトのスクリーンの色を設定
  spr.setTextColor(TFT_WHITE);    //文字の背景色と表示色
  spr.drawRightString(String(dist), 100, 30, 6);  //(表示する数字,x,y,文字サイズ) 
  spr.drawString("cm", 130, 50, 4);
  spr.pushSprite(20, 120);           //スプライトの表示位置と表示開始
}



/********************************************************
 * dist_set(int Trig,int Echo)
 * 概要:超音波センサーを動作させて距離を測定して値を変える
 *    距離測定は3回実施し平均値を戻り値として返す。
 * 引数:Trig :HC-SR04のTargのPin番号
         Echo :HC-SR04のEchoのPin番号
 * 戻値:平均距離
 * 
 *******************************************************/
int dist_set(int Trig,int Echo){
  int Duration = 0; //超音波センサーで受信したデータを格納
  int Distance = 0; //音波センサーのデータから距離に変換したデータを格納する変数
  int ave_Dist = 0; //距離の平均を求めるための3回分の合計を格納するための変数(今回は3回の平均)
 
  for(int i=0;i<3;i++){               //超音波センサーで距離を3測定  ※超音波センサーの精度によるが精度がよくないので3回測った平均を求める
  //距離を3回測定
    digitalWrite(Trig, LOW);       //測定前にトリガーピンをLow
    delayMicroseconds(2);
    digitalWrite(Trig, HIGH);     //トリガーピンを10マイクロ秒 High
    delayMicroseconds(10);
    digitalWrite(Trig, LOW);
    Duration = pulseIn(Echo, HIGH);   //Echoピンから動作時間を取得(往復の時間)
    
    Distance = Duration * 0.017;    //音速(340m/s)の340/2*100/1000000=0.017 (cmに変換)
    ave_Dist=ave_Dist + Distance;   //3回分を合計
    delay(10);
  }
  return ave_Dist/3;
}