電子工作

ESP32と超音波センサを使って自動で衝突回避をする戦車を作ってみた【ArduinoとESP32】

前回製作した、ESP32の戦車を超音波センサで衝突回避をする戦車を作ったので作り方について、紹介します。戦車の基本的な内容については、以前製作したこちらの記事をご覧ください。

衝突回避する車を作りたいんですけど、どういう原理で、衝突回避できるんですか?

基本的には超音波センサや、レーザ距離センサ、カメラ等を使って、対象物までの距離を検知することで、衝突を回避しているんだよ。

自作してみたいんですけど、どうやったら作れますか?

今まで、勉強してきた超音波センサとサーボモータを使って、衝突検知をする車を作ってみましょう。楽しく学べて理解が深まると思います。

超音波センサを使ったものはこちらで紹介しています。今回はこれを用いて作ってみます。

<今回の記事の対象者>
 ・超音波センサを使った衝突回避をしてみたい
 ・ESP32を使って、モータを動かしてみたい
 ・対象物に近づくと自動回避する車を作ってみたい

🚀 0円で現役エンジニアから学べる【Techスクールオンライン】のお申込みをお勧めします。 このオンラインスクールでは、現役のエンジニアから直接学ぶことができ、プログラミングの基礎から高度なスキルまでを習得できます。しかも、今なら 0円 で受講できるチャンスです。 エンジニア転職を考えている方やプログラミングに興味がある方、新しいスキルを習得したい方に特におすすめです。

サーボモータと超音波センサを搭載した戦車を作ってみる

前回作った、衝突検知するための超音波センサ回路は上で紹介しています。今回はサーボモータで超音波センサの首振りを行い、超音波センサと対象物の距離が近くなった時、停止・後退・右に曲がるプログラムを作っていきます。

衝突検知する戦車の回路製作

戦車の作り方の詳細については、以前紹介したこちらの記事を参考にしてみてください。

モータドライバの使用方法やタミヤのツインモータギヤの製作方法を記載しています。

組み合わせて完成したものがこちらになります。サーボモータの上に超音波センサを取り付けたブレッドボードをのせます。そのあと、このサーボモータが取り付けられたボードを戦車の上にのせていきます。

完成品がこちらになります。なかなかかわいいやつです。

衝突前に回避するプログラム作成

超音波センサで測定した距離が30cm以下となった場合、停止・後退・旋回するプログラムを作ってみます。流れとしてはこのようになります。

サーボモータで超音波センサを首振り

超音波センサで測定

30cm以下かどうか判定

30cm以下の場合、停止 
(30cm以上:前進を続ける)

後退・旋回

前進

プログラムのフローは上記になります。ではコードをこちらに記載します。

#include <ESP32Servo.h>
#define ENABLE 5
#include "SR04.h"
#define TRIG_PIN 2
#define ECHO_PIN 15
SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN);
long a;
const int DIRA = 17;
const int DIRB = 16;
const int DIRC = 19;
const int DIRD = 18;
Servo myservo;

void setup()
{
  Serial.begin(9600);
  pinMode(ENABLE,OUTPUT);
  pinMode(DIRA, OUTPUT); // IN1
  pinMode(DIRB, OUTPUT); // IN2
  pinMode(DIRC, OUTPUT); // IN1
  pinMode(DIRD, OUTPUT); // IN2
  myservo.attach(23);
  }
void loop()
{
   int pos = 0;
    for (pos = 45; pos <= 135; pos += 10) { 
     a=sr04.Distance();
     Serial.println(a); 
     myservo.write(pos);              
     delay(10);
        if (a<30){
          pos=90;
          funk_stop();
          funk_backward();
          funk_right();
          
        }else{ 
          funk_forward();
          Serial.println("forward");
          }
          }
     for (pos = 135; pos >= 45; pos -= 10) {
     a=sr04.Distance();
     Serial.println(a); 
     myservo.write(pos);             
     delay(10);
        if (a<30){
          pos=90;
          funk_stop();
          funk_backward();
          funk_right();
          
          }else{
          funk_forward(); 

          Serial.println("forward");;
          }
          }}

void funk_forward(){
          digitalWrite(ENABLE,HIGH); 
          digitalWrite(DIRA,LOW); 
          digitalWrite(DIRB,HIGH);
          digitalWrite(DIRC,LOW); 
          digitalWrite(DIRD,HIGH);
          }
void funk_stop(){
          digitalWrite(ENABLE,LOW); 
          digitalWrite(DIRA,LOW); 
          digitalWrite(DIRB,LOW);
          digitalWrite(DIRC,LOW); 
          digitalWrite(DIRD,LOW);
          delay(3000);
}
void funk_backward(){
          digitalWrite(ENABLE,HIGH);
          digitalWrite(DIRA,HIGH); 
          digitalWrite(DIRB,LOW);
          digitalWrite(DIRC,HIGH); 
          digitalWrite(DIRD,LOW);
          delay(500);
}
void funk_right(){
          digitalWrite(ENABLE,HIGH); 
          digitalWrite(DIRA,HIGH); 
          digitalWrite(DIRB,LOW);
          digitalWrite(DIRC,LOW); 
          digitalWrite(DIRD,LOW);
          delay(500);
}

自動で衝突回避する戦車を実際に動かしてみた

では実際に動かした動画を紹介します。このように超音波センサの首振りを行い、衝突物までの距離が30cm以下となると、停止・後退・旋回することができました。首振り速度なども、コードを変えることで変更することができます。

今回の内容で、超音波センサの使い方や自動で戦車を動かす・旋回する動作を行うことができるようになったと思います。別途詳細のプログラムの説明や回路のつくり方をどこかで紹介していきたいと思います。

🚀 0円で現役エンジニアから学べる【Techスクールオンライン】のお申込みをお勧めします。 このオンラインスクールでは、現役のエンジニアから直接学ぶことができ、プログラミングの基礎から高度なスキルまでを習得できます。しかも、今なら 0円 で受講できるチャンス。
私がツナグバに登録してから、求人情報が豊富に届き、自分に合った仕事を見つけることができました。特に、第二新卒向けの求人情報が多いので、自分のスキルや経験を活かしながら新たなキャリアに挑戦することができました。転職活動は不安も多いですが、ツナグバのサポートがあれば、成功への道が明るく感じました。