роботы робототехника микроконтроллеры


 Страниц (2): [1] 2 »   

> Без описания
PiFi Post Id



Майор


Сообщений всего: 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;
}
//**********************************************

Прошу помочь мне.
 
 Top
nestandart Супермодератор Post Id



Супер-модератор


Сообщений всего: 1490
Дата рег-ции: Сент. 2010  



Какой у вас ИК датчик ? Вообще дайте ссылки на все что вы купили.
Работает ли ИК отдельно от всего ?
Кстати у вас немного не правильная схема управления драйвером моторов. Вы управляете моторами только инаблами. Т.е. моторы не могут реверсироваться. Кагда робот подезжает к краю стола и начинает разворачиваться то одно колесо вполне может упасть со стола (т.к. для маневра нужно некоторое пространство). В этом случае лучше отъехать чуть назад и только тогда совершать маневр.
Так же , вторая пара инпутов подключена никуда , а должна быть подтянута к земле.
(Добавление)
Это что ?
Грамматические ошибки в программе ? Странно что компилятор на них не ругается.
Переменная distacne вообще нигде не инициализирована.

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



Цитата:
long distacne_cm = getEchoTiming()/29/2;

(Добавление)
По маршруту. Вам нужно чтобы робот , увидев препятствие/край стола , сделал два поворота вправо. При следующем контакте с препятствием два поворота влево. Так ?
 
 Top
PiFi Post Id



Майор


Сообщений всего: 67
Дата рег-ции: Июнь 2012  



Занчит ИК датчик у меня HC-SR501. УЗ HC-SR04.
Ик работал отдельно. Только очень медленно. 2-3 секунды. В это программе он работает быстро. (Подозрительно как-то).
Цитата:
Вы управляете моторами только инаблами. Т.е. моторы не могут реверсироваться. Кагда робот подезжает к краю стола и начинает разворачиваться то одно колесо вполне может упасть со стола (т.к. для маневра нужно некоторое пространство). В этом случае лучше отъехать чуть назад и только тогда совершать маневр.

Вот об этом Я не подумал. Как это можно реализовать? На программном уровне?
Цитата:
Грамматические ошибки в программе ? Странно что компилятор на них не ругается.
Переменная distacne вообще нигде не инициализирована.

Я этот кусок взял с одного сайта. (в коментариях он есть).
Цитата:
По маршруту. Вам нужно чтобы робот , увидев препятствие/край стола , сделал два поворота вправо. При следующем контакте с препятствием два поворота влево. Так ?

Да да. Вы правильно поняли мою великую мыслю.
 
 Top
nestandart Супермодератор Post Id



Супер-модератор


Сообщений всего: 1490
Дата рег-ции: Сент. 2010  



Цитата:
Вот об этом Я не подумал. Как это можно реализовать? На программном уровне?


Можно подключить инаблы к +5 , а инпуты завести на цифровые порты МК. В этом случае для движения обоих моторов будет задействовано 4 ноги МК. Для управления еще и скоростью можно подключить инаблы к pwm-портам. Тогда будет задействовано 6 ног МК.

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

Цитата:
Да да. Вы правильно поняли мою великую мыслю.


Тогда продумайте мыслю еще раз.
Что будет когда робот дойдет до крайней точки стола ?
 
 Top
PiFi Post Id



Майор


Сообщений всего: 67
Дата рег-ции: Июнь 2012  



Цитата:
Можно подключить инаблы к +5 , а инпуты завести на цифровые порты МК. В этом случае для движения обоих моторов будет задействовано 4 ноги МК. Для управления еще и скоростью можно подключить инаблы к pwm-портам. Тогда будет задействовано 6 ног МК.

А Вы не могли бы скинуть схему сие описания? А то как-то Я не очень понял.
Цитата:
При управлении моторами только через инаблы вы не можете совершать резкие маневры , когда один мотор вращается в одну сторону , а другой - в другую. В вашем случае (маленькое пространство стола) резкие маневры просто необходимы.

А почему через инаблы не получится совершать резкие маневры? Можно же просто задать компьютеру что бы Моторы были включены изначально. И можно спокойно совершать маневры.
Так в чем у меня ошибка в коде?
 
 Top
nestandart Супермодератор Post Id



Супер-модератор


Сообщений всего: 1490
Дата рег-ции: Сент. 2010  



Цитата:
А почему через инаблы не получится совершать резкие маневры? Можно же просто задать компьютеру что бы Моторы были включены изначально.


Есть разница между : один мотор стоит , другой вращается и один мотор вращается в одну сторону , а другой - в другую ?

Цитата:
А Вы не могли бы скинуть схему сие описания? А то как-то Я не очень понял.
В "Шаг за шагом" есть описание подключения драйвера.
Чтобы мотор вращался нужно установить разность логов на его инпутах.
 
 Top
PiFi Post Id



Майор


Сообщений всего: 67
Дата рег-ции: Июнь 2012  



Цитата:
Есть разница между : один мотор стоит , другой вращается и один мотор вращается в одну сторону , а другой - в другую ?

Моя не внимательность. Я забыл дописать. Моторы изначально включены. Край стола. Ардуионо посылает сигнал о том что бы включить один двигатель на пол оборота. (Другой работает на полную мощь). Ну и по программе. Такое можно сделать? В принципе очень даже резкий маневр получается.
Цитата:
Чтобы мотор вращался нужно установить разность логов на его инпутах.

Что такое логи?
Цитата:
а инпуты завести на цифровые порты МК. В этом случае для движения обоих моторов будет задействовано 4 ноги МК.

Если Я так сделаю то как Я буду управлять двигателями? Через ШИМ? Два двигателя, получается два провода управления двигателями. Инпутов то 4 а провода 2. Вот это Я и не понял.
Так где ошибка в коде????? Обещали со мной ковыряться. Так и выполняйте обещания.
 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



PiFi пишет:
Что такое логи?
ну типа в ипром писать что он там делал и потом читать.
offtop: begin
-- имхо довольно сложная задача
end offtop;
(я и так си не знаю, а ардуиноСи - темпаче.)
(да не буду я учить эту ардуино, ее же можно на нормальном Си, и даже асме (нативно понятном любому) программить?)

(Отредактировано автором: 15 Июля, 2012 - 19:31:33)

 
 Top
PiFi Post Id



Майор


Сообщений всего: 67
Дата рег-ции: Июнь 2012  



Цитата:
разность логов

Я не понял вот эту фразу. А логи эти файл где написана история использования проги.
Цитата:
ипром

А что это такое? Смущение
 
 Top
anar Post Id



Главнокомандующий


Сообщений всего: 441
Дата рег-ции: Июнь 2011  



PiFi пишет:
А что это такое?

ЭСППЗУ электронно-стираемое программируемое постоянное запоминающее устройство electronically erasable programmable read-only memory (EEPROM).
Советую вам почитать книгу "Занимательно о микроконтроллерах".Тогда и не будут возникать такого рода вопросы.
(Добавление)
PiFi пишет:
разность логов

Логический уровень на ножках l293d, "1" или "0".

(Отредактировано автором: 15 Июля, 2012 - 21:10:42)

 
 Top
PiFi Post Id



Майор


Сообщений всего: 67
Дата рег-ции: Июнь 2012  



Цитата:
ЭСППЗУ электронно-стираемое программируемое постоянное запоминающее устройство electronically erasable programmable read-only memory (EEPROM).
Советую вам почитать книгу "Занимательно о микроконтроллерах".Тогда и не будут возникать такого рода вопросы.

Обязательно почитаю.
Цитата:
Логический уровень на ножках l293d, "1" или "0".

Я так и знал. Пятками чувствовал.

Вообщем сделал так: подключил инпут 2 и 3 к ШИМ. (В коде en1 и en2.) Енаибылы подключил к +5. Инпут 1 и 4 подключены к +5. Вышла какая-та ерунда. Светодиоды постоянно миргают.

Так же жду ответ на вопрос.
Цитата:
Цитата:
Есть разница между : один мотор стоит , другой вращается и один мотор вращается в одну сторону , а другой - в другую ?


Моя не внимательность. Я забыл дописать. Моторы изначально включены. Край стола. Ардуионо посылает сигнал о том что бы включить один двигатель на пол оборота. (Другой работает на полную мощь). Ну и по программе. Такое можно сделать? В принципе очень даже резкий маневр получается.
Цитата:

Цитата:
а инпуты завести на цифровые порты МК. В этом случае для движения обоих моторов будет задействовано 4 ноги МК.

Если Я так сделаю то как Я буду управлять двигателями? Через ШИМ? Два двигателя, получается два провода управления двигателями. Инпутов то 4 а провода 2. Вот это Я и не понял.
Так где ошибка в коде????? Обещали со мной ковыряться. Так и выполняйте обещания.[/quote]
(Добавление)
Цитата:
(да не буду я учить эту ардуино, ее же можно на нормальном Си, и даже асме (нативно понятном любому) программить?)

Я тут статейку, на робокрафт читал, "ардуино как фреймворк" ; так вот там рассказывается почему ардуино лучше.
 
 Top
nestandart Супермодератор Post Id



Супер-модератор


Сообщений всего: 1490
Дата рег-ции: Сент. 2010  



Во первых вот вам ваша главная ошибка в программе.

Цитата:
int en1 = 3;//Переменная для управления 1 двигателем через ШИМ

Цитата:
int pir = 3;


Один и тот же порт имеет два названия и в одной и той же программе используется , одновременно , как вход и как выход

Цитата:
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/
 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



здрасти? не знаю как ардуиноси, но winavr выделит им в стеке по четыре байта. при чем тут порты?
(даташиты рекомендуют шимить через инэйбл (правда я тоже программномодулирую через инпут, а инэйблы на плюсе) )
(Добавление)
а nestandart предпочитает использовать неруское слово "лог" по другому.
можно и так...
(хотя "поменять биты портов"- правильнее)
 
 Top
nestandart Супермодератор Post Id



Супер-модератор


Сообщений всего: 1490
Дата рег-ции: Сент. 2010  



Цитата:
а nestandart предпочитает использовать неруское слово "лог" по другому

Лог - логический уровень.
(Добавление)
Цитата:
хотя "поменять биты портов"- правильнее

Может и правильней , но для меня лог привычней и понятней.
 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  




для меня лог- отчет за день Улыбка
 
 Top
Страниц (2): [1] 2 »
« Программирование микроконтроллеров »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru