>
В этой статье мастер расскажет нам, как построить робота, избегающего препятствий. Робот представляет собой небольшой и простой двухколесный автомобиль, который будет двигаться вперед, пока не обнаружит препятствие на своем пути. Дальше он остановится, отъедет немного назад, а затем “посмотрит” влево и вправо.
Затем он сравнит расстояния, доступные с обеих сторон и повернет в направлении, где доступное расстояние кажется более предпочтительным. Таким образом, он сможет перемещаться в пространстве, полном препятствий, не сталкиваясь с ними.
Для определения расстояния робот использует ультразвуковой датчик HC-SR04. Этот датчик посылает ультразвуковые звуковые волны каждые 10 микросекунд, и если впереди есть какое-либо препятствие, датчик получает отражение сигнала.
Инструменты и материалы:-Arduino UNO;-Плата расширения L293D;-Шасси (включая моторы и колеса);-Провода соединительные;-Держатель батареи;-Серводвигатель SG90;-Ультразвуковой датчик HC-SR04;-Паяльник;-Клеевой пистолет;
-Кусачки;
-Отвертка;
Шаг первый: база
Сначала собираем базу и добавляем роликовое колесо спереди. Оно будет действовать как поддерживающее третье колесо спереди, и оно может свободно вращаться на 360 градусов.
Устанавливает моторы и колеса на шасси. Припаиваем провода к моторам и переходим к следующему шагу.Шаг второй: установка ардуино
Устанавливаем ардуино и плату расширения. Фиксируем на двусторонний скотч.Шаг третий: ультразвуковой датчик
Дальше нужно установить сервопривод и на его вал закрепить ультразвуковой датчик.Шаг четвертый: схема подключения
Двигатели
Щит двигателя имеет винтовые клеммы для подключения до четырех двигателей. Просто подключите двигатели к любым двум клеммам, поскольку используются только два двигателя.
Серводвигатель
Серводвигатель имеет один соединительный провод, в котором три жилы. Просто подключите его к S1 на плате расширения.
Ультразвуковой датчик
Датчик GND: Arduino GND
Датчик VCC: Arduino + 5 В
Датчик TRIP : Arduino A4
Датчик ECHO: Arduino A5
Кроме того, подсоедините держатель аккумулятора к винтовой клемме аккумулятора платы расширения. Шаг пятый: код
Теперь нужно через Arduino IDE запрограммировать Ардуино. Код можно скачать ниже. Показать / Скрыть текст
////////////////////////////////////////////////////////
// Arduino Obstacle Avoiding Robot v2.0 //
// By Aarav Garg – 2021 //
////////////////////////////////////////////////////////
//including the libraries
#include <AFMotor.h>
#include <NewPing.h>
#include <Servo.h>
//defining pins and variables
#define TRIG_PIN A4
#define ECHO_PIN A5
#define MAX_DISTANCE 200
#define MAX_SPEED 200 // sets speed of DC motors
#define MAX_SPEED_OFFSET 20
#define turn_amount 500
//defining motors,servo,sensor
NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE);
AF_DCMotor motor1(2, MOTOR12_8KHZ);
AF_DCMotor motor2(1, MOTOR12_8KHZ);
Servo myservo;
//defining global variables
boolean goesForward=false;
int distance = 100;
int speedSet = 0;
void setup() {
Serial.begin(9600);
myservo.attach(10);
myservo.write(90);
delay(2000);
distance = readPing();
delay(100);
distance = readPing();
delay(100);
distance = readPing();
delay(100);
distance = readPing();
delay(100);
}
void loop() {
int distanceR = 0;
int distanceL = 0;
delay(40);
Serial.println(distance);
if(distance<=15)
{
Serial.println("Object Detected");
moveStop();
delay(100);
moveBackward();
delay(300);
moveStop();
delay(200);
distanceR = lookRight();
Serial.print("Distance Right = ");
Serial.println(distanceR);
delay(200);
distanceL = lookLeft();
Serial.print("Distance Left = ");
Serial.println(distanceL);
delay(200);
if(distanceR>=distanceL)
{
turnRight();
moveStop();
}
else
{
turnLeft();
moveStop();
}
}
else
{
moveForward();
}
//reseting the variable after the operations
distance = readPing();
}
int lookRight()
{
myservo.write(0);
delay(500);
int distance = readPing();
delay(100);
myservo.write(90);
return distance;
}
int lookLeft()
{
myservo.write(180);
delay(500);
int distance = readPing();
delay(100);
myservo.write(90);
return distance;
delay(100);
}
int readPing() {
delay(70);
int cm = sonar.ping_cm();
if(cm==0)
{
cm = 250;
}
return cm;
}
void moveStop() {
motor1.run(RELEASE);
motor2.run(RELEASE);
}
void moveForward() {
if(!goesForward)
{
goesForward=true;
motor1.run(FORWARD);
motor2.run(FORWARD);
for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2) // slowly bring the speed up to avoid loading down the batteries too quickly
{
motor1.setSpeed(speedSet);
motor2.setSpeed(speedSet+MAX_SPEED_OFFSET);
delay(5);
}
}
}
void moveBackward() {
goesForward=false;
motor1.run(BACKWARD);
motor2.run(BACKWARD);
for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2) // slowly bring the speed up to avoid loading down the batteries too quickly
{
motor1.setSpeed(speedSet);
motor2.setSpeed(speedSet+MAX_SPEED_OFFSET);
delay(5);
}
}
void turnRight() {
Serial.println("Turning Right");
motor1.run(FORWARD);
motor2.run(BACKWARD);
delay(turn_amount);
motor1.run(FORWARD);
motor2.run(FORWARD);
}
void turnLeft() {
Serial.println("Turning Left");
motor1.run(BACKWARD);
motor2.run(FORWARD);
delay(turn_amount);
motor1.run(FORWARD);
motor2.run(FORWARD);
}
На видео можно посмотреть сборку и демонстрацию работы робота.