前回製作した、ESP32の戦車を超音波センサで衝突回避をする戦車を作ったので作り方について、紹介します。戦車の基本的な内容については、以前製作したこちらの記事をご覧ください。
衝突回避する車を作りたいんですけど、どういう原理で、衝突回避できるんですか?
基本的には超音波センサや、レーザ距離センサ、カメラ等を使って、対象物までの距離を検知することで、衝突を回避しているんだよ。
自作してみたいんですけど、どうやったら作れますか?
今まで、勉強してきた超音波センサとサーボモータを使って、衝突検知をする車を作ってみましょう。楽しく学べて理解が深まると思います。
超音波センサを使ったものはこちらで紹介しています。今回はこれを用いて作ってみます。
<今回の記事の対象者>
・超音波センサを使った衝突回避をしてみたい
・ESP32を使って、モータを動かしてみたい
・対象物に近づくと自動回避する車を作ってみたい
サーボモータと超音波センサを搭載した戦車を作ってみる
前回作った、衝突検知するための超音波センサ回路は上で紹介しています。今回はサーボモータで超音波センサの首振りを行い、超音波センサと対象物の距離が近くなった時、停止・後退・右に曲がるプログラムを作っていきます。
衝突検知する戦車の回路製作
戦車の作り方の詳細については、以前紹介したこちらの記事を参考にしてみてください。
モータドライバの使用方法やタミヤのツインモータギヤの製作方法を記載しています。
組み合わせて完成したものがこちらになります。サーボモータの上に超音波センサを取り付けたブレッドボードをのせます。そのあと、このサーボモータが取り付けられたボードを戦車の上にのせていきます。
完成品がこちらになります。なかなかかわいいやつです。
衝突前に回避するプログラム作成
超音波センサで測定した距離が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以下となると、停止・後退・旋回することができました。首振り速度なども、コードを変えることで変更することができます。
今回の内容で、超音波センサの使い方や自動で戦車を動かす・旋回する動作を行うことができるようになったと思います。別途詳細のプログラムの説明や回路のつくり方をどこかで紹介していきたいと思います。