Ультразвуковой радар на Arduino и Processing
Введение
В этом проекте мы соберём простой ультразвуковой радар на базе Arduino. Он позволяет обнаруживать объекты перед собой, измерять расстояние до них и наглядно отображать данные на экране компьютера в виде радиолокационного интерфейса. Проект отлично подходит для обучения и понимания принципов работы датчиков расстояния, сервво-приводов и обмена данными между Arduino и компьютером.
Где и зачем используется такой радар
Подобные проекты применяются в учебных целях, робототехнике и хобби-электронике. Они помогают понять:
- как работает ультразвуковой датчик расстояния;
- как управлять сервоприводом;
- как передавать данные с Arduino на компьютер;
- как визуализировать данные в реальном времени.
Что понадобится для проекта
- Arduino Uno (или совместимая плата)
- Ультразвуковой датчик HC-SR04
- Сервопривод SG90
- Макетная плата
- Соединительные провода
- Компьютер с установленным Processing
Основные пины и интерфейсы
| Компонент | Пин Arduino | Назначение |
|---|---|---|
| HC-SR04 Trig | D10 | Запуск измерения расстояния |
| HC-SR04 Echo | D11 | Приём отражённого сигнала |
| Сервопривод | D12 | Поворот датчика |
Принцип работы
Сервопривод поворачивает ультразвуковой датчик от 0 до 180 градусов. В каждой позиции Arduino измеряет расстояние до ближайшего объекта с помощью HC-SR04. Данные о текущем угле и расстоянии передаются по последовательному порту на компьютер. Программа Processing принимает эти данные и отображает их в виде радиолокационного экрана.
Подключение компонентов
Датчик HC-SR04 подключается к цифровым пинам Arduino для отправки и приёма сигналов. Сервопривод получает управляющий сигнал с отдельного цифрового пина и питание от 5 В. Важно обеспечить надёжное питание сервопривода, чтобы избежать сбоев в работе.
Скетч Arduino
#include <Servo.h>
const int trigPin = 10;
const int echoPin = 11;
const int servoPin = 12;
Servo radarServo;
long duration;
int distance;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
radarServo.attach(servoPin);
Serial.begin(9600);
}
void loop() {
for (int angle = 0; angle <= 180; angle++) {
radarServo.write(angle);
delay(15);
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2;
Serial.print(angle);
Serial.print(",");
Serial.print(distance);
Serial.print(".");
}
for (int angle = 180; angle >= 0; angle--) {
radarServo.write(angle);
delay(15);
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2;
Serial.print(angle);
Serial.print(",");
Serial.print(distance);
Serial.print(".");
}
}
Этот скетч управляет сервоприводом, измеряет расстояние ультразвуковым датчиком и передаёт данные в формате «угол,расстояние». Данные обновляются при каждом шаге поворота сервопривода и используются для визуализации в Processing.
Код Processing
import processing.serial.*;
Serial myPort;
String data = "";
int angle, distance;
void setup() {
size(800, 400);
myPort = new Serial(this, Serial.list()[0], 9600);
myPort.bufferUntil('.');
}
void draw() {
background(0);
translate(width / 2, height);
stroke(0, 255, 0);
noFill();
for (int i = 0; i <= 180; i += 30) {
arc(0, 0, i * 4, i * 4, PI, TWO_PI);
}
if (distance < 200) {
float x = distance * cos(radians(angle));
float y = distance * sin(radians(angle));
line(0, 0, x, -y);
}
}
void serialEvent(Serial myPort) {
data = myPort.readStringUntil('.');
if (data != null) {
data = trim(data);
String[] parts = split(data, ',');
if (parts.length == 2) {
angle = int(parts[0]);
distance = int(parts[1]);
}
}
}
Программа Processing принимает данные по последовательному порту и отображает их в виде радиолокационного экрана. Обновление происходит в реальном времени при каждом новом измерении.
FAQ — Ультразвуковой радар Arduino
Можно ли использовать другой ультразвуковой датчик?
Да, но код потребуется адаптировать под особенности конкретного датчика.
Почему сервопривод дёргается?
Обычно это связано с недостаточным питанием или плохими контактами.
Как увеличить дальность измерений?
Можно использовать более чувствительный датчик или уменьшить шаг поворота сервопривода.
Нужен ли Processing обязательно?
Нет, но без него не будет наглядной визуализации радара.
Можно ли использовать другой компьютерный язык?
Да, можно реализовать визуализацию на Python, C# или JavaScript.
Заключение
Этот проект наглядно демонстрирует работу ультразвуковых датчиков, сервоприводов и обмен данных между Arduino и компьютером. Он хорошо подходит для обучения и первых экспериментов с визуализацией измерений в реальном времени.