Без описания |
Поиск в теме | Версия для печати |
PiFi |
Отправлено: 13 Июля, 2012 - 16:37:03
|
Майор
Сообщений всего: 67
Дата рег-ции: Июнь 2012
|
Доброго времени суток. Есть ардуино уно. УЗ и ИК датчики. Драйвер двигателей l293d.
Робот должен ездить по столу. (Маршрут указан в 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;
}
//**********************************************
Прошу помочь мне. |
|
|
PiFi |
Отправлено: 15 Июля, 2012 - 11:42:33
|
Майор
Сообщений всего: 67
Дата рег-ции: Июнь 2012
|
Занчит ИК датчик у меня HC-SR501. УЗ HC-SR04.
Ик работал отдельно. Только очень медленно. 2-3 секунды. В это программе он работает быстро. (Подозрительно как-то).
Цитата:Вы управляете моторами только инаблами. Т.е. моторы не могут реверсироваться. Кагда робот подезжает к краю стола и начинает разворачиваться то одно колесо вполне может упасть со стола (т.к. для маневра нужно некоторое пространство). В этом случае лучше отъехать чуть назад и только тогда совершать маневр.
Вот об этом Я не подумал. Как это можно реализовать? На программном уровне?
Цитата:Грамматические ошибки в программе ? Странно что компилятор на них не ругается.
Переменная distacne вообще нигде не инициализирована.
Я этот кусок взял с одного сайта. (в коментариях он есть).
Цитата:По маршруту. Вам нужно чтобы робот , увидев препятствие/край стола , сделал два поворота вправо. При следующем контакте с препятствием два поворота влево. Так ?
Да да. Вы правильно поняли мою великую мыслю. |
|
|
PiFi |
Отправлено: 15 Июля, 2012 - 19:08:59
|
Майор
Сообщений всего: 67
Дата рег-ции: Июнь 2012
|
Цитата:Есть разница между : один мотор стоит , другой вращается и один мотор вращается в одну сторону , а другой - в другую ?
Моя не внимательность. Я забыл дописать. Моторы изначально включены. Край стола. Ардуионо посылает сигнал о том что бы включить один двигатель на пол оборота. (Другой работает на полную мощь). Ну и по программе. Такое можно сделать? В принципе очень даже резкий маневр получается.
Цитата:Чтобы мотор вращался нужно установить разность логов на его инпутах.
Что такое логи?
Цитата:а инпуты завести на цифровые порты МК. В этом случае для движения обоих моторов будет задействовано 4 ноги МК.
Если Я так сделаю то как Я буду управлять двигателями? Через ШИМ? Два двигателя, получается два провода управления двигателями. Инпутов то 4 а провода 2. Вот это Я и не понял.
Так где ошибка в коде????? Обещали со мной ковыряться. Так и выполняйте обещания. |
|
|
anar |
Отправлено: 15 Июля, 2012 - 21:01:47
|
Главнокомандующий
Сообщений всего: 441
Дата рег-ции: Июнь 2011
|
PiFi пишет:А что это такое?
ЭСППЗУ электронно-стираемое программируемое постоянное запоминающее устройство electronically erasable programmable read-only memory (EEPROM).
Советую вам почитать книгу "Занимательно о микроконтроллерах".Тогда и не будут возникать такого рода вопросы.
(Добавление)
PiFi пишет:разность логов
Логический уровень на ножках l293d, "1" или "0".(Отредактировано автором: 15 Июля, 2012 - 21:10:42) |
|
|
PiFi |
Отправлено: 15 Июля, 2012 - 21:27:36
|
Майор
Сообщений всего: 67
Дата рег-ции: Июнь 2012
|
Цитата:ЭСППЗУ электронно-стираемое программируемое постоянное запоминающее устройство electronically erasable programmable read-only memory (EEPROM).
Советую вам почитать книгу "Занимательно о микроконтроллерах".Тогда и не будут возникать такого рода вопросы.
Обязательно почитаю.
Цитата:Логический уровень на ножках l293d, "1" или "0".
Я так и знал. Пятками чувствовал.
Вообщем сделал так: подключил инпут 2 и 3 к ШИМ. (В коде en1 и en2.) Енаибылы подключил к +5. Инпут 1 и 4 подключены к +5. Вышла какая-та ерунда. Светодиоды постоянно миргают.
Так же жду ответ на вопрос.
Цитата:Цитата:
Есть разница между : один мотор стоит , другой вращается и один мотор вращается в одну сторону , а другой - в другую ?
Моя не внимательность. Я забыл дописать. Моторы изначально включены. Край стола. Ардуионо посылает сигнал о том что бы включить один двигатель на пол оборота. (Другой работает на полную мощь). Ну и по программе. Такое можно сделать? В принципе очень даже резкий маневр получается.
Цитата:
Цитата:
а инпуты завести на цифровые порты МК. В этом случае для движения обоих моторов будет задействовано 4 ноги МК.
Если Я так сделаю то как Я буду управлять двигателями? Через ШИМ? Два двигателя, получается два провода управления двигателями. Инпутов то 4 а провода 2. Вот это Я и не понял.
Так где ошибка в коде????? Обещали со мной ковыряться. Так и выполняйте обещания.[/quote]
(Добавление)
Цитата:(да не буду я учить эту ардуино, ее же можно на нормальном Си, и даже асме (нативно понятном любому) программить?)
Я тут статейку, на робокрафт читал, "ардуино как фреймворк" ; так вот там рассказывается почему ардуино лучше. |
|
|
nestandart |
Отправлено: 16 Июля, 2012 - 07:51:07
|
Супер-модератор
Сообщений всего: 1490
Дата рег-ции: Сент. 2010
|
Во первых вот вам ваша главная ошибка в программе.
Цитата:int en1 = 3;//Переменная для управления 1 двигателем через ШИМ
Один и тот же порт имеет два названия и в одной и той же программе используется , одновременно , как вход и как выход
Цитата:pinMode(en1,OUTPUT);
pinMode(pir,INPUT);
Более того , в сетапе вы инициализируете его как вход и тут же как выход.
А как выподключаете датчик и инабл ? к одному и тому же проту ?
(Добавление)
Цитата:Если Я так сделаю то как Я буду управлять двигателями? Через ШИМ? Два двигателя, получается два провода управления двигателями. Инпутов то 4 а провода 2. Вот это Я и не понял.
Так где ошибка в коде????? Обещали со мной ковыряться. Так и выполняйте обещания.
Для начала забудьте про инаблы (они управляют лишь скоростью моторов). Имеем четыре инпута.
У каждого мотора по два инпута (например инпут1 и инпут2).
Если дать высокий лог уровень (2 и болле вольт) на инпут 1 , а на инпут 2 дать низкий лог
(0 вольт) то мотор будет вращаться в одну сторону. Если поменять логи - мотор будет крутится в другую сторону. Если установить на инпутах два одинаковых лога
(хоть1 хоть0) - мотор встанет.
Чтобы управлять моторами с МК нам нужно 4 цифровых ноги (например 1,2,3,4)
нога1-инпут1
нога2-инпут2
нога3-инпут3
нога4-инпут4
Т.е инпуты 1и2 это мотор1 , а инпуты 2 и 3 это второй мотор.
Эсли вы напишите в программе такой код то мотор1 будет крутиться в одну сторону
digitalWrite(1,HIGH);
digitalWrite(2,LOW);
Вот так придут во вращение два мотора.
digitalWrite(1,HIGH);
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(4,LOW);
Вот так они сменят направление.
digitalWrite(1,LOW);
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(4,HIGH);
А вот так они встанут.
digitalWrite(1,LOW);
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
Или так.
digitalWrite(1,HIGH);
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
Надеюсь теперь понятно.
(Добавление)
И еще. Ваш ИК для вашей задачи не подойдет. Это пассивный pir датчик , который реагирут лишь на движение теплых объектов.
Вам нужен активный датчик на ИК светодиоде и TSOPе.
Который будет реагировать на объект отражающий частоты ИК светодиода.
В сети вагон схем ИК бамперов для МК.
(Добавление)
Для вашей задачи подошел бы вот такой.
http://robotshop.su/e-store/catalog/202/700/ |
|
|
|
Поиск в теме | Версия для печати |
Страниц (2): [1] 2 » |
« Программирование микроконтроллеров » |
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
|
|
|
|
|