Проблема считывния 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. Но как временный вариант для обкатки ходовой пойдет, буду пробовать