Создадим робота на основе платы Ардуино Уно, который будет обнаруживать линию на полу и перемешаться по ней.
Это продолжение темы роботов, которые следуют линии или за хозяином. У нас уже было на сайте два урока:
Компоненты
Для создания робота, который будет следовать по линии на полу нам понадобятся следующие компоненты оборудования:
- Arduino UNO × 1
- Драйвер SparkFun Dual H-Bridge для двигателей L298 × 1
- Двигатель постоянного тока, 12 В × 1
- Держатель батареи, 18650 х 2 × 1
Ручные инструменты:
- Паяльник (универсальный)
- Дрель
- Автоматический цифровой мультиметр
- Мультитул, Отвертка
- Плоскогубцы
Программное обеспечение
Этот автомобиль-робот будет следовать по контрастной линии на полу, куда бы она ни шла. Датчики обнаруживают линию (цвет), Arduino обрабатывает показания датчиков, а затем сообщает двигателям как и куда двигаться.
Схема соединения
Все компоненты мы подключаем согласно схеме ниже:
Скетч
После того как мы собрали схему, соединили все компоненты, нам осталось воспользоваться Arduino IDE и написать наш скетч.
int mr1=8; //motor right 1
int mr2=9; //motor right 2
int ml1=10; //motor left 1
int ml2=11; //motor left 2
int sr=6; //sensor right
int sl=7; //sensor left
int svr=0;
int svl=0;
int led=13;
int enr=3;
int enl=5;
int vspeed=100;
int tspeed=255;
int tdelay=20;
void setup()
{
pinMode(mr1,OUTPUT);
pinMode(mr2,OUTPUT);
pinMode(ml1,OUTPUT);
pinMode(ml2,OUTPUT);
pinMode(led,OUTPUT);
pinMode(sr,INPUT);
pinMode(sl,INPUT);
delay(5000);
}
void loop()
{
svr=digitalRead(sr);
svl=digitalRead(sl);
if(svl==LOW && svr==LOW)
{
forward(); //maju
}
if(svl==HIGH && svr==LOW)
{
left(); //belok kiri
}
if(svl==LOW && svr==HIGH)
{
right(); //belok kanan
}
if(svl==HIGH && svr==HIGH)
{
stop(); //berhenti
}
}
void forward()
{
digitalWrite(mr1,HIGH);
digitalWrite(mr2,LOW);
digitalWrite(ml1,HIGH);
digitalWrite(ml2,LOW);
analogWrite (enr,vspeed);
analogWrite (enl,vspeed);
}
void backward()
{
digitalWrite(mr1,LOW);
digitalWrite(mr2,HIGH);
digitalWrite(ml1,LOW);
digitalWrite(ml2,HIGH);
analogWrite (enr,vspeed);
analogWrite (enl,vspeed);
}
void right()
{
digitalWrite(mr1,LOW);
digitalWrite(mr2,HIGH);
digitalWrite(ml1,HIGH);
digitalWrite(ml2,LOW);
analogWrite (enr,tspeed);
analogWrite (enl,tspeed);
delay(tdelay);
}
void left()
{
digitalWrite(mr1,HIGH);
digitalWrite(mr2,LOW);
digitalWrite(ml1,LOW);
digitalWrite(ml2,HIGH);
analogWrite (enr,tspeed);
analogWrite (enl,tspeed);
delay(tdelay);
}
void stop()
{
analogWrite (enr,0);
analogWrite (enl,0);
}
Также небольшой комментарий по поводу некоторых фрагментов кода. Вот этот блок:
int svr=0;
int svl=0;
int enr=3;
int enl=5;
int svr=0;
- значение правого датчика.
int svl=0;
- значение слева от датчика.
int enr=3;
- включить правый двигатель (должен быть подключен к ШИМ-контактному разъему Arduino).
int enl=5;
- включить левый двигатель (должен быть подключен к ШИМ-контактному разъему Arduino).
Также, в теории, можно было бы использовать некоторые ИК-датчики:
void loop() {
drive();
}
void drive(void){
bool sensor_right = digitalRead(SENSOR_R_D0);
bool sensor_left = digitalRead(SENSOR_L_D0);
if (!sensor_right && !sensor_left) goForward();
else if (sensor_right) goRight();
else goLeft();
}
На этом всё. Стоит сказать, что, скорее всего, с одним сенсором робот будет также вполне нормально работать.
30 сентября 2020 в 15:12
При компиляции выдаёт ошибку платы Arduino