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

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

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

 

 

По порядку:

1. Устанавливаем эту библиотеку для iBUS (собрал по другим именем iBUSem)
2. Устанавливаем эту библиотеку для AltSoftSerial
3. Открываем в примерах Файл-Примеры-iBUSem-example-Alt_basic
4. Компилируем, заливаем

Скетч использует 4878 байт (15%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 562 байт (27%) динамической памяти, оставляя 1486 байт для локальных переменных. Максимум: 2048 байт.

5. Проверяем работу

 

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

Библиотека IBusBM https://github.com/bmellink/IBusBM рабочая.

кароткий код для проверки.


#include <IBusBM.h>

IBusBM IBus; // IBus object for receivig signals from transmitter/receiver
int channels = 10;
//------------------------------
void setup() {
  Serial.begin(115200);

  IBus.begin(Serial);    // iBUS connected to Serial

  Serial.println("Wait for receiver");
  //while (IBus.cnt_rec == 0) delay(100);
  Serial.println("Init done");
}
//------------------------------
int savespd = 0, saveturn = 0;

void loop()
{
  Serial.println("*********** ");
  int val[] = {};
  for (int i = 0; i < channels; i++)
  {
    val[i] = ((int) IBus.readChannel(i));
    Serial.print("val "); Serial.print(i); Serial.print(" ---> "); Serial.println(val[i]);
  }
  delay(100);
}

Может  ее как то через AltSoftSerial ?

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

ua6em пишет:

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

 

 

По порядку:

1. Устанавливаем эту библиотеку для iBUS (собрал по другим именем iBUSem)
2. Устанавливаем эту библиотеку для AltSoftSerial
3. Открываем в примерах Файл-Примеры-iBUSem-example-Alt_basic
4. Компилируем, заливаем

Скетч использует 4878 байт (15%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 562 байт (27%) динамической памяти, оставляя 1486 байт для локальных переменных. Максимум: 2048 байт.

5. Проверяем работу

 

Сейчас спробую. Извени не видел 

gince
Offline
Зарегистрирован: 14.12.2017
C:\Users\gince\Documents\Arduino\libraries\iBUSem-main\src/iBUSem.h:7:10: fatal error: CustomSoftwareSerial.h: No such file or directory
 #include <CustomSoftwareSerial.h>
          ^~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
exit status 1
Ошибка компиляции для платы Arduino Nano.

Эта подойдет ? 

https://github.com/ledongthuc/CustomSoftwareSerial

 

 

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

Скачал эту https://github.com/ledongthuc/CustomSoftwareSerial, но IDE eее не видит. Перезапустил Ардуино IDE  > не видет. PC Restart  > не видит. ТоталКомандер и ехплорер показывает в папке вставленыв библиотек. 

 

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

gince пишет:

Скачал эту https://github.com/ledongthuc/CustomSoftwareSerial, но IDE eее не видит. Перезапустил Ардуино IDE  > не видет. PC Restart  > не видит. ТоталКомандер и ехплорер показывает в папке вставленыв библиотек. 

 

Нашел другую, ее видит. Но пишет, что не верная.

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

gince пишет:

gince пишет:

Скачал эту https://github.com/ledongthuc/CustomSoftwareSerial, но IDE eее не видит. Перезапустил Ардуино IDE  > не видет. PC Restart  > не видит. ТоталКомандер и ехплорер показывает в папке вставленыв библиотек. 

Нашел другую, ее видит. Но пишет, что не верная.

правлю код на Гитхабе, надеюсь до завтра одолею

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

gince пишет:

gince пишет:

Скачал эту https://github.com/ledongthuc/CustomSoftwareSerial, но IDE eее не видит. Перезапустил Ардуино IDE  > не видет. PC Restart  > не видит. ТоталКомандер и ехплорер показывает в папке вставленыв библиотек. 

 

Нашел другую, ее видит. Но пишет, что не верная.

Опять поставил эту https://github.com/ledongthuc/CustomSoftwareSerial, но только распаковал прямо в библиотечной папке. Ардуино IDE нашел src папку и библиотеку вставил в скеч. Компиляция и 

In file included from C:\Users\gince\Documents\Arduino\libraries\iBUSem-main\src/iBUSem.h:6:0,
                 from C:\Users\gince\Documents\Arduino\Alt_basic\Alt_basic.ino:14:
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) { }
                                 ^~~~~~
C:\Users\gince\Documents\Arduino\libraries\src\CustomSoftwareSerial.cpp: In function 'void DebugPulse(uint8_t, uint8_t)':
C:\Users\gince\Documents\Arduino\libraries\src\CustomSoftwareSerial.cpp:147:32: warning: unused parameter 'pin' [-Wunused-parameter]
 inline void DebugPulse(uint8_t pin, uint8_t count)
                                ^~~
C:\Users\gince\Documents\Arduino\libraries\src\CustomSoftwareSerial.cpp:147:45: warning: unused parameter 'count' [-Wunused-parameter]
 inline void DebugPulse(uint8_t pin, uint8_t count)
                                             ^~~~~
C:\Users\gince\Documents\Arduino\libraries\src\CustomSoftwareSerial.cpp: In member function 'virtual size_t CustomSoftwareSerial::write(uint8_t)':
C:\Users\gince\Documents\Arduino\libraries\src\CustomSoftwareSerial.cpp:477:11: warning: unused variable 'maxValueOfData' [-Wunused-variable]
   uint8_t maxValueOfData = round(pow(2, this->_numberOfDataBit - 1));
           ^~~~~~~~~~~~~~
In file included from C:\Users\gince\Documents\Arduino\libraries\iBUSem-main\src/iBUSem.h:6:0,
                 from C:\Users\gince\Documents\Arduino\libraries\iBUSem-main\src\iBUSem.cpp:1:
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) { }
                                 ^~~~~~
C:\Users\gince\Documents\Arduino\libraries\iBUSem-main\src\iBUSem.cpp: In constructor 'iBus::iBus(AltSoftSerial&)':
C:\Users\gince\Documents\Arduino\libraries\iBUSem-main\src\iBUSem.cpp:20:33: error: no matching function for call to 'AltSoftSerial::begin(long int, int)'
  serial.begin(115200, SERIAL_8N1);
                                 ^
In file included from C:\Users\gince\Documents\Arduino\libraries\iBUSem-main\src/iBUSem.h:6:0,
                 from C:\Users\gince\Documents\Arduino\libraries\iBUSem-main\src\iBUSem.cpp:1:
C:\Users\gince\Documents\Arduino\libraries\AltSoftSerial-master/AltSoftSerial.h:47:14: note: candidate: static void AltSoftSerial::begin(uint32_t)
  static void begin(uint32_t baud) { init((ALTSS_BASE_FREQ + baud / 2) / baud); }
              ^~~~~
C:\Users\gince\Documents\Arduino\libraries\AltSoftSerial-master/AltSoftSerial.h:47:14: note:   candidate expects 1 argument, 2 provided
exit status 1
Ошибка компиляции для платы Arduino Nano.
Неверная библиотека найдена в C:\Users\gince\Documents\Arduino\libraries\CustomSoftwareSerial-master: нет заголовочных файлов (.h), найденных в C:\Users\gince\Documents\Arduino\libraries\CustomSoftwareSerial-master
Неверная библиотека найдена в C:\Users\gince\Documents\Arduino\libraries\examples: нет заголовочных файлов (.h), найденных в C:\Users\gince\Documents\Arduino\libraries\examples

е 

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

Готово, пробный скетч на две библиотеки:
1. Custom - https://github.com/UA6EM/CustomSoftwareSerial
2. ALT - https://github.com/UA6EM/AltSoftSerial
3. iBUSem (мод.) - https://github.com/UA6EM/iBUSem
4. Telemetry - https://github.com/UA6EM/iBUSTelemetry-Arduino
5. Внутри два примера с телеметрией и без, описание в скетче

В примерах лежит компилируемая версия, если замаркировать #define ALT_SERIAL тогда будет использоваться кастомная библиотека серийного порта, пробуй

PS если не заработает, надо искать библиотеку iBUS.h которая начнёт принимать с SoftwareSerial.h, код поправим
по этой работающей библиотеке, видимо есть какие-то отличия и исправлены баги

Поискал еще разные версии iBUS в том числе под ESP8266, из приятного, приёмник исправен )))
надо искать с перламутровыми пуговицами IBUS работающую с ардуино нано

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

ua6em, Огромное спасибо за ваши труды и потерянное время.

Сейчас после работы проверял. Пока не закомментировал 313-320 стр. были ошибки. Потом компиляция прошла. 

С телеметрией все хорошо, но Ibus.h дохлая библиотека.

Читал описания Ibus.h. Так те , что мы применяем и находили, сделаны для линух (если я правильно понял). Нашел личную почту разрабочика. Попробую ему написать и поспрашивать. Пока на этом все. Еще раз спасибо.

 

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

gince пишет:

ua6em, Огромное спасибо за ваши труды и потерянное время.

Сейчас после работы проверял. Пока не закомментировал 313-320 стр. были ошибки. Потом компиляция прошла. 

С телеметрией все хорошо, но Ibus.h дохлая библиотека.

Читал описания Ibus.h. Так те , что мы применяем и находили, сделаны для линух (если я правильно понял). Нашел личную почту разрабочика. Попробую ему написать и поспрашивать. Пока на этом все. Еще раз спасибо.

 

да мне самому интересно одолеть этот протокол, перспективный однако!
Я сегодня пересмотрел более 30 библиотек разных разбирающих протокол ibus, нашел даже описание, что именно передается и как считать, в принципе если информация есть можно написать свою библиотеку (тому кто это умеет)

Надо пройтись еще по ветке гитхаба по ibus.h посмотреть что там и как кто форкнул и правил форк

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

Я уже заказал и мегу и стм32. Но я на нано хочу закончить. Буду искать, читать.

 

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

Рабочая https://gitlab.com/timwilkinson/FlySkyIBus

код

/*
 * Test FlySky IBus interface on an Arduino Mega.
 *  Connect FS-iA6B receiver to Serial1.
 */
 
#include "FlySkyIBus.h"
int channels=6;
void setup() 
{
  Serial.begin(115200);
  IBus.begin(Serial);
}

void loop() 
{
  IBus.loop();
  for (int i = 0; i < channels; i++)
  {
    Serial.print(i);
    Serial.print("    ");
    Serial.print(IBus.readChannel(i));
    Serial.print("    ");
    Serial.println(IBus.readChannel(i), HEX);
    Serial.println();
  }
  delay(200);
}

 

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

gince пишет:

Рабочая https://gitlab.com/timwilkinson/FlySkyIBus

код

/*
 * Test FlySky IBus interface on an Arduino Mega.
 *  Connect FS-iA6B receiver to Serial1.
 */
 
#include "FlySkyIBus.h"
int channels=6;
void setup() 
{
  Serial.begin(115200);
  IBus.begin(Serial);
}

void loop() 
{
  IBus.loop();
  for (int i = 0; i < channels; i++)
  {
    Serial.print(i);
    Serial.print("    ");
    Serial.print(IBus.readChannel(i));
    Serial.print("    ");
    Serial.println(IBus.readChannel(i), HEX);
    Serial.println();
  }
  delay(200);
}

 

Она хардовая, делаю форк и пытаюсь её обернуть в SomeSerial

Там у тебя ссылка на библиотеку IBUS.h битая, вот адрес - https://github.com/AAU-EIT5/iBUS

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

Кстати, библиотека IBusBM тоже кривая:
 

D:\ARDUINO\arduino-1.8.16\portable\sketchbook\libraries\IBusBM-master\src\IBusBM.cpp: In member function 'void IBusBM::loop()':
D:\ARDUINO\arduino-1.8.16\portable\sketchbook\libraries\IBusBM-master\src\IBusBM.cpp:199:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         if (chksum == (v << 8) + lchksum) {
             ~~~~~~~^~~~~~~~~~~~~~~~~~~~~

 

Посмотрим на ошибку:  if (chksum == (v << 8) + lchksum) {

Компилятор предупреждает о сравнении signed and unsigned! В действительности переменная "v" объявлена как
uint8_t  а переменные "chksum" и "lchksum" как uint16_t!!!  Да, да, компиляторы тоже люди пишут )))
Обиднее всего, что ошибка эта кочует по многочисленным реализациям протокола IBUS и в этой тоже!
PS ("и как тут не быть дураком?")
PPS видимо и значение в правой части сравниваемого надо привести к более читабельному виду:

 if (chksum == ((v << 8) + lchksum)) {

Использованы материалы:

1. https://github.com/aanon4/FlySkyIBus (алгоритм есть)
2. https://github.com/Cleric-K/FlySkyRxFirmwareRssiMod
3. https://github.com/PK-420/iBus2USB
4. https://github.com/Yenya/ibus-altitude-sensor
5. https://github.com/utkudarilmaz/FlySkyiBus
6. https://github.com/33d/ibus-library (описан формат пакета)
7. https://github.com/Cleric-K/vJoySerialFeeder (вирт. джойстик)
8. https://github.com/wdcossey/flysky-ibus-leonardo
9. https://github.com/mokhwasomssi/stm32_hal_ibus
10.https://github.com/jawb/MacFlyskyIBUS
11.https://github.com/wdcossey/ppm-to-ibus-serial
12.https://github.com/MrTransistorsChannel/FlySkyIBus
13.https://github.com/eminakgun/ibus_decoder  
14.https://github.com/TimBeard/IBusReader
15.https://github.com/smallsoda/flysky_ibus (на питоне, интерес)
16.https://github.com/rangeli/py-flysky (cpp)
17.https://github.com/goguma/FlySkyIBusBySoftwareSerial
18.https://github.com/xtebs/IBus-python
19.https://github.com/hamhapichai/arduino_flysky_ibus (ino 2шт.)
20.https://github.com/NelsonLima07/iBus_FlySky (stm32 HAL CUBE)
21.https://github.com/house4hack/circuitpython-ibus
22.https://github.com/fr0zn/FlySkyIBus (mega)
23.https://github.com/guni9191/flysky_ibus_ros
24.https://github.com/pedrocastelani/SoftIBus (на софтовом)
25.https://github.com/maxlock/FlySkySBus2Servos (ino)
26.https://github.com/pinkfloydfan/iBUSEncoder (прямая кодиров)
27.https://github.com/tomxposed/iBus-Joystick
 

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

Все сылки не пересмотрел, но одна (самая первая, которую открыл) заработала. https://github.com/pedrocastelani/SoftIBus. Сегодня больше не успею посмотреть. но уже одна софтовая работает и это хорошо. Дальше дела уже будет продвигатса.

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

gince пишет:

Все сылки не пересмотрел, но одна (самая первая, которую открыл) заработала. https://github.com/pedrocastelani/SoftIBus. Сегодня больше не успею посмотреть. но уже одна софтовая работает и это хорошо. Дальше дела уже будет продвигатса. 

Проверял пример SoftIBus10.

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

Дальнейшие исследования возможности использования продолжаются:

1. Не обойтись без визуального мониторинга, поэтому пригодится программа виртуального джойстика
2. Устанавливаем, настраиваем наши 10 каналов и выбираем протокол IBUS
3. Пишем простую программу сплиттера (передача данных из порта 1 в порт 0(USB))
4. Код такой
 

// Для Atmega328PB

volatile byte ibyte;

void setup() {
 Serial.begin(115200);
 Serial1.begin(115200);
}

void loop() {
 if(Serial1.available() > 0){
  ibyte = Serial1.read();
  Serial.write(ibyte);
 }
}

5. Получается следующая ситуация: при включении аппаратуры и соединении с приёмником реакции на ручки управления в виртуальном джойстике не наблюдается, а вот при выключении аппаратуры происходит считывание по всем 10 каналам. Замена приёмника ситуацию не исправила.

При потере связи (коннекта приёмника с аппаратурой) он гонит последние принятые значения. Если настроен режим Failsafe он по каналам задействованным в этом режиме должен передавать установленные для этого режима значения.
Замена передатчика также проблему не исправила.
Непонятки ...
 

 

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

gince пишет:

Все сылки не пересмотрел, но одна (самая первая, которую открыл) заработала. https://github.com/pedrocastelani/SoftIBus. Сегодня больше не успею посмотреть. но уже одна софтовая работает и это хорошо. Дальше дела уже будет продвигатса. 

Проверял пример SoftIBus10.

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

файл SofIbus.cpp строка 32: uint8_t v = stream->read(); заменить на: uint16_t v = stream->read();

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

Посмотрим на ошибку:  if (chksum == (v << 8) + lchksum) {

Компилятор предупреждает о сравнении signed and unsigned! В действительности переменная "v" объявлена как uint8_t  а переменные "chksum" и "lchksum" как uint16_t!!!  Да, да, компиляторы тоже люди пишут )))

Простите, всю тему не читал, потому не до конца понял, Вы понимаете почему здесь так? Почему получается такая ошибка? А то, судя по дальнейшему, Вы эту ошибку так и не исправили.

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

ЕвгенийП пишет:

ua6em пишет:

Посмотрим на ошибку:  if (chksum == (v << 8) + lchksum) {

Компилятор предупреждает о сравнении signed and unsigned! В действительности переменная "v" объявлена как uint8_t  а переменные "chksum" и "lchksum" как uint16_t!!!  Да, да, компиляторы тоже люди пишут )))

Простите, всю тему не читал, потому не до конца понял, Вы понимаете почему здесь так? Почему получается такая ошибка? А то, судя по дальнейшему, Вы эту ошибку так и не исправили.

надеюсь понимаю, пулемёт не той системы переменную v исправил на uint16_t
ЗЫ если ошибаюсь поправьте пожалуйста

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

gince пишет:

Проверял пример SoftIBus10.

чуток поправил код примера на 10 каналов:
 

#include "SoftIBus.h"//SoftIBus library
SoftwareSerial IBuspin(14, 15);//"serial" port on which we will be running the IBus connection. Since to read values we only need the Rx, just connect pin 2 and leave 3 open
int ch = 10; //число каналов радиоаппаратуры RC

void setup()
{
  IBuspin.begin(115200);//the softserial port has to begin at this baud prior to starting it as the IBus port
  Serial.begin(115200);//hardserial for debigging
  IBus.begin(IBuspin);//start the IBus object
}

void loop()
{
  static int inibus;
  IBus.loop();
  for (int i = 0; i < ch; i++)
  {
    inibus = IBus.readChannel(i);
    if (i < ch - 1)
    {
      Serial.print(inibus);
      Serial.print("\t");
    } else {
      Serial.println(inibus);
    }
  }
}

 

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

Спасибо. Это я сделал. Завтра попробую на АлтСофтСериал сделать по вашим примерам. 

 

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

gince пишет:

Спасибо. Это я сделал. Завтра попробую на АлтСофтСериал сделать по вашим примерам. 

Лови готовую на SoftwareSerial, 14 каналов, под телеметрию подготовлено, проверь:
1. IBus с примерами (с телеметрией )

2. Библиотека телеметрии

Ну и данные каналов
 

1499	1497	1002	1025	1000	1000	1000	1000	1000	2000	2000	1025	1000	1000
1499	1497	1002	1025	1000	1000	1000	1000	1000	2000	2000	1025	1000	1000
1499	1497	1002	1025	1000	1000	1000	1000	1000	2000	2000	1025	1000	1000
1499	1497	1002	1025	1000	1000	1000	1000	1000	2000	2000	1025	1000	1000
1499	1497	1002	1025	1000	1000	1000	1000	1000	2000	2000	1025	1000	1000
1499	1497	1002	1025	1000	1000	1000	1000	1000	2000	2000	1025	1000	1000
1499	1497	1002	1025	1000	1000	1000	1000	1000	2000	2000	1025	1000	1000
149

 

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

Еще в будущем попробую в одну библиотеку засунуть прием (PWM) и передачу(telemetry) данных.

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

ua6em пишет:

gince пишет:

Спасибо. Это я сделал. Завтра попробую на АлтСофтСериал сделать по вашим примерам. 

Лови готовую на SoftwareSerial, 14 каналов, под телеметрию подготовлено, проверь:
1. IBus с примерами (с телеметрией )

2. Библиотека телеметрии

Завтра попробую. Сейчас на работе

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

gince пишет:

Еще в будущем попробую в одну библиотеку засунуть прием (PWM) и передачу(telemetry) данных.

Это только ради спортивного интереса. Ведь это мой первый проект и я только учусь. Начал лезть в библиотеки с вашей помощью, так надо и дальше в этом направлении иногда поработать. За два месяца много узнал. Хорошо, что есть хорошие люди и помогает. 

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

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

надеюсь понимаю, пулемёт не той системы переменную v исправил на uint16_t

Ну, в данном случае можно и так, но это будет дольше работать вдвое.

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

ЕвгенийП пишет:

ua6em пишет:

надеюсь понимаю, пулемёт не той системы переменную v исправил на uint16_t

Ну, в данном случае можно и так, но это будет дольше работать вдвое.

а правильней как? чек сумма там рассчитывает вычитанием, побайтно, из кода 0xFFFF, командная последовательность в начале пакета 20 и 40 тоже участвует

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

а правильней как?

оставить все типы в покое, как были, а в самом выражении привести тип к оригинальному

        if (chksum == static_cast<uint8_t>(v << 8) + lchksum) {

 

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

ЕвгенийП пишет:

ua6em пишет:

а правильней как?

оставить все типы в покое, как были, а в самом выражении привести тип к оригинальному

        if (chksum == static_cast<uint8_t>(v << 8) + lchksum) {

да, у меня тоже был костыль, использовать для байта двухбайтовую переменную некомильфо, вы бы пояснили как работает эта конструкция. Мой мозг предложил бы следующее:
1. взять временную переменную размером uint16_t
2. Присвоить ей значение V
3. Сдвинуть содержимое в верхний байт
4. Сложить с lchksum
5. Сравнить

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em,

в первую очередь, Вы должны всегда помнить, что если в левой части операции сдвига стоит переменная типа uint8_t, то перед выполнением операции она будет преобразована в int. Не в int8_t, не в unsigned, а именно в int. И результат будет тоже типа int. Именно поэтому у Вас возникает предупреждение о смешивании знакового и беззнакового типов. Причём это НЕ особенность компилятора, это правило самого языка, поэтому, если в каком-то компиляторе это не так, то его разработчики неправы. Почему так я когда-то подробно объяснял Архату. Там, конечно, был срач, но объяснение понять вполне можно.

Иногда это приводит к таким, как у Вас, предупреждениям, а иногда и к ошибкам в работе программы. Поэтому такие вещи в программе лучше не оставлять.

Бороться с этим можно внимательно согласовывая типы.

Так, как предложили Вы (расширить v до uint16_t) можно, это правильно - типы в итоге согласованы. Но Вы перевели все операции в 16-битовые, т.е. выполняться стало медленнее, примерно в два раза.

Другой способ - преобразовать тип непосредственно гадящей операции (т.е. сдвига), а всё остальное оставить как есть. При этом многие операции остаются 8-битовыми, потому работать будет быстрее.

Я подготовил для Вас пример, чтобы Вы смогли сравнить время при uint16_t и при преобразовании типа результата сдвига. Там разница не в два раза, но мы должны понимать, что в цикле исполняется далеко не только интересующая нас строка, а и куча других (в обоих случаях одинаковых), которые дают "постоянную составляющую". А реально разница во времени исполнения именно данной операции - примерно в два раза, можете посмотреть получающийся код в ассемблере.

Все операции с регистрами TCNTх в коде примера нужны для того, чтобы компилятор не мог заранее узнать значения переменных и "соптимизировать" (т.е. выбросить) наши вычисления.

//
//	Здесь все типы - точно как были в исходном примере
//	Пролбема с разнознаковостью решается преобразованием
//	типа результат сдвига
//
uint32_t test1(void) {
	uint16_t chksum;
	uint8_t lchksum;
	uint8_t v;
	const uint32_t start = millis();
	for (uint32_t i = 0; i < 1000000ul; i++) {
		v = TCNT0;
		lchksum = TCNT2;
		chksum = static_cast<uint8_t>(v << 8) + lchksum;
		TCNT1 = chksum;
	}
	return millis() - start;
}

//
//	Здесь тип переменной v заменён на uint16_t
//	это исключило необходимость преобразования
//
uint32_t test2(void) {
	uint16_t chksum;
	uint8_t lchksum;
	uint16_t v;
	const uint32_t start = millis();
	for (uint32_t i = 0; i < 1000000ul; i++) {
		v = TCNT0;
		lchksum = TCNT2;
		chksum = (v << 8) + lchksum;
		TCNT1 = chksum;
	}
	return millis() - start;
}

void setup() {
	Serial.begin(115200);
	//
	const uint32_t res1 = test1();
	Serial.print("С преобразованием типа: ");
	Serial.println(res1);
	Serial.flush();
	//
	const uint32_t res2 = test2();
	Serial.print("С переменной  uint16_t: ");
	Serial.println(res2);
}

void loop(void) {}

//////////////////////////////////
//
//		РЕЗУЛЬТАТ
//
//		С преобразованием типа: 879
//		С переменной  uint16_t: 1132
//
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Это понятно, по скорости выполнения, мне непонятно каким образом в конечном итоге получается требуемая uint16_t )))
Туплю немного, Дельта она такая )))

Перечитал три раза, дошло )))
она будет преобразована в int. Не в int8_t, не в unsigned, а именно в int ... а static_cast сделает её беззнаковой???

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:
а static_cast сделает её беззнаковой???
А static_cast преобразует результат сдвига к uint8_t

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

ЕвгенийП пишет:

ua6em пишет:
а static_cast сделает её беззнаковой???
А static_cast преобразует результат сдвига к uint8_t


а нам же надо 16-ти битную, "CRC" там uint16_t

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не понял, так Вам чего нужно? 

Допустим v равно, 0x81.

Какой Вам нужен результат операции v << 1 ???

Вам хочется получить 0x0102 или 0x02 ?

Если первое, то замените в staic_cast тип в угловых скобках на uint16_t

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

ЕвгенийП пишет:

Если первое, то замените в staic_cast тип в угловых скобках на uint16_t

ОК!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Тему не читал, но осуждаю!!!

Ибо нехрен. :) 

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

Для софтовой библиотеки скетчи совместил, доступно на GITHUB здесь:

Из опробованного:
1. Библиотеку AltSoftSerial применить не получится, прерывание по приёму с канала servo имеет низкий приоритет.
2. В аппаратуре FlySky FS-I6 перешитой на 14 каналов неправильно работает режим Failsafe:
3. Аппаратура FlySky FS-I6S  (10 каналов) работает великолепно!!! Датчиков не имею. так что проверить обратный канал не могу.

режим Failsafe:

CH1       CH2       CH3      CH4     CH5     CH6      CH7   CH8    CH9     CH10    CH11    CH12   CH13    CH14
50649    46555    9192    1171    1000    1000    700    700    1346    1538    1555    1550    1506    1513
50649    46555    9192    1171    1000    1000    700    700    1346    1538    1555    1550    1506    1513
50649    46555    9192    1171    1000    1000    700    700    1346    1538    1555    1550    1506    1513

В рабочем режиме приём нормальный:

CH1      CH2     CH3     CH4     CH5     CH6      CH7      CH8     CH9     CH10    CH11    CH12   CH13    CH14
1980    2000    1987    2000    2000    2000    2000    2000    1172    1780    2000    2000    2000    2000
1980    2000    1987    2000    2000    2000    2000    2000    1172    1780    2000    2000    2000    2000
1980    2000    1987    2000    2000    2000    2000    2000    1172    1780    2000    2000    2000    2000

 

 

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

DetSimen пишет:

Тему не читал, но осуждаю!!!

Ибо нехрен. :) 

А ты Дельту чем выгоняешь? )))
 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

Тему не читал, но осуждаю!!!

Ибо нехрен. :) 

Солидаризуюсь!

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

 

ждём, что скажет ТС, есть телеметрия или нет

 

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

DetSimen пишет:

Тему не читал, но осуждаю!!!

Ибо нехрен. :) 

ибо сказано: «Если слепой ведёт слепого, то оба упадут в яму" (Мф. 15:14)

 

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

b707 пишет:

DetSimen пишет:

Тему не читал, но осуждаю!!!

Ибо нехрен. :) 

ибо сказано: «Если слепой ведёт слепого, то оба упадут в яму" (Мф. 15:14)

когда мне в 1988 году захотелось не терять ёмкость дискет и вместо 360кб использовать полную доступную ёмкость в 720кб, я сел и написал драйвер, за неделю, в машинных кодах, использовал INT13 и DMA и размер его был 3.6 килобайта (это много, можно было уложиться в 2 килобайта) и было это задолго до того, как Альберто Паскуале написал свой знаменитый драйвер и, служил этот драйвер мне и моим друзьям верой и правдой долгие годы...

Не боги горшки обжигают...

От тебя я "политого обжига" не видел, да и сомневаюсь, что сможешь, Евгений Петрович сможет, ты - никогда, от слова совсем...
PS да, авторитет для меня это ребята написавшие FDA, за пять лет на форуме ничего подобного в кодах пока не видел, увы

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

gince пишет:

gince пишет:

Еще в будущем попробую в одну библиотеку засунуть прием (PWM) и передачу(telemetry) данных.

Это только ради спортивного интереса. Ведь это мой первый проект и я только учусь. Начал лезть в библиотеки с вашей помощью, так надо и дальше в этом направлении иногда поработать. За два месяца много узнал. Хорошо, что есть хорошие люди и помогает. 

У тебя какая аппаратура? FLYSKY FS-I6 с прошивкой FlyPlus 1.7.5 от 2018 года отрабатывает режим Failsafe неправильно...
Захватывать под обратный канал PCINT0 я считаю неразумным, приоритет надо отдать приёму команд, переделал всё, лежит на Гитхабе в виде форка
Нужна схема любого простого датчика, может датчик температуры приделать DS18B20?

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

ua6em пишет:

PS да, авторитет для меня это ребята написавшие FDA, за пять лет на форуме ничего подобного в кодах пока не видел, увы

what is FDA? - единственное что нашед гугл -

Food and Drug Administration

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

когда мне в 1988 году захотелось не терять ёмкость дискет и вместо 360кб использовать полную доступную ёмкость в 720кб, я сел и написал драйвер, за неделю, в машинных кодах, использовал INT13 и DMA и размер его был 3.6 килобайта (это много, можно было уложиться в 2 килобайта)...

На мой взгляд это как-то странно звучит.

Дисковод, который использовался как в оригинальных, так и совместимых IBM PC, был рассчитан на 40 дорожек, а потому выжать с него 720 кбайт было совершенно невозможно (ну разве что записать 720, но считать после этого все равно только последние 360))). А вот у нас в стране массовое распространение получили дисководы двойной плотности на 80 дорожек. Есть подозрение, что в процессе разработки замахнулись на высокую плотность (1.2М), но не вышло. 

Так вот, эти дисководы, будучи подключены к IBM PC, могли работать и даже общаться между собой(!) информацией. Но именно только между собой, т.к. расстояние между дорожками у них было вдвое меньше, чем в оригинальных для IBM PC. И соответственно, дискеты, записанные на этих дисководах, дальше 0-й дорожки на дисководах для IBM PC не читались.

Отсюда вывод: чтобы обеспечить совместимость между 40- и 80-дорожечными дисководами нужен драйвер. Этот драйвер должен уметь писать и читать на 80-дорожечном дисководе дискету на 360. Т.е. уметь шагать через дорожку. А вот специального драйвера, который бы делал шаги по одной дорожке, совсем не нужно. Он и так на IBM PC имеется. Ну, максимум, что может понадобиться, поправить пару смежных байтиков в прошивке.

PS. Насчет того, что приходилось писать: BIOS для CP/M-80. Без INT13 и DMA, т.к. ни того, ни другого на CP/M не предусмотрено. Да, размер его тоже был порядка 3.5кбайт. Но это был весь BIOS, а не единственный драйвер, да еще к тому же сам использующий BIOS (AKA INT13).

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

andriano пишет:

На мой взгляд это как-то странно звучит.

ЕС-1841 что-то говорит? ОС - АЛЬФА-ДОС. Дисковод там был двойной плотности именно 720кб, на 1.2 не замахивался, так как в 1993 году у меня уже был 286, а он их поддерживал.
 

b707 пишет:

FDA

FLoppy Disk Analiser  неужели Яндекс забанили?

kolyn
Offline
Зарегистрирован: 18.01.2019

ua6em пишет:

b707 пишет:

FDA

FLoppy Disk Analiser  неужели Яндекс забанили?

Меня, наверное, забанили, на первых 20 страницах выдачи Яндекс и Гугл такой ссылки не нашел))