Портативный дальномер на Arduino Nano: HC-SR04, питание 18650, 3D-корпус
Компоненты и материалы
| Компонент | Количество | Примечание |
|---|---|---|
| Arduino Nano R3 | 1 | |
| Ультразвуковой датчик HC-SR04 | 1 | |
| Аккумулятор 18650 | 1 | |
| Зарядный модуль TP4056 | 1 | |
| DC-DC повышающий преобразователь 5V | 1 | |
| Зуммер | 1 | |
| Потенциометр (регулятор порога) | 1 | |
| Кнопка-переключатель (slide switch) | 1 | |
| Светодиоды (красный x2, зеленый, синий) | 4 | |
| Резисторы 330 Ом | 2 | |
| Болты M3x10 мм | 4 | |
| Провода 18 AWG | 1 набор | |
| 3D-печатные детали корпуса (3 шт.) | 1 комплект | |
| Трехгранный адаптер для штатива | 1 |
Инструменты
- 3D-принтер (Anet A8)
- Паяльник
- Клеевой пистолет
- Дремель (или ротационная инструмент)
Приложения и сервисы
- Arduino IDE (нужна библиотека NewPing)
- Simplify3D (или любой слайсер)
О проекте
Введение
Кафедра физкультуры колледжа Lehman проводила исследования тренировок с весами. Проблема: непоследовательность амплитуды движений искажала данные. Нужен был прибор, фиксирующий полную амплитуду повторений для тренажеров и свободных весов.
Требования:
- Регулируемое расстояние срабатывания
- Нестационарное крепление (не навсегда на тренажере)
- Совместимость со штативом (1/4")
- Беспроводное питание
Код
Требуется библиотека NewPing. Глобальные настройки:
int frequency = 700; // Частота зуммера, Гц
int lower_bound = 60; // Мин. расстояние, мм
int upper_bound = 200; // Макс. расстояние, мм
При включении 3 звуковых сигнала (успешная загрузка). В цикле loop() continuamente опрашивается датчик, расстояние сравнивается с порогом от потенциометра (маппинг 0-1023 → lower_bound-upper_bound). Если объект ближе порога — зуммер пищит, горит индикатор.
3D-печать
Файлы на Thingiverse. Модель с учетом возможностей FDM: фаски 45°, щель для стыковки. Время печати (Anet A8):
- Верхняя часть: 2 ч 40 мин
- Нижняя часть: 2 ч 20 мин
- Ручка регулятора: 20 мин


Сборка
- Детали примеряются без пайки.
- Провода из старых IDE-кабелей (удобные пучки).
- SMD-светодиоды на TP4056 заменены на выводные 3 мм (с резисторами на плате).
- Arduino Nano имеет всего 2 GND и 1 VCC пятачок — использована стрип-платы для разводки питания (перемычка на стрипе разрезана, чтобы не замкнуть 5V и GND).
- Электроника паяется вне корпуса, периодически примеряется для проверки длины проводов.
- Вал потенциометра укорочен на 6 мм.
- Аккумулятор 18650 припаян напрямую (не лучшая практика; лучше точечная сварка никелевой ленты).
- Компоненты зафиксированы горячим клеем (для прототипа допустимо, для серии — механическое крепление).












Итоги и планы
Ультразвуковой датчик имеет широкий угол (~30°), дает ложные срабатывания. Лучше ИК-датчик (уже луч, но до ~1 м). Планирую v2: LiPo вместо 18650, кастомный PCB, упрощенный штативный крепеж (гайка 1/4" вместо тяжелого адаптера). Альтернативная схема: датчик на движущейся штанге, направленный в пол — исключает широкий угол. Заказчик доволен прототипом за 2 недели.
Код
RangeDetectionDevice.ino
/** Viktor Silivanov 3/22/2018 Portable distance detection device using the HC-SR04 Ultrasonic sensor with distance adjustment for triggering the buzzer. **/
#include <NewPing.h>
#define wiper A5
#define echo 2
#define trig 3
#define ON_LED 7
#define buzzer 8
#define buzzer_LED 9
int frequency = 700;
int lower_bound = 60;
int upper_bound = 200;
int buzz_time = 250;
int buzz_delay = 280;
int max_distance = 400;
int i = 0;
int distance;
int threshold;
NewPing sonar(trig, echo, max_distance);
void setup() {
Serial.begin(9600);
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
pinMode(buzzer, OUTPUT);
pinMode(buzzer_LED, OUTPUT);
pinMode(ON_LED, OUTPUT);
digitalWrite(ON_LED, HIGH);
while(i < 3){
digitalWrite(buzzer_LED, HIGH);
tone(buzzer, frequency, buzz_time);
delay(buzz_delay);
i++;
}
digitalWrite(buzzer_LED, LOW);
}
void loop() {
distance = sonar.ping_cm();
threshold = analogRead(wiper);
threshold = map(threshold, 0, 1023, lower_bound, upper_bound);
if(distance != 0 && distance < threshold){
tone(buzzer, frequency);
digitalWrite(buzzer_LED, HIGH);
} else {
noTone(buzzer);
digitalWrite(buzzer_LED, LOW);
}
// serial_test(); // раскомментируйте для отладки
}
void serial_test(){
Serial.print("Ping: "); Serial.print(distance); Serial.println("cm");
Serial.print("Range: ["); Serial.print(lower_bound); Serial.print(", "); Serial.print(upper_bound); Serial.println("] cm");
Serial.print("Threshold: "); Serial.print(threshold); Serial.println("cm");
delay(100);
}
3D-модели
Все 3 детали в одном файле на Thingiverse.
Схемы

Производственный процесс
- TinyML-детектор языка на Arduino Nano 33 BLE Sense с Edge Impulse
- Создание игры в реальном времени на Arduino Nano с гироскопом MPU-6050 и OLED-дисплеем
- Цифровые кости на Arduino: генератор случайных чисел с LCD-дисплеем и кнопкой
- Создание рулетки на 37 светодиодов с Arduino Nano
- Мини-аркада на ATtiny85: Snake — ручная OLED-консоль своими руками
- Сборка аудиореактивной настольной лампы на Arduino Nano
- Автономный робот-следопыт с распознаванием лиц на Arduino Nano и OpenCV
- Медное гальваническое покрытие: умная система на Arduino UNO
- NeoPixel Matrix Pong на Arduino Nano: неоновая игра Pong на матрице 15×10
- Портативная станция мониторинга температуры: TMP36 + LCD дисплей