Управление мобильным роботом ардуино

25 февраля 2019 - Администратор

Управление мобильным роботом ардуино Повороты мобильного робота arduino

В этой статье мы познакомимся с программированием поворотов мобильного робота ардуино.
Для поворотов напишем процедуры. Подробно о процедурах в си вы можете познакомиться в статье процедуры в си. У каждой процедуры в си есть имя и параметры. Общий вид процедуры в си
void Имя процедуры (параметры)
{
}

Мобильный робот ардуино будет совершать  повороты,  при которых один мотор вращается вперед другой мотор назад В качестве параметров будем передавать мощности моторов и длительность поворота в миллисекундах. Для каждого поворота напишем свою процедуру. Чтобы мотор вращался вперед необходимо на пин который отвечает за направление вращения передать значение HIGH , чтобы мотор мобильного робота ардуино вращался назад, необходимо передать значение LOW.  После поворота необходимо остановить моторы, для этого мы послыаем значение 0 на пины отвечающие за скорость. Тогда процедура поворота будет выглядеть следующим образом
void vpravo(int p, int pt, int d) {
 analogWrite(SPEED_1, p);
 digitalWrite(DIR_1,HIGH);
 analogWrite(SPEED_2,pt);
 digitalWrite(DIR_2, LOW);
 delay(d);
 analogWrite(SPEED_1,0);
 digitalWrite(DIR_1,HIGH);
 analogWrite(SPEED_2,0);
 digitalWrite(DIR_2, LOW);
 delay(100);
}

Аналогично будет процедура поворота мобильного робота ардуино налево в ней лишь поменяются местами моторы,  теперь правый будет двигаться вперед,  левый мотор назад 
void vlevo(int l, int lt, int d) {
 analogWrite(SPEED_1, lt);
 digitalWrite(DIR_1,LOW);
 analogWrite(SPEED_2,l);
 digitalWrite(DIR_2, HIGH);
 delay(d);
 analogWrite(SPEED_1,0);
 digitalWrite(DIR_1, LOW);
 analogWrite(SPEED_2,0);
 digitalWrite(DIR_2, HIGH);
 delay(100);
}

В процедуре движения вперед оба мотора должны двигаться вперед, значение на пины, отвечающие за направление, будет HIGH
void vpered(int s, int d) {
  analogWrite(SPEED_1, s);
 digitalWrite(DIR_1,HIGH);
 analogWrite(SPEED_2,s);
 digitalWrite(DIR_2, HIGH);
 delay(d);
 analogWrite(SPEED_1,0);
 digitalWrite(DIR_1,HIGH);
 analogWrite(SPEED_2,0);
 digitalWrite(DIR_2, HIGH);
 delay(100);
}

Полезная процедура остановки в ней мы останавливаем оба мотора на заданное время, скорости обоих моторов 0.
void st(int d) {
   analogWrite(SPEED_1,0);
 digitalWrite(DIR_1,HIGH);
 analogWrite(SPEED_2,0);
 digitalWrite(DIR_2, HIGH);
 delay(d);
}

Теперь в программе можем вызывать процедуры, отвечающие за движение мобильного робота. Пример программы движение по квадрату мобильного робота. В программе предварительно определены пины, отвечающие за направление и скорость моторов, в блоке setup все пины отвечающие за управлением моторами в  режим OUTPUT
#define SPEED_1      6 // скорость первого мотора
#define DIR_1        7 // направление первого мотора
#define DIR_2        4 // направление второго мотора
#define SPEED_2      5 // скорость второго мотора
void setup() {
Serial.begin(9600); 
// подключение пинов для управления моторами
 pinMode(4, OUTPUT);
 pinMode(5, OUTPUT);
 pinMode(6, OUTPUT);
 pinMode(7, OUTPUT); 
}
// процедура движения вперед 
void vpered(int s, int d) {
   analogWrite(SPEED_1, s);
 digitalWrite(DIR_1,HIGH);
 analogWrite(SPEED_2,s);
 digitalWrite(DIR_2, HIGH);
 delay(d);
  analogWrite(SPEED_1,0);
 digitalWrite(DIR_1,HIGH);
 analogWrite(SPEED_2,0);
 digitalWrite(DIR_2, HIGH);
 delay(100);
}
// процедура поворота направо
void vpravo(int p, int pt, int d) {
 analogWrite(SPEED_1, p);
 digitalWrite(DIR_1,HIGH);
 analogWrite(SPEED_2,pt);
 digitalWrite(DIR_2, LOW);
 delay(d);
  analogWrite(SPEED_1,0);
 digitalWrite(DIR_1,HIGH);
 analogWrite(SPEED_2,0);
 digitalWrite(DIR_2, HIGH);
 delay(100);
}
// процедура поворота налево
void vlevo(int l, int lt, int d) {
 analogWrite(SPEED_1, lt);
 digitalWrite(DIR_1,LOW);
 analogWrite(SPEED_2,l);
 digitalWrite(DIR_2, HIGH);
 delay(d);
 analogWrite(SPEED_1,0);
 digitalWrite(DIR_1,HIGH);
 analogWrite(SPEED_2,0);
 digitalWrite(DIR_2, HIGH);
 delay(100);
}
// процедура остановки
void st(int d) {
 analogWrite(SPEED_1,0);
 digitalWrite(DIR_1,HIGH);
 analogWrite(SPEED_2,0);
 digitalWrite(DIR_2, HIGH);
 delay(d);
}
void loop() {
vlevo(60, 60, 500);
vpered (60,500);
st(1000);
}

Вернуться к содержанию Следующая тема Движение робота ардуино по черной линии

Комментарии (0)

Нет комментариев. Ваш будет первым!