Подключение 2-ух ультразвуковых дальномеров HC-SR04 (программа)

vlasov-serg-27
Offline
Зарегистрирован: 21.06.2014

Здравствуйте, в проекте требуется подключить 2 ультразвуковых дальномера. При получении данных от дальномеров принимается решение в какую сторону совершить поворот манипулятору. Возникла проблема судя по работе сразу после включения с левого дальномера приходит значение нуля, и совершается поворот в его сторону, хотя предметов нет. Следующее его значение соответствует расстоянию до стены.

Вот текст программы для определения расстояния (без кусков на повороты манипулятора):

//PIN UZD
int uE1=26; //UZD RIGHT ECHO
int uT1=27; //UZD RIGHT TRIG
int uE2=28; //UZD LEFT ECHO
int uT2=29; //UZD LEFT TRIG
void setup()
{
//SETUP SERIAL
Serial.begin(9600);
Serial.println("PROJECT TEST");
pinMode(uE1, INPUT);
pinMode(uT1, OUTPUT);
pinMode(uE2, INPUT);
pinMode(uT2, OUTPUT);
}
void loop()
{
//UZD RIGHT
digitalWrite(uT1, LOW);
delayMicroseconds(2);
digitalWrite(uT1, HIGH);
delayMicroseconds(10);
digitalWrite(uT1, LOW);
int d1=pulseIn(uE1, HIGH);
d1=d1/58;
//UZD LEFT
digitalWrite(uT2, LOW);
delayMicroseconds(2);
digitalWrite(uT2, HIGH);
delayMicroseconds(10);
digitalWrite(uT2, LOW);
int d2=pulseIn(uE2, HIGH);
d2=d2/58;
//COM-PORT SERIAL
//COM-PORT UZD RIGHT
Serial.print(d1);
Serial.print(" ");
Serial.print("cm UZV RIGHT");
Serial.print(" ");
Serial.println(" ");
//COM-PORT UZD LEFT
Serial.print(d2);
Serial.print(" ");
Serial.print("cm UZV LEFT");
Serial.print(" ");
Serial.println(" ");
if (d1<=20)
{
//POVOROT RIGHT
}
else if (d2<=20)
{
//POVOROT LEFT
}
else
{
//STOP MANIPULATOR
}
}


Монитор COM-Porta:

PROJECT TEST
43 cm UZV RIGHT 
0 cm UZV LEFT 
44 cm UZV RIGHT 
77 cm UZV LEFT 
44 cm UZV RIGHT 
68 cm UZV LEFT 
44 cm UZV RIGHT 
77 cm UZV LEFT 


Как видно из монитора COM-Porta: первый опрос правого датчика выдает 43 см, а левый выдает 0 см. В следующий момент все приходит в норму: правый 44 см, левый 77 см.

Как убрать этот ноль при первом опросе, он портит всю систему. Как только включаю совершает сразу поворот в левую сторону.

Araris
Offline
Зарегистрирован: 09.11.2012

Первое, что в голову пришло :

if ((d1<=20) && (d1>0))
{
//POVOROT RIGHT
}
else if ((d2<=20) && (d2>0))
{
//POVOROT LEFT
}

vlasov-serg-27
Offline
Зарегистрирован: 21.06.2014

Все вроде по данному изменению все работает, спасибо вам большое. сейчас буду дальше все проверять.