Fast
ROB-55648Автономный робот "Fast" выполнен на четырех колесной платформе с задним приводом. Элементы шасси робота вырезаны из оргстекла толщиной 3 мм на лазерном станке. Привод задний, два мотора модель HC02-48, 1::48 с редуктором. Управление двигателями осуществляется с помощью драйвера двигателя L298.
Рулевое управление переднее помощью стандартного сервопривода на 6 килограмм.
Передний бампер вспененная резина.
Система управления на базе микропроцессора Arduino UNO.
Драйвер двигателя L298.
Цифровые датчики линии и датчики расстояния HC-SR04.
Питание робота 7,4В осуществляется от двух аккумуляторов типа 18650 соединенных последовательно.
#include "Ultrasonic.h"
#include <Servo.h>
Ultrasonic L(10, 11); // Trig - first, Echo - second
Ultrasonic R(12, 13);
Servo myservo;
#define LS A0 // левый датчик
#define RS A1 // правый датчик
#define IN1 2 // мотор 1
#define IN2 4 // мотор 1
#define IN3 5 // мотор 2
#define IN4 7 // мотор 2
#define ENA 3 // мотор 1
#define ENB 6 // мотор 2
void setup()
{
myservo.attach(8);
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
pinMode(ENA,OUTPUT);
pinMode(ENB,OUTPUT);
pinMode(LS,INPUT);
pinMode(RS,INPUT);
Serial.begin(9600);
}
void loop()
{
float d_L = L.Ranging(CM); // get distance
float d_R = R.Ranging(CM); // get distance
int lsstatus = digitalRead(LS);
int rsstatus = digitalRead(RS);
/*Serial.print(d_L);
Serial.println("cml, ");
Serial.print(d_R);
Serial.println("cmr, ");
delay(500);*/
int var = (d_L - d_R);
Serial.println(var);
if ((-10<=var)&&(var<=10)) // движение прямо
{myservo.write(90);
digitalWrite(IN1, 1);
digitalWrite(IN2, 0);
digitalWrite(IN3, 1);
digitalWrite(IN4, 0);
analogWrite(ENA, 100);
analogWrite(ENB, 100);}
if (var > 11) // поворот налево
{myservo.write(60);
digitalWrite(IN1, 1);
digitalWrite(IN2, 0);
digitalWrite(IN3, 1);
digitalWrite(IN4, 0);
analogWrite(ENA, 100);
analogWrite(ENB, 100);}
if (var < -11) // поворот направо
{myservo.write(120);
digitalWrite(IN1, 1);
digitalWrite(IN2, 0);
digitalWrite(IN3, 1);
digitalWrite(IN4, 0);
analogWrite(ENA, 100);
analogWrite(ENB, 100);}
if ((var < -70)||(var > 70))
{if(digitalRead(LS) && digitalRead(RS)) // движение вперед
{myservo.write(90);
digitalWrite(IN1, 1);
digitalWrite(IN2, 0);
digitalWrite(IN3, 1);
digitalWrite(IN4, 0);
analogWrite(ENA, 100);
analogWrite(ENB, 100);}
if(!(digitalRead(LS)) && digitalRead(RS)) // поворачиваем направо
{myservo.write(50);
digitalWrite(IN1, 1);
digitalWrite(IN2, 0);
digitalWrite(IN3, 1);
digitalWrite(IN4, 0);
analogWrite(ENA, 100);
analogWrite(ENB, 100);
delay(500);}
if(digitalRead(LS) && !(digitalRead(RS))) // поворачиваем налево
{myservo.write(130);
digitalWrite(IN1, 1);
digitalWrite(IN2, 0);
digitalWrite(IN3, 1);
digitalWrite(IN4, 0);
analogWrite(ENA, 100);
analogWrite(ENB, 100);
delay(500);}
}
/*/if ((-10<=var)&&(var<=10)) // стоп
{if(!(digitalRead(LS)) && !(digitalRead(RS))) // остановка
{myservo.write(90);
analogWrite(ENA, 0);
analogWrite(ENB, 0);}
}*/
}