Выставка · проект 2
Парковочный шлагбаум
HC-SR04 меряет «машину» (вашу руку). По зонам расстояния: зелёный — далеко, жёлтый — подъехали, красный + писк — слишком близко. Серво MG90S поднимает и опускает стрелу.
Оглавление
1. Цель
Мини-шлагбаум на столе: рука далеко — стрела открыта, зелёный свет; ближе — жёлтый; совсем близко — стрела «закрыта», красный и короткий писк. Аналогия парктроника и КПП.
2. Подготовка
Программы
- Подготовка Arduino IDE — Uno, порт, Blink уже пройдены.
- Библиотека Servo (встроена).
- Bambu Studio + setup-bambu-p2s.html — стойка и стрела.
Инструменты
- Макетка, провода MM/MF
- USB A↔B
- Резисторы ~220 Ω для светодиодов (если не модуль KY-016 с своими)
Компоненты
| Что | Каталог | Сколько |
|---|---|---|
| Arduino Uno | arduino-uno-r3 | 1 |
| HC-SR04 | hc-sr04 | 1 |
| Серво MG90S (металлоредуктор) | servo-mg90s | 1 |
| RGB KY-016 или три LED | rgb-led-ky016 / leds-5mm | 1 набор |
| Зуммер | buzzer-tmb12a05 | 1 |
| Макетка, провода | breadboard-mb102, jumper-mm, jumper-mf | — |
3. Распиновка (Uno → модуль)
| Пин Uno | Куда | Пояснение |
|---|---|---|
| 5 V | VCC HC-SR04, красный серво, VCC RGB-модуля | +5 V |
| GND | GND всех модулей | Общий минус |
| D9 | сигнал серво MG90S | Угол стрелы |
| D7 | Trig HC-SR04 | |
| D6 | Echo HC-SR04 | |
| D8 | зуммер | tone() |
| D3 | R (красный) RGB / LED | Через резистор, если голый LED |
| D4 | G (зелёный) | |
| D5 | B (синий) — в скетче «жёлтый» = R+G | Или отдельный жёлтый LED на D5 |
4. Сборка по шагам
Питание на макетке
5 V и GND с Uno на шины. Общий минус для всех.
Датчик и серво
HC-SR04: Trig D7, Echo D6. Серво: сигнал D9. Стрелу пока не надевайте — откалибруете углы OPEN/CLOSED в константах.
Индикация
RGB или три LED + зуммер по таблице. Прозвоните глазами: нет короткого между соседними пинами.
Verify, затем Upload по согласию
Скомпилируйте скетч. Заливайте только после явного «да». Откройте Serial 115200 — смотрите зону и см.
Подстройте углы и пороги
ANGLE_OPEN / ANGLE_CLOSED — под вашу стрелу (часто 10 и 90). ZONE_NEAR / ZONE_STOP — под длину стола (например 40 и 15 см).
5. Скетч (полный рабочий)
#include <Servo.h>
const int PIN_SERVO = 9;
const int PIN_TRIG = 7;
const int PIN_ECHO = 6;
const int PIN_BUZZ = 8;
const int PIN_R = 3;
const int PIN_G = 4;
const int PIN_B = 5;
// Подстройте под механику стрелы:
const int ANGLE_OPEN = 20; // открыто (проезд)
const int ANGLE_CLOSED = 95; // закрыто
const int ZONE_FAR = 50; // см и дальше — зелёный, открыто
const int ZONE_NEAR = 25; // между NEAR и FAR — жёлтый
// ближе ZONE_NEAR — красный, закрыто + писк
Servo barrier;
int currentAngle;
long readDistanceCm() {
digitalWrite(PIN_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
unsigned long us = pulseIn(PIN_ECHO, HIGH, 30000UL);
if (us == 0) return -1;
return (long)(us * 0.0343 / 2.0);
}
void setRGB(bool r, bool g, bool b) {
digitalWrite(PIN_R, r ? HIGH : LOW);
digitalWrite(PIN_G, g ? HIGH : LOW);
digitalWrite(PIN_B, b ? HIGH : LOW);
}
void moveToward(int target) {
if (currentAngle < target) currentAngle++;
else if (currentAngle > target) currentAngle--;
barrier.write(currentAngle);
}
void setup() {
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
pinMode(PIN_BUZZ, OUTPUT);
pinMode(PIN_R, OUTPUT);
pinMode(PIN_G, OUTPUT);
pinMode(PIN_B, OUTPUT);
barrier.attach(PIN_SERVO);
currentAngle = ANGLE_OPEN;
barrier.write(currentAngle);
Serial.begin(115200);
}
void loop() {
long cm = readDistanceCm();
int target = ANGLE_OPEN;
const char* zone = "FAR";
if (cm < 0) {
setRGB(false, false, true); // синий = нет эха
zone = "NONE";
noTone(PIN_BUZZ);
} else if (cm >= ZONE_FAR) {
setRGB(false, true, false); // зелёный
target = ANGLE_OPEN;
zone = "FAR";
noTone(PIN_BUZZ);
} else if (cm >= ZONE_NEAR) {
setRGB(true, true, false); // жёлтый ≈ R+G
target = ANGLE_OPEN;
zone = "NEAR";
noTone(PIN_BUZZ);
} else {
setRGB(true, false, false); // красный
target = ANGLE_CLOSED;
zone = "STOP";
tone(PIN_BUZZ, 900, 30);
}
moveToward(target);
Serial.print("cm=");
Serial.print(cm);
Serial.print(" zone=");
Serial.print(zone);
Serial.print(" angle=");
Serial.println(currentAngle);
delay(25);
}
6. Печать на Bambu Lab P2S
Какие детали печатаем
- Стойка / бокс под серво MG90S.
- Стрела (лёгкая, длинная) с втулкой на рожок/вал.
- По желанию: площадка «парковка» с разметкой и кронштейн HC-SR04 «на проезд».
Модель: скачать или нарисовать простое
Путь A. Ищите: parking barrier servo, boom gate model, SG90 arm, MG90S mount.
Путь C (Tinkercad). Вертикальная стойка-короб под серво + длинный тонкий брусок-стрела. Отверстие под рожок с зазором +0,3…0,5 mm. Стрелу держите тонкой.
Проект в Bambu Studio
Импорт STL → стрелу и основание плашмя → PLA, 0.2 mm, заполнение 15–20%. Отправка — setup-bambu-p2s.html.
Проверка качества
- Стрела ровная, без сильной «сабли»
- Втулка на рожок садится плотно, но снимается руками
- Стойка не шатается
Примерка без клея
Насадите стрелу на рожок, поставьте серво в стойку. Прогоните крайние углы из скетча.
7. Скрипт демо
- «Это модель парковочного шлагбаума и парктроника.»
- «Датчик считает сантиметры. Программа делит их на зоны — как светофор.»
- «Поднесите руку медленно: зелёный → жёлтый → красный и стрела закрывается.»
- «Настоящий шлагбаум сложнее, но идея та же: датчик + решение + привод.»
8. Неисправности
| Симптом | Что проверить |
|---|---|
| Стрела дрожит | Углы в упор; тяжёлая стрела; просадка 5 V |
| Цвета перепутаны | Пины R/G/B; общий анод/катод модуля |
| Всегда STOP | Датчик смотрит в стену; порог ZONE_NEAR слишком большой |
| Нет писка | D8, тип зуммера, короткость tone() |
| Uno сбрасывается | Отдельное питание серво + общий GND (согласовать) |
9. Безопасность
- Общий GND у Uno и серво — всегда.
- Не питайте мотор/серво с цифрового пина — только линия 5 V / согласованный БП.
- Upload — только после вашего согласия. Первое включение внешнего БП — тоже «стоп и спросить».
10. Что дальше
Дальше — управление руками: Двухосевая «голова» на джойстике.