Как подружить две библиотеки iBUSTelemetry.h и SoftwareSerial.h ?

gince
Offline
Зарегистрирован: 14.12.2017

Привет знатокам. 

Как подружить две библиотеки  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

iBUS.h                 http://https://github.com/AAU-EIT5/iBUS

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

Софтовый работает через PCINT, попробуй разнести на разные группы..

Да, мне пришлось заворачивать всё в обёртку SomeSerial (аналогичную задачу)

я так понял IBUS.h не взлетит, она для прямого канала, надо разбираться как передается информация в обратном канале, давай ссылку на iBusBM.h

gince
Offline
Зарегистрирован: 14.12.2017

Спасибо за ответ.

Сылка на  iBusBM.h           https://github.com/bmellink/IBusBM.

 А вот здесь я ниже нуля   --->  Софтовый работает через PCINT, попробуй разнести на разные группы..

Канечно буду искать, но пока пойму ни одна неделя пройдет. Это я свой первый проект делаю и Ардуинку первый раз увидел месяц назад. Хотя за месяц уже много узнал.

Если поможет , то ошибка

libraries\iBUSTelemetry-Arduino-master\iBUSTelemetry.cpp.o (symbol from plugin): In function `iBUSTelemetry::read()':
(.text+0x0): multiple definition of `__vector_3'
libraries\SoftwareSerial\SoftwareSerial.cpp.o (symbol from plugin):(.text+0x0): first defined here
exit status 1
Ошибка компиляции для платы Arduino Nano.
 
 

Если можете, помогите.

Извините за ошибки, я не русский.

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

gince пишет:

Если можете, помогите.

эта библиотека тоже не пойдёт, её применение на стороне радиоуправляемой модели.
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.

b707
Offline
Зарегистрирован: 26.05.2017

Если это ваш первый проект - просто примите как данность, что в программе может быть только один СофтСериал.
Это строго говоря неверно, но новичку два сериала не запустить.

gince
Offline
Зарегистрирован: 14.12.2017

Такая глупая мысль пришла, библиотека  iBUSTelemetry.h отправляет данные. А, если в нее добавить прием из iBUS.h. или iBusBM.h. Они все в отдельности рабочие.

gince
Offline
Зарегистрирован: 14.12.2017

Я упертый и буду искать, капатса, спрашивать. Ну когда не надоест искать куплю Мегу, но это не скоро так случитса.

Два софварных порта можно переключать. Один работает, другой спит. Мне не надо, чтоб они оба одновременно работали.

 

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

gince пишет:

Такая глупая мысль пришла, библиотека  iBUSTelemetry.h отправляет данные. А, если в нее добавить прием из iBUS.h. или iBusBM.h. Они все в отдельности рабочие.

так они не телеметрию принимают а параметры всех 14 каналов (значение PWM)...

или я не пойму, что ты хочешь сделать

ты хочешь сделать свой полётный контроллер?

Все, что надо разбирать описано в этой библиотеке - https://github.com/qba667/FlySkyI6/blob/master/source/source/ibustelemetry.h

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

В софтсериале даже функция есть - listen(). Для выбора активного экземпляра софтсериала. Так что я бы не стал ждать, пока рак на горе свистнет и заслушают оба чудесным образом.

gince
Offline
Зарегистрирован: 14.12.2017

ua6em пишет:

gince пишет:

Такая глупая мысль пришла, библиотека  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 портом. 

 

gince
Offline
Зарегистрирован: 14.12.2017

sadman41 пишет:
В софтсериале даже функция есть - listen(). Для выбора активного экземпляра софтсериала. Так что я бы не стал ждать, пока рак на горе свистнет и заслушают оба чудесным образом.

 

Да, такая есть. Я знаю это. Вот данной функцией я и хочу пользоваться при переключений с приема на передачу и на оборот. Но вот проблема в том, что софтсериал и IbusTelemetry вместе работать не может.

Мне нужны две библиотеки IbusTelemetry и (IBUS или IBUSBM). IbusTelemetry уже в библиотеке сделан софтваресериал. IBUS можно было бы подкльчить через SoftwareSerial создав порт. Но как писал IbusTelemetry и SoftwareSerial вместе не может работать.

 

b707
Offline
Зарегистрирован: 26.05.2017

gince пишет:

iBUS.h  Принимает 14 каналов PWM. Можно пользоватса Software portom.

iBusBM.h. Принимает 14 каналов PWM передает телеметрию, но только с нескольки датчиков. Использует Hardware порт.

iBUSTelemetry.h  передает телеметрию со всех датчиков, которые мне нужны. Пользетса Software портом. 

 

то есть вам даже не нужно два порта, достаточно чуть поправить библиотеки iBUS.h и iBUSTelemetry.h, чтобы они не открывали каждая свой СофтСериал, а работали с одним и тем же

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

b707 пишет:

то есть вам даже не нужно два порта, достаточно чуть поправить библиотеки iBUS.h и iBUSTelemetry.h, чтобы они не открывали каждая свой СофтСериал, а работали с одним и тем же

пока совершенно непонятно что именно ТС делает, в приёмнике порты на приём (по нему принимается значение PWM для 14 каналов) и передачу (по нему обратный канал телеметрии обрабатываемый пультом управления) разделены. Изначально я думал, что ТС имеет желание сделать свои датчики телеметрии с протоколом IBUS

gince
Offline
Зарегистрирован: 14.12.2017

b707 пишет:

gince пишет:

iBUS.h  Принимает 14 каналов PWM. Можно пользоватса Software portom.

iBusBM.h. Принимает 14 каналов PWM передает телеметрию, но только с нескольки датчиков. Использует Hardware порт.

iBUSTelemetry.h  передает телеметрию со всех датчиков, которые мне нужны. Пользетса Software портом. 

 

то есть вам даже не нужно два порта, достаточно чуть поправить библиотеки iBUS.h и iBUSTelemetry.h, чтобы они не открывали каждая свой СофтСериал, а работали с одним и тем же

Можно и так. Как писал у меня хардваре уже занят. А прием и передача на софтваре. Это один или два порта мне разницы нет. С одним даже лучше. 

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

gince пишет:

iBUSTelemetry.h  передает телеметрию со всех датчиков, которые мне нужны. Пользетса Software портом. 

нет, он использует - https://github.com/nickstedman/SoftwareSerialWithHalfDuplex

gince
Offline
Зарегистрирован: 14.12.2017

ua6em пишет:

b707 пишет:

то есть вам даже не нужно два порта, достаточно чуть поправить библиотеки iBUS.h и iBUSTelemetry.h, чтобы они не открывали каждая свой СофтСериал, а работали с одним и тем же

пока совершенно непонятно что именно ТС делает, в приёмнике порты на приём (по нему принимается значение PWM для 14 каналов) и передачу (по нему обратный канал телеметрии обрабатываемый пультом управления) разделены. Изначально я думал, что ТС имеет желание сделать свои датчики телеметрии с протоколом IBUS

Вы правы. У меня свои датчики телеметрии с протоколом IBUS. они уже испробаваны с iBUSTelemetry и хорошо работают. Два из них очень нужны. Еще три нужны, ну дальше видно будет.

gince
Offline
Зарегистрирован: 14.12.2017

Ребята, я в программирование ноль. Английского языка не знаю. Учить и то, и другое поздновато. Мне летом 60 лет. Но как писал , в пространстве интернета много чего нашел и применил. Я даже не думал, что за полтора месяца можно старому новичку столько узнать и сделать. То что сделал, это не тупые копии с интернета. Я делал под себя и старалса понять , что делаю.

Не обижайте, помогите.

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

Рисуйте структурную схему, что вы там конструируете! Прокладку на шине IBUS на ардуине UNO(nano) c интеграцией своих датчиков я так понимаю

gince
Offline
Зарегистрирован: 14.12.2017

ua6em пишет:

Рисуйте структурную схему, что вы там конструируете! Прокладку на шине IBUS c интеграцией своих датчиков я так понимаю

Все сегодня. Пошел спать. Завтра очень рано вставать. На работе попробую описать и нарисовать свои хотелки. 

Большое спасибо сегодня.

gince
Offline
Зарегистрирован: 14.12.2017

Привет. 

Попробую описать свой проект.

В моем проекте будет занято не мене 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

Как то так

 

 

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

попробуй разнеси IBUS.h и телеметрию -iBUSTelemetry.h на разные PCINT (их использует SoftwareSerial):

  • D8 .. D13 - генерируют запрос прерывания PCINT0
  • A0 .. A5 - генерируют запрос прерывания PCINT1
  • D0 .. D7 - генерируют запрос прерывания PCINT2

Из примера телеметрии:
iBUSTelemetry telemetry(11); // I use only PCINT0 interrupt vector, so you can use D8 to D13 pins.

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

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();
}

Библиотеки:
1. AltSoftSerial
2. iBUS
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Удастся проверить?

gince
Offline
Зарегистрирован: 14.12.2017

ua6em пишет:

Удастся проверить?

Большое спасибо, что помогаете.
 
Эти библиотеки скачал по вашим сылкам. У меня они были, но бывает, что с другого места они бывают изменены.
 
Подключил так: IBUS Servo A0; IBUS Sensor D11
 
телеметрия работает прекрасно, а вот ibus.get_channel(i) нет. 
 
Last valid packet was received 292524 ms ago
ch 1: 0 !!LINK DEAD!!
ch 2: 0 !!LINK DEAD!!
ch 3: 0 !!LINK DEAD!!
ch 4: 0 !!LINK DEAD!!
ch 5: 0 !!LINK DEAD!!
ch 6: 0 !!LINK DEAD!!

 

Ошибок при компиляции нет, только предупреждения
 
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) { }
                                 ^~~~~~

 

 
b707
Offline
Зарегистрирован: 26.05.2017

gince пишет:

телеметрия работает прекрасно, а вот ibus.get_channel(i) нет.

и не будет работать. Обратите внимание на вот этот окмментарий в библиотеке AltSoftSerial
:

// AltSoftSerial always uses these pins:
//
// Board          Transmit  Receive   PWM Unusable
// -----          --------  -------   ------------
// Teensy 3.0 & 3.1  21        20         22
// Teensy 2.0         9        10       (none)
// Teensy++ 2.0      25         4       26, 27
// Arduino Uno        9         8         10
// Arduino Leonardo   5        13       (none)
// Arduino Mega      46        48       44, 45
// Wiring-S           5         6          4
// Sanguino          13        14         12

 

gince
Offline
Зарегистрирован: 14.12.2017

так aduino nanoкак и Uno 

// Arduino Uno        9         8         10

пакурили это самвспомнил. Сейчас попробую

b707
Offline
Зарегистрирован: 26.05.2017

gince пишет:

так aduino nanoкак и Uno 

// Arduino Uno        9         8         10

пакурили это самвспомнил. Сейчас попробую

в коде выше вот так:

AltSoftSerial sw_ser = AltSoftSerial(A0, A1);

так работать не будет

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

b707 пишет:

и не будет работать. Обратите внимание на вот этот окмментарий в библиотеке AltSoftSerial

то, что протокол IBUS проблемный (для меня) и к бабке не ходи, лет 5 назад так его и не одолел (на атмеге, на STM он работает, в тойже прошивке INAV), но так как мне хватало 8 каналов и не парился, сподвигло, что кому-то это еще кроме меня интересно...
Да, это не только на этой библиотеке, от неё есть еще форки:
у меня с этим всё нормально (но не работает):
 

#include <iBUSem.h>
#include <AltSoftSerial.h>

AltSoftSerial sw_ser(8, 9); 
iBus ibus(sw_ser);

 

gince
Offline
Зарегистрирован: 14.12.2017
arduino nano Подключил так: IBUS Servo D8 (// Arduino Uno  TX 9  Rx 8 Unusable 10)  IBUS Sensor D11
iBus test
ch 1: 0 !!LINK DEAD!!
ch 2: 0 !!LINK DEAD!!
ch 3: 0 !!LINK DEAD!!
ch 4: 0 !!LINK DEAD!!
ch 5: 0 !!LINK DEAD!!
ch 6: 0 !!LINK DEAD!!
Last valid packet was received 60 ms ago
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) { }
                                 ^~~~~~

 

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

b707 пишет:

gince пишет:

так aduino nanoкак и Uno 

// Arduino Uno        9         8         10

пакурили это самвспомнил. Сейчас попробую

в коде выше вот так:

AltSoftSerial sw_ser = AltSoftSerial(A0, A1);

так работать не будет

я поправил, пост был еще 11 числа, за это время много воды утекло, выкинул всё оставив только приём IBUS, не выходит каменный цветок...надо попробовать поменять аппаратуру, может в ней косяк какой...приёмники менял

библиотек уже перепробовал кучу, естественно с правкой библиотеки iBUS

gince
Offline
Зарегистрирован: 14.12.2017

ua6em пишет:

b707 пишет:

и не будет работать. Обратите внимание на вот этот окмментарий в библиотеке AltSoftSerial

то, что протокол IBUS проблемный (для меня) и к бабке не ходи, лет 5 назад так его и не одолел (на атмеге, на STM он работает, в тойже прошивке INAV), но так как мне хватало 8 каналов и не парился, сподвигло, что кому-то это еще кроме меня интересно...
Да, это не только на этой библиотеке, от неё есть еще форки:
у меня с этим всё нормально (но не работает):
 

#include <iBUSem.h>
#include <AltSoftSerial.h>

AltSoftSerial sw_ser(8, 9); 
iBus ibus(sw_ser);

 

сделано, но не работает

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

gince пишет:

сделано, но не работает

у тебя вообще библиотеки iBUS и IBusBM на приём работают?

gince
Offline
Зарегистрирован: 14.12.2017

Поставил пульт на погрузку питания. После погрузки начну проверять по новой все библиотеки отдельно.

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

gince пишет:

Поставил пульт на погрузку питания. После погрузки начну проверять по новой все библиотеки отдельно.

 

Железо 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);
}

 

Вывод в мониторе порта:
 

Start iBUS monitor
0 0 0 0 0 0 0 0 0 0 Cnt=0
0 0 0 0 0 0 0 0 0 0 Cnt=0
Start iBUS monitor
0 0 0 0 0 0 0 0 0 0 Cnt=0
0 0 0 0 0 0 0 0 0 0 Cnt=0
Start iBUS monitor
0 0 0 0 0 0 0 0 0 0 Cnt=0
0 0 0 0 0 0 0 0 0 0 Cnt=0
0 0 0 0 0 0 0 0 0 0 Cnt=0

при бинде перегружается ардуино, так выходит

 

gince
Offline
Зарегистрирован: 14.12.2017

[/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++;
    }
  }
}

 

gince
Offline
Зарегистрирован: 14.12.2017

ua6em пишет:

gince пишет:

Поставил пульт на погрузку питания. После погрузки начну проверять по новой все библиотеки отдельно.

 

Железо 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);
}

 

Вывод в мониторе порта:
 

Start iBUS monitor
0 0 0 0 0 0 0 0 0 0 Cnt=0
0 0 0 0 0 0 0 0 0 0 Cnt=0
Start iBUS monitor
0 0 0 0 0 0 0 0 0 0 Cnt=0
0 0 0 0 0 0 0 0 0 0 Cnt=0
Start iBUS monitor
0 0 0 0 0 0 0 0 0 0 Cnt=0
0 0 0 0 0 0 0 0 0 0 Cnt=0
0 0 0 0 0 0 0 0 0 0 Cnt=0

при бинде перегружается ардуино, так выходит

 

IBusBM.h телеметрию не смог подключить. А прием каналов работает. Там подключение через диод ирезистор

https://github.com/betaflight/betaflight/wiki/Single-wire-FlySky-(IBus)-telemetry

 

b707
Offline
Зарегистрирован: 26.05.2017

gince - возьмите уже Мегу и подключите через два зардовых Сериала

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

так в коде прямой разбор пакетов, попробую на разных софтовых библиотеках, дам знать

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

gince пишет:

IBusBM.h телеметрию не смог подключить. А прием каналов работает. Там подключение через диод ирезистор

https://github.com/betaflight/betaflight/wiki/Single-wire-FlySky-(IBus)-telemetry

это подключение актуально для прошивки betaflight, сигналы переводятся в однопроводный двунаправленный интерфейс, для INAV прошивки выходы с приёмника (SERVO - SENSOR) подключаются в стандартный порт сериал и он настраивается

gince
Offline
Зарегистрирован: 14.12.2017

Рабочий код  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);
}
Start IBus2PWM
0  2000
1  1972
2  1000
3  2000
4  1000
5  1039

 

 

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

gince пишет:

Рабочий код  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&nbsp; &nbsp; );Serial.print("&nbsp; "); Serial.print(val); Serial.println();
  }
  delay(1000);
}
Start IBus2PWM
0  2000
1  1972
2  1000
3  2000
4  1000
5  1039

 

А Ардуино какая?

gince
Offline
Зарегистрирован: 14.12.2017

 

 

А Ардуино какая?

 

NANO

 

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

gince пишет:

А Ардуино какая?

NANO

1. Версия ардуино IDE какая
2. как подключаешь
3. Выбираешь nano из стандартного набора плат или какое-то иное ядро?

gince
Offline
Зарегистрирован: 14.12.2017

ua6em пишет:

gince пишет:

А Ардуино какая?

NANO

1. Версия ардуино IDE какая
2. как подключаешь
3. Выбираешь nano из стандартного набора плат или какое-то иное ядро?

IDE > 1.8.16

Выбираю Процессор >atmega328P

стандартный выбор

 

 

 

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

Так?

FS IA-6B servo  ------->  RXD   nano (old bootloader)
                 V+ ------->  5V
                 G   ------->  GND

 

gince
Offline
Зарегистрирован: 14.12.2017

ua6em пишет:

Так?

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

AltSoftSerial sw_ser = AltSoftSerial(8, 9);
iBus ibus(sw_ser);
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

похоже у тебя нано с новым загрузчиком, всё дело в нём, надо попробовать перешить свою, у меня не работает (

gince
Offline
Зарегистрирован: 14.12.2017

понял. Буду ждать

gince
Offline
Зарегистрирован: 14.12.2017

Первый раз полез в менять библиотеку. Поменять ничего не поменял, а только новую функцию добавил. Херня получилась.

Тут 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.

Что дальше делать пока не знаю.

 

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

раненая птица в руки не давалась этот IBUS мне уже лет пять неподвластен, пока вообще не могу определиться в чем проблема,
есть две аппаратуры FLYSKY FS-I6 перешитая на 10 каналов, и FLYSKY FS-I6S она 10 канальная, два приёмника FS-i6B, FS-i10B, работают и по PWM и по PPM и через SBUS, а вот пытаюсь настроить IBUS - ан нет, запитываю правда от USB порта, но по напряжению все норм 4.65V

Пока не одолею приём дальше идти некуда...

 

gince
Offline
Зарегистрирован: 14.12.2017

Я сравнивал две библиотеки SoftwareSerial и iBusTelemetry. Так iBusTelemetry скопировала полностью весь код с SoftwareSerial кроме инверсии. Потом дописали код самой телеметрии. Вот если так сделать - скопировать AltSoftSerial и в конце дописать прием PWM по IBUS.

Беда в том, что я только начинаю все это осваивать. Пока мне не под силу это сделать.