Ардуино и датчики УЗ.

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Аватара пользователя
Сообщения: 50
Зарегистрирован: Вс июл 03, 2011 23:15:06
Откуда: Москва

Сообщение afagorn »

Здравствуйте, товарищи коты. Значится, есть два датчика УЗ. Они должны детектить препятствия, при чем одновременно. Привожу кусок кода который отвечает за один датчик. Нужно что бы два датчика одновременно выполняли одну и тоже работу. Только что бы увидев препятствие один датчик, сообщал эту инфу одной переменной, а другой датчик увидев препятствие сообщал другой переменной.

Код: Выделить всё

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;
}
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

И в чём проблема ?
Контактная информация:
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 50
Зарегистрирован: Вс июл 03, 2011 23:15:06
Откуда: Москва

Сообщение afagorn »

Этот кусок отвечает за детектирование одного датчика. А мне нужно что бы работали два сразу дачтика. 2 раза одну и туже функцию объявить нельзя. Или можно?
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Нельзя. Но в функцию можно передать параметр с каким датчиком работать.
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Аватара пользователя
Сообщения: 50
Зарегистрирован: Вс июл 03, 2011 23:15:06
Откуда: Москва

Сообщение afagorn »

Нельзя. Но в функцию можно передать параметр с каким датчиком работать.
Расскажите как это сделать. Приведет пример если не трудно. Буду очень благодарен.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Почитайте любой учебник по С, раздел функции. Не вижу смысла переписывать текст оттуда сюда. Вот, например, первая попавшаяся ссылка:
http://informatics.mccme.ru/moodle/mod/ ... pterid=304
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 50
Зарегистрирован: Вс июл 03, 2011 23:15:06
Откуда: Москва

Сообщение afagorn »

Товарищ, помогите. Прочитал Я про функции. Но как передать параметр понять Я не смог. Если бы был там пример похожий на мою проблему. Буду благодарен.
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Ну например так. Я об'единил функции getDistance() getEchoTiming() в одну getDistance(). Ей основная программа передает 2 параметра: пин передатчика (trig) и пин приемника (echo).

Код: Выделить всё

long distance1 = getDistance(trigPin1, echoPin1);//тут берется расстояние от первой пары датчиков
long distance2 = getDistance(trigPin2, echoPin2); // тут от второй

long getDistance(uint8_7 trig, uint8_t echo) //эта функция возвращает расстояние в сантиметрах до объекта перед сенсором
{
  digitalWrite(trig, LOW);//тут высталяем на вход тригер логический нуль
  delayMicroseconds(2);
  digitalWrite(trig, HIGH);//ставим единицу
  delayMicroseconds(10);//ждем пока сигнал отразится
  digitalWrite(trig, LOW);//ставим нуль
  long duration = pulseIn(echo,HIGH);//слушаем эфир (она вычитает сколько микросекунд прошло)
  long distacne_cm = getEchoTiming()/29/2;
  return distacne_cm;
}
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

echoPin, trigPin - что это за переменные и как они объявлены?
Моторчика видать тоже два?
Где весь текст проги?
Всё это дело надо както покучнее собрать, а то переменные передавать из одной функции в другую, голову свернешь.

P.S. пока расписывал опоздал :(
Открыл глаза
Аватара пользователя
Сообщения: 50
Зарегистрирован: Вс июл 03, 2011 23:15:06
Откуда: Москва

Сообщение afagorn »

Ардуино ругается.
Error compiling.
4:18: error: 'uint8_7' was not declared in this scope 4:40: error: expected primary-expression before 'echo'
4:44: error: initializer expression list treated as compound expression
194:1: error: 'distancel' does not name a type
195:1: error: 'ledLevell' does not name a type
198:1: error: 'distance2' does not name a type
199:1: error: 'ledLevel' does not name a type
202:18: error: redefinition of 'long int getDistance'
4:18: error: 'long int getDistance' previously defined here 202:18: error: 'uint8_7' was not declared in this scope 202:40: error: expected primary-expression before 'echo'
207
Открыл глаза
Аватара пользователя
Сообщения: 50
Зарегистрирован: Вс июл 03, 2011 23:15:06
Откуда: Москва

Сообщение afagorn »

Вот исходники.

Код: Выделить всё

int trigPin = 4;
int echoPin = 7;
int trigPin1 = 13;
int echoPin1 = 12;
int in4 = 11;
int in3 = 10;
int in2 = 2;
int in1 = 8;
int state = 0;//Переменная которая хранит 1 или 0 нужна она для того что бы определить в какую сторону поворачивать. 

int duration1;
int duration;
long distance2;
int ledLevel;
long distance1;
int ledLevel1;

void setup() {
 
  
Serial.begin(9600);
pinMode(trigPin,OUTPUT);
pinMode(echoPin,INPUT);
pinMode(trigPin1,OUTPUT);
pinMode(echoPin1,INPUT);

pinMode(in4,OUTPUT);
pinMode(in3,OUTPUT);
pinMode(in2,OUTPUT);
pinMode(in1,OUTPUT);
}

void loop() {

}

//все что написано внизу Я взял с этого сайта. Там все подробно описанно. http://research.andbas.com/2011/12/hc-sr04.html
//distance1 = getDistance();//тут берется расстояние
distance1 = getDistance(trigPin1, echoPin1);//тут берется расстояние от первой пары датчиков
ledLevel1 = (int) (distance1*10)<=255?255-distance1*10:0;//тут вычисляется уровень который нужно подать на моторчик

//distance = getDistance();//тут берется расстояние
distance2 = getDistance(trigPin2, echoPin2); // тут от второй
ledLevel = (int) (distance2*10)<=255?255-distance2*10:0;//тут вычисляется уровень который нужно подать на моторчик


long getDistance(uint8_7 trig, uint8_t echo) //эта функция возвращает расстояние в сантиметрах до объекта перед сенсором
{
  digitalWrite(trig, LOW);//тут высталяем на вход тригер логический нуль
  delayMicroseconds(2);
  digitalWrite(trig, HIGH);//ставим единицу
  delayMicroseconds(10);//ждем пока сигнал отразится
  digitalWrite(trig, LOW);//ставим нуль
  long duration = pulseIn(echo,HIGH);//слушаем эфир (она вычитает сколько микросекунд прошло)
  long distacne_cm = getEchoTiming()/29/2;
  return distacne_cm;
}


/*
//)))))))))))))))))))))))))))
long getEchoTiming() {
digitalWrite(trigPin1, LOW);//тут высталяем на вход тригер логический нуль
delayMicroseconds(2);
digitalWrite(trigPin1, HIGH);//ставим единицу
delayMicroseconds(10);//ждем пока сигнал отразится
digitalWrite(trigPin1, LOW);//ставим нуль
long duration1 = pulseIn(echoPin1,HIGH);//слушаем эфир (она вычитает сколько микросекунд прошло)
return duration1;
}
//))))))))))))))))))))))))))))

long getDistance() //эта функция возвращает расстояние в сантиметрах до объекта перед сенсором
{
long distacne_cm1 = getEchoTiming()/29/2;
return distacne_cm1;

long distacne_cm = getEchoTiming()/29/2;
return distacne_cm;
}*/
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Вместо uint8_7 надо, конечно, писать uint8_t (моя опечатка). Я не знал, что Вы пишите для Адруино. Тогда переменные для функции digitalWrite должны быть типа int. Поэтому об'явите функцию getDistance так:
long getDistance(int trig, int echo)
Перед этой функцией перенесите закрывающую скобку метода loop().

В начале кода переименуйте trigPin в trigPin2 и echoPin в echoPin2 (в 2-х местах).
Открыл глаза
Аватара пользователя
Сообщения: 50
Зарегистрирован: Вс июл 03, 2011 23:15:06
Откуда: Москва

Сообщение afagorn »

Она опять ругается. Я их не смог исправить.
Вложения
ругательства.png
(39.5 КБ) 666 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

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

Оевидно, надо вместо строчки в функции getDistance()
long distacne_cm = getEchoTiming()/29/2;
написать
long distacne_cm = duration/29/2;
Открыл глаза
Аватара пользователя
Сообщения: 50
Зарегистрирован: Вс июл 03, 2011 23:15:06
Откуда: Москва

Сообщение afagorn »

Я книгу по С++ уже скачал. Мне нужно как можно скорее сделать этот проект. Это робот будет. Если Я пройду, то Я зачислен в Бауманский университет. МК Я начал недавно увлекаться.
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Ну тогда удачи во всем!
Ответить

Вернуться в «AVR»