Ультразвуковой радар HC-SR04 на Arduino: визуализация в Processing в реальном времени
Компоненты и материалы
| Компонент | Количество |
|---|---|
| Arduino UNO | 1 |
| Ультразвуковой датчик HC-SR04 | 1 |
| Сервопривод (любой стандартный, например SG90/MG996R) | 1 |
| Плата для прототипирования и провода | 1 |
О проекте
Проект реализует «радар» на базе ультразвукового датчика HC-SR04, установленного на сервопривод. Arduino сканирует пространство поворотом сервы от -80° до +80° и передает измерения расстояния по последовательному порту в приложение на Processing, которое строит визуальную карту (сверху вниз) в реальном времени.
Архитектура
- Arduino (сервер) — управляет сервой, опрашивает HC-SR04 через библиотеку
NewPing, отправляет пары «угол, расстояние» в Serial (9600 бод). - Processing (клиент) — принимает данные, рисует лучы, усредняет два прохода (туда-обратно).
Исходники на GitHub: faweiz/My-Arduino/arduino_radar
Код Arduino (Arduino_radar_server_arduino.ino)
/* Radar Screen Visualisation for HC-SR04
* Отправляет показания датчика для каждого градуса поворота сервы в Serial
* для приема в Processing.
*/
#include <NewPing.h>
#include <Servo.h>
#define TRIGGER_PIN 2 // Trig HC-SR04
#define ECHO_PIN 3 // Echo HC-SR04
#define MAX_DISTANCE 150 // макс. дистанция пинга, см (датчик до 400-500 см)
#define SERVO_PWM_PIN 9 // серва на пине 9
#define ANGLE_BOUNDS 80 // предел угла ±80°
#define ANGLE_STEP 1 // шаг 1°
int angle = 0; // текущий угол (-80..+80)
int dir = 1; // направление: 1 = вперед, -1 = назад
Servo myservo;
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
void setup() {
Serial.begin(9600);
myservo.attach(SERVO_PWM_PIN);
}
void loop() {
delay(50); // стабилизация сервы
// Серва принимает 0..180, наш угол -80..+80 -> смещаем на +80
myservo.write(angle + ANGLE_BOUNDS);
// Измерение и отправка
getDistanceAndSend2Serial(angle);
// Смена направления на границах
if (angle >= ANGLE_BOUNDS || angle <= -ANGLE_BOUNDS) {
dir = -dir;
}
angle += (dir * ANGLE_STEP);
}
int getDistanceAndSend2Serial(int angle) {
int cm = sonar.ping_cm(); // расстояние в см
Serial.print(angle, DEC);
Serial.print(",");
Serial.println(cm, DEC);
return cm;
}
Код Processing (Arduino_radar_client_processing.pde)
Полный код клиента доступен в репозитории GitHub. Основные моменты:
- Чтение строк из Serial, парсинг
angle,distance. - Отрисовка в полярных координатах: линия от центра под углом
angleдлиной пропорциональноdistance. - Накопление двух проходов (влево-вправо и вправо-влево) и отображение усредненного значения.
- Графический интерфейс: полукруг с градуировкой, цветовые зоны дальности.
Схема подключения
- HC-SR04: VCC -> 5V, GND -> GND, Trig -> D2, Echo -> D3.
- Серва: сигнальный провод -> D9, питание -> 5V/GND (желательно отдельное питание 5V 1A+ для сервы, чтобы не сбрасывать Arduino).
Запуск
- Загрузите скетч в Arduino.
- Откройте Processing IDE, загрузите
.pdeфайл. - Выберите правильный COM-порт в коде Processing (массив
Serial.list()). - Запустите Processing — откроется окно радара.
Доработки и идеи
- Добавить фильтрацию выбросов (медианный фильтр по 3-5 измерениям на угол).
- Использовать более точный датчик (VL53L0X — ToF лидар) для большей дальности и точности.
- Реализовать сохранение карты в файл/изображение.
- Добавить обнаружение движущихся объектов (сравнение кадров).
Производственный процесс
- Сборка Bluetooth-робота-шпиона на Arduino с управлением с телефона
- FlickMote: жестовое IR-пульт для умного дома на Arduino 101 и ультразвуковом датчике
- DIY Arduino TV-B-Gone: универсальный пульт для выключения любого телевизора
- Создание пользовательских LED-часов с будильником — видно с 12 метров
- Find Me: Умный поисковик вещей на Arduino и Bluetooth
- Оптимизированные решения питания для проектов на Arduino
- Крестики-нолики на Arduino с матрицей MAX7219 и картонным корпусом
- Пошаговое руководство: сборка умного четырёхногого робота на Arduino
- Измерение расстояния в реальном времени: Ардуино-сонар с визуализацией в Processing
- Своё рулевое управление (джойстик) для игр на Arduino