Проблема считывния IBus ардуиной

Kollbhock
Offline
Зарегистрирован: 25.02.2021

Имеется: недостроенный шнекоход, аппаратура FS-i6, приемник FS-iA10B, Arduino Mega 2560. Проблема в том, что по IBus сигналы со стика считываются только при условии, что он выставлен в ноль хотя бы по одной оси. Проблем с железом нет, все компоненты проверялись в двух экземплярах и имели один косяк. Использую библиотеку IBusBM (https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&u...), но при использовании библиотеки FlySkyIBus ничего не меняется. Через pulseIn все работает, но с огромной задержкой. В чем может быть проблема? ниже на всякий приложу полный код, но если нужно просто считать переменную без всех вычислений, результат не меняется

#include <IBusBM.h>
#include <Servo.h>;
  IBusBM IBus;
  Servo Left;
  Servo Right;
  byte MedPos1;
  byte MedPos3;//Переменные среднего положения для 1 и 3 каналов
  byte leftOtc;//Переменная значения для левого шнека
  byte rightOtc;//Переменная значения для правого шнека
  int Canal1B;//Переменная 1 канала (0-180) (лево-право)
  byte Canal3B;//Переменная второго канала ( (вперед-назад)

void setup() {
  IBus.begin(Serial2); 
  Left.attach(9);//Назначение правого и левого мотора
  Right.attach(13);  
  Serial.begin(115200);
  MedPos1 = 90;//установка средних положений
  MedPos3 = 90;
}
void loop() {
//СЧИТЫВАНИЕ ЗНАЧЕНИЙ С КАНАЛОВ ПО IBus
  long Canal1 = IBus.readChannel(0);
  //long Canal2 = IBus.readChannel(1);
  long Canal3 = IBus.readChannel(2);
  //long Canal4 = IBus.readChannel(3);
  //long Canal5 = FS.readChannel(4);
  //long Canal6 = FS.readChannel(5);
  //long Canal7 = FS.readChannel(6);
  //long Canal8 = FS.readChannel(7);
  //long Canal9 = FS.readChannel(8);
  //long Canal10 = FS.readChannel(9);
 
  Canal3B = map(Canal3, 894, 2080, 0, 180);
  Canal1B = map(Canal1, 894, 2080, 0, 180);//Перевод каналов 1 и 3 в 0-180 для более удобной работы
 //ДВИЖЕНИЕ
 if(abs(Canal1B-MedPos1)<1){
  leftOtc= Canal3B;
  rightOtc = leftOtc;
  }
   if((Canal1B>MedPos1) && (Canal3B>MedPos3)){//ПРАВЫЙ ПЕРЕДНИЙ ПОВОРОТ
    Canal1B = Canal1B-(Canal3B/4);
    leftOtc = Canal3B+Canal1B/2;
    rightOtc = Canal3B -(Canal1B/2);
    //установка ограничений
    if(leftOtc>180){leftOtc = 180;}
    if(rightOtc<90){rightOtc = 90;}
  }
  else if((Canal1B<MedPos1) && (Canal3B>MedPos3)){//ЛЕВЫЙ ПЕРЕДНИЙ ПОВОРОТ
    Canal1B = Canal1B+Canal3B/4;
    leftOtc = Canal3B +Canal1B/2;
    rightOtc = Canal3B-Canal1B/2;
    //установка ограничений
    if(rightOtc>180){rightOtc = 180;}
    if(leftOtc<90){leftOtc = 90;}
  }
  else if((Canal1B<MedPos1) && (Canal3B<MedPos3)){//ЗАДНИЙ ЛЕВЫЙ ПОВОРОТ
    Canal1B = Canal1B+((180-Canal3B)/4);
    leftOtc = Canal3B+abs(Canal1B)/2;
    rightOtc = Canal3B-abs(Canal1B)/2;
    //установка ограничений
    if(leftOtc>90){leftOtc = 90;}
    if(rightOtc>120){rightOtc = 0;}
  }
  else if((Canal1B>MedPos1+1) && (Canal3B<MedPos3-1)){//ЗАДНИЙ ПРАВЫЙ ПОВОРОТ                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
    Canal1B = Canal1B-(180-Canal3B)/4;
    leftOtc = Canal3B-Canal1B/2;
    rightOtc = Canal3B+Canal1B/2;
    //установка ограничений
    if(rightOtc>90){rightOtc = 90;}
    if(leftOtc>120){leftOtc = 0;}
  }
  else if((MedPos3 = Canal3B) && (Canal1B>MedPos1)){//ПРАВЫЙ РАЗВОРОТ НА МЕСТЕ
    leftOtc = 90 + abs(Canal1B);
    rightOtc = 90;
    }
  else if((MedPos3=Canal3B) && (Canal1B<MedPos1)) {//ЛЕВЫЙ РАЗВОРОТ НА МЕСТЕ
    leftOtc = 90;
    rightOtc = 90+abs(Canal1B);
  
  Serial.println(Canal3);
  //Serial.print("MedPos1="); Serial.println(MedPos1);//Если средние положения выставлять при начале работы
 // Serial.print("MedPos3="); Serial.println(MedPos3);
  //Serial.print("Canal3B="); Serial.println(Canal3B);
  //Serial.print("left="); Serial.println(leftOtc);
  //Serial.print("right="); Serial.println(rightOtc);
  //Serial.println("================================");
  //Left.write(leftOtc);
  //Right.write(rightOtc);
  }
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

не понял, для каких целей нужен IBUS?

может попроще?

Kollbhock
Offline
Зарегистрирован: 25.02.2021

IBus, чтобы ничего не перегружая иметь 10+ каналов, так как в планах еще и манипулятор с кучей сервоприводов, а на прерывание только 6. Но как временный вариант для обкатки ходовой пойдет, буду пробовать