Как подружить две библиотеки iBUSTelemetry.h и SoftwareSerial.h ?
- Войдите на сайт для отправки комментариев
Привет знатокам.
Как подружить две библиотеки iBUSTelemetry.h и SoftwareSerial.h ?
Мне надо по IBUS принимать и отправлять данные. Для отправки есть библиотека iBUSTelemetry.h , а для приема iBUS.h. iBusBM.h не подходит , так как она HardwareSerial применяет, который занят.
Библиотека iBUSTelemetry.h создает первый SoftwareSerial_1. Думаю с библиотекой SoftwareSerial.h создать еще один SoftwareSerial_2. Но они друг дружке мешают. Похоже что работают от одного таймера (тут я ниже нуля только гадаю). Через второй SoftwareSerial_2 запущу прием данных при помощи iBUS.h.
У меня эти два SoftwareSerial будет работать по одиночке. Первый работает, второй отдыхает и на оборот. Это думаю сделать командой listen. Одновременной работы не будет.
Сылки на библиотеки :
iBUSTelemetry.h https://github.com/adis1313/iBUSTelemetry-Arduino
SoftwareSerial.h https://github.com/PaulStoffregen/SoftwareSerial
Софтовый работает через PCINT, попробуй разнести на разные группы..
Да, мне пришлось заворачивать всё в обёртку SomeSerial (аналогичную задачу)
я так понял IBUS.h не взлетит, она для прямого канала, надо разбираться как передается информация в обратном канале, давай ссылку на iBusBM.h
Спасибо за ответ.
Сылка на iBusBM.h https://github.com/bmellink/IBusBM.
А вот здесь я ниже нуля ---> Софтовый работает через PCINT, попробуй разнести на разные группы..
Канечно буду искать, но пока пойму ни одна неделя пройдет. Это я свой первый проект делаю и Ардуинку первый раз увидел месяц назад. Хотя за месяц уже много узнал.
Если поможет , то ошибка
Если можете, помогите.
Извините за ошибки, я не русский.
Если можете, помогите.
эта библиотека тоже не пойдёт, её применение на стороне радиоуправляемой модели.
Arduino library for Flysky/Turnigy RC iBUS protocol - servo (receive) and sensors/telemetry (send) using hardware UART.
Нужна библиотека разбирающая sensors/telemetry (send)...
Наверно её можно написать разобравшись с библиотекой передачи телеметрии, но это не мой уровень
Да, кстати, библиотека телеметрии заточена под аппаратуру FlySky на 14 каналов доступные в прошивке qba667 Fly Plus.
Если это ваш первый проект - просто примите как данность, что в программе может быть только один СофтСериал.
Это строго говоря неверно, но новичку два сериала не запустить.
Такая глупая мысль пришла, библиотека iBUSTelemetry.h отправляет данные. А, если в нее добавить прием из iBUS.h. или iBusBM.h. Они все в отдельности рабочие.
Я упертый и буду искать, капатса, спрашивать. Ну когда не надоест искать куплю Мегу, но это не скоро так случитса.
Два софварных порта можно переключать. Один работает, другой спит. Мне не надо, чтоб они оба одновременно работали.
Такая глупая мысль пришла, библиотека iBUSTelemetry.h отправляет данные. А, если в нее добавить прием из iBUS.h. или iBusBM.h. Они все в отдельности рабочие.
так они не телеметрию принимают а параметры всех 14 каналов (значение PWM)...
или я не пойму, что ты хочешь сделать
ты хочешь сделать свой полётный контроллер?
Все, что надо разбирать описано в этой библиотеке - https://github.com/qba667/FlySkyI6/blob/master/source/source/ibustelemetry.h
В софтсериале даже функция есть - listen(). Для выбора активного экземпляра софтсериала. Так что я бы не стал ждать, пока рак на горе свистнет и заслушают оба чудесным образом.
Такая глупая мысль пришла, библиотека iBUSTelemetry.h отправляет данные. А, если в нее добавить прием из iBUS.h. или iBusBM.h. Они все в отдельности рабочие.
так они не телеметрию принимают а параметры всех 14 каналов (значение PWM)...
или я не пойму, что ты хочешь сделать
ты хочешь сделать свой полётный контроллер?
Все, что надо разбирать описано в этой библиотеке - https://github.com/qba667/FlySkyI6/blob/master/source/source/ibustelemetry.h
iBUS.h Принимает 14 каналов PWM. Можно пользоватса Software portom.
iBusBM.h. Принимает 14 каналов PWM передает телеметрию, но только с нескольки датчиков. Использует Hardware порт.
iBUSTelemetry.h передает телеметрию со всех датчиков, которые мне нужны. Пользетса Software портом.
Да, такая есть. Я знаю это. Вот данной функцией я и хочу пользоваться при переключений с приема на передачу и на оборот. Но вот проблема в том, что софтсериал и IbusTelemetry вместе работать не может.
Мне нужны две библиотеки IbusTelemetry и (IBUS или IBUSBM). IbusTelemetry уже в библиотеке сделан софтваресериал. IBUS можно было бы подкльчить через SoftwareSerial создав порт. Но как писал IbusTelemetry и SoftwareSerial вместе не может работать.
iBUS.h Принимает 14 каналов PWM. Можно пользоватса Software portom.
iBusBM.h. Принимает 14 каналов PWM передает телеметрию, но только с нескольки датчиков. Использует Hardware порт.
iBUSTelemetry.h передает телеметрию со всех датчиков, которые мне нужны. Пользетса Software портом.
то есть вам даже не нужно два порта, достаточно чуть поправить библиотеки iBUS.h и iBUSTelemetry.h, чтобы они не открывали каждая свой СофтСериал, а работали с одним и тем же
то есть вам даже не нужно два порта, достаточно чуть поправить библиотеки iBUS.h и iBUSTelemetry.h, чтобы они не открывали каждая свой СофтСериал, а работали с одним и тем же
пока совершенно непонятно что именно ТС делает, в приёмнике порты на приём (по нему принимается значение PWM для 14 каналов) и передачу (по нему обратный канал телеметрии обрабатываемый пультом управления) разделены. Изначально я думал, что ТС имеет желание сделать свои датчики телеметрии с протоколом IBUS
iBUS.h Принимает 14 каналов PWM. Можно пользоватса Software portom.
iBusBM.h. Принимает 14 каналов PWM передает телеметрию, но только с нескольки датчиков. Использует Hardware порт.
iBUSTelemetry.h передает телеметрию со всех датчиков, которые мне нужны. Пользетса Software портом.
то есть вам даже не нужно два порта, достаточно чуть поправить библиотеки iBUS.h и iBUSTelemetry.h, чтобы они не открывали каждая свой СофтСериал, а работали с одним и тем же
Можно и так. Как писал у меня хардваре уже занят. А прием и передача на софтваре. Это один или два порта мне разницы нет. С одним даже лучше.
iBUSTelemetry.h передает телеметрию со всех датчиков, которые мне нужны. Пользетса Software портом.
нет, он использует - https://github.com/nickstedman/SoftwareSerialWithHalfDuplex
то есть вам даже не нужно два порта, достаточно чуть поправить библиотеки iBUS.h и iBUSTelemetry.h, чтобы они не открывали каждая свой СофтСериал, а работали с одним и тем же
пока совершенно непонятно что именно ТС делает, в приёмнике порты на приём (по нему принимается значение PWM для 14 каналов) и передачу (по нему обратный канал телеметрии обрабатываемый пультом управления) разделены. Изначально я думал, что ТС имеет желание сделать свои датчики телеметрии с протоколом IBUS
Вы правы. У меня свои датчики телеметрии с протоколом IBUS. они уже испробаваны с iBUSTelemetry и хорошо работают. Два из них очень нужны. Еще три нужны, ну дальше видно будет.
Ребята, я в программирование ноль. Английского языка не знаю. Учить и то, и другое поздновато. Мне летом 60 лет. Но как писал , в пространстве интернета много чего нашел и применил. Я даже не думал, что за полтора месяца можно старому новичку столько узнать и сделать. То что сделал, это не тупые копии с интернета. Я делал под себя и старалса понять , что делаю.
Не обижайте, помогите.
Рисуйте структурную схему, что вы там конструируете! Прокладку на шине IBUS на ардуине UNO(nano) c интеграцией своих датчиков я так понимаю
Рисуйте структурную схему, что вы там конструируете! Прокладку на шине IBUS c интеграцией своих датчиков я так понимаю
Все сегодня. Пошел спать. Завтра очень рано вставать. На работе попробую описать и нарисовать свои хотелки.
Большое спасибо сегодня.
Привет.
Попробую описать свой проект.
В моем проекте будет занято не мене 10 каналов принимаемых с ФлиСки. 4 канала для выбора режима работы и адресации памяти и других настроек это два потенциометра и 2 тумблера ( один из них трехпозиционный SwC ). Все 4 канала падключаетса на прямую приемник iA6b --> АРДУНО без всяких IBUS. Остальные данные еще 6 каналов АРДУИНО принимает по IBUS (iBUS.h). При выключеных тумблерах Идет прием с пульта и можно начать ручное управление всеми органами управления с пульта. При включении трехпозиционного в среднее положение переходим в фазу настроек и ручное управление отключаетса , а включаетса телеметрия (iBUSTelemetry.h). Остаетса рабочими также 4канала выше описаны, оставшиеся 6 бездействует отключены. После настроек трехпозиционный тумблер переключаю в третье положение и тогда телеметрия (iBUSTelemetry.h) остаетса работать а (iBUS.h) - выключеным. В этом положении обьект в режиме АВТО и все управление с Ардуино.
Так с описания видно, что (iBUS.h) применяетса только в исходном положении трехпозиционного тумблера. (iBUSTelemetry.h) применяетса в остальных двух положениях тумблера SwC .
SwC 0 положение BUS.h
SwC 1 положение iBUSTelemetry.h
SwC 2 положение iBUSTelemetry.h
Как то так
попробуй разнеси IBUS.h и телеметрию -iBUSTelemetry.h на разные PCINT (их использует SoftwareSerial):
Из примера телеметрии:
iBUSTelemetry telemetry(11); // I use only PCINT0 interrupt vector, so you can use D8 to D13 pins.
TC! Ты где пропал? Показывай подключение приёмника!
Так?
Хотите сказать, что при переключении передатчика в режим IBUS остаются доступны 6 каналов по PWM и становятся доступны 14 каналов по IBUS?
Собрал два примера из библиотек в единое целое, в библиотеке iBUS.h заменил порт на AltSoftSerial.h, компилируется без ошибок и предупреждений, осталось проверить на железе:
// GO #define UPDATE_INTERVAL 500 #include <iBUS.h> #include <iBUSTelemetry.h> #include <AltSoftSerial.h> AltSoftSerial sw_ser = AltSoftSerial(8, 9); iBus ibus(sw_ser); iBUSTelemetry telemetry(11); // I use only PCINT0 interrupt vector, so you can use D8 to D13 pins. /* D8 .. D13 - генерируют запрос прерывания PCINT0 A0 .. A5 - генерируют запрос прерывания PCINT1 D0 .. D7 - генерируют запрос прерывания PCINT2 */ uint32_t prevMillis = 0; // Necessary to updateValues() method. Look below. float i = 0; int channels_per_packet = 14; uint32_t last_print = 0; const int PERIOD = 50; const int channels = 6; void updateValues() { uint32_t currMillis = millis(); if (currMillis - prevMillis >= UPDATE_INTERVAL) { // Code in the middle of these brackets will be performed every 500ms. prevMillis = currMillis; telemetry.setSensorValueFP(1, i); // Now, you have two ways to set sensors values. Using floating point variables // or directly in 32bit integer, but then you have to format variable by yourself. // Ex.: telemetry.setSensorValueFP(1, 24.45); is equivalent to telemetry.setSensorValue(1, 2445); // The values differ for different sensors. telemetry.setSensorValue(2, telemetry.gpsStateValues(3, 8)); // As GPS status consists of two values, // use gpsStateValues(firstVal, secondVal) to set it properly. telemetry.setSensorValue(3, 123 * 10); telemetry.setSensorValue(4, 179583647); // You can set LAT / LON using FP metohod, but due to fact floats have only 6 digits precision, // your values on tx may be corrupted in some cases. It's better to use setSensorValue(). telemetry.setSensorValue(5, UNARMED); // ARMED / UNARMED or 1 / 0 could be used. telemetry.setSensorValue(6, LOITER); // Available flight modes: STAB 0 // ACRO 1 // AHOLD 2 // AUTO 3 // GUIDED 4 // LOITER 5 // RTL 6 // CIRCLE 7 // PHOLD 8 // LAND 9 telemetry.setSensorValueFP(7, 54.87); i += 0.1; if (i > 50) i = 0; // These were the most difficult sensors to use. I hope that this library will be useful for you and will make your work easier. :) } } /* updateValues */ void print_channels() { // Only print every PERIOD ms if(millis() - last_print > PERIOD) { last_print = millis(); for(int i=0; i<channels; i++) { Serial.print("ch "); Serial.print(i+1); Serial.print(": "); Serial.print(ibus.get_channel(i)); if(ibus.is_alive()) { Serial.println(); digitalWrite(LED_BUILTIN, LOW); } else { Serial.println(" !!LINK DEAD!!"); digitalWrite(LED_BUILTIN, HIGH); } } Serial.print("Last valid packet was received "); Serial.print(ibus.time_since_last()); Serial.println(" ms ago"); } } void setup() { Serial.begin(115200); while (!Serial) // On USB CDC serial ports, wait for the serial connection. { ; } // Set timeout between received packets to 20 ms before considering it a lost connection ibus.set_alive_timeout(20); // Set minimum time between transmitting packets, to 5ms ibus.set_tx_period(5); pinMode(LED_BUILTIN, OUTPUT); Serial.println("iBus test"); telemetry.begin(); // Let's start having fun! telemetry.addSensor(0x01); // You can use sensors definitions from iBUSSensors.h instead of numbers. // Ex.: telemetry.addSensor(IBUS_MEAS_TYPE_TEM); telemetry.addSensor(IBUS_MEAS_TYPE_GPS_STATUS); telemetry.addSensor(IBUS_MEAS_TYPE_SPE); telemetry.addSensor(IBUS_MEAS_TYPE_GPS_LAT); telemetry.addSensor(IBUS_MEAS_TYPE_ARMED); telemetry.addSensor(IBUS_MEAS_TYPE_FLIGHT_MODE); telemetry.addSensor(IBUS_MEAS_TYPE_ALT); } void loop() { updateValues(); // Very important! iBUS protocol is very sensitive to timings. // DO NOT USE ANY delay()! Look at updateValues() method. // It's an example of how to use intervals without delays. telemetry.run(); //It must be here. Period. ibus.handle(); // Run this often // Reduce all channels by 50% for(int i=0; i<channels_per_packet; i++) { int old_value = ibus.get_channel(i); // map the old value (1000 to 2000) to a new value going from 1250 to 1750 int new_value = map(old_value, 1000, 2000, 1250, 1750); // Set this new value to be sent on the next handle() ibus.set_channel(i, new_value); } // The above will mess with the throttle, so fix the throttle channel separately // Channels are zero-indexed. ibus.set_channel(2, map(ibus.get_channel(2), 1000, 2000, 1000, 1500)); print_channels(); }Удастся проверить?
Удастся проверить?
In file included from C:\Users\gince\Documents\Arduino\libraries\iBUS-master\src/iBUS.h:6:0, from C:\Users\gince\Documents\Arduino\IBUS_and_Telemetry\IBUS_and_Telemetry.ino:5: C:\Users\gince\Documents\Arduino\libraries\AltSoftSerial-master/AltSoftSerial.h: In constructor 'AltSoftSerial::AltSoftSerial(uint8_t, uint8_t, bool)': C:\Users\gince\Documents\Arduino\libraries\AltSoftSerial-master/AltSoftSerial.h:63:24: warning: unused parameter 'rxPin' [-Wunused-parameter] AltSoftSerial(uint8_t rxPin, uint8_t txPin, bool inverse = false) { } ^~~~~ C:\Users\gince\Documents\Arduino\libraries\AltSoftSerial-master/AltSoftSerial.h:63:39: warning: unused parameter 'txPin' [-Wunused-parameter] AltSoftSerial(uint8_t rxPin, uint8_t txPin, bool inverse = false) { } ^~~~~ C:\Users\gince\Documents\Arduino\libraries\AltSoftSerial-master/AltSoftSerial.h:63:61: warning: unused parameter 'inverse' [-Wunused-parameter] AltSoftSerial(uint8_t rxPin, uint8_t txPin, bool inverse = false) { } ^~~~~ C:\Users\gince\Documents\Arduino\libraries\AltSoftSerial-master/AltSoftSerial.h: In static member function 'static void AltSoftSerial::enable_timer0(bool)': C:\Users\gince\Documents\Arduino\libraries\AltSoftSerial-master/AltSoftSerial.h:68:33: warning: unused parameter 'enable' [-Wunused-parameter] static void enable_timer0(bool enable) { } ^~~~~~и не будет работать. Обратите внимание на вот этот окмментарий в библиотеке AltSoftSerial
:
так aduino nanoкак и Uno
// Arduino Uno 9 8 10
пакурили это самвспомнил. Сейчас попробую
так aduino nanoкак и Uno
// Arduino Uno 9 8 10
пакурили это самвспомнил. Сейчас попробую
в коде выше вот так:
так работать не будет
и не будет работать. Обратите внимание на вот этот окмментарий в библиотеке AltSoftSerial
то, что протокол IBUS проблемный (для меня) и к бабке не ходи, лет 5 назад так его и не одолел (на атмеге, на STM он работает, в тойже прошивке INAV), но так как мне хватало 8 каналов и не парился, сподвигло, что кому-то это еще кроме меня интересно...
Да, это не только на этой библиотеке, от неё есть еще форки:
у меня с этим всё нормально (но не работает):
In file included from C:\Users\gince\Documents\Arduino\libraries\iBUS-master\src/iBUS.h:6:0, from C:\Users\gince\Documents\Arduino\IBUS_and_Telemetry\IBUS_and_Telemetry.ino:5: C:\Users\gince\Documents\Arduino\libraries\AltSoftSerial-master/AltSoftSerial.h: In constructor 'AltSoftSerial::AltSoftSerial(uint8_t, uint8_t, bool)': C:\Users\gince\Documents\Arduino\libraries\AltSoftSerial-master/AltSoftSerial.h:63:24: warning: unused parameter 'rxPin' [-Wunused-parameter] AltSoftSerial(uint8_t rxPin, uint8_t txPin, bool inverse = false) { } ^~~~~ C:\Users\gince\Documents\Arduino\libraries\AltSoftSerial-master/AltSoftSerial.h:63:39: warning: unused parameter 'txPin' [-Wunused-parameter] AltSoftSerial(uint8_t rxPin, uint8_t txPin, bool inverse = false) { } ^~~~~ C:\Users\gince\Documents\Arduino\libraries\AltSoftSerial-master/AltSoftSerial.h:63:61: warning: unused parameter 'inverse' [-Wunused-parameter] AltSoftSerial(uint8_t rxPin, uint8_t txPin, bool inverse = false) { } ^~~~~ C:\Users\gince\Documents\Arduino\libraries\AltSoftSerial-master/AltSoftSerial.h: In static member function 'static void AltSoftSerial::enable_timer0(bool)': C:\Users\gince\Documents\Arduino\libraries\AltSoftSerial-master/AltSoftSerial.h:68:33: warning: unused parameter 'enable' [-Wunused-parameter] static void enable_timer0(bool enable) { } ^~~~~~так aduino nanoкак и Uno
// Arduino Uno 9 8 10
пакурили это самвспомнил. Сейчас попробую
в коде выше вот так:
так работать не будет
я поправил, пост был еще 11 числа, за это время много воды утекло, выкинул всё оставив только приём IBUS, не выходит каменный цветок...надо попробовать поменять аппаратуру, может в ней косяк какой...приёмники менял
библиотек уже перепробовал кучу, естественно с правкой библиотеки iBUS
и не будет работать. Обратите внимание на вот этот окмментарий в библиотеке AltSoftSerial
то, что протокол IBUS проблемный (для меня) и к бабке не ходи, лет 5 назад так его и не одолел (на атмеге, на STM он работает, в тойже прошивке INAV), но так как мне хватало 8 каналов и не парился, сподвигло, что кому-то это еще кроме меня интересно...
Да, это не только на этой библиотеке, от неё есть еще форки:
у меня с этим всё нормально (но не работает):
сделано, но не работает
сделано, но не работает
у тебя вообще библиотеки iBUS и IBusBM на приём работают?
Поставил пульт на погрузку питания. После погрузки начну проверять по новой все библиотеки отдельно.
Поставил пульт на погрузку питания. После погрузки начну проверять по новой все библиотеки отдельно.
Железо atmega328pb
беру этот скетч с библиотекой IBusBM.h, пока приёмник с аппаратурой не соединился в мониторе по нулям, как только включаю аппаратуру, вывод прекращается:
#include <IBusBM.h> IBusBM IBusServo; //IBusBM IBusSensor; void setup() { // initialize serial port for debug Serial.begin(115200); // iBUS setup IBusServo.begin(Serial1); // The default RX/TX pins for Serial1 on ESP32 boards are pins 9/10 and they are often not // exposed on the printed circuit board. You can change the pin number by replacing the line above with: // IBusServo.begin(Serial1, 1, 21, 22); // IBusSensor.begin(Serial2); Serial.println("Start iBUS monitor"); // adding 2 sensors // IBusSensor.addSensor(IBUSS_RPM); // IBusSensor.addSensor(IBUSS_TEMP); } #define TEMPBASE 400 // base value for 0'C // sensor values uint16_t speed = 0; uint16_t temp = TEMPBASE + 200; // start at 20'C void loop() { // show first 8 servo channels for (int i = 0; i < 10 ; i++) { Serial.print(IBusServo.readChannel(i)); Serial.print(" "); } Serial.print("Cnt="); Serial.println(IBusServo.cnt_rec); // count of how many times servo values have been updated // Serial.print(" POLL="); // Serial.print(IBusSensor.cnt_poll); // count of polling for sensor existance // Serial.print(" Sensor="); // Serial.println(IBusSensor.cnt_sensor); // count of polling for sensor value // IBusSensor.setSensorMeasurement(1,speed); // speed += 10; // increase motor speed by 10 RPM // IBusSensor.setSensorMeasurement(2,temp++); // increase temperature by 0.1 'C every loop delay(500); }Вывод в мониторе порта:
[/quote]
у тебя вообще библиотеки iBUS и IBusBM на приём работают?
[/quote]
IBusBM работает. Проверил еще раз.
iBUS не работает с твоей сылки. Та что работала выкинул (заменил твоей). Теперь перепробовал с нескольки мест, все не работает. Не помню от куда раньше брал. Была рабочая.
Этот рабочий код, но он hardware
#include <string.h> #define IBUS_BUFFSIZE 32 #define IBUS_MAXCHANNELS 10 // I am using only 10 channels because my TX (FlySky i6) supports max 10 channels static uint8_t ibusIndex = 0; static uint8_t ibus[IBUS_BUFFSIZE] = {0}; static uint16_t rcValue[IBUS_MAXCHANNELS]; static boolean rxFrameDone; int ch_width_1; int ch_width_2; int ch_width_3; int ch_width_4; int ch_width_5; int ch_width_6; int ch_width_7; int ch_width_8; int ch_width_9; int ch_width_10; void setup() { Serial.begin(115200); } void loop() { readRx(); } void readRx() { rxFrameDone = false; if (Serial.available()) { uint8_t val = Serial.read(); // Look for 0x2040 as start of packet if (ibusIndex == 0 && val != 0x20) { ibusIndex = 0; return; } if (ibusIndex == 1 && val != 0x40) { ibusIndex = 0; return; } if (ibusIndex == IBUS_BUFFSIZE) { ibusIndex = 0; int high = 3; int low = 2; for (int i = 0; i < IBUS_MAXCHANNELS; i++) { rcValue[i] = (ibus[high] << 8) + ibus[low]; high += 2; low += 2; } ch_width_1 = map(rcValue[0], 1000, 2000, -100, 100); //ch1.writeMicroseconds(ch_width_1); Serial.print("ch_width_1 ");Serial.print(ch_width_1); Serial.println(); ch_width_2 = map(rcValue[1], 1000, 2000, -100, 100); //ch2.writeMicroseconds(ch_width_2); Serial.print("ch_width_2 ");Serial.print(ch_width_2); Serial.println(); ch_width_3 = map(rcValue[2], 1000, 2000, 1000, 2000); //ch3.writeMicroseconds(ch_width_3); Serial.print("ch_width_3 ");Serial.print(ch_width_3); Serial.println(); ch_width_4 = map(rcValue[3], 1000, 2000, 1000, 2000); //ch4.writeMicroseconds(ch_width_4); Serial.print("ch_width_4 ");Serial.print(ch_width_4); Serial.println(); ch_width_5 = map(rcValue[4], 1000, 2000, 0, 1); //ch5.writeMicroseconds(ch_width_5); Serial.print("ch_width_5 ");Serial.print(ch_width_5); Serial.println(); ch_width_6 = map(rcValue[5], 1000, 2000, 1000, 2000); //ch6.writeMicroseconds(ch_width_6); Serial.print("ch_width_6 ");Serial.print(ch_width_6); Serial.println(); ch_width_7 = map(rcValue[6], 1000, 2000, 1000, 2000); //ch7.writeMicroseconds(ch_width_7); Serial.print("ch_width_7 ");Serial.print(ch_width_7); Serial.println(); ch_width_8 = map(rcValue[7], 1000, 2000, 1000, 2000); //ch8.writeMicroseconds(ch_width_8); Serial.print("ch_width_18 ");Serial.print(ch_width_8); Serial.println(); ch_width_9 = map(rcValue[8], 1000, 2000, 1000, 2000); //ch9.writeMicroseconds(ch_width_9); Serial.print("ch_width_9 ");Serial.print(ch_width_9); Serial.println(); ch_width_10 = map(rcValue[9], 1000, 2000, 1000, 2000); //ch10.writeMicroseconds(ch_width_10); Serial.print("ch_width_10 ");Serial.print(ch_width_10); Serial.println(); delay(1000); rxFrameDone = true; return; } else { ibus[ibusIndex] = val; ibusIndex++; } } }Поставил пульт на погрузку питания. После погрузки начну проверять по новой все библиотеки отдельно.
Железо atmega328pb
беру этот скетч с библиотекой IBusBM.h, пока приёмник с аппаратурой не соединился в мониторе по нулям, как только включаю аппаратуру, вывод прекращается:
#include <IBusBM.h> IBusBM IBusServo; //IBusBM IBusSensor; void setup() { // initialize serial port for debug Serial.begin(115200); // iBUS setup IBusServo.begin(Serial1); // The default RX/TX pins for Serial1 on ESP32 boards are pins 9/10 and they are often not // exposed on the printed circuit board. You can change the pin number by replacing the line above with: // IBusServo.begin(Serial1, 1, 21, 22); // IBusSensor.begin(Serial2); Serial.println("Start iBUS monitor"); // adding 2 sensors // IBusSensor.addSensor(IBUSS_RPM); // IBusSensor.addSensor(IBUSS_TEMP); } #define TEMPBASE 400 // base value for 0'C // sensor values uint16_t speed = 0; uint16_t temp = TEMPBASE + 200; // start at 20'C void loop() { // show first 8 servo channels for (int i = 0; i < 10 ; i++) { Serial.print(IBusServo.readChannel(i)); Serial.print(" "); } Serial.print("Cnt="); Serial.println(IBusServo.cnt_rec); // count of how many times servo values have been updated // Serial.print(" POLL="); // Serial.print(IBusSensor.cnt_poll); // count of polling for sensor existance // Serial.print(" Sensor="); // Serial.println(IBusSensor.cnt_sensor); // count of polling for sensor value // IBusSensor.setSensorMeasurement(1,speed); // speed += 10; // increase motor speed by 10 RPM // IBusSensor.setSensorMeasurement(2,temp++); // increase temperature by 0.1 'C every loop delay(500); }Вывод в мониторе порта:
IBusBM.h телеметрию не смог подключить. А прием каналов работает. Там подключение через диод ирезистор
https://github.com/betaflight/betaflight/wiki/Single-wire-FlySky-(IBus)-telemetry
gince - возьмите уже Мегу и подключите через два зардовых Сериала
так в коде прямой разбор пакетов, попробую на разных софтовых библиотеках, дам знать
IBusBM.h телеметрию не смог подключить. А прием каналов работает. Там подключение через диод ирезистор
https://github.com/betaflight/betaflight/wiki/Single-wire-FlySky-(IBus)-telemetry
это подключение актуально для прошивки betaflight, сигналы переводятся в однопроводный двунаправленный интерфейс, для INAV прошивки выходы с приёмника (SERVO - SENSOR) подключаются в стандартный порт сериал и он настраивается
Рабочий код IBusBM.h
#include <IBusBM.h> int maxChanell = 6; IBusBM IBus; // IBus object void setup() { Serial.begin(115200); while (!Serial) ; IBus.begin(Serial); // iBUS connected to Serial1 - change to Serial0 or Serial2 port when required Serial.println("Start IBus2PWM"); } void loop() { Serial.println("Start IBus2PWM"); int val; for (int i = 0; i < maxChanell; i++) { val = IBus.readChannel(i); // get latest value for servo channel 1 Serial.print( i );Serial.print(" "); Serial.print(val); Serial.println(); } delay(1000); }Рабочий код IBusBM.h
#include <IBusBM.h> int maxChanell = 6; IBusBM IBus; // IBus object void setup() { Serial.begin(115200); while (!Serial) ; IBus.begin(Serial); // iBUS connected to Serial1 - change to Serial0 or Serial2 port when required Serial.println("Start IBus2PWM"); } void loop() { Serial.println("Start IBus2PWM"); int val; for (int i = 0; i < maxChanell; i++) { val = IBus.readChannel(i); // get latest value for servo channel 1 Serial.print( i );Serial.print(" "); Serial.print(val); Serial.println(); } delay(1000); }А Ардуино какая?
А Ардуино какая?
NANO
А Ардуино какая?
NANO
1. Версия ардуино IDE какая
2. как подключаешь
3. Выбираешь nano из стандартного набора плат или какое-то иное ядро?
А Ардуино какая?
NANO
1. Версия ардуино IDE какая
2. как подключаешь
3. Выбираешь nano из стандартного набора плат или какое-то иное ядро?
IDE > 1.8.16
Выбираю Процессор >atmega328P
стандартный выбор
Так?
FS IA-6B servo -------> RXD nano (old bootloader)
V+ -------> 5V
G -------> GND
Так?
FS IA-6B servo -------> RXD nano (old bootloader)
V+ -------> 5V
G -------> GND
если nano (old bootloader), то незагружаета в нано. Если 328P, загружаетса.
FS IA-6B servo -------> RXD nano (328P) ----->D8
V+ -------> 5V
G -------> GND
похоже у тебя нано с новым загрузчиком, всё дело в нём, надо попробовать перешить свою, у меня не работает (
понял. Буду ждать
Первый раз полез в менять библиотеку. Поменять ничего не поменял, а только новую функцию добавил. Херня получилась.
Тут iBUS.cpp
#include <iBUS.h> #include <string.h> #define IBUS_BUFFSIZE 32 #define IBUS_MAXCHANNELS 10 // I am using only 10 channels because my TX (FlySky i6) supports max 10 channels static uint8_t ibusIndex = 0; static uint8_t ibus[IBUS_BUFFSIZE] = {0}; static uint16_t rcValue[IBUS_MAXCHANNELS]; static boolean rxFrameDone; iBus::iBus(HardwareSerial& serial): m_ser(serial) { serial.begin(115200); this->m_ser = serial; } /* iBus::iBus(SoftwareSerial& serial): m_ser(serial) { serial.begin(115200); this->m_ser = serial; } */ iBus::iBus(AltSoftSerial& serial): m_ser(serial) { serial.begin(115200); this->m_ser = serial; } int iBus::get_channel(int ch) { return m_channel[ch]; } void iBus::set_channel(int ch, int val) { m_channel_out[ch] = val; } int iBus::get_tx_channel(int ch) { return m_channel_out[ch]; } void iBus::set_tx_period(unsigned int val) { m_minimum_packet_spacing = val; } void iBus::set_alive_timeout(unsigned int timeout) { m_timeout = timeout; } bool iBus::is_alive() { if (millis() - m_last_iBus_packet < m_timeout) { return true; } return false; } void iBus::handle(unsigned int timeout) { // If bytes are waiting in the serial buffer, process them // but don't loop for more than timeout ms uint32_t start = millis(); while (m_ser.available() && millis() - start < timeout) { uint8_t c = m_ser.read(); // If header byte received outside of packet, start a new packet if (!m_in_packet && c == 0x55) { m_in_packet = true; m_packet_offset = 0; // If the next byte is also 0x55, it's most likely an error // but there are 4 valid values it could be. if (m_ser.peek() == 0x55) { m_ser.read(); if (m_ser.peek() >= 4 && m_ser.peek() <= 7) { // Valid packet, let's clean up a bit m_packet[0] = 0x55; m_packet[1] = 0x55; m_packet_offset = 2; } } } // If m_packet_size bytes have been received, end packet and parse it if (m_packet_offset >= m_packet_size - 1 && m_in_packet) { m_in_packet = false; m_packet[m_packet_size - 1] = c; if (m_checksum_check(m_packet)) { m_parse_channels(m_packet, m_channel); m_last_iBus_packet = millis(); } m_packet[0] = 0x00; // Meant to signify error/no packet } // If in a packet, store byte and increment m_packet_offset if (m_in_packet) { m_packet[m_packet_offset++] = c; } } // If the link is alive (received valid packets recently), // and over m_minimum_packet_spacing since last sent packet. Send a packet if (is_alive() && millis() - m_last_packet_sent > m_minimum_packet_spacing) { m_last_packet_sent = millis(); m_send_packet(m_channel_out); } } void iBus::m_send_packet(int ch[]) { // Set up buffer and set header byte uint8_t buff[m_packet_size]; buff[0] = 0x55; // For each channel, unpack 16 bit integer into bytes // The values are sent LSB first, MSb first. for (int i = 0; i < m_channels_per_packet; i++) { buff[i * 2 + 1] = (ch[i] & 0x00FF); buff[i * 2 + 2] = (ch[i] >> 8); } int checksum = m_get_checksum(ch); buff[29] = (checksum & 0x00FF); buff[30] = (checksum >> 8); m_ser.write(buff, m_packet_size); } // Checksum is a simple sum of channel values int iBus::m_get_checksum(int ch[]) { int sum = 0; for (int i = 0; i < m_channels_per_packet; i++) { sum += ch[i]; } return sum; } bool iBus::m_checksum_check(uint8_t packet[]) { int recieved_checksum = packet[30] << 8 | packet[29]; int ch[m_channels_per_packet]; m_parse_channels(packet, ch); return (recieved_checksum == m_get_checksum(ch)); } void iBus::m_parse_channels(uint8_t packet[], int ch[]) { // For each channel, store 2 bytes in 16bit integer // The values are sent MSb first, LSB first for (int i = 0; i < m_channels_per_packet; i++) { ch[i] = packet[i * 2 + 2] << 8 | packet[i * 2 + 1]; } } uint32_t iBus::time_since_last() { return millis() - m_last_iBus_packet; } uint16_t readRx(uint8_t _ch) { rxFrameDone = false; // If bytes are waiting in the serial buffer, process them // but don't loop for more than timeout ms uint32_t start = millis(); while (m_ser.available() && millis() - start < timeout) { uint8_t val = m_ser.read(); // Look for 0x2040 as start of packet if (ibusIndex == 0 && val != 0x20) { ibusIndex = 0; return; } if (ibusIndex == 1 && val != 0x40) { ibusIndex = 0; return; } if (ibusIndex == IBUS_BUFFSIZE) { ibusIndex = 0; int high = 3; int low = 2; for (int i = 0; i < IBUS_MAXCHANNELS; i++) { rcValue[i] = (ibus[high] << 8) + ibus[low]; high += 2; low += 2; } delay(200); rxFrameDone = true; return (rcValue[_ch]); } else { ibus[ibusIndex] = val; ibusIndex++; } } }тут iBUS.h
#pragma once #include <Arduino.h> #include <HardwareSerial.h> //#include <SoftwareSerial.h> #include <AltSoftSerial.h> class iBus { public: /** * Constructor for the class. Takes either a HardwareSerial or SoftwareSerial class */ iBus(HardwareSerial& serial); // iBus(SoftwareSerial& serial); iBus(AltSoftSerial& serial); /** * A getter to get received channel values * @param ch An integer value to pick channel, 0-13 */ int get_channel(int ch); /** * A method to set transmitted channel values * @param ch An integer value to pick channel, 0-13 * @param val An integer value to send on this channel */ void set_channel(int ch, int val); /** * A method to get transmitted channel values * @param ch An integer value to pick channel, 0-13 */ int get_tx_channel(int ch); /** * A method to set the minimum time between sending ibus packets * @param val The minimum time in ms between transmitting ibus packets */ void set_tx_period(unsigned int val); /** * A method to set the maximum time between receiving ibus packets to * consider the connection active * @param timeout The maximum time in ms between receiving ibus packets */ void set_alive_timeout(unsigned int timeout); /** * @return true if valid packet has been received recently, defined by m_timeout. Otherwise false. */ bool is_alive(); /** * The main ticker function for the class. Handles any buffered incoming bytes, */ void handle(unsigned int timeout = 10); /** * @return The time since last valid iBUS packet */ uint32_t time_since_last(); /* * */ uint16_t readRx(uint8_t _ch); private: Stream& m_ser; // The extra bytes used for non-data in the packets. // One start byte and 2 CRC bytes const static int m_packet_overhead = 3; // Number of channels sent per packet const static int m_channels_per_packet = 14; // Size of a packet const static int m_packet_size = 2*m_channels_per_packet + m_packet_overhead; // Max time between packets unsigned int m_timeout = 25; // If no iBUS packet has been received in this time, consider the TX off uint32_t m_last_iBus_packet = 0; // Buffer for receiving packets uint8_t m_packet[m_packet_size]; // Array of received channel values int m_channel[m_channels_per_packet]; // Array of channel values to send int m_channel_out[m_channels_per_packet]; // Flag signifying if currently in a packet bool m_in_packet = false; // Current index of packet int m_packet_offset = 0; // Returns sum of all channel values int m_get_checksum(int ch[]); // Checks if checksum matches received data bool m_checksum_check(uint8_t packet[]); // Parses channel values from raw packet void m_parse_channels(uint8_t packet[], int ch[]); // Rate limiting for sending packets in ms unsigned int m_minimum_packet_spacing = 10; uint32_t m_last_packet_sent = 0; // Builds packet and sends it void m_send_packet(int ch[]); };Ваш код с новой функцией
#include <iBUS.h> // GO #define UPDATE_INTERVAL 500 #include <iBUSTelemetry.h> #include <AltSoftSerial.h> AltSoftSerial sw_ser = AltSoftSerial(8, 9); iBus ibus(sw_ser); iBUSTelemetry telemetry(11); // I use only PCINT0 interrupt vector, so you can use D8 to D13 pins. /* D8 .. D13 - генерируют запрос прерывания PCINT0 A0 .. A5 - генерируют запрос прерывания PCINT1 D0 .. D7 - генерируют запрос прерывания PCINT2 */ uint32_t prevMillis = 0; // Necessary to updateValues() method. Look below. float i = 0; int channels_per_packet = 14; uint32_t last_print = 0; const int PERIOD = 50; const int channels = 6; void updateValues() { uint32_t currMillis = millis(); if (currMillis - prevMillis >= UPDATE_INTERVAL) { // Code in the middle of these brackets will be performed every 500ms. prevMillis = currMillis; telemetry.setSensorValueFP(1, i); // Now, you have two ways to set sensors values. Using floating point variables // or directly in 32bit integer, but then you have to format variable by yourself. // Ex.: telemetry.setSensorValueFP(1, 24.45); is equivalent to telemetry.setSensorValue(1, 2445); // The values differ for different sensors. telemetry.setSensorValue(2, telemetry.gpsStateValues(3, 8)); // As GPS status consists of two values, // use gpsStateValues(firstVal, secondVal) to set it properly. telemetry.setSensorValue(3, 123 * 10); telemetry.setSensorValue(4, 179583647); // You can set LAT / LON using FP metohod, but due to fact floats have only 6 digits precision, // your values on tx may be corrupted in some cases. It's better to use setSensorValue(). telemetry.setSensorValue(5, UNARMED); // ARMED / UNARMED or 1 / 0 could be used. telemetry.setSensorValue(6, LOITER); // Available flight modes: STAB 0 // ACRO 1 // AHOLD 2 // AUTO 3 // GUIDED 4 // LOITER 5 // RTL 6 // CIRCLE 7 // PHOLD 8 // LAND 9 telemetry.setSensorValueFP(7, 54.87); i += 0.1; if (i > 50) i = 0; // These were the most difficult sensors to use. I hope that this library will be useful for you and will make your work easier. :) } } /* updateValues */ void print_channels() { // Only print every PERIOD ms if (millis() - last_print > PERIOD) { last_print = millis(); for (int i = 0; i < channels; i++) { Serial.print("ch "); Serial.print(i + 1); Serial.print(": "); Serial.print(ibus.get_channel(i)); if (ibus.is_alive()) { Serial.println(); digitalWrite(LED_BUILTIN, LOW); } else { Serial.println(" !!LINK DEAD!!"); digitalWrite(LED_BUILTIN, HIGH); } } Serial.print("Last valid packet was received "); Serial.print(ibus.time_since_last()); Serial.println(" ms ago"); } } void setup() { Serial.begin(115200); while (!Serial) // On USB CDC serial ports, wait for the serial connection. { ; } // Set timeout between received packets to 20 ms before considering it a lost connection ibus.set_alive_timeout(20); // Set minimum time between transmitting packets, to 5ms ibus.set_tx_period(5); pinMode(LED_BUILTIN, OUTPUT); Serial.println("iBus test"); telemetry.begin(); // Let's start having fun! telemetry.addSensor(0x01); // You can use sensors definitions from iBUSSensors.h instead of numbers. // Ex.: telemetry.addSensor(IBUS_MEAS_TYPE_TEM); telemetry.addSensor(IBUS_MEAS_TYPE_GPS_STATUS); telemetry.addSensor(IBUS_MEAS_TYPE_SPE); telemetry.addSensor(IBUS_MEAS_TYPE_GPS_LAT); telemetry.addSensor(IBUS_MEAS_TYPE_ARMED); telemetry.addSensor(IBUS_MEAS_TYPE_FLIGHT_MODE); telemetry.addSensor(IBUS_MEAS_TYPE_ALT); } void loop() { updateValues(); // Very important! iBUS protocol is very sensitive to timings. // DO NOT USE ANY delay()! Look at updateValues() method. // It's an example of how to use intervals without delays. telemetry.run(); //It must be here. Period. /* ibus.handle(200); // Run this often // Reduce all channels by 50% for (int i = 0; i < channels_per_packet; i++) { int old_value = ibus.get_channel(i); Serial.print("old_value_"); Serial.print(i); Serial.print(" "); Serial.println(old_value); int val = ibus.get_tx_channel(i); Serial.print("val_"); Serial.print(i); Serial.print(" "); Serial.println(val); Serial.println(); // int alive_timeout = ibus.set_alive_timeout(200); /* // map the old value (1000 to 2000) to a new value going from 1250 to 1750 int new_value = map(old_value, 1000, 2000, -50, 50); Serial.print("new_value = "); Serial.println(new_value); Serial.println(); // Set this new value to be sent on the next handle() ibus.set_channel(i, new_value); */ for (int i = 0; i < channels_per_packet; i++) { uint16_t val = ibus.readRx(i); Serial.print("old_value_"); Serial.print(i); Serial.print(" "); Serial.println(val); } // The above will mess with the throttle, so fix the throttle channel separately // Channels are zero-indexed. //int x = ibus.set_channel(2, map(ibus.get_channel(2), 1000, 2000, -100, 100)); //Serial.print("x = "); Serial.println(x); Serial.println(); //print_channels(); }и прдупреждения с ошибками
C:\Users\gince\Documents\Arduino\IBUS_and_Telemetry\IBUS_and_Telemetry.ino:139:7: warning: "/*" within comment [-Wcomment] /* In file included from C:\Users\gince\Documents\Arduino\libraries\iBUS-master\src/iBUS.h:6:0, from C:\Users\gince\Documents\Arduino\IBUS_and_Telemetry\IBUS_and_Telemetry.ino:1: C:\Users\gince\Documents\Arduino\libraries\AltSoftSerial-1.4.0/AltSoftSerial.h: In constructor 'AltSoftSerial::AltSoftSerial(uint8_t, uint8_t, bool)': C:\Users\gince\Documents\Arduino\libraries\AltSoftSerial-1.4.0/AltSoftSerial.h:63:24: warning: unused parameter 'rxPin' [-Wunused-parameter] AltSoftSerial(uint8_t rxPin, uint8_t txPin, bool inverse = false) { } ^~~~~ C:\Users\gince\Documents\Arduino\libraries\AltSoftSerial-1.4.0/AltSoftSerial.h:63:39: warning: unused parameter 'txPin' [-Wunused-parameter] AltSoftSerial(uint8_t rxPin, uint8_t txPin, bool inverse = false) { } ^~~~~ C:\Users\gince\Documents\Arduino\libraries\AltSoftSerial-1.4.0/AltSoftSerial.h:63:61: warning: unused parameter 'inverse' [-Wunused-parameter] AltSoftSerial(uint8_t rxPin, uint8_t txPin, bool inverse = false) { } ^~~~~ C:\Users\gince\Documents\Arduino\libraries\AltSoftSerial-1.4.0/AltSoftSerial.h: In static member function 'static void AltSoftSerial::enable_timer0(bool)': C:\Users\gince\Documents\Arduino\libraries\AltSoftSerial-1.4.0/AltSoftSerial.h:68:33: warning: unused parameter 'enable' [-Wunused-parameter] static void enable_timer0(bool enable) { } ^~~~~~ In file included from C:\Users\gince\Documents\Arduino\libraries\iBUS-master\src/iBUS.h:6:0, from C:\Users\gince\Documents\Arduino\libraries\iBUS-master\src\iBUS.cpp:1: C:\Users\gince\Documents\Arduino\libraries\AltSoftSerial-1.4.0/AltSoftSerial.h: In constructor 'AltSoftSerial::AltSoftSerial(uint8_t, uint8_t, bool)': C:\Users\gince\Documents\Arduino\libraries\AltSoftSerial-1.4.0/AltSoftSerial.h:63:24: warning: unused parameter 'rxPin' [-Wunused-parameter] AltSoftSerial(uint8_t rxPin, uint8_t txPin, bool inverse = false) { } ^~~~~ C:\Users\gince\Documents\Arduino\libraries\AltSoftSerial-1.4.0/AltSoftSerial.h:63:39: warning: unused parameter 'txPin' [-Wunused-parameter] AltSoftSerial(uint8_t rxPin, uint8_t txPin, bool inverse = false) { } ^~~~~ C:\Users\gince\Documents\Arduino\libraries\AltSoftSerial-1.4.0/AltSoftSerial.h:63:61: warning: unused parameter 'inverse' [-Wunused-parameter] AltSoftSerial(uint8_t rxPin, uint8_t txPin, bool inverse = false) { } ^~~~~ C:\Users\gince\Documents\Arduino\libraries\AltSoftSerial-1.4.0/AltSoftSerial.h: In static member function 'static void AltSoftSerial::enable_timer0(bool)': C:\Users\gince\Documents\Arduino\libraries\AltSoftSerial-1.4.0/AltSoftSerial.h:68:33: warning: unused parameter 'enable' [-Wunused-parameter] static void enable_timer0(bool enable) { } ^~~~~~ C:\Users\gince\Documents\Arduino\libraries\iBUS-master\src\iBUS.cpp: In function 'uint16_t readRx(uint8_t)': C:\Users\gince\Documents\Arduino\libraries\iBUS-master\src\iBUS.cpp:194:10: error: 'm_ser' was not declared in this scope while (m_ser.available() && millis() - start < timeout) ^~~~~ C:\Users\gince\Documents\Arduino\libraries\iBUS-master\src\iBUS.cpp:194:10: note: suggested alternative: 'memset' while (m_ser.available() && millis() - start < timeout) ^~~~~ memset C:\Users\gince\Documents\Arduino\libraries\iBUS-master\src\iBUS.cpp:194:50: error: 'timeout' was not declared in this scope while (m_ser.available() && millis() - start < timeout) ^~~~~~~ C:\Users\gince\Documents\Arduino\libraries\iBUS-master\src\iBUS.cpp:202:7: warning: return-statement with no value, in function returning 'uint16_t {aka unsigned int}' [-fpermissive] return; ^~~~~~ C:\Users\gince\Documents\Arduino\libraries\iBUS-master\src\iBUS.cpp:207:7: warning: return-statement with no value, in function returning 'uint16_t {aka unsigned int}' [-fpermissive] return; ^~~~~~ exit status 1 Ошибка компиляции для платы Arduino Nano.Что дальше делать пока не знаю.
раненая птица в руки не даваласьэтот IBUS мне уже лет пять неподвластен, пока вообще не могу определиться в чем проблема,есть две аппаратуры FLYSKY FS-I6 перешитая на 10 каналов, и FLYSKY FS-I6S она 10 канальная, два приёмника FS-i6B, FS-i10B, работают и по PWM и по PPM и через SBUS, а вот пытаюсь настроить IBUS - ан нет, запитываю правда от USB порта, но по напряжению все норм 4.65V
Пока не одолею приём дальше идти некуда...
Я сравнивал две библиотеки SoftwareSerial и iBusTelemetry. Так iBusTelemetry скопировала полностью весь код с SoftwareSerial кроме инверсии. Потом дописали код самой телеметрии. Вот если так сделать - скопировать AltSoftSerial и в конце дописать прием PWM по IBUS.
Беда в том, что я только начинаю все это осваивать. Пока мне не под силу это сделать.