ик сигнал - команду пропускает периодически приёмник...
- Войдите на сайт для отправки комментариев
Вс, 08/04/2018 - 20:29
////////////////////////// скетч для управления 8 сервоприводами квадропода ///////////////// #include <Servo.h> //используем библиотеку //#include "boarddefs.h" //Добавочная библиотека #include <IRremote.h> //используем библиотеку //#include "IRremoteInt.h" //Добавочная библиотека Servo myservoK3 ; //указываем сервопривод заднего левого колена Servo myservoB4; //указываем сервопривод заднего левого бедра Servo myservoK5 ; //указываем сервопривод переднего левого колена Servo myservoB6; //указываем сервопривод переднего левого бедра Servo myservoK7 ; //указываем сервопривод заднего правого колена Servo myservoB8; //указываем сервопривод заднего правого бедра Servo myservoK9 ; //указываем сервопривод переднего правого колена Servo myservoB10; //указываем сервопривод переднего правого бедра int n=17; int a03=110;int a04=75;int a05=55;int a06=97;int a07=80;int a08=75;int a09=73;int a010=85;//переменные для углов начального положения конечностей int da=10;//переменная амплитуды изменения угла в градусах для колен int db=15;//переменная амплитуды изменения угла в градусах для бёдер int i; int a3=a03;int a4=a04;int a5=a05;int a6=a06;int a7=a07;int a8=a08;int a9=a09;int a10=a010;// переменные для хранения значений текущих углов //////при увеличении значения угла сервоприводы движут лапы :B4,B6-вперёд B8,B10-назад K3,K9-вниз K5,K7-вверх //////// //////////////////////////////// int RECV_PIN = 2; //Пин подключения выходного сигнала с ИК-приёмника int N=0; //Счётчик номера нажатой кнопки long Y1=0;long Y2=0; //Создаём экземпляр класса IRrecv, в качестве параметра передаём пин подключения сигнала ИК-приёмника IRrecv irrecv(RECV_PIN); decode_results results; //Переменная для сохранения полученного кода нажатой кнопки //////////////////////////////// void setup() { //////////////////////////////////////////// myservoK3.attach(3);//выводы для подключения 1-8 сервоприводов myservoB4.attach(4); myservoK5.attach(5); myservoB6.attach(6); myservoK7.attach(7); myservoB8.attach(8); myservoK9.attach(9); myservoB10.attach(10); myservoK3.write(a03); delay(n);// начальная установка-настройка углов поворота валов серв myservoB4.write(a04); delay(n); myservoK5.write(a05); delay(n); myservoB6.write(a06); delay(n); myservoK7.write(a07); delay(n); myservoB8.write(a08); delay(n); myservoK9.write(a09); delay(n); myservoB10.write(a010); delay(n); irrecv.enableIRIn(); //Включение ИК-приёмника в работу delay(250*n); } void loop() { if(N==0){delay_(5*n);} if(N==1) { ///////////////////////////////////////////// ПРЯМОХОЖДЕНИЕ ///////////////////////////////////////////// ///////////// K5,K7 вверх/////////// for(i = 0 ; i<=da; i++) {myservoK5.write(a5+i); myservoK7.write(a7+i); delay_(n);} ///////////// B6,B8- вперёд B4,B10- назад //////// for(i = 0 ; i<=db; i++) {myservoB6.write(a6+i); myservoB8.write(a8-i); myservoB4.write(a4-i); myservoB10.write(a10+i); delay_(n);} /////////////K5,K7 вниз ///////////// for(i = 0 ; i<=da; i++) {myservoK5.write(a5-i); myservoK7.write(a7-i); delay_(n);} ////////////K3,K9 вверх ///////////// for(i = 0 ; i<=da; i++) {myservoK3.write(a3-i); myservoK9.write(a9-i); delay_(n);} ///////////// B6,B8- назад B4,B10- вперёд //////// for(i = 0 ; i<=db; i++) {myservoB6.write(a6-i); myservoB8.write(a8+i); myservoB4.write(a4+i); myservoB10.write(a10-i); delay_(n);} //////////////K3,K9 вниз ///////////// for(i = 0 ; i<=da; i++) {myservoK3.write(a3+i); myservoK9.write(a9+i); delay_(n);} ///////////////////////////////////////////////////////////////////////////////////////// } if(N==2) { ///////////////////////////////////////////// ДВИЖЕНИЕ НАЗАД ///////////////////////////////////////////// ////////////K3,K9 вверх ///////////// for(i = 0 ; i<=da; i++) {myservoK3.write(a3-i); myservoK9.write(a9-i); delay_(n);} ///////////// B6,B8- вперёд B4,B10- назад //////// for(i = 0 ; i<=db; i++) {myservoB6.write(a6+i); myservoB8.write(a8-i); myservoB4.write(a4-i); myservoB10.write(a10+i); delay_(n);} //////////////K3,K9 вниз ///////////// for(i = 0 ; i<=da; i++) {myservoK3.write(a3+i); myservoK9.write(a9+i); delay_(n);} ///////////// K5,K7 вверх/////////// for(i = 0 ; i<=da; i++) {myservoK5.write(a5+i); myservoK7.write(a7+i); delay_(n);} ///////////// B6,B8- назад B4,B10- вперёд //////// for(i = 0 ; i<=db; i++) {myservoB6.write(a6-i); myservoB8.write(a8+i); myservoB4.write(a4+i); myservoB10.write(a10-i); delay_(n);} /////////////K5,K7 вниз ///////////// for(i = 0 ; i<=da; i++) {myservoK5.write(a5-i); myservoK7.write(a7-i); delay_(n);} ///////////////////////////////////////////////////////////////////////////////////////// } if(N==3) { ///////////////////////////////////////////// РАЗВОРОТ ВЛЕВО ///////////////////////////////////////////// ////////////K3,K9 вверх ///////////// for(i = 0 ; i<=da; i++) {myservoK3.write(a3-i); myservoK9.write(a9-i); delay_(n);} ///////////// B6,B10- вперёд B4,B8- назад //////// for(i = 0 ; i<=db; i++) {myservoB6.write(a6+i); myservoB8.write(a8+i); myservoB4.write(a4-i); myservoB10.write(a10-i); delay_(n);} //////////////K3,K9 вниз ///////////// for(i = 0 ; i<=da; i++) {myservoK3.write(a3+i); myservoK9.write(a9+i); delay_(n);} ///////////// K5,K7 вверх/////////// for(i = 0 ; i<=da; i++) {myservoK5.write(a5+i); myservoK7.write(a7+i); delay_(n);} ///////////// B6,B10- назад B4,B8- вперёд //////// for(i = 0 ; i<=db; i++) {myservoB6.write(a6-i); myservoB8.write(a8-i); myservoB4.write(a4+i); myservoB10.write(a10+i); delay_(n);} /////////////K5,K7 вниз ///////////// for(i = 0 ; i<=da; i++) {myservoK5.write(a5-i); myservoK7.write(a7-i); delay_(n);} ///////////////////////////////////////////////////////////////////////////////////////// } if(N==4) { ///////////////////////////////////////////// РАЗВОРОТ ВПРАВО ///////////////////////////////////////////// ///////////// K5,K7 вверх/////////// for(i = 0 ; i<=da; i++) {myservoK5.write(a5+i); myservoK7.write(a7+i); delay_(n);} ///////////// B6,B10- вперёд B4,B8- назад //////// for(i = 0 ; i<=db; i++) {myservoB6.write(a6+i); myservoB8.write(a8+i); myservoB4.write(a4-i); myservoB10.write(a10-i); delay_(n);} /////////////K5,K7 вниз ///////////// for(i = 0 ; i<=da; i++) {myservoK5.write(a5-i); myservoK7.write(a7-i); delay_(n);} ////////////K3,K9 вверх ///////////// for(i = 0 ; i<=da; i++) {myservoK3.write(a3-i); myservoK9.write(a9-i); delay_(n);} ///////////// B6,B10- назад B4,B8- вперёд //////// for(i = 0 ; i<=db; i++) {myservoB6.write(a6-i); myservoB8.write(a8-i); myservoB4.write(a4+i); myservoB10.write(a10+i); delay_(n);} //////////////K3,K9 вниз ///////////// for(i = 0 ; i<=da; i++) {myservoK3.write(a3+i); myservoK9.write(a9+i); delay_(n);} ///////////////////////////////////////////////////////////////////////////////////////// } } //////////////////////////////////////// ФУНКЦИИ ОПИСАНИЕ ////////////////////////////////////////////////////// //Функция заменяет выполнение команды delay(n); в ней на время паузы идёт опрос датчика void delay_(int T1) { Y2=millis();metka:Y1=millis();if(Y1-Y2>=T1){} else { if (irrecv.decode(&results)) //Если произошло событие/кнопка была нажата { switch ( results.value ) { case 0x88877://кнопка "вверх-вперёд" N=1; break; case 0x8A857://кнопка "вниз-назад" N=2; break; case 0x8C837://кнопка "ОК-стоп" N=0; break; case 0x848B7://кнопка "влево" N=3; break; case 0x828D7://кнопка "вправо" N=4; break; } irrecv.resume();//Считываем следующую значение/кнопку } goto metka;} } //////////////////////////////////////////////////////////////////////
Дилэи уберите - перестанет пропускать...
Ох, да у вас там еще и подпространственные прыжки с Goto...
Экспериментирую с ходуном на 4 ноги и 8 сервоприводов в варианте с управлением от пульта триколор. Такая история: то слушается робот идеально команд, то игнорирует по 3-4 нажатия на кнопку. Грешил на яркий дневной свет, расположение приёмника во время ходьбы, дистанцию управления, потерю контактов при движении. Вроде всё это не в счёт. Что ещё может быть?
Дилэи уберите - перестанет пропускать...
Ох, да у вас там еще и подпространственные прыжки с Goto...
Так в эти самые делеи (когда не надо ничего ворочать) и работает опрос приёмника...или я фатально не понимаю структуру своей программы?
или я фатально не понимаю структуру своей программы?
Как и я...
Перепишите функцию так хотя бы:
А чего Вы хотели? Просто разберите логику программы.
Так и есть. Давайте разберём Вашу программу.
Ну, вот, допустим, новая команда пришла во время выполнения delay_ в строке №70. Команда пришла, и N стал равен 5.
И что, программа досрочно вышла из delay_, а дальше. Цикл в строка 67-70 продолжился и спокойно выполняется дальше (со всеми delay_, как положено). После того, как этот цикл завершится, начнёт выполняться цикл в строках 72-77 (полностью со всеми delay_), Затем начнёт выполняться цикл в строках 79-82, затем цикл в строках 84-87, затем в строках 90-94, затем 96-99 …
Т.е. всё будет идти, как шло, и плевать на то, была получена команда.
А пока всё это идёт, глядишь, и новая команда подоспеет. N снова поменяется, а про ту N==5 уже все и забыли.
А чего Вы хотели? Просто разберите логику программы.
Так и есть. Давайте разберём Вашу программу.
Ну, вот, допустим, новая команда пришла во время выполнения delay_ в строке №70. Команда пришла, и N стал равен 5.
И что, программа досрочно вышла из delay_, а дальше. Цикл в строка 67-70 продолжился и спокойно выполняется дальше (со всеми delay_, как положено). После того, как этот цикл завершится, начнёт выполняться цикл в строках 72-77 (полностью со всеми delay_), Затем начнёт выполняться цикл в строках 79-82, затем цикл в строках 84-87, затем в строках 90-94, затем 96-99 …
Т.е. всё будет идти, как шло, и плевать на то, была получена команда.
А пока всё это идёт, глядишь, и новая команда подоспеет. N снова поменяется, а про ту N==5 уже все и забыли.
Ну да, ходун реагирует не сразу - в пределах одного шага, так и задумано...но он вредитель периодически западает и на несколько шагов вот чего так не ясно. Может опрос ик приёмника в луупе надо делать?
Не знаю, делайте где хотите.
Но если приходит новая команда в процессе довыполнения, то пришедшая перед этим команда забывается.
Не знаю, делайте где хотите.
Но если приходит новая команда в процессе довыполнения, то пришедшая перед этим команда забывается.
Да, это понимаю, но тискаю я одну и ту же кнопку когда ходун вредничает.
или я фатально не понимаю структуру своей программы?
Как и я...
Перепишите функцию так хотя бы:
Счас попробую...
Вот такой вариант загрузил. Квадрик перестал шевелиться совсем.
Если бы Вы нормально форматировали код, Вы бы легко увидели ошибку. у Вас строка 268 оказалась ВНЕ if'а из строки 246. И Вы лупите resume налево и направло. Вы никакого сигнала не получаете.
Переставьте строку 268 перед строкой 266 и всё восстановится.
Только это не поможет с изначальной проблемой. Этим Вы только от goto избавитесь (не очень понятно зачем и кому он мешает).
Чтобы решить изначальную проблему, постаьте печать переменной N сразу после (или перед) "irrecv.resume();"
А также поставьте печать той же N перед каждым for в функции loop. Смотрите как она меняется и анализируйте.
Да этому скетчу ничего не помешает и не поможет - ни goto, ни матерь божья. А так хоть красиво будет. Единственное, что тут как-то сдвинет ситуацию, так это return после свича. Но как это скажется на дальнейшем - мне как-то уже не думается. От этого скетча у меня даже Arduino IDE зависла и теперь не запускается ))
Если бы Вы нормально форматировали код, Вы бы легко увидели ошибку. у Вас строка 268 оказалась ВНЕ if'а из строки 246. И Вы лупите resume налево и направло. Вы никакого сигнала не получаете.
Переставьте строку 268 перед строкой 266 и всё восстановится.
Только это не поможет с изначальной проблемой. Этим Вы только от goto избавитесь (не очень понятно зачем и кому он мешает).
Чтобы решить изначальную проблему, постаьте печать переменной N сразу после (или перед) "irrecv.resume();"
А также поставьте печать той же N перед каждым for в функции loop. Смотрите как она меняется и анализируйте.
Увидел, скобкой выше у меня было в исходнике...исправлю и перепробую. С печатью тоже попробую, но вот что интересно: если каждую команду на пульте выполнять двумя краткими нажатиями ходун практически не ослушивается.
Ну, я же говорю, что где-то теряется.
Когда Вы посавите печать рядом с resune (т.е. в момент получения команды) и потом перед всеми for, Вы сразу увидите что-нибудь типа:
1. Команда просто не приходит (через раз) - тогда надо разбираться с IR - смотреть почему не приходит.
2. Команда приходит всегда исправно, но потом теряется - вот и посмотрите в каком месте N меняется.
3. Команда приходит всегда исправно, но потом приходит ещё какая-то левая команда. Опять же будете думать, откуда берётся.
В общем эта печать поможет локализовать проблему.
Поставил печать в нескольких местах. Номер N везде совпадает с соответсвующей кратко нажатой или постоянно удерживаемой кнопкой. Так происходит в любых вариациях переключений...раз 7-10. Потом вдруг краткое нажатие на очередную кнопку игнорируется - сохраняется текущий N . Два кратких нажатия выправляют ситуацию, но ещё лучше кратко-длительное нажатие, здесь гарантированно "переключается N" на кнопку. Пробовал старый пульт с теми же кодами, на две кнопки нет никакой реакции в переключении. В пульте дело или в канале ИК.
Возьмите простой скетч из IRRemote (IRrecvDemo / IRrecvDump) - сразу и узнаете в пульте ли дело.
Возьмите простой скетч из IRRemote (IRrecvDemo / IRrecvDump) - сразу и узнаете в пульте ли дело.
Да чертовщина какая то, я и брал простой пример и изголялся на светодиоде 13 пина - в зависимости от кратко нажатой кнопки тот мигал разной частотой. Так вот старый "пульт исправно воспринимался всеми кнопками" с 5 метров без ошибок и в отражении от потолка. И даже на напряжении питания в 3,7 Вольт всё работало. А с сервами хрен. Только 5В. Хотя ходун без управления нормально шлёпает на 3,7 В.
Так вот старый "пульт исправно воспринимался всеми кнопками" с 5 метров без ошибок и в отражении от потолка. И даже на напряжении питания в 3,7 Вольт всё работало. А с сервами хрен. Только 5В. Хотя ходун без управления нормально шлёпает на 3,7 В.
Что ж поделать... Нельзя просто так взять плату за 100р, скачать пару либ и за вечер собрать на ней собаку бостон динамикса.
Придется сидеть, рыть библиотеки и выяснять в чем грабли. Может серв много и они все ресурсы сжырают.
А может и просто диагноз неправильный поставлен: на кнопку всё реагировает, но по причине, описанной в #5, вы считаете, что ситуация обратная. Сделайте из светодиода мыргалку, которая будет сигнализировать о том, что входящий пакет обработан в delay_(). Или даже на любимых WS2812 замутить цветовую схему ;)
Так вот старый "пульт исправно воспринимался всеми кнопками" с 5 метров без ошибок и в отражении от потолка. И даже на напряжении питания в 3,7 Вольт всё работало. А с сервами хрен. Только 5В. Хотя ходун без управления нормально шлёпает на 3,7 В.
Что ж поделать... Нельзя просто так взять плату за 100р, скачать пару либ и за вечер собрать на ней собаку бостон динамикса.
Придется сидеть, рыть библиотеки и выяснять в чем грабли. Может серв много и они все ресурсы сжырают.
А может и просто диагноз неправильный поставлен: на кнопку всё реагировает, но по причине, описанной в #5, вы считаете, что ситуация обратная. Сделайте из светодиода мыргалку, которая будет сигнализировать о том, что входящий пакет обработан в delay_(). Или даже на любимых WS2812 замутить цветовую схему ;)
Вроде разобрался со сбоями в управлении. Помогло управление квадроподом с помощью блютуза через Remote XY. Использовал аналогичный по структуре скетч, модуль НС05 выключался от планшета каждые 30-70 секунд. Экспериментировал и понял - виновата аппаратная составляющая - питал сервы, Ардуино и "датчики" через общий понижающий стабилизатор. Как только запитал ИК приёмник и блютуз модуль через стабилизатор Ардуино, всё исправилось...