Плеко / Робототехніка
Урок 09-05 · Крок 1 / 5

Відстань має напрямок

Як це працює

Однієї відстані недостатньо для карти

Показ 30 см повідомляє, як далеко відбиття, але не пояснює, у який бік дивиться датчик. Якщо повертати датчик і записувати команду кута поруч із відстанню, отримаємо кілька напрямків огляду.

Що ми справді знаємо

Arduino знає надісланий кут, але не отримує виміряний кут із нашого серво. Тому це приблизна карта. HC-SR04 використовує звук, а не радіохвилі; назва «радар» для такої моделі умовна.

Зроби

  1. Повтори окреме живлення серво та спільний GND.
  2. Підключи датчик за таблицею.
  3. Залиш датчик нерухомим, поки перевіряєш електроніку.

Очікуваний результат

Серво та датчик підключені; механічне кріплення встановлює вчитель після перевірки.

Що можна змінити

Без готового кріплення проходь програмні кроки в симуляторі.

Як запустити у Wokwi або на платі

У Wokwi: відкрий новий Arduino Uno, перенеси diagram.json, sketch/sketch.ino та libraries.txt з ZIP потрібного кроку у відповідні вкладки, натисни ▶. На справжній платі спочатку перевір підключення з учителем. Кожен код замінює весь попередній скетч.

Схема підключення — відкрити

Підключення справжнього комплекту

Підключення: звір кожен дрітДжерело серво +5VВерхня шина +Джерело GNDВерхня шина −Uno GNDВерхня шина −Серво V+Верхня +, отвір 10Серво GNDВерхня −, отвір 11Серво сигналUno D9Uno 5VНижня шина +Верхня шина −Нижня шина −HC-SR04 VCCНижня +, отвір 15HC-SR04 GNDНижня −, отвір 16HC-SR04 TRIGUno D7HC-SR04 ECHOUno D6Два плюси розділені, GND спільний

На макетній платі верхня + — тільки джерело серво, нижня + — тільки Uno. Об’єднуємо мінусові шини. Перевір розриви шин; за потреби з’єднай половини тієї самої шини. У Wokwi верхня + живиться від Uno лише як спрощення. На справжній платі цей дріт заміни на +5 V окремого джерела; його мінус додай на верхню −.

Повний код і файли проєкту

Поворот, пауза, вимірювання: таблиця перешкод за напрямками.

#include <Arduino.h>
#include <Servo.h>
const byte SERVO_PIN = 9;
const byte TRIG_PIN = 7;
const byte ECHO_PIN = 6;
const int MIN_ANGLE = 60;
const int MAX_ANGLE = 120;
const int STEP_DEG = 10;
const unsigned long SETTLE_MS = 300;
Servo arm;
int angle = MIN_ANGLE;
int direction = 1;

float readDistanceCm() {
  digitalWrite(TRIG_PIN, LOW); // Готуємо короткий імпульс
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH); // Запускаємо вимірювання
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);
  unsigned long echoUs = pulseIn(ECHO_PIN, HIGH, 25000UL);
  float cm = echoUs / 58.0; // Шлях туди й назад уже врахований

  if (echoUs == 0 || cm < 2 || cm > 400) {
    return -1; // Немає надійного вимірювання
  }

  return cm;
}

void setup() {
  pinMode(TRIG_PIN, OUTPUT); // TRIG — команда датчику
  pinMode(ECHO_PIN, INPUT); // ECHO — відповідь датчика
  digitalWrite(TRIG_PIN, LOW);
  Serial.begin(115200); // Така сама швидкість у моніторі
  arm.write(angle);
  arm.attach(SERVO_PIN);
  Serial.println("angle,distance_cm");
}

void loop() {
  arm.write(angle);
  delay(SETTLE_MS);
  float cm = readDistanceCm();
  Serial.print(angle);
  Serial.print(",");

  if (cm < 0) {
    Serial.println("NA");
  } else {
    Serial.println(cm);
  }

  angle += direction * STEP_DEG;

  if (angle >= MAX_ANGLE) {
    angle = MAX_ANGLE;
    direction = -1;
  }

  if (angle <= MIN_ANGLE) {
    angle = MIN_ANGLE;
    direction = 1;
  }

}

Wokwi потребує інтернету. Завантажений HTML-урок працює офлайн.