Робот-ускользатор на сервоприводе: сборка на Arduino и HC-SR04
Компоненты и материалы
| Arduino UNO | 1 шт. |
| Микросервопривод SG90 | 1 шт. |
| Ультразвуковой датчик HC-SR04 | 1 шт. |
| Набор шасси робота 2WD с двигателями постоянного тока | 1 шт. |
| Перемычки (набор) | 1 шт. |
| Arduino Motor Shield Rev3 | 1 шт. |
Необходимые инструменты
- Паяльник
Программное обеспечение
- Arduino IDE
О проекте
Я студент факультета медиа-дизайна в Мультимедийном университете (Киберджая, Малайзия). Это мой третий год обучения, и предмет «Интерактивный дизайн» учит работу с компонентами Arduino. Для итогового задания я выбрал создание робота, избегающего препятствия, чтобы разобраться в принципе работы каждого элемента.
Шаг 1: Сборка шасси
В наборе шасси находятся: рама, два двигателя, два колеса, переднее опорное колесо, держатель батареи, винты, выключатель и перемычки. Соберите механическую часть согласно инструкции производителя.
Шаг 2: Проверка компонентов и пайка моторов
Перед пайкой рекомендую проверить все компоненты: оба двигателя постоянного тока, плату Arduino, Motor Shield, сервопривод и ультразвуковой датчик. Затем припаяйте красные и чёрные провода к выводам обоих двигателей.
Шаг 3: Подключение батарейного отсека и выключателя
Отрежьте чёрный провод держателя батарей пополам. Припаяйте один конец к одному контакту выключателя, второй — к другому. Выключатель готов.
Шаг 4: Установка Motor Shield на Arduino
Установите Motor Shield сверху на плату Arduino (pin-to-pin).
Шаг 5: Подключение двигателей к Motor Shield
Motor Shield выдаёт до 600 мА на канал — достаточно для двигателей. Припаяйте провода двигателей к клеммам шилда: левый двигатель — к M1, правый — к M3. Если родных проводов не хватает, удлините их кусками перемычек (срежьте контакты, оголите жилы и припаяйте).
Шаг 6: Питание и сигнальные линии
Подключите красный и чёрный провода от выключателя к клеммам питания Motor Shield (VIN и GND).
Для датчика и сервопривода подготовьте 4 пары перемычек (Male + Female) одинакового цвета — так проще не запутаться:
— Белые: 5V (Male → Arduino 5V, Female → датчик VCC)
— Чёрные: GND (Male → Arduino GND, Female → датчик GND)
— Оранжевые: A5 / TRIG (Male → A5, Female → датчик TRIG)
— Коричневые: A4 / ECHO (Male → A4, Female → датчик ECHO)
Шаг 7: Крепление электроники на шасси
Закрепите Arduino с шилдом на раме на двухстороннем скотче или термоклеем.
Шаг 8: Подключение ультразвукового датчика HC-SR04
Соедините Female-концы подготовленных проводов с датчиком: VCC — белый, GND — чёрный, ECHO — коричневый, TRIG — оранжевый.
Шаг 9: Подключение сервопривода
Вставьте штекер сервопривода в гнездо servo_2 на Motor Shield. (У разных сервоприводов распиновка может отличаться — проверьте даташит.)
Последний шаг: Загрузка кода
Для работы понадобятся три библиотеки:
1. AFMotor — драйвер Motor Shield
2. NewPing — ультразвуковой датчик
3. Servo — встроена в Arduino IDE
Установите их через менеджер библиотек, затем загрузите приведённый ниже скетч.
Код (Arduino IDE)
#include <AFMotor.h>
#include <Servo.h>
#include <NewPing.h>
#define TRIG_PIN A4
#define ECHO_PIN A5
#define MAX_DISTANCE_POSSIBLE 1000
#define MAX_SPEED 150
#define COLL_DIST 20
#define TURN_DIST COLL_DIST+10
NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE_POSSIBLE);
AF_DCMotor leftMotor(3, MOTOR12_8KHZ);
AF_DCMotor rightMotor(1, MOTOR12_8KHZ);
Servo neckControllerServoMotor;
int pos = 0;
int maxDist = 0;
int maxAngle = 0;
int maxRight = 0;
int maxLeft = 0;
int maxFront = 0;
int course = 0;
int curDist = 0;
String motorSet = "";
int speedSet = 0;
void setup() {
neckControllerServoMotor.attach(10);
neckControllerServoMotor.write(90);
delay(2000);
checkPath();
motorSet = "FORWARD";
neckControllerServoMotor.write(90);
moveForward();
}
void loop() {
checkForward();
checkPath();
}
void checkPath() {
int curLeft = 0, curFront = 0, curRight = 0, curDist = 0;
neckControllerServoMotor.write(144);
delay(120);
for (pos = 144; pos >= 36; pos -= 18) {
neckControllerServoMotor.write(pos);
delay(90);
checkForward();
curDist = readPing();
if (curDist < COLL_DIST) { checkCourse(); break; }
if (curDist < TURN_DIST) { changePath(); }
if (curDist > curDist) maxAngle = pos;
if (pos > 90 && curDist > curLeft) curLeft = curDist;
if (pos == 90 && curDist > curFront) curFront = curDist;
if (pos < 90 && curDist > curRight) curRight = curDist;
}
maxLeft = curLeft; maxRight = curRight; maxFront = curFront;
}
void setCourse() {
if (maxAngle < 90) turnRight();
if (maxAngle > 90) turnLeft();
maxLeft = maxRight = maxFront = 0;
}
void checkCourse() {
moveBackward(); delay(500); moveStop(); setCourse();
}
void changePath() {
if (pos < 90) lookLeft();
if (pos > 90) lookRight();
}
int readPing() {
delay(70);
unsigned int uS = sonar.ping();
return uS / US_ROUNDTRIP_CM;
}
void checkForward() {
if (motorSet == "FORWARD") {
leftMotor.run(FORWARD); rightMotor.run(FORWARD);
}
}
void checkBackward() {
if (motorSet == "BACKWARD") {
leftMotor.run(BACKWARD); rightMotor.run(BACKWARD);
}
}
void moveStop() { leftMotor.run(RELEASE); rightMotor.run(RELEASE); }
void moveForward() {
motorSet = "FORWARD";
leftMotor.run(FORWARD); rightMotor.run(FORWARD);
for (speedSet = 0; speedSet < MAX_SPEED; speedSet += 2) {
leftMotor.setSpeed(speedSet);
rightMotor.setSpeed(speedSet);
delay(5);
}
}
void moveBackward() {
motorSet = "BACKWARD";
leftMotor.run(BACKWARD); rightMotor.run(BACKWARD);
for (speedSet = 0; speedSet < MAX_SPEED; speedSet += 2) {
leftMotor.setSpeed(speedSet);
rightMotor.setSpeed(speedSet);
delay(5);
}
}
void turnRight() {
motorSet = "RIGHT";
leftMotor.run(FORWARD); rightMotor.run(BACKWARD);
delay(400);
motorSet = "FORWARD";
leftMotor.run(FORWARD); rightMotor.run(FORWARD);
}
void turnLeft() {
motorSet = "LEFT";
leftMotor.run(BACKWARD); rightMotor.run(FORWARD);
delay(400);
motorSet = "FORWARD";
leftMotor.run(FORWARD); rightMotor.run(FORWARD);
}
void lookRight() { rightMotor.run(BACKWARD); delay(400); rightMotor.run(FORWARD); }
void lookLeft() { leftMotor.run(BACKWARD); delay(400); leftMotor.run(FORWARD); }
Схема подключения
См. изображение схемы в разделе «Schematics» оригинального проекта.
Производственный процесс
- Simple Pi Robot — Сборка 2WD автономного ровера на Raspberry Pi
- Автономный линий-следующий робот на Arduino UNO
- Управление Roomba Create 2 через Arduino и Android: пошаговое руководство
- Точное управление сервоприводом через MPU6050 (Arduino, SG90, MG996R)
- Автономный домашний помощник-робот: полный список деталей и руководство по настройке (ROS, Alexa, MoveIt)
- DIY манипулятор, управляемый жестами руки: пошаговая сборка на Arduino
- Управление манипулятором LittleArm через Android-приложение по Bluetooth
- Набор для создания робота с умной внутренней навигацией на базе Arduino
- Серводвигатели: принцип работы и значение
- Максимизация точности: правильное сочетание редукторов (gearheads) с сервоприводами