Ультразвуковой сканер-картограф на Arduino Yun: пошаговое руководство
Компоненты и материалы
| Arduino Yun | ×1 |
| Ультразвуковой датчик расстояния (HC-SR04 или аналогичный) | ×1 |
| Сервопривод Tower Pro MG996R | ×1 |
| Перемычки (набор) | ×10 |
Программное обеспечение
| Arduino IDE |
| MATLAB |
О проекте
Шаг 1: Теория
Используется ультразвуковой датчик расстояния. Он генерирует звуковые волны выше порога слышимости и измеряет расстояние по времени прохождения волны до препятствия и обратно. Принцип работы как у летучих мышей и сонаров кораблей.

Сервопривод отличается от обычного двигателя тем, что может точно поворачиваться на заданный угол и удерживать позицию. Подача импульсов определённой длительности заставляет вал повернуться на соответствующий угол.

Комбинируя эти компоненты, получаем 180° обзор для сканирования пространства.
Шаг 2: Сборка компонентов
Необходимое железо:
- Arduino Uno/Yun (любая плата с форм-фактором Arduino)
- Прототипирующий Shield для Arduino
- Ультразвуковой датчик HC-SR04
- Сервопривод (использовал компактный Tower Pro SG90)
Софт:
- Arduino IDE — загрузка кода управления сервой и считывания датчика, вывод в последовательный порт.
- MATLAB — приём данных из COM-порта, обработка, визуализация графика.
Шаг 3: Механическая сборка

На маленьком куске макетной платы делаем разъём для HC-SR04 и крепим его на рычаг сервы на двусторонний скотч.

Опционально: для компактности серву также приклеиваем на выступающую часть прото-шилда.

Результат напоминает живот Wall-E.
Шаг 4: Код для Arduino
Код управляет движением сервы, частотой опроса ультразвукового датчика и отправкой данных в последовательный порт.
- Подключение библиотек
- Инициализация переменных и пинов
- Создание объекта сервы
- Инициализация последовательной связи
- Ожидание 3 секунд
- Сброс счётчиков
- Поворот сервы на 1°
- 10 замеров ультразвукового датчика (по умолчанию)
- Усреднение показаний
- Отправка среднего значения в последовательный порт
- Переход к п. 7
Шаг 5: Код для MATLAB
MATLAB занимается обработкой данных, а не управлением платой. Данные передаются по последовательному порту на ПК.
Получаемые от Arduino данные — угол поворота сервы и расстояние до препятствия в этом направлении. То есть данные в полярной системе координат. Для наглядной визуализации их нужно преобразовать в декартову (X-Y) систему.

MATLAB считывает данные из COM-порта, сохраняет в матрицу с углом, преобразует в декартовы координаты по формуле выше и строит график. Я поместил устройство в коробку и получил следующий результат:

Шаг 6: Заключение

Система не идеальна, но выполняет задачу. Она даёт грубую оценку ширины и длины коробки и передаёт данные точно.
Основные ошибки: дрожание датчика при движении сервы и случайные ошибочные замеры самого датчика.
Система работает стабильно и подходит для экспериментов с восприятием глубины и базовых проектов компьютерного зрения.
Программный код
- matlab_code_to_run_on_pc.m
- Arduino Code
matlab_code_to_run_on_pc.m MATLAB
theta = 0:(pi/180):pi;
s = serial('COM10');
s.BaudRate = 9600;
fopen(s);
i = 0;
inc = 1;
while i < 180
A = fgets(s);
num(i+1) = str2num(A);
i = i+1;
end
fclose(s);
j = 1;
while j < 181
tab(j,1) = (j-1)*inc;
tab(j,2) = num(j);
tab(j,3) = num(j)*cosd((j-1)*inc);
tab(j,4) = num(j)*sind((j-1)*inc);
j = j+1;
end
% figure
% polar(theta,num)
plot(tab(:,3), tab(:,4));
Arduino Code Arduino
#include <Servo.h>
#include <NewPing.h>
#define TRIGGER_PIN 12
#define ECHO_PIN 11
#define MAX_DISTANCE 200
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
Servo myservo;
int pos = 0;
int it = 10;
void setup() {
myservo.attach(9);
Serial.begin(9600);
delay(3000);
}
void loop() {
int i = 0, t = 0, a = 0;
for (i = 0; i < 180; i++) {
unsigned int uS = sonar.ping();
myservo.write(i);
delay(20);
for (t = 0; t < it; t++) {
uS = sonar.ping();
a = uS / US_ROUNDTRIP_CM + a;
delay(30);
}
a = a / (it - 1);
t = 0;
Serial.println(a);
a = 0;
}
}
Схемы
Fritzing-файл для подключения сервы и ультразвукового датчика: YunConfig.fzz
Производственный процесс
- Создание потрясающей системы Ambilight для монитора на Arduino
- Робот для поиска людей на базе Arduino Uno: пошаговая интеграция датчиков
- Создание ультразвукового левитатора на Arduino: пошаговое руководство
- FlickMote: жестовое IR-пульт для умного дома на Arduino 101 и ультразвуковом датчике
- Умный вольтметр на Arduino и смартфоне — простое DIY-проект
- IoT-монитор пульса в реальном времени на Arduino и MAX30100
- Android-управляемая робот-платформа на Raspberry Pi и Motor Shield
- Умная банка на ESP8266 + Arduino: мониторинг наполненности в реальном времени
- Веб-сервер на Arduino Uno WiFi: управление LED через браузер
- Автономный линий-следующий робот на Arduino UNO