Робот должен ездить по столу. (Маршрут указан в 1 рисунке). УЗ определяет препяствие. ИК определяет границу стола. Робот поворачивает как танк. Алгоритм работы робота подробно описан во 2 рисунке.
Проблема заключается в том, что подключив дополнительно ИК начался какой-то бред. (До этого стоял один УЗ датчик и работало все нормально). ИК увидев руку должен сказать ардуино что бы светодиод(пока вместо моторов светодиоды), допустим en1 (на рисунке 1 обозначен так мотор), маргнул 2 раза. Вместо этого первый светодиод маргает 2 раза потом сразу второй маргает 2 раза (по программе он так не должен) и так 4 раза. Потом этот цикл заканчивается. Его в программе нету! Если что-то не понятно спрашиваете.
1 рисунок
2 рисунок
CODE:
int trigPin = 10;
int echoPin = 5;
int en2 = 9;//Переменная для управления 2 двигателем через ШИМ
int en1 = 3;//Переменная для управления 1 двигателем через ШИМ
int state = 0;/*Переменная которая хранит 1 или 0 нужна она для того что бы определить в какую сторону поворачивать.
*/
int pir = 3;
long distance;
int ledLevel;
int vall;
void setup() {
Serial.begin(9600);
pinMode(trigPin,OUTPUT);
pinMode(echoPin,INPUT);
pinMode(en2,OUTPUT);
pinMode(en1,OUTPUT);
pinMode(pir,INPUT);
}
void loop() {
//____________________________________________
vall = analogRead(pir);//начинаем "слушать" ИК датчик
if((vall >= 500)&&(state == 1))/*Тут если к ИК датчику подведенна рука и state = 1 то робот поворачивает. Робот поворачивает как танк.
Для чего нужны эти операторы Я написал на рисунке.
*/
{
vall = 0;
analogWrite(en2,50);
delay(1000);
analogWrite(en2,255);
delay(1000);
analogWrite(en2,50);
delay(1000);
analogWrite(en2,255);
state = 1 - state;
}else{
analogWrite(en2,255);
}
if((vall >= 500)&&(state == 0))//если опять граница стола то поварачиваем уже в другую сторону
{
analogWrite(en1,50);
delay(1000);
analogWrite(en1,255);
delay(1000);
analogWrite(en1,50);
delay(1000);
analogWrite(en1,255);
state = 1 - state;
vall = 0;
}else{
analogWrite(en1,255);
}
//********************************************
if ((ledLevel >= 210)&&(state == 0)){//если с УЗ придет сигнал больше 210 то поворачиваем.
analogWrite(en2,50);
delay(1000);
analogWrite(en2,255);
delay(1000);
analogWrite(en2,50);
delay(1000);
analogWrite(en2,255);
state = 1 - state;
ledLevel = 0;
}else{
analogWrite(en2,255);
}
if ((ledLevel >= 210)&&(state == 1))//тут если опять с УЗ придет сигнал то поворачиваем уже в другую сторону
{
analogWrite(en1,50);
delay(1000);
analogWrite(en1,255);
delay(1000);
analogWrite(en1,50);
delay(1000);
analogWrite(en1,255);
state = 1 - state;
ledLevel = 0;
}else{
analogWrite(en1,255);
}
//все что написано внизу Я взял с этого сайта. Там все подробно описанно. http://research.andbas.com/2011/12/hc-sr04.html
distance = getDistance();//тут берется расстояние
ledLevel = (int) (distance*10)<=255?255-distance*10:0;//тут вычисляется уровень который нужно подать на моторчик
}
long getEchoTiming() {
digitalWrite(trigPin, LOW);//тут высталяем на вход тригер логический нуль
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);//ставим единицу
delayMicroseconds(10);//ждем пока сигнал отразится
digitalWrite(trigPin, LOW);//ставим нуль
long duration = pulseIn(echoPin,HIGH);//слушаем эфир (она вычитает сколько микросекунд прошло)
return duration;//возвращяем значение
}
long getDistance() {//эта функция возвращает расстояние в сантиметрах до объекта перед сенсором
long distacne_cm = getEchoTiming()/29/2;
return distacne_cm;
}
//**********************************************
int echoPin = 5;
int en2 = 9;//Переменная для управления 2 двигателем через ШИМ
int en1 = 3;//Переменная для управления 1 двигателем через ШИМ
int state = 0;/*Переменная которая хранит 1 или 0 нужна она для того что бы определить в какую сторону поворачивать.
*/
int pir = 3;
long distance;
int ledLevel;
int vall;
void setup() {
Serial.begin(9600);
pinMode(trigPin,OUTPUT);
pinMode(echoPin,INPUT);
pinMode(en2,OUTPUT);
pinMode(en1,OUTPUT);
pinMode(pir,INPUT);
}
void loop() {
//____________________________________________
vall = analogRead(pir);//начинаем "слушать" ИК датчик
if((vall >= 500)&&(state == 1))/*Тут если к ИК датчику подведенна рука и state = 1 то робот поворачивает. Робот поворачивает как танк.
Для чего нужны эти операторы Я написал на рисунке.
*/
{
vall = 0;
analogWrite(en2,50);
delay(1000);
analogWrite(en2,255);
delay(1000);
analogWrite(en2,50);
delay(1000);
analogWrite(en2,255);
state = 1 - state;
}else{
analogWrite(en2,255);
}
if((vall >= 500)&&(state == 0))//если опять граница стола то поварачиваем уже в другую сторону
{
analogWrite(en1,50);
delay(1000);
analogWrite(en1,255);
delay(1000);
analogWrite(en1,50);
delay(1000);
analogWrite(en1,255);
state = 1 - state;
vall = 0;
}else{
analogWrite(en1,255);
}
//********************************************
if ((ledLevel >= 210)&&(state == 0)){//если с УЗ придет сигнал больше 210 то поворачиваем.
analogWrite(en2,50);
delay(1000);
analogWrite(en2,255);
delay(1000);
analogWrite(en2,50);
delay(1000);
analogWrite(en2,255);
state = 1 - state;
ledLevel = 0;
}else{
analogWrite(en2,255);
}
if ((ledLevel >= 210)&&(state == 1))//тут если опять с УЗ придет сигнал то поворачиваем уже в другую сторону
{
analogWrite(en1,50);
delay(1000);
analogWrite(en1,255);
delay(1000);
analogWrite(en1,50);
delay(1000);
analogWrite(en1,255);
state = 1 - state;
ledLevel = 0;
}else{
analogWrite(en1,255);
}
//все что написано внизу Я взял с этого сайта. Там все подробно описанно. http://research.andbas.com/2011/12/hc-sr04.html
distance = getDistance();//тут берется расстояние
ledLevel = (int) (distance*10)<=255?255-distance*10:0;//тут вычисляется уровень который нужно подать на моторчик
}
long getEchoTiming() {
digitalWrite(trigPin, LOW);//тут высталяем на вход тригер логический нуль
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);//ставим единицу
delayMicroseconds(10);//ждем пока сигнал отразится
digitalWrite(trigPin, LOW);//ставим нуль
long duration = pulseIn(echoPin,HIGH);//слушаем эфир (она вычитает сколько микросекунд прошло)
return duration;//возвращяем значение
}
long getDistance() {//эта функция возвращает расстояние в сантиметрах до объекта перед сенсором
long distacne_cm = getEchoTiming()/29/2;
return distacne_cm;
}
//**********************************************
Прошу помочь мне.