У Wokwi замість драйвера й мотора — світлодіоди з резисторами 220 Ом. Батарея, драйвер і мотор потрібні лише на столі.
5 кроків · у власному темпі
1. Перевіряємо сторони в Wokwi
На шасі по два мотори з кожного боку. Два ліві з’єднані паралельно з AO1/AO2, два праві — з BO1/BO2. Мотори з різних боків стоять дзеркально, тому один бік може крутитися назад. Це виправляємо в коді: LEFT_REVERSED або RIGHT_REVERSED.
Відкрий новий проєкт 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
Файли для 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 bool LEFT_REVERSED = false; // true, якщо ліві колеса крутяться назад
const bool RIGHT_REVERSED = false; // true, якщо праві колеса крутяться назад
const int MAX_SPEED = 230;
const int SPEED = 150;
const unsigned long RUN_MS = 1500;
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);
}
void setup() {
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);
pinMode(PWMA, OUTPUT);
pinMode(BIN1, OUTPUT);
pinMode(BIN2, OUTPUT);
pinMode(PWMB, OUTPUT);
Serial.begin(115200);
}
void loop() {
Serial.println("Left side forward");
drive(SPEED, 0);
delay(RUN_MS);
drive(0, 0);
delay(1000);
Serial.println("Right side forward");
drive(0, SPEED);
delay(RUN_MS);
drive(0, 0);
delay(3000);
}
Очікуваний результат
Під час Left side forward обидва ліві колеса крутяться вперед, під час Right side forward — обидва праві.
Перевір себе
Колеса одного боку завжди крутяться однаково.
Що можна змінити
Запиши свої значення LEFT_REVERSED і RIGHT_REVERSED: вони потрібні для наступних кроків.
Якщо не працює
Два колеса одного боку крутяться в різні боки — це підключення, а не код. При вимкненій батареї поміняй місцями дроти того мотора, що крутиться назад. Крутиться лише одне колесо з пари — перевір дроти другого мотора на виходах драйвера.
3. Їдемо за програмою
Робот на підлозі не має рушати одразу: 3 секунди, щоб поставити його й прибрати руки. Програма виконується один раз у setup(), loop() порожній — після Done робот стоїть. Функція move() їде заданий час і зупиняється.
Перенеси свої LEFT_REVERSED і RIGHT_REVERSED у скетч кроку 3.
Заміни код скетчем кроку 3.
Запусти симуляцію.
Стеж за монітором і світлодіодами.
Підключення
Контакт
Куди з’єднати
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
Файли для 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 bool LEFT_REVERSED = false; // true, якщо ліві колеса крутяться назад
const bool RIGHT_REVERSED = false; // true, якщо праві колеса крутяться назад
const int MAX_SPEED = 230;
const int SPEED = 170;
const unsigned long START_DELAY_MS = 3000; // Час прибрати руки після ввімкнення
const unsigned long TURN_MS = 600;
const unsigned long PAUSE_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);
}
void move(int left, int right, unsigned long ms) {
drive(left, right);
delay(ms);
drive(0, 0);
delay(PAUSE_MS);
}
void setup() {
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);
pinMode(PWMA, OUTPUT);
pinMode(BIN1, OUTPUT);
pinMode(BIN2, OUTPUT);
pinMode(PWMB, OUTPUT);
drive(0, 0);
Serial.begin(115200);
Serial.println("Start in 3 s");
delay(START_DELAY_MS);
Serial.println("Forward");
move(SPEED, SPEED, 1500);
Serial.println("Backward");
move(-SPEED, -SPEED, 1000);
Serial.println("Spin left");
move(-SPEED, SPEED, TURN_MS);
Serial.println("Done");
}
void loop() {
}
Очікуваний результат
Start in 3 s, далі Forward (обидва зелені), Backward (обидва сині), Spin left (AIN2 і BIN1), Done — усе гасне.
Перевір себе
Після Done нічого не світить: програма не повторюється.
Що можна змінити
move(SPEED, SPEED, 1500): зміни час, щоб робот проїхав рівно 50 см.
Якщо не працює
Програма почалася одразу — перевір delay(START_DELAY_MS) у setup().
4. Квадрат
Цикл for чотири рази повторює сторону й поворот праворуч. TURN_MS підбираємо так, щоб поворот був 90°: кут залежить від підлоги, заряду батареї й ваги робота.
Перенеси свої LEFT_REVERSED і RIGHT_REVERSED у скетч кроку 4.
Заміни код скетчем кроку 4.
Запусти симуляцію.
Порахуй сторони в моніторі.
Підключення
Контакт
Куди з’єднати
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
Файли для Wokwi
Відкрий новий Arduino Uno. Заміни sketch.ino і diagram.json файлами кроку. Бібліотеки не потрібні. Натисни ▶.
Робот їде дугою замість прямої — один бік сильніший. У move(SPEED, SPEED, SIDE_MS) зменш швидкість сильнішого боку на 10. Uno перезапускається на старті — живлення Uno має йти від павербанка, а не від батареї моторів.