Проблема считывния IBus ардуиной
- Войдите на сайт для отправки комментариев
Чт, 25/02/2021 - 18:58
Имеется: недостроенный шнекоход, аппаратура 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);
}
}
не понял, для каких целей нужен IBUS?
может попроще?
IBus, чтобы ничего не перегружая иметь 10+ каналов, так как в планах еще и манипулятор с кучей сервоприводов, а на прерывание только 6. Но как временный вариант для обкатки ходовой пойдет, буду пробовать