1. Додаємо другий мотор TB6612 має два канали. Канал B керується так само, як A: BIN1, BIN2 і PWMB. Лівий мотор — канал A, правий — канал B.
Відкрий новий проєкт 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 byte SPEED = 180;
const unsigned long RUN_MS = 2000;
const unsigned long STOP_MS = 2000;
void setup() {
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);
pinMode(PWMA, OUTPUT);
pinMode(BIN1, OUTPUT);
pinMode(BIN2, OUTPUT);
pinMode(PWMB, OUTPUT);
digitalWrite(AIN1, HIGH); // Обидва мотори — вперед
digitalWrite(AIN2, LOW);
digitalWrite(BIN1, HIGH);
digitalWrite(BIN2, LOW);
Serial.begin(115200);
}
void loop() {
analogWrite(PWMA, SPEED);
analogWrite(PWMB, SPEED);
Serial.println("Both forward");
delay(RUN_MS);
analogWrite(PWMA, 0);
analogWrite(PWMB, 0);
Serial.println("Stop");
delay(STOP_MS);
}
Очікуваний результат Обидва зелені й обидва помаранчеві світлодіоди світять 2 с, потім 2 с не світить жоден.
Перевір себе Ліва макетка — піни 12, 11, 10; права — 5, 4, 3.
Що можна змінити Зміни SPEED на 120: обидва PWM-світлодіоди стануть тьмянішими.
Якщо не працює Не світить права макетка — перевір, що її лінія «−» з’єднана з лівою.
2. Одна функція для двох моторів Щоб щоразу не писати шість команд, робимо setMotor(): знак числа — напрямок, саме число — швидкість. drive(ліва, права) керує обома моторами одним рядком.
Заміни код скетчем кроку 2. Запусти симуляцію. Знайди у скетчі drive(-SPEED, -SPEED). Підключення Контакт Куди з’єднати 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 int MAX_SPEED = 230;
const int SPEED = 180;
const unsigned long RUN_MS = 2000;
const unsigned long STOP_MS = 1000;
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);
setMotor(BIN1, BIN2, PWMB, 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("Forward");
drive(SPEED, SPEED);
delay(RUN_MS);
Serial.println("Stop");
drive(0, 0);
delay(STOP_MS);
Serial.println("Backward");
drive(-SPEED, -SPEED); // Мінус — обертання назад
delay(RUN_MS);
Serial.println("Stop");
drive(0, 0);
delay(STOP_MS);
}
Очікуваний результат Forward — світять зелені AIN1 і BIN1, Backward — сині AIN2 і BIN2. PWM-світлодіоди однаково яскраві.
Перевір себе drive(-180, -180) означає «обидва назад зі швидкістю 180».
Що можна змінити drive(100, 200): лівий мотор повільніший за правий.
Якщо не працює Яскравість PWMB не змінюється — PWMB має бути на піні 3 з позначкою ~.
3. Повороти Робот повертає, коли колеса крутяться по-різному. Різні напрямки — поворот на місці. Один напрямок, але різна швидкість — плавна дуга.
Заміни код скетчем кроку 3. Запусти симуляцію. Порівняй світлодіоди під час Spin left, Spin right і Curve right. Підключення Контакт Куди з’єднати 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 int MAX_SPEED = 230;
const int SPEED = 180;
const unsigned long TURN_MS = 1000;
const unsigned long STOP_MS = 1000;
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);
setMotor(BIN1, BIN2, PWMB, 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("Spin left");
drive(-SPEED, SPEED); // Колеса в різні боки — поворот на місці
delay(TURN_MS);
drive(0, 0);
delay(STOP_MS);
Serial.println("Spin right");
drive(SPEED, -SPEED);
delay(TURN_MS);
drive(0, 0);
delay(STOP_MS);
Serial.println("Curve right");
drive(SPEED, SPEED / 2); // Праве колесо повільніше — плавна дуга
delay(TURN_MS * 2);
drive(0, 0);
delay(STOP_MS);
}
Очікуваний результат Spin left — світять AIN2 і BIN1. Spin right — AIN1 і BIN2. Curve right — обидва зелені, PWMB тьмяніший за PWMA.
Перевір себе Поясни, чому для повороту ліворуч ліве колесо крутиться назад.
Що можна змінити SPEED / 2 заміни на SPEED / 3 — дуга стане крутішою.
Якщо не працює Поворот іде не в той бік — перевір знак: drive(-SPEED, SPEED) — ліворуч.
4. Два справжні мотори Обидва мотори живляться від тієї самої батареї через один драйвер. Позначимо їх, щоб не сплутати лівий і правий.
Вимкни вимикач батареї. Підпиши мотори скотчем: L — лівий, R — правий. Закріпи обидва мотори на столі валами в один бік. З’єднай усе за таблицею, батарею — останньою. Завантаж скетч і увімкни батарею. Порівняй обертання валів зі словами в моніторі. Вимкни батарею. Підключення Контакт Куди з’єднати «+» батареї 2×18650 через вимикач TB6612 VM «−» батареї TB6612 GND 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 Правий мотор
Скетч для справжньої плати Це той самий код, що й у попередньому кроці. Відкрий його в Arduino IDE, вибери плату Arduino Uno і завантаж.
Повний код цього кроку Копіювати код #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 int MAX_SPEED = 230;
const int SPEED = 180;
const unsigned long TURN_MS = 1000;
const unsigned long STOP_MS = 1000;
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);
setMotor(BIN1, BIN2, PWMB, 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("Spin left");
drive(-SPEED, SPEED); // Колеса в різні боки — поворот на місці
delay(TURN_MS);
drive(0, 0);
delay(STOP_MS);
Serial.println("Spin right");
drive(SPEED, -SPEED);
delay(TURN_MS);
drive(0, 0);
delay(STOP_MS);
Serial.println("Curve right");
drive(SPEED, SPEED / 2); // Праве колесо повільніше — плавна дуга
delay(TURN_MS * 2);
drive(0, 0);
delay(STOP_MS);
}
Очікуваний результат Spin left — вали крутяться в різні боки, Curve right — в один бік, правий повільніше.
Перевір себе Під час Spin right вали міняють напрямки порівняно зі Spin left.
Що можна змінити Спробуй drive(SPEED, 0): крутиться лише лівий мотор.
Якщо не працює Один мотор крутиться не в той бік — при вимкненій батареї поміняй місцями його дроти на виходах драйвера.