Управление функционалом робота через Bluetooth
- Войдите на сайт для отправки комментариев
Сб, 22/04/2017 - 20:55
Господа, помогите правильно задать работу функции роботу. Все перепробовал, а нужного результата так и не получил. Необходимо, что бы робот по команде, начал движение по линии, до этого робот двигается под управление со смартфона. У меня получается, что робот просто едет вперед, когда я даю ему команду ехать по линии.
int in1 = 9;
int in2 = 8;
int in3 = 7;
int in4 = 6;
int ENA = 10;
int ENB = 5;
int ABS = 130;
char getstr = 'S';
void _mForward(int a)
{
digitalWrite(ENA, HIGH);
digitalWrite(ENB, HIGH);
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
Serial.println("go forward!");
delay (a * 50);
}
void _mBack(int b)
{
digitalWrite(ENA, HIGH);
digitalWrite(ENB, HIGH);
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
Serial.println("go back!");
delay (b * 50);
}
void _mleft(int c)
{
analogWrite(ENA, ABS);
analogWrite(ENB, ABS);
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
Serial.println("go left!");
delay(c * 50);
}
void _mright(int d)
{
analogWrite(ENA, ABS);
analogWrite(ENB, ABS);
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
Serial.println("go right!");
delay (d * 50);
}
void _mStop(int s)
{
digitalWrite(ENA, LOW);
digitalWrite(ENB, LOW);
Serial.println("Stop!");
delay (s * 50);
}
void _go(int g)
{
int num1,num2,num3;
num1=digitalRead(11);
num2=digitalRead(4);
num3=digitalRead(2);
if((num1==0)&&num2&&num3)
{
_mleft(3); //The sensor detected that right car turn left immediately when it meets black line
delay(2);
while(1){
num2=digitalRead(2); //Cycle to judge degree of intermediate sensor,
if(num2==1)
{ _mleft(3); //If num2==1 does not go to the middle position, continue to turn left.
delay(2);}
else
break; //Detection of num2==0 instructions turned over, out of the loop, detection of three sensors’ statusand then make appropriate action
} //The following and so on
}
else if(num2&&num1&&(num3==0))
{
_mright(3);
delay(2);
while(1)
{
num2=digitalRead(2);
if(num2==1){
_mright(3);
delay(2);}
else
break;
}
}
else
{
_mForward(3);
delay(2);
}
delay (g * 50);
}
void setup()
{
Serial.begin(9600);
pinMode (in1, OUTPUT);
pinMode (in2, OUTPUT);
pinMode (in3, OUTPUT);
pinMode (in4, OUTPUT);
pinMode (ENA, OUTPUT);
pinMode (ENB, OUTPUT);
}
void loop() {
if (Serial.available() > 0)// В случае если в "Серийном порту" есть информация
{
getstr = Serial.read(); // Считываем инвормацию с "Серийного порта"
switch (getstr)// Отрабатывем в соотвествии с поступившей командой
{
case 'F':
_mForward (3); // едем ВПЕРЕД
break;
case 'B':
_mBack (3); // едем НАЗАД
break;
case 'R':
_mright (3); // поворачиваем ВПРАВО
break;
case 'L':
_mleft (3); // поворачиваем ВЛЕВО
break;
case 'V':
_go(3);
break;
case 'S':
_mStop (3);
}
}
}
У меня получается, что робот просто едет вперед, когда я даю ему команду ехать по линии.
А какую команду при этом распознает сам робот?
Это к тому, что надо отделить ситуацию, когда он выполняет не ту команду, от ситуации, когда он банально не умеет ездить по линии.