Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Робот-ускользатор на сервоприводе: сборка на Arduino и HC-SR04

Компоненты и материалы

Arduino UNO 1 шт.
Микросервопривод SG90 1 шт.
Ультразвуковой датчик HC-SR04 1 шт.
Набор шасси робота 2WD с двигателями постоянного тока 1 шт.
Перемычки (набор) 1 шт.
Arduino Motor Shield Rev3 1 шт.

Необходимые инструменты

Программное обеспечение

О проекте

Я студент факультета медиа-дизайна в Мультимедийном университете (Киберджая, Малайзия). Это мой третий год обучения, и предмет «Интерактивный дизайн» учит работу с компонентами 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» оригинального проекта.

Производственный процесс

  1. Simple Pi Robot — Сборка 2WD автономного ровера на Raspberry Pi
  2. Автономный линий-следующий робот на Arduino UNO
  3. Управление Roomba Create 2 через Arduino и Android: пошаговое руководство
  4. Точное управление сервоприводом через MPU6050 (Arduino, SG90, MG996R)
  5. Автономный домашний помощник-робот: полный список деталей и руководство по настройке (ROS, Alexa, MoveIt)
  6. DIY манипулятор, управляемый жестами руки: пошаговая сборка на Arduino
  7. Управление манипулятором LittleArm через Android-приложение по Bluetooth
  8. Набор для создания робота с умной внутренней навигацией на базе Arduino
  9. Серводвигатели: принцип работы и значение
  10. Максимизация точности: правильное сочетание редукторов (gearheads) с сервоприводами