ик сигнал - команду пропускает периодически приёмник...

leks
Offline
Зарегистрирован: 22.10.2017
//////////////////////////    скетч для управления 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;}

}
 //////////////////////////////////////////////////////////////////////

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Дилэи уберите - перестанет пропускать...

Ох, да у вас там еще и подпространственные прыжки с Goto...

leks
Offline
Зарегистрирован: 22.10.2017

Экспериментирую с ходуном на 4 ноги и 8 сервоприводов в варианте с управлением от пульта триколор. Такая история: то слушается робот идеально команд, то игнорирует по 3-4 нажатия на кнопку. Грешил на яркий дневной свет, расположение приёмника во время ходьбы, дистанцию управления, потерю контактов при движении. Вроде всё это не в счёт. Что ещё может быть?

leks
Offline
Зарегистрирован: 22.10.2017

sadman41 пишет:

Дилэи уберите - перестанет пропускать...

Ох, да у вас там еще и подпространственные прыжки с Goto...

Так в эти самые делеи (когда не надо ничего ворочать) и работает опрос приёмника...или я фатально не понимаю структуру своей программы?

sadman41
Offline
Зарегистрирован: 19.10.2016

leks пишет:

или я фатально не понимаю структуру своей программы?

Как и я...

Перепишите функцию так хотя бы:

void delay_(uint32_t waitInterval) {
  uint32_t startDelay = millis();

  while (millis() - startDelay < waitInterval) {
    if (irrecv.decode(&results) {
    switch (results.value) {
          ....
      }
    }
    irrecv.resume();
  }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А чего Вы хотели? Просто разберите логику программы.

leks пишет:
или я фатально не понимаю структуру своей программы?

Так и есть. Давайте разберём Вашу программу.

Ну, вот, допустим, новая команда пришла во время выполнения delay_ в строке №70. Команда пришла, и N стал равен 5.

И что, программа досрочно вышла из delay_, а дальше. Цикл в строка 67-70 продолжился и спокойно выполняется дальше (со всеми delay_, как положено). После того, как этот цикл завершится, начнёт выполняться цикл в строках 72-77 (полностью со всеми delay_), Затем начнёт выполняться цикл в строках 79-82, затем цикл в строках 84-87, затем в строках 90-94, затем 96-99 …

Т.е. всё будет идти, как шло, и плевать на то, была получена команда.

А пока всё это идёт, глядишь, и новая команда подоспеет. N снова поменяется, а про ту N==5 уже все и забыли.

leks
Offline
Зарегистрирован: 22.10.2017

ЕвгенийП пишет:

А чего Вы хотели? Просто разберите логику программы.

leks пишет:
или я фатально не понимаю структуру своей программы?

Так и есть. Давайте разберём Вашу программу.

Ну, вот, допустим, новая команда пришла во время выполнения delay_ в строке №70. Команда пришла, и N стал равен 5.

И что, программа досрочно вышла из delay_, а дальше. Цикл в строка 67-70 продолжился и спокойно выполняется дальше (со всеми delay_, как положено). После того, как этот цикл завершится, начнёт выполняться цикл в строках 72-77 (полностью со всеми delay_), Затем начнёт выполняться цикл в строках 79-82, затем цикл в строках 84-87, затем в строках 90-94, затем 96-99 …

Т.е. всё будет идти, как шло, и плевать на то, была получена команда.

А пока всё это идёт, глядишь, и новая команда подоспеет. N снова поменяется, а про ту N==5 уже все и забыли.

Ну да, ходун реагирует не сразу - в пределах одного шага, так и задумано...но он вредитель периодически западает и на несколько шагов вот чего так не ясно. Может опрос ик приёмника в луупе надо делать?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не знаю, делайте где хотите.

Но если приходит новая команда в процессе довыполнения, то пришедшая перед этим команда забывается.

leks
Offline
Зарегистрирован: 22.10.2017

ЕвгенийП пишет:

Не знаю, делайте где хотите.

Но если приходит новая команда в процессе довыполнения, то пришедшая перед этим команда забывается.

Да, это понимаю, но тискаю я одну и ту же кнопку когда ходун вредничает.

leks
Offline
Зарегистрирован: 22.10.2017

sadman41 пишет:

leks пишет:

или я фатально не понимаю структуру своей программы?

Как и я...

Перепишите функцию так хотя бы:

void delay_(uint32_t waitInterval) {
  uint32_t startDelay = millis();

  while (millis() - startDelay < waitInterval) {
    if (irrecv.decode(&results) {
    switch (results.value) {
          ....
      }
    }
    irrecv.resume();
  }
}

 

Счас попробую...

leks
Offline
Зарегистрирован: 22.10.2017
//////////////////////////    скетч для управления 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_(uint32_t waitInterval) {
   uint32_t startDelay = millis();
   while (millis() - startDelay < waitInterval) {
    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();

  }

}
 
 //////////////////////////////////////////////////////////////////////

Вот такой вариант загрузил. Квадрик перестал шевелиться совсем.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Если бы Вы нормально форматировали код, Вы бы легко увидели ошибку. у Вас строка 268 оказалась ВНЕ if'а из строки 246. И Вы лупите resume налево и направло. Вы никакого сигнала не получаете.

Переставьте строку 268 перед строкой 266 и всё восстановится.

Только это не поможет с изначальной проблемой. Этим Вы только от goto избавитесь (не очень понятно зачем и кому он мешает).

Чтобы решить изначальную проблему, постаьте печать переменной N сразу после (или перед) "irrecv.resume();"

А также поставьте печать той же N перед каждым for в функции loop. Смотрите как она меняется и анализируйте.

sadman41
Offline
Зарегистрирован: 19.10.2016

Да этому скетчу ничего не помешает и не поможет - ни goto, ни матерь божья. А так хоть красиво будет. Единственное, что тут как-то сдвинет ситуацию, так это return после свича. Но как это скажется на дальнейшем - мне как-то уже не думается. От этого скетча у меня даже Arduino IDE зависла и теперь не запускается ))

leks
Offline
Зарегистрирован: 22.10.2017

ЕвгенийП пишет:

Если бы Вы нормально форматировали код, Вы бы легко увидели ошибку. у Вас строка 268 оказалась ВНЕ if'а из строки 246. И Вы лупите resume налево и направло. Вы никакого сигнала не получаете.

Переставьте строку 268 перед строкой 266 и всё восстановится.

Только это не поможет с изначальной проблемой. Этим Вы только от goto избавитесь (не очень понятно зачем и кому он мешает).

Чтобы решить изначальную проблему, постаьте печать переменной N сразу после (или перед) "irrecv.resume();"

А также поставьте печать той же N перед каждым for в функции loop. Смотрите как она меняется и анализируйте.

Увидел, скобкой выше у меня было в исходнике...исправлю и перепробую. С печатью тоже попробую, но вот что интересно: если каждую команду на пульте выполнять двумя краткими нажатиями ходун практически не ослушивается.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, я же говорю, что где-то теряется.

Когда Вы посавите печать рядом с resune (т.е. в момент получения команды) и потом перед всеми for, Вы сразу увидите что-нибудь типа:

1. Команда просто не приходит (через раз) - тогда надо разбираться с IR - смотреть почему не приходит.

2. Команда приходит всегда исправно, но потом теряется - вот и посмотрите в каком месте N меняется.

3. Команда приходит всегда исправно, но потом приходит ещё какая-то левая команда. Опять же будете думать, откуда берётся.

В общем эта печать поможет локализовать проблему.

leks
Offline
Зарегистрирован: 22.10.2017

Поставил печать в нескольких местах. Номер N везде совпадает с соответсвующей кратко нажатой или постоянно удерживаемой кнопкой. Так происходит в любых вариациях переключений...раз 7-10. Потом вдруг краткое нажатие на очередную кнопку игнорируется - сохраняется текущий N . Два кратких нажатия выправляют ситуацию, но ещё лучше кратко-длительное нажатие, здесь гарантированно "переключается N" на кнопку. Пробовал старый пульт с теми же кодами, на две кнопки нет никакой реакции в переключении. В пульте дело или в канале ИК.

sadman41
Offline
Зарегистрирован: 19.10.2016

Возьмите простой скетч из IRRemote (IRrecvDemo / IRrecvDump) - сразу и узнаете в пульте ли дело.

leks
Offline
Зарегистрирован: 22.10.2017

sadman41 пишет:

Возьмите простой скетч из IRRemote (IRrecvDemo / IRrecvDump) - сразу и узнаете в пульте ли дело.

Да чертовщина какая то, я и брал простой пример и изголялся на светодиоде 13 пина - в зависимости от кратко нажатой кнопки тот мигал разной частотой. Так вот старый "пульт исправно воспринимался всеми кнопками" с 5 метров без ошибок и в отражении от потолка. И даже на напряжении питания в 3,7 Вольт всё работало. А с сервами хрен. Только 5В. Хотя ходун без управления нормально шлёпает на 3,7 В.

sadman41
Offline
Зарегистрирован: 19.10.2016

leks пишет:

 Так вот старый "пульт исправно воспринимался всеми кнопками" с 5 метров без ошибок и в отражении от потолка. И даже на напряжении питания в 3,7 Вольт всё работало. А с сервами хрен. Только 5В. Хотя ходун без управления нормально шлёпает на 3,7 В.

Что ж поделать... Нельзя просто так взять плату за 100р, скачать пару либ и за вечер собрать на ней собаку бостон динамикса. 

Придется сидеть, рыть библиотеки и выяснять в чем грабли. Может серв много и они все ресурсы сжырают.

А может и просто диагноз неправильный поставлен: на кнопку всё реагировает, но по причине, описанной в #5, вы считаете, что ситуация обратная. Сделайте из светодиода мыргалку, которая будет сигнализировать о том, что входящий пакет обработан в delay_(). Или даже на любимых WS2812 замутить цветовую схему ;)

leks
Offline
Зарегистрирован: 22.10.2017

sadman41 пишет:

leks пишет:

 Так вот старый "пульт исправно воспринимался всеми кнопками" с 5 метров без ошибок и в отражении от потолка. И даже на напряжении питания в 3,7 Вольт всё работало. А с сервами хрен. Только 5В. Хотя ходун без управления нормально шлёпает на 3,7 В.

Что ж поделать... Нельзя просто так взять плату за 100р, скачать пару либ и за вечер собрать на ней собаку бостон динамикса. 

Придется сидеть, рыть библиотеки и выяснять в чем грабли. Может серв много и они все ресурсы сжырают.

А может и просто диагноз неправильный поставлен: на кнопку всё реагировает, но по причине, описанной в #5, вы считаете, что ситуация обратная. Сделайте из светодиода мыргалку, которая будет сигнализировать о том, что входящий пакет обработан в delay_(). Или даже на любимых WS2812 замутить цветовую схему ;)

Вроде разобрался со сбоями в управлении. Помогло управление квадроподом с помощью блютуза через Remote XY. Использовал аналогичный по структуре скетч, модуль НС05 выключался от планшета каждые 30-70 секунд. Экспериментировал и понял - виновата аппаратная составляющая - питал сервы, Ардуино и "датчики" через общий понижающий стабилизатор. Как только запитал ИК приёмник и блютуз модуль через стабилизатор Ардуино, всё исправилось...