У Wokwi замість драйвера й мотора — світлодіоди з резисторами 220 Ом. Батарея, драйвер і мотор потрібні лише на столі.
4 кроки · у власному темпі
1. Додаємо датчик
Датчик знайомий з уроку 8. Тут TRIG — A1, ECHO — A0: аналогові піни працюють і як цифрові, а дроти датчика не перетинаються з дротами драйвера. Мотори поки стоять.
Відкрий новий проєкт Arduino Uno у Wokwi.
Заміни diagram.json файлом кроку.
Заміни sketch.ino скетчем кроку.
Натисни ▶.
Натисни на датчик і рухай повзунок відстані.
Підключення
Контакт
Куди з’єднати
Uno D12
LED AIN1 (зелений) через резистор 220 Ом
Uno D11
LED AIN2 (синій) через резистор 220 Ом
Uno D10
LED PWMA (помаранчевий) через резистор 220 Ом
Uno D5
LED BIN1 (зелений) через резистор 220 Ом
Uno D4
LED BIN2 (синій) через резистор 220 Ом
Uno D3
LED PWMB (помаранчевий) через резистор 220 Ом
Короткі ніжки LED
Лінія «−» своєї макетки
Лінія «−» лівої макетки
Лінія «−» правої макетки
Лінія «−» лівої макетки
Uno GND
HC-SR04 VCC
Uno 5V
HC-SR04 GND
Uno GND
HC-SR04 TRIG
Uno A1
HC-SR04 ECHO
Uno A0
Файли для Wokwi
Відкрий новий Arduino Uno. Заміни sketch.ino і diagram.json файлами кроку. Бібліотеки не потрібні. Натисни ▶.
#include <Arduino.h>
const byte AIN1 = 12; // Лівий мотор: вперед
const byte AIN2 = 11; // Лівий мотор: назад
const byte PWMA = 10; // Швидкість лівого мотора
const byte BIN1 = 5; // Правий мотор: вперед
const byte BIN2 = 4; // Правий мотор: назад
const byte PWMB = 3; // Швидкість правого мотора
const byte TRIG_PIN = A1; // Команда датчику
const byte ECHO_PIN = A0; // Відповідь датчика
const bool LEFT_REVERSED = false; // true, якщо ліві колеса крутяться назад
const bool RIGHT_REVERSED = false; // true, якщо праві колеса крутяться назад
const int MAX_SPEED = 230;
const int SPEED = 150;
const float STOP_CM = 25;
const unsigned long START_DELAY_MS = 3000;
const unsigned long BACK_MS = 400; // Від'їжджаємо від перешкоди
const unsigned long TURN_MS = 500; // Розвертаємось праворуч
void setMotor(byte in1, byte in2, byte pwm, int speed) {
speed = constrain(speed, -MAX_SPEED, MAX_SPEED);
if (speed > 0) {
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
} else if (speed < 0) {
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
} else {
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
}
analogWrite(pwm, abs(speed)); // Знак — напрямок, число — швидкість
}
void drive(int left, int right) {
setMotor(AIN1, AIN2, PWMA, LEFT_REVERSED ? -left : left);
setMotor(BIN1, BIN2, PWMB, RIGHT_REVERSED ? -right : right);
}
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 avoid() {
Serial.println("Obstacle: back and turn");
drive(0, 0);
delay(300);
drive(-SPEED, -SPEED);
delay(BACK_MS);
drive(SPEED, -SPEED);
delay(TURN_MS);
drive(0, 0);
delay(200);
}
void setup() {
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);
pinMode(PWMA, OUTPUT);
pinMode(BIN1, OUTPUT);
pinMode(BIN2, OUTPUT);
pinMode(PWMB, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
digitalWrite(TRIG_PIN, LOW);
drive(0, 0);
Serial.begin(115200);
Serial.println("Start in 3 s");
delay(START_DELAY_MS);
}
void loop() {
float cm = readDistanceCm();
if (cm > 0 && cm < STOP_CM) {
avoid();
} else {
drive(SPEED, SPEED);
}
delay(60);
}
Очікуваний результат
На 15 см: світлодіоди гаснуть, потім світять сині (назад), потім AIN1 і BIN2 (поворот), і знову вимірювання. Поки перешкода близько, об’їзд повторюється. На 100 см — обидва зелені.
Перевір себе
У моніторі Obstacle: back and turn з’являється лише коли повзунок менше 25 см.
Що можна змінити
TURN_MS: 300 — малий поворот, 800 — майже розворот.
Якщо не працює
Робот лише стоїть і не об’їжджає — перевір, що в loop() викликається avoid().
4. Їздимо по класу
Датчик спереду дивиться вперед. Він бачить тверді рівні перешкоди краще, ніж м’які чи скошені.
Вимкни батарею моторів.
Закріпи HC-SR04 спереду шасі, датчиками вперед, на висоті 5–10 см від підлоги.
Підключи датчик за таблицею.
Завантаж скетч кроку 3.
Від’єднай кабель комп’ютера й підключи павербанк.
Увімкни батарею, натисни RESET і постав робота на підлогу.
Постав на шляху коробку.
Вимкни батарею моторів після досліду.
Підключення
Контакт
Куди з’єднати
«+» батареї 2×18650 через вимикач
TB6612 VM
«−» батареї
TB6612 GND
Павербанк 18650
Uno через USB-кабель
Uno 5V
TB6612 VCC
Uno GND
TB6612 GND — спільна земля
TB6612 STBY
TB6612 VCC — дозвіл роботи
Uno D12
TB6612 AIN1
Uno D11
TB6612 AIN2
Uno D10
TB6612 PWMA
Uno D5
TB6612 BIN1
Uno D4
TB6612 BIN2
Uno D3
TB6612 PWMB
TB6612 AO1 і AO2
Обидва ліві мотори, з’єднані паралельно
TB6612 BO1 і BO2
Обидва праві мотори, з’єднані паралельно
HC-SR04 VCC
Uno 5V — через лінію «+» макетки разом із VCC драйвера
HC-SR04 GND
Uno GND
HC-SR04 TRIG
Uno A1
HC-SR04 ECHO
Uno A0
Скетч для справжньої плати
Це той самий код, що й у попередньому кроці. Відкрий його в Arduino IDE, вибери плату Arduino Uno і завантаж.