A
ARDUINO LABGUIDE

Выставка · проект 2

Парковочный шлагбаум

HC-SR04 меряет «машину» (вашу руку). По зонам расстояния: зелёный — далеко, жёлтый — подъехали, красный + писк — слишком близко. Серво MG90S поднимает и опускает стрелу.

старт серво зоны ~2–3 часа + печать

Оглавление

1. Цель

Мини-шлагбаум на столе: рука далеко — стрела открыта, зелёный свет; ближе — жёлтый; совсем близко — стрела «закрыта», красный и короткий писк. Аналогия парктроника и КПП.

Критерий готовности: три зоны стабильно переключаются при движении руки; стрела плавно едет между двумя углами без дрожания; цвет/писк соответствуют зоне ≥5 секунд подряд.

2. Подготовка

Программы

Инструменты

Компоненты

ЧтоКаталогСколько
Arduino Unoarduino-uno-r31
HC-SR04hc-sr041
Серво MG90S (металлоредуктор)servo-mg90s1
RGB KY-016 или три LEDrgb-led-ky016 / leds-5mm1 набор
Зуммерbuzzer-tmb12a051
Макетка, проводаbreadboard-mb102, jumper-mm, jumper-mf—
Серво MG90S HC-SR04

3. Распиновка (Uno → модуль)

Пин UnoКудаПояснение
5 VVCC HC-SR04, красный серво, VCC RGB-модуля+5 V
GNDGND всех модулейОбщий минус
D9сигнал серво MG90SУгол стрелы
D7Trig HC-SR04
D6Echo HC-SR04
D8зуммерtone()
D3R (красный) RGB / LEDЧерез резистор, если голый LED
D4G (зелёный)
D5B (синий) — в скетче «жёлтый» = R+GИли отдельный жёлтый LED на D5
У модуля KY-016 часто общий катод и три резистора уже на плате — тогда R/G/B напрямую на D3/D4/D5, GND модуля на GND Uno. У голых LED: анод → пин через 220 Ω, катод → GND.
MG90S тянет больше тока, чем SG90. Если плата мигает/перезапускается — не «лечение» более толстым USB наугад: согласуйте отдельное 5 V и общий GND.

4. Сборка по шагам

Шаг 4.1

Питание на макетке

5 V и GND с Uno на шины. Общий минус для всех.

✓ Шины подписаны «+» и «−»
Шаг 4.2

Датчик и серво

HC-SR04: Trig D7, Echo D6. Серво: сигнал D9. Стрелу пока не надевайте — откалибруете углы OPEN/CLOSED в константах.

✓ Датчик смотрит туда, куда будет подъезжать «машина»
Шаг 4.3

Индикация

RGB или три LED + зуммер по таблице. Прозвоните глазами: нет короткого между соседними пинами.

✓ Провода индикации не пересекают силовые «внахлёст» оголёнными
Шаг 4.4

Verify, затем Upload по согласию

Скомпилируйте скетч. Заливайте только после явного «да». Откройте Serial 115200 — смотрите зону и см.

✓ Движение руки меняет цвет; у порога CLOSE стрела едет в «закрыто»
Шаг 4.5

Подстройте углы и пороги

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

Общий курс «с нуля» (Studio, отправка, качество): setup-bambu-p2s.html. Ниже — только детали ЭТОГО проекта.
Печатайте корпус после того, как схема на макетке уже работает.
Шаг 6.1

Какие детали печатаем

  • Стойка / бокс под серво MG90S.
  • Стрела (лёгкая, длинная) с втулкой на рожок/вал.
  • По желанию: площадка «парковка» с разметкой и кронштейн HC-SR04 «на проезд».
Не делайте стрелу тяжёлой: серво и USB не любят инерцию.
Шаг 6.2

Модель: скачать или нарисовать простое

Путь A. Ищите: parking barrier servo, boom gate model, SG90 arm, MG90S mount.

Путь C (Tinkercad). Вертикальная стойка-короб под серво + длинный тонкий брусок-стрела. Отверстие под рожок с зазором +0,3…0,5 mm. Стрелу держите тонкой.

Шаг 6.3

Проект в Bambu Studio

Импорт STL → стрелу и основание плашмя → PLA, 0.2 mm, заполнение 15–20%. Отправка — setup-bambu-p2s.html.

Шаг 6.4

Проверка качества

  • Стрела ровная, без сильной «сабли»
  • Втулка на рожок садится плотно, но снимается руками
  • Стойка не шатается
Шаг 6.5

Примерка без клея

Насадите стрелу на рожок, поставьте серво в стойку. Прогоните крайние углы из скетча.

✓ Стрела насажена без большого люфта; в крайних углах не трётся о стойку

7. Скрипт демо

  1. «Это модель парковочного шлагбаума и парктроника.»
  2. «Датчик считает сантиметры. Программа делит их на зоны — как светофор.»
  3. «Поднесите руку медленно: зелёный → жёлтый → красный и стрела закрывается.»
  4. «Настоящий шлагбаум сложнее, но идея та же: датчик + решение + привод.»

8. Неисправности

СимптомЧто проверить
Стрела дрожитУглы в упор; тяжёлая стрела; просадка 5 V
Цвета перепутаныПины R/G/B; общий анод/катод модуля
Всегда STOPДатчик смотрит в стену; порог ZONE_NEAR слишком большой
Нет пискаD8, тип зуммера, короткость tone()
Uno сбрасываетсяОтдельное питание серво + общий GND (согласовать)

9. Безопасность

10. Что дальше

Дальше — управление руками: Двухосевая «голова» на джойстике.

← К списку проектов