Два дальномера
- Войдите на сайт для отправки комментариев
Сб, 07/03/2015 - 20:22
Добрый день. Начинаю строить робота, столкнулся с проблемой. Стоит 2 дальномера и драйвер двигателя L298N. Один дальномер срабатывает верно(совершает движение и загорается светодиод), другой как-то не правильно - светодиод загорается, а движения нет. Подскажите, пожалуйста, как решить проблему? Правильно работающий R.
int Motor1Dvig1 = 47; int Motor1Dvig2 = 49; int Motor2Dvig1 = 51; int Motor2Dvig2 = 53; int RegSpeed1 = 9; int RegSpeed2 = 8; int Ksenon1 = 4; int Ksenon2 = 5; int EchoL = 24; int EchoR = 28; int TrigL = 26; int TrigR = 30; unsigned int impulseTimeL=0; unsigned int distance_smL=0; unsigned int impulseTimeR=0; unsigned int distance_smR=0; void setup() { // put your setup code here, to run once: pinMode(Motor1Dvig1, OUTPUT); pinMode(Motor1Dvig2, OUTPUT); pinMode(Motor2Dvig1, OUTPUT); pinMode(Motor2Dvig2, OUTPUT); pinMode(Ksenon1, OUTPUT); pinMode(Ksenon2, OUTPUT); pinMode(RegSpeed1, OUTPUT); pinMode(RegSpeed2, OUTPUT); pinMode(TrigL, OUTPUT); //инициируем как выход pinMode(EchoL, INPUT); //инициируем как вход pinMode(TrigR, OUTPUT); //инициируем как выход pinMode(EchoR, INPUT); //инициируем как вход digitalWrite(Ksenon1, HIGH); digitalWrite(Ksenon2, HIGH); } void loop() { digitalWrite(TrigL, HIGH); delayMicroseconds(10); // равный 10 микросекундам digitalWrite(TrigL, LOW); // Отключаем impulseTimeL=pulseIn(EchoL, HIGH); // Замеряем длину импульса distance_smL=impulseTimeL/58; // Пересчитываем в сантиметры if (distance_smL<10) // Если расстояние менее 10 сантиметром { digitalWrite(Ksenon1, HIGH); digitalWrite(Motor1Dvig1, HIGH); digitalWrite(Motor1Dvig2, LOW); digitalWrite(Motor2Dvig1, LOW); digitalWrite(Motor2Dvig2, HIGH); analogWrite(RegSpeed1, 180); analogWrite(RegSpeed2, 250); } else { digitalWrite(Ksenon1, LOW); analogWrite(RegSpeed1, 0); analogWrite(RegSpeed2, 0); } digitalWrite( TrigR, HIGH); delayMicroseconds(10); // равный 10 микросекундам digitalWrite(TrigR, LOW); // Отключаем impulseTimeR=pulseIn(EchoR, HIGH); // Замеряем длину импульса distance_smR=impulseTimeR/58; // Пересчитываем в сантиметры if (distance_smR<10) // Если расстояние менее 10 сантиметром { digitalWrite(Ksenon2, HIGH); digitalWrite(Motor1Dvig1, HIGH); digitalWrite(Motor1Dvig2, LOW); digitalWrite(Motor2Dvig1, LOW); digitalWrite(Motor2Dvig2, HIGH); analogWrite(RegSpeed1, 250); analogWrite(RegSpeed2, 180); } else { digitalWrite(Ksenon2, LOW); analogWrite(RegSpeed1, 0); analogWrite(RegSpeed2, 0); } delay(100); }
строки #90....112 всегда маскируют действия в строках #52....75
.....пересмотрите свои ИФЫ
два замера - потом анализ и действия, а не по очереди - замер-анализ, замер-анализ
Спасибо за ответ.
Поменял - все равно то же самое.
Если убрать действия правого дальномера-левый начинает работать как надо.
строки #90....112 всегда маскируют действия в строках #52....75
.....пересмотрите свои ИФЫ
Не совсем понял..
луп выполняется по кругу, крайние действия в нём "затирают" действия прописанные выше крайних.....
разрулите ифами 4 состояния системы после 2-ух замеров лев и прав бортом
1 - лев > 10 см, прав > 10 см - едем прямо
2 - лев > 10 см, прав < 10 см - объезд левее
3 - лев < 10 см, прав > 10 см - объезд правее
4 - лев < 10 см, прав < 10 см - сдать назад, подвернуть правее/левее, снова прямо
два замера, потом 4 ИФА !
Работает только правый
при размещении длинного кода выставляйте ещё галочку "свернуть" :)
код щас гляну.....
if
(distance_smL>2&&distance_smR>2)
почему && ?
чёбы не запутацца я пишу так
if
( (distance_smL>2) & (distance_smR>2) )
и, наверное надо & , а не && ? попробуйте
if
( (distance_smL>2) && (distance_smR>2) )
или
if
( (distance_smL>2) & (distance_smR>2) )
строки #1.....12
лучше переделать к виду
int
Motor1Dvig1 = 47; >>>>>> #define
Motor1Dvig1 47.....это оптимизация кода
Переделал - всё так же(( В изначальном коде, где дальномер зажигал ещё светодиод - дальномер со светодиодом работал, а вот с двигателями какя-то фигня.
я не вникал в управление двигателями - мне кажется вы запутались что прописать в каждом из 4-ёх ИФАх - когда что делать и куда, и как крутить движки :(
строки #58.......71 - если нет препятствия ни справа, ни слева - зачем включать поворотник ? ( про движки пока молчу )
при размещении длинного кода выставляйте ещё галочку "свернуть" :) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
поворотники обзовите не 1 и 2 , а L и R - так логичнее же ?
так же и моторы - левый правый, так же и пины левыйВперёд, левый Назад.........................................
Я в данный момент не придаю этому значения - может что - то и неверно в какую сторону крутить, с этим разобраться не сложно. Главное чтобы дальномер заработал как надо. Сейчас платформа (Тамия и редутор тамия) стоит на столе без гусениц-поднес руку к правому дальномеру - колеса вращаются, поднес к левому тишина.
Поворотники остались от старой конструкции с else ) Кода срабатывал дальномер - загорался светодиод. Он как бы не мешает. В следующем коде обязательно поставлю галочку)
Я в данный момент не придаю этому значения - может что - то и неверно в какую сторону крутить, с этим разобраться не сложно. Главное чтобы дальномер заработал как надо. Сейчас платформа (Тамия и редутор тамия) стоит на столе без гусениц-поднес руку к правому дальномеру - колеса вращаются, поднес к левому тишина.
я вижу картину по другому :(
никаких рук - оба движка крутят
справа помеха - левый движок стоп
слева помеха - правый движок стоп
глухая стена впереди - оба движка стоп
начните всё сначала - НО долько дальномеры и поворотники
сделайте код чтобы
- нет препятствий - поворотники не светятся
- слева препятсвие - вкл поворотник R
- справа препятсвие - вкл поворотник L
- глухая стена - вкл поворотник R и L
....после этого перейдёте к управлению движками ( отработали одно - перешли к другому )
я бы начал с этого
Добрый вечер! Проблема разрешилась,оказывается неисправен дальномер, поэтому криво работал. Нашел новый - всё работает как положено))Огромное спасибо за помощь и уделённое время. Ваши советы по оптимизации кода уже использую и планирую использовать дальше. Ещё раз спасибо. Не знаю есть ли здесь Личные сообщения, но хотел бы Вам позадавать вопросы,на которые, я уверен, Вы сможете дать исчерпывающие ответы.
что мешает спрашивать здесь ? :)
Да в принципе - только название темы)
Как interferenceR присвоить
Т.е. вложить в переменную поворот вправо?
Я наверное не совсем точно выразился. Это не имело отношение к коду, который Вы мне привели. Я имел ввиду, для наглядности и удобства, в начале программы,действия по повороту вложить в одну строчку, чтобы вдальнейшем, выполняя поворот не ужно было перечилять кучу операций с двигателями.
чтобы вдальнейшем, выполняя поворот не ужно было перечилять кучу операций
:) опять не точно..... это называется не переменной - это функция-процедура-подпрограмма :)
если в #21 прописан поворот вправо - то
смотри строки 25......38 -> 71
39......46 -> 76
Спасибо большое, буду изучать!
удачи !
этого хватит надолго :)
http://lord-n.narod.ru/download/books/walla/programming/Spr_po_C/main.htm#13
Глава 06. Функции