Arduino-радар на ультразвуковом датчике и сервоприводе: пошаговое руководство
Соберём радар на Arduino и Processing. Нужен ультразвуковой датчик HC-SR04, сервопривод и Arduino. Видео и текст ниже. Датчик на сервоприводе сканирует пространство, данные передаются в Processing для отрисовки PPI-дисплея. Готовые крепления для HC-SR04 есть на Banggood. Trig — pin 10, Echo — pin 11, Servo — pin 12. Arduino отправляет угол и дистанцию в Serial. Processing читает через Processing: парсит строку «угол,дистанция.» до точки. Переменные Функция Основной Полный код Processing (фиксированное разрешение 1920×1080) и адаптивная версия под любое разрешение (меняйте Обзор
Комплектующие
Сборка устройства




Схема подключения

Исходные коды
serialEvent() и рисует радар.
Arduino код с комментариями
#include <Servo.h>
const int trigPin=10, echoPin=11;
long duration; int distance;
Servo myServo;
void setup() {
pinMode(trigPin,OUTPUT); pinMode(echoPin,INPUT);
Serial.begin(9600); myServo.attach(12);
}
void loop() {
// 15→165°
for(int i=15;i<=165;i++){
myServo.write(i); delay(30);
distance=calculateDistance();
Serial.print(i); Serial.print(","); Serial.print(distance); Serial.print(".");
}
// 165→15°
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;
}
iAngle, iDistance используются для рисования.drawRadar() — дуги и лучи разметки.void drawRadar(){
pushMatrix(); translate(960,1000);
noFill(); strokeWeight(2); stroke(98,245,31);
arc(0,0,1800,1800,PI,TWO_PI);
arc(0,0,1400,1400,PI,TWO_PI);
arc(0,0,1000,1000,PI,TWO_PI);
arc(0,0,600,600,PI,TWO_PI);
line(-960,0,960,0);
line(0,0,-960*cos(radians(30)),-960*sin(radians(30)));
line(0,0,-960*cos(radians(60)),-960*sin(radians(60)));
line(0,0,-960*cos(radians(90)),-960*sin(radians(90)));
line(0,0,-960*cos(radians(120)),-960*sin(radians(120)));
line(0,0,-960*cos(radians(150)),-960*sin(radians(150)));
line(-960*cos(radians(30)),0,960,0);
popMatrix();
}
drawLine() — луча сканирования.void drawLine(){
pushMatrix(); strokeWeight(9); stroke(30,250,60);
translate(960,1000);
line(0,0,950*cos(radians(iAngle)),-950*sin(radians(iAngle)));
popMatrix();
}
drawObject() — обнаруженные объекты (красные линии). Дистанция в пиксели: pixsDistance = iDistance*22.5, лимит 40 см.void drawObject(){
pushMatrix(); translate(960,1000);
strokeWeight(9); stroke(255,10,10);
pixsDistance=iDistance*22.5;
if(iDistance<40){
line(pixsDistance*cos(radians(iAngle)),-pixsDistance*sin(radians(iAngle)),
950*cos(radians(iAngle)),-950*sin(radians(iAngle)));
}
popMatrix();
}drawText() — надписи: дальность, угол, статус объекта.draw() вызывает все функции, использует fill(0,4) для эффекта следа луча.void draw(){
fill(98,245,31); textFont(orcFont);
noStroke(); fill(0,4); rect(0,0,width,1010);
fill(98,245,31);
drawRadar(); drawLine(); drawObject(); drawText();
}
size()).// Полный код Processing (фиксированный 1920x1080) — см. оригинал
// Адаптивная версия:
/* Arduino Radar Project - Adaptive resolution
* by Dejan Nedelkovski, www.HowToMechatronics.com
*/
import processing.serial.*; import java.awt.event.KeyEvent; import java.io.IOException;
Serial myPort; String angle="", distance="", data="", noObject;
float pixsDistance; int iAngle,iDistance, index1=0, index2=0; PFont orcFont;
void setup(){ size(1920,1080); smooth(); myPort=new Serial(this,"COM4",9600); myPort.bufferUntil('.'); orcFont=loadFont("OCRAExtended-30.vlw"); }
void draw(){ fill(98,245,31); textFont(orcFont); 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); }
// drawRadar, drawObject, drawLine, drawText — с использованием width/height вместо констант
Производственный процесс
- Создание потрясающей системы Ambilight для монитора на Arduino
- Создание классической игры Pong на Arduino UNO с OLED-дисплеем: пошаговый урок
- Робот-ускользатор на сервоприводе: сборка на Arduino и HC-SR04
- Детектор аудиочастот на Arduino: измеряем пик громкости с высокочувствительным модулем
- Собираем свой Tamagotchi на Arduino: цифровой питомец своими руками
- Умный беспроводной выключатель света: Arduino-контроллер для удаленного управления
- Крестики-нолики на Arduino с матрицей MAX7219 и картонным корпусом
- Умный водяной пистолет с датчиком движения на Arduino Nano
- Сборка надежного таймера обратного отсчета на Arduino с 7-сегментным дисплеем SparkFun
- Arduino Sunflower: электронный подсолнух, следящий за солнцем