цифровая электроника
вычислительная техника
встраиваемые системы

 



Ультразвуковой радар на основе платы WeMos D1 Mini ESP32

Автор: Mike(admin) от 3-09-2023, 23:55

В данном материале мы узнаем, как сделать простую радиолокационную систему с помощью платы Wemos esp32. Для этой цели мы используем ультразвуковой датчик HC-SR04, а для отображения данных используем программную среду Processing.


Ультразвуковой радар на основе платы WeMos D1 Mini ESP32

Принцип работы системы очень прост. Сначала мы непрерывно вращаем наш датчик вокруг вертикальной оси в диапазоне 180 градусов. Во время этого движения мы берем данные о расстоянии до ближайшего объекта от ультразвукового датчика под каждым углом. Для этого процесса мы используем Wemos ESP32. После этого нам нужно установить соединение со средой обработки Processing, чтобы отобразить наши данные.


Для этого мы используем протокол последовательной связи с подходящей скоростью передачи данных. Затем мы проектируем интерфейс нашей радиолокационной системы с помощью Processing IDE. В этой IDE мы настраиваем последовательную связь для получения данных в реальном времени через последовательный порт. Таким образом, мы осуществляем связь с Wemos ESP32 в режиме реального времени и показываем данные, отправленные из Wemos ESP 32, в обрабатывающую IDE.


Схема соединения платы ESP32 с ультразвуковым датчиком и сервомотором представлена далее.


Ультразвуковой радар на основе платы WeMos D1 Mini ESP32

Код для Processing дан далее.



import processing.serial.*;
import java.awt.event.KeyEvent;
import java.io.IOException;
Serial myPort;
String angle="";
String distance="";
String data="";
String noObject;
float pixsDistance;
int iAngle, iDistance;
int index1=0;
int index2=0;
PFont orcFont;
void setup() {
 
 size (1200, 700);
 smooth();
 myPort = new Serial(this,"COM10", 9600);
 myPort.bufferUntil('.');
}
void draw() {
 
  fill(98,245,31);
  noStroke();
  fill(0,4); 
  rect(0, 0, width, height-height*0.065); 
 
  fill(98,245,31);
  drawRadar(); 
  drawLine();
  drawObject();
  drawText();
}
void serialEvent (Serial myPort) {
  data = myPort.readStringUntil('.');
  data = data.substring(0,data.length()-1);
 
  index1 = data.indexOf(",");
  angle= data.substring(0, index1);
  distance= data.substring(index1+1, data.length());
 
  iAngle = int(angle);
  iDistance = int(distance);
}
void drawRadar() {
  pushMatrix();
  translate(width/2,height-height*0.074);
  noFill();
  strokeWeight(2);
  stroke(98,245,31);
  arc(0,0,(width-width*0.0625),(width-width*0.0625),PI,TWO_PI);
  arc(0,0,(width-width*0.27),(width-width*0.27),PI,TWO_PI);
  arc(0,0,(width-width*0.479),(width-width*0.479),PI,TWO_PI);
  arc(0,0,(width-width*0.687),(width-width*0.687),PI,TWO_PI);
  line(-width/2,0,width/2,0);
  line(0,0,(-width/2)*cos(radians(30)),(-width/2)*sin(radians(30)));
  line(0,0,(-width/2)*cos(radians(60)),(-width/2)*sin(radians(60)));
  line(0,0,(-width/2)*cos(radians(90)),(-width/2)*sin(radians(90)));
  line(0,0,(-width/2)*cos(radians(120)),(-width/2)*sin(radians(120)));
  line(0,0,(-width/2)*cos(radians(150)),(-width/2)*sin(radians(150)));
  line((-width/2)*cos(radians(30)),0,width/2,0);
  popMatrix();
}
void drawObject() {
  pushMatrix();
  translate(width/2,height-height*0.074);
  strokeWeight(9);
  stroke(255,10,10);
  pixsDistance = iDistance*((height-height*0.1666)*0.025);
  if(iDistance<40){
  line(pixsDistance*cos(radians(iAngle)),-pixsDistance*sin(radians(iAngle)),(width-width*0.505)*cos(radians(iAngle)),-(width-width*0.505)*sin(radians(iAngle)));
  }
  popMatrix();
}
void drawLine() {
  pushMatrix();
  strokeWeight(9);
  stroke(30,250,60);
  translate(width/2,height-height*0.074);
  line(0,0,(height-height*0.12)*cos(radians(iAngle)),-(height-height*0.12)*sin(radians(iAngle)));
  popMatrix();
}
void drawText() {
 
  pushMatrix();
  if(iDistance>40) {
  noObject = "Out of Range";
  }
  else {
  noObject = "In Range";
  }
  fill(0,0,0);
  noStroke();
  rect(0, height-height*0.0648, width, height);
  fill(98,245,31);
  textSize(25);
 
  text("10cm",width-width*0.3854,height-height*0.0833);
  text("20cm",width-width*0.281,height-height*0.0833);
  text("30cm",width-width*0.177,height-height*0.0833);
  text("40cm",width-width*0.0729,height-height*0.0833);
  textSize(40);
  text("StupidTechy", width-width*0.875, height-height*0.0277);
  text("Angle: " + iAngle +" °", width-width*0.48, height-height*0.0277);
  text("Distance: ", width-width*0.26, height-height*0.0277);
  if(iDistance<40) {
  text("              " + iDistance +" cm", width-width*0.225, height-height*0.0277);
  }
  textSize(25);
  fill(98,245,60);
  translate((width-width*0.4994)+width/2*cos(radians(30)),(height-height*0.0907)-width/2*sin(radians(30)));
  rotate(-radians(-60));
  text("30°",0,0);
  resetMatrix();
  translate((width-width*0.503)+width/2*cos(radians(60)),(height-height*0.0888)-width/2*sin(radians(60)));
  rotate(-radians(-30));
  text("60°",0,0);
  resetMatrix();
  translate((width-width*0.507)+width/2*cos(radians(90)),(height-height*0.0833)-width/2*sin(radians(90)));
  rotate(radians(0));
  text("90°",0,0);
  resetMatrix();
  translate(width-width*0.513+width/2*cos(radians(120)),(height-height*0.07129)-width/2*sin(radians(120)));
  rotate(radians(-30));
  text("120°",0,0);
  resetMatrix();
  translate((width-width*0.5104)+width/2*cos(radians(150)),(height-height*0.0574)-width/2*sin(radians(150)));
  rotate(radians(-60));
  text("150°",0,0);
  popMatrix(); 
}

Код для платы ESP32 следующий.



#include <ESP32Servo.h>
Servo myservo;
const int trigPin = 5;
const int echoPin = 18;
long duration;
int distance;
int pos = 0;
int incomingByte = 0;
void setup() {
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
 pinMode(echoPin, INPUT);
  //myservo.attach(13);
  myservo.attach(13);
  myservo.write(90);
}
void loop() {
 for(int i=15;i<=165;i++){  
  myservo.write(i);
  delay(30);
  distance = calculateDistance();
  Serial.print(i);
 Serial.print(",");
  Serial.print(distance);
 Serial.print(".");
  }
  for(int i=165;i>15;i--){  
  myservo.write(i);
  delay(30);
  distance = calculateDistance();
  Serial.print(i);
  Serial.print(",");
  Serial.print(distance);
  Serial.print(".");
  }
  int calculateDistance(){

 

  digitalWrite(trigPin, LOW);

  delayMicroseconds(2);


  digitalWrite(trigPin, HIGH);

  delayMicroseconds(10);

  digitalWrite(trigPin, LOW);

  duration = pulseIn(echoPin, HIGH); 

  distance= duration*0.034/2;

  return distance;

}



© digitrode.ru


Теги: ESP32, радар, Processing, ультразвук, сервомотор




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий
  • Группа: Посетители
  • ICQ:
  • Регистрация: 17.11.2023
  • Статус: Пользователь offline
  • Комментариев: 11
  • Публикаций: 0
^
Радар по условию не может быть ультразвуковым, а ультразвуковой сонар – радаром.