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, но IDE eее не видит. Перезапустил Ардуино IDE > не видет. PC Restart > не видит. ТоталКомандер и ехплорер показывает в папке вставленыв библиотек.
Скачал эту https://github.com/ledongthuc/CustomSoftwareSerial, но IDE eее не видит. Перезапустил Ардуино IDE > не видет. PC Restart > не видит. ТоталКомандер и ехплорер показывает в папке вставленыв библиотек.
Скачал эту https://github.com/ledongthuc/CustomSoftwareSerial, но IDE eее не видит. Перезапустил Ардуино IDE > не видет. PC Restart > не видит. ТоталКомандер и ехплорер показывает в папке вставленыв библиотек.
Скачал эту https://github.com/ledongthuc/CustomSoftwareSerial, но IDE eее не видит. Перезапустил Ардуино IDE > не видет. PC Restart > не видит. ТоталКомандер и ехплорер показывает в папке вставленыв библиотек.
В примерах лежит компилируемая версия, если замаркировать #define ALT_SERIAL тогда будет использоваться кастомная библиотека серийного порта, пробуй
PS если не заработает, надо искать библиотеку iBUS.h которая начнёт принимать с SoftwareSerial.h, код поправим
по этой работающей библиотеке, видимо есть какие-то отличия и исправлены баги
Поискал еще разные версии iBUS в том числе под ESP8266, из приятного, приёмник исправен )))
надо искать с перламутровыми пуговицами IBUS работающую с ардуино нано
ua6em, Огромное спасибо за ваши труды и потерянное время.
Сейчас после работы проверял. Пока не закомментировал 313-320 стр. были ошибки. Потом компиляция прошла.
С телеметрией все хорошо, но Ibus.h дохлая библиотека.
Читал описания Ibus.h. Так те , что мы применяем и находили, сделаны для линух (если я правильно понял). Нашел личную почту разрабочика. Попробую ему написать и поспрашивать. Пока на этом все. Еще раз спасибо.
ua6em, Огромное спасибо за ваши труды и потерянное время.
Сейчас после работы проверял. Пока не закомментировал 313-320 стр. были ошибки. Потом компиляция прошла.
С телеметрией все хорошо, но Ibus.h дохлая библиотека.
Читал описания Ibus.h. Так те , что мы применяем и находили, сделаны для линух (если я правильно понял). Нашел личную почту разрабочика. Попробую ему написать и поспрашивать. Пока на этом все. Еще раз спасибо.
да мне самому интересно одолеть этот протокол, перспективный однако!
Я сегодня пересмотрел более 30 библиотек разных разбирающих протокол ibus, нашел даже описание, что именно передается и как считать, в принципе если информация есть можно написать свою библиотеку (тому кто это умеет)
Надо пройтись еще по ветке гитхаба по ibus.h посмотреть что там и как кто форкнул и правил форк
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 видимо и значение в правой части сравниваемого надо привести к более читабельному виду:
Все сылки не пересмотрел, но одна (самая первая, которую открыл) заработала. https://github.com/pedrocastelani/SoftIBus. Сегодня больше не успею посмотреть. но уже одна софтовая работает и это хорошо. Дальше дела уже будет продвигатса.
Все сылки не пересмотрел, но одна (самая первая, которую открыл) заработала. https://github.com/pedrocastelani/SoftIBus. Сегодня больше не успею посмотреть. но уже одна софтовая работает и это хорошо. Дальше дела уже будет продвигатса.
Дальнейшие исследования возможности использования продолжаются:
1. Не обойтись без визуального мониторинга, поэтому пригодится программа виртуального джойстика
2. Устанавливаем, настраиваем наши 10 каналов и выбираем протокол IBUS
3. Пишем простую программу сплиттера (передача данных из порта 1 в порт 0(USB))
4. Код такой
5. Получается следующая ситуация: при включении аппаратуры и соединении с приёмником реакции на ручки управления в виртуальном джойстике не наблюдается, а вот при выключении аппаратуры происходит считывание по всем 10 каналам. Замена приёмника ситуацию не исправила.
При потере связи (коннекта приёмника с аппаратурой) он гонит последние принятые значения. Если настроен режим Failsafe он по каналам задействованным в этом режиме должен передавать установленные для этого режима значения.
Замена передатчика также проблему не исправила.
Непонятки ...
Все сылки не пересмотрел, но одна (самая первая, которую открыл) заработала. https://github.com/pedrocastelani/SoftIBus. Сегодня больше не успею посмотреть. но уже одна софтовая работает и это хорошо. Дальше дела уже будет продвигатса.
это та же самая библиотека, об ошибке в которой я писал, при потере линка в мониторе идёт отображение с каналов, при линке - встряёт (у меня) что тут не так не знаю )))
Я жеж говорю, пять лет назад уже пытал этот протокол, не одолел
файл SofIbus.cpp строка 32: uint8_t v = stream->read(); заменить на: uint16_t v = stream->read();
Посмотрим на ошибку: if (chksum == (v << 8) + lchksum) {
Компилятор предупреждает о сравнении signed and unsigned! В действительности переменная "v" объявлена как uint8_t а переменные "chksum" и "lchksum" как uint16_t!!! Да, да, компиляторы тоже люди пишут )))
Простите, всю тему не читал, потому не до конца понял, Вы понимаете почему здесь так? Почему получается такая ошибка? А то, судя по дальнейшему, Вы эту ошибку так и не исправили.
Посмотрим на ошибку: if (chksum == (v << 8) + lchksum) {
Компилятор предупреждает о сравнении signed and unsigned! В действительности переменная "v" объявлена как uint8_t а переменные "chksum" и "lchksum" как uint16_t!!! Да, да, компиляторы тоже люди пишут )))
Простите, всю тему не читал, потому не до конца понял, Вы понимаете почему здесь так? Почему получается такая ошибка? А то, судя по дальнейшему, Вы эту ошибку так и не исправили.
надеюсь понимаю, пулемёт не той системы переменную v исправил на uint16_t
ЗЫ если ошибаюсь поправьте пожалуйста
#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);
}
}
}
Еще в будущем попробую в одну библиотеку засунуть прием (PWM) и передачу(telemetry) данных.
Это только ради спортивного интереса. Ведь это мой первый проект и я только учусь. Начал лезть в библиотеки с вашей помощью, так надо и дальше в этом направлении иногда поработать. За два месяца много узнал. Хорошо, что есть хорошие люди и помогает.
PWM это опять применять прерывания, у меня в тележке на ардуино три канала обрабатываются, но это два шага назад
да, в примерах библиотеки тип переменной куда считываются значения каналов должен быть uint16_t, я поправлю но попозже
оставить все типы в покое, как были, а в самом выражении привести тип к оригинальному
if (chksum == static_cast<uint8_t>(v << 8) + lchksum) {
да, у меня тоже был костыль, использовать для байта двухбайтовую переменную некомильфо, вы бы пояснили как работает эта конструкция. Мой мозг предложил бы следующее:
1. взять временную переменную размером uint16_t
2. Присвоить ей значение V
3. Сдвинуть содержимое в верхний байт
4. Сложить с lchksum
5. Сравнить
в первую очередь, Вы должны всегда помнить, что если в левой части операции сдвига стоит переменная типа 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
//
Это понятно, по скорости выполнения, мне непонятно каким образом в конечном итоге получается требуемая uint16_t )))
Туплю немного, Дельта она такая )))
Перечитал три раза, дошло )))
она будет преобразована в int. Не в int8_t, не в unsigned, а именно в int ... а static_cast сделает её беззнаковой???
Для софтовой библиотеки скетчи совместил, доступно на GITHUB здесь:
Из опробованного:
1. Библиотеку AltSoftSerial применить не получится, прерывание по приёму с канала servo имеет низкий приоритет.
2. В аппаратуре FlySky FS-I6 перешитой на 14 каналов неправильно работает режим Failsafe:
3. Аппаратура FlySky FS-I6S (10 каналов) работает великолепно!!! Датчиков не имею. так что проверить обратный канал не могу.
ибо сказано: «Если слепой ведёт слепого, то оба упадут в яму" (Мф. 15:14)
когда мне в 1988 году захотелось не терять ёмкость дискет и вместо 360кб использовать полную доступную ёмкость в 720кб, я сел и написал драйвер, за неделю, в машинных кодах, использовал INT13 и DMA и размер его был 3.6 килобайта (это много, можно было уложиться в 2 килобайта) и было это задолго до того, как Альберто Паскуале написал свой знаменитый драйвер и, служил этот драйвер мне и моим друзьям верой и правдой долгие годы...
Не боги горшки обжигают...
От тебя я "политого обжига" не видел, да и сомневаюсь, что сможешь, Евгений Петрович сможет, ты - никогда, от слова совсем...
PS да, авторитет для меня это ребята написавшие FDA, за пять лет на форуме ничего подобного в кодах пока не видел, увы
Еще в будущем попробую в одну библиотеку засунуть прием (PWM) и передачу(telemetry) данных.
Это только ради спортивного интереса. Ведь это мой первый проект и я только учусь. Начал лезть в библиотеки с вашей помощью, так надо и дальше в этом направлении иногда поработать. За два месяца много узнал. Хорошо, что есть хорошие люди и помогает.
У тебя какая аппаратура? FLYSKY FS-I6 с прошивкой FlyPlus 1.7.5 от 2018 года отрабатывает режим Failsafe неправильно...
Захватывать под обратный канал PCINT0 я считаю неразумным, приоритет надо отдать приёму команд, переделал всё, лежит на Гитхабе в виде форка
Нужна схема любого простого датчика, может датчик температуры приделать DS18B20?
когда мне в 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).
ЕС-1841 что-то говорит? ОС - АЛЬФА-ДОС. Дисковод там был двойной плотности именно 720кб, на 1.2 не замахивался, так как в 1993 году у меня уже был 286, а он их поддерживал.
AltSoftSerial тоже разные, есть с поддержкой параметров порта, есть без оной, могу собрать скетч под любую из них...
По порядку:
1. Устанавливаем эту библиотеку для iBUS (собрал по другим именем iBUSem)
2. Устанавливаем эту библиотеку для AltSoftSerial
3. Открываем в примерах Файл-Примеры-iBUSem-example-Alt_basic
4. Компилируем, заливаем
Скетч использует 4878 байт (15%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 562 байт (27%) динамической памяти, оставляя 1486 байт для локальных переменных. Максимум: 2048 байт.
5. Проверяем работу
Библиотека IBusBM https://github.com/bmellink/IBusBM рабочая.
кароткий код для проверки.
Может ее как то через AltSoftSerial ?
AltSoftSerial тоже разные, есть с поддержкой параметров порта, есть без оной, могу собрать скетч под любую из них...
По порядку:
1. Устанавливаем эту библиотеку для iBUS (собрал по другим именем iBUSem)
2. Устанавливаем эту библиотеку для AltSoftSerial
3. Открываем в примерах Файл-Примеры-iBUSem-example-Alt_basic
4. Компилируем, заливаем
Скетч использует 4878 байт (15%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 562 байт (27%) динамической памяти, оставляя 1486 байт для локальных переменных. Максимум: 2048 байт.
5. Проверяем работу
Сейчас спробую. Извени не видел
Эта подойдет ?
https://github.com/ledongthuc/CustomSoftwareSerial
Скачал эту https://github.com/ledongthuc/CustomSoftwareSerial, но IDE eее не видит. Перезапустил Ардуино IDE > не видет. PC Restart > не видит. ТоталКомандер и ехплорер показывает в папке вставленыв библиотек.
Скачал эту https://github.com/ledongthuc/CustomSoftwareSerial, но IDE eее не видит. Перезапустил Ардуино IDE > не видет. PC Restart > не видит. ТоталКомандер и ехплорер показывает в папке вставленыв библиотек.
Нашел другую, ее видит. Но пишет, что не верная.
Скачал эту https://github.com/ledongthuc/CustomSoftwareSerial, но IDE eее не видит. Перезапустил Ардуино IDE > не видет. PC Restart > не видит. ТоталКомандер и ехплорер показывает в папке вставленыв библиотек.
Нашел другую, ее видит. Но пишет, что не верная.
правлю код на Гитхабе, надеюсь до завтра одолею
Скачал эту https://github.com/ledongthuc/CustomSoftwareSerial, но IDE eее не видит. Перезапустил Ардуино IDE > не видет. PC Restart > не видит. ТоталКомандер и ехплорер показывает в папке вставленыв библиотек.
Нашел другую, ее видит. Но пишет, что не верная.
Опять поставил эту https://github.com/ledongthuc/CustomSoftwareSerial, но только распаковал прямо в библиотечной папке. Ардуино IDE нашел src папку и библиотеку вставил в скеч. Компиляция и
е
Готово, пробный скетч на две библиотеки:
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 работающую с ардуино наноua6em, Огромное спасибо за ваши труды и потерянное время.
Сейчас после работы проверял. Пока не закомментировал 313-320 стр. были ошибки. Потом компиляция прошла.
С телеметрией все хорошо, но Ibus.h дохлая библиотека.
Читал описания Ibus.h. Так те , что мы применяем и находили, сделаны для линух (если я правильно понял). Нашел личную почту разрабочика. Попробую ему написать и поспрашивать. Пока на этом все. Еще раз спасибо.
ua6em, Огромное спасибо за ваши труды и потерянное время.
Сейчас после работы проверял. Пока не закомментировал 313-320 стр. были ошибки. Потом компиляция прошла.
С телеметрией все хорошо, но Ibus.h дохлая библиотека.
Читал описания Ibus.h. Так те , что мы применяем и находили, сделаны для линух (если я правильно понял). Нашел личную почту разрабочика. Попробую ему написать и поспрашивать. Пока на этом все. Еще раз спасибо.
да мне самому интересно одолеть этот протокол, перспективный однако!
Я сегодня пересмотрел более 30 библиотек разных разбирающих протокол ibus, нашел даже описание, что именно передается и как считать, в принципе если информация есть можно написать свою библиотеку (тому кто это умеет)
Надо пройтись еще по ветке гитхаба по ibus.h посмотреть что там и как кто форкнул и правил форк
Я уже заказал и мегу и стм32. Но я на нано хочу закончить. Буду искать, читать.
Рабочая https://gitlab.com/timwilkinson/FlySkyIBus
код
Рабочая https://gitlab.com/timwilkinson/FlySkyIBus
код
Она хардовая, делаю форк и пытаюсь её обернуть в SomeSerial
Там у тебя ссылка на библиотеку IBUS.h битая, вот адрес - https://github.com/AAU-EIT5/iBUS
Кстати, библиотека IBusBM тоже кривая:
Посмотрим на ошибку: if (chksum == (v << 8) + lchksum) {
Компилятор предупреждает о сравнении signed and unsigned! В действительности переменная "v" объявлена как
uint8_t а переменные "chksum" и "lchksum" как uint16_t!!! Да, да, компиляторы тоже люди пишут )))
Обиднее всего, что ошибка эта кочует по многочисленным реализациям протокола IBUS и в этой тоже!
PS ("и как тут не быть дураком?")
PPS видимо и значение в правой части сравниваемого надо привести к более читабельному виду:
Использованы материалы:
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
Все сылки не пересмотрел, но одна (самая первая, которую открыл) заработала. https://github.com/pedrocastelani/SoftIBus. Сегодня больше не успею посмотреть. но уже одна софтовая работает и это хорошо. Дальше дела уже будет продвигатса.
Все сылки не пересмотрел, но одна (самая первая, которую открыл) заработала. https://github.com/pedrocastelani/SoftIBus. Сегодня больше не успею посмотреть. но уже одна софтовая работает и это хорошо. Дальше дела уже будет продвигатса.
Проверял пример SoftIBus10.
Дальнейшие исследования возможности использования продолжаются:
1. Не обойтись без визуального мониторинга, поэтому пригодится программа виртуального джойстика
2. Устанавливаем, настраиваем наши 10 каналов и выбираем протокол IBUS
3. Пишем простую программу сплиттера (передача данных из порта 1 в порт 0(USB))
4. Код такой
5. Получается следующая ситуация: при включении аппаратуры и соединении с приёмником реакции на ручки управления в виртуальном джойстике не наблюдается, а вот при выключении аппаратуры происходит считывание по всем 10 каналам. Замена приёмника ситуацию не исправила.
При потере связи (коннекта приёмника с аппаратурой) он гонит последние принятые значения. Если настроен режим Failsafe он по каналам задействованным в этом режиме должен передавать установленные для этого режима значения.
Замена передатчика также проблему не исправила.
Непонятки ...
Все сылки не пересмотрел, но одна (самая первая, которую открыл) заработала. https://github.com/pedrocastelani/SoftIBus. Сегодня больше не успею посмотреть. но уже одна софтовая работает и это хорошо. Дальше дела уже будет продвигатса.
Проверял пример SoftIBus10.
это та же самая библиотека, об ошибке в которой я писал, при потере линка в мониторе идёт отображение с каналов, при линке - встряёт (у меня) что тут не так не знаю )))
Я жеж говорю, пять лет назад уже пытал этот протокол, не одолел
файл SofIbus.cpp строка 32: uint8_t v = stream->read(); заменить на: uint16_t v = stream->read();
Посмотрим на ошибку: if (chksum == (v << 8) + lchksum) {
Компилятор предупреждает о сравнении signed and unsigned! В действительности переменная "v" объявлена как uint8_t а переменные "chksum" и "lchksum" как uint16_t!!! Да, да, компиляторы тоже люди пишут )))
Простите, всю тему не читал, потому не до конца понял, Вы понимаете почему здесь так? Почему получается такая ошибка? А то, судя по дальнейшему, Вы эту ошибку так и не исправили.
Посмотрим на ошибку: if (chksum == (v << 8) + lchksum) {
Компилятор предупреждает о сравнении signed and unsigned! В действительности переменная "v" объявлена как uint8_t а переменные "chksum" и "lchksum" как uint16_t!!! Да, да, компиляторы тоже люди пишут )))
Простите, всю тему не читал, потому не до конца понял, Вы понимаете почему здесь так? Почему получается такая ошибка? А то, судя по дальнейшему, Вы эту ошибку так и не исправили.
надеюсь понимаю,
пулемёт не той системыпеременную v исправил на uint16_tЗЫ если ошибаюсь поправьте пожалуйста
Проверял пример SoftIBus10.
чуток поправил код примера на 10 каналов:
Спасибо. Это я сделал. Завтра попробую на АлтСофтСериал сделать по вашим примерам.
Спасибо. Это я сделал. Завтра попробую на АлтСофтСериал сделать по вашим примерам.
Лови готовую на SoftwareSerial, 14 каналов, под телеметрию подготовлено, проверь:
1. IBus с примерами (с телеметрией )
2. Библиотека телеметрии
Ну и данные каналов
Еще в будущем попробую в одну библиотеку засунуть прием (PWM) и передачу(telemetry) данных.
Спасибо. Это я сделал. Завтра попробую на АлтСофтСериал сделать по вашим примерам.
Лови готовую на SoftwareSerial, 14 каналов, под телеметрию подготовлено, проверь:
1. IBus с примерами (с телеметрией )
2. Библиотека телеметрии
Завтра попробую. Сейчас на работе
Еще в будущем попробую в одну библиотеку засунуть прием (PWM) и передачу(telemetry) данных.
Это только ради спортивного интереса. Ведь это мой первый проект и я только учусь. Начал лезть в библиотеки с вашей помощью, так надо и дальше в этом направлении иногда поработать. За два месяца много узнал. Хорошо, что есть хорошие люди и помогает.
PWM это опять применять прерывания, у меня в тележке на ардуино три канала обрабатываются, но это два шага назад
да, в примерах библиотеки тип переменной куда считываются значения каналов должен быть uint16_t, я поправлю но попозже
надеюсь понимаю,
пулемёт не той системыпеременную v исправил на uint16_tНу, в данном случае можно и так, но это будет дольше работать вдвое.
надеюсь понимаю,
пулемёт не той системыпеременную v исправил на uint16_tНу, в данном случае можно и так, но это будет дольше работать вдвое.
а правильней как? чек сумма там рассчитывает вычитанием, побайтно, из кода 0xFFFF, командная последовательность в начале пакета 20 и 40 тоже участвует
а правильней как?
оставить все типы в покое, как были, а в самом выражении привести тип к оригинальному
а правильней как?
оставить все типы в покое, как были, а в самом выражении привести тип к оригинальному
да, у меня тоже был костыль, использовать для байта двухбайтовую переменную некомильфо, вы бы пояснили как работает эта конструкция. Мой мозг предложил бы следующее:
1. взять временную переменную размером uint16_t
2. Присвоить ей значение V
3. Сдвинуть содержимое в верхний байт
4. Сложить с lchksum
5. Сравнить
ua6em,
в первую очередь, Вы должны всегда помнить, что если в левой части операции сдвига стоит переменная типа uint8_t, то перед выполнением операции она будет преобразована в int. Не в int8_t, не в unsigned, а именно в int. И результат будет тоже типа int. Именно поэтому у Вас возникает предупреждение о смешивании знакового и беззнакового типов. Причём это НЕ особенность компилятора, это правило самого языка, поэтому, если в каком-то компиляторе это не так, то его разработчики неправы. Почему так я когда-то подробно объяснял Архату. Там, конечно, был срач, но объяснение понять вполне можно.
Иногда это приводит к таким, как у Вас, предупреждениям, а иногда и к ошибкам в работе программы. Поэтому такие вещи в программе лучше не оставлять.
Бороться с этим можно внимательно согласовывая типы.
Так, как предложили Вы (расширить v до uint16_t) можно, это правильно - типы в итоге согласованы. Но Вы перевели все операции в 16-битовые, т.е. выполняться стало медленнее, примерно в два раза.
Другой способ - преобразовать тип непосредственно гадящей операции (т.е. сдвига), а всё остальное оставить как есть. При этом многие операции остаются 8-битовыми, потому работать будет быстрее.
Я подготовил для Вас пример, чтобы Вы смогли сравнить время при uint16_t и при преобразовании типа результата сдвига. Там разница не в два раза, но мы должны понимать, что в цикле исполняется далеко не только интересующая нас строка, а и куча других (в обоих случаях одинаковых), которые дают "постоянную составляющую". А реально разница во времени исполнения именно данной операции - примерно в два раза, можете посмотреть получающийся код в ассемблере.
Все операции с регистрами TCNTх в коде примера нужны для того, чтобы компилятор не мог заранее узнать значения переменных и "соптимизировать" (т.е. выбросить) наши вычисления.
Это понятно, по скорости выполнения, мне непонятно каким образом в конечном итоге получается требуемая uint16_t )))
Туплю немного, Дельта она такая )))
Перечитал три раза, дошло )))
она будет преобразована в int. Не в int8_t, не в unsigned, а именно в int ... а static_cast сделает её беззнаковой???
а нам же надо 16-ти битную, "CRC" там uint16_t
Не понял, так Вам чего нужно?
Допустим v равно, 0x81.
Какой Вам нужен результат операции v << 1 ???
Вам хочется получить 0x0102 или 0x02 ?
Если первое, то замените в staic_cast тип в угловых скобках на uint16_t
Если первое, то замените в staic_cast тип в угловых скобках на uint16_t
ОК!
Тему не читал, но осуждаю!!!
Ибо нехрен. :)
Для софтовой библиотеки скетчи совместил, доступно на 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
Тему не читал, но осуждаю!!!
Ибо нехрен. :)
А ты Дельту чем выгоняешь? )))
Тему не читал, но осуждаю!!!
Ибо нехрен. :)
Солидаризуюсь!
ждём, что скажет ТС, есть телеметрия или нет
Тему не читал, но осуждаю!!!
Ибо нехрен. :)
ибо сказано: «Если слепой ведёт слепого, то оба упадут в яму" (Мф. 15:14)
Тему не читал, но осуждаю!!!
Ибо нехрен. :)
ибо сказано: «Если слепой ведёт слепого, то оба упадут в яму" (Мф. 15:14)
когда мне в 1988 году захотелось не терять ёмкость дискет и вместо 360кб использовать полную доступную ёмкость в 720кб, я сел и написал драйвер, за неделю, в машинных кодах, использовал INT13 и DMA и размер его был 3.6 килобайта (это много, можно было уложиться в 2 килобайта) и было это задолго до того, как Альберто Паскуале написал свой знаменитый драйвер и, служил этот драйвер мне и моим друзьям верой и правдой долгие годы...
Не боги горшки обжигают...
От тебя я "политого обжига" не видел, да и сомневаюсь, что сможешь, Евгений Петрович сможет, ты - никогда, от слова совсем...
PS да, авторитет для меня это ребята написавшие FDA, за пять лет на форуме ничего подобного в кодах пока не видел, увы
Еще в будущем попробую в одну библиотеку засунуть прием (PWM) и передачу(telemetry) данных.
Это только ради спортивного интереса. Ведь это мой первый проект и я только учусь. Начал лезть в библиотеки с вашей помощью, так надо и дальше в этом направлении иногда поработать. За два месяца много узнал. Хорошо, что есть хорошие люди и помогает.
У тебя какая аппаратура? FLYSKY FS-I6 с прошивкой FlyPlus 1.7.5 от 2018 года отрабатывает режим Failsafe неправильно...
Захватывать под обратный канал PCINT0 я считаю неразумным, приоритет надо отдать приёму команд, переделал всё, лежит на Гитхабе в виде форка
Нужна схема любого простого датчика, может датчик температуры приделать DS18B20?
PS да, авторитет для меня это ребята написавшие FDA, за пять лет на форуме ничего подобного в кодах пока не видел, увы
what is FDA? - единственное что нашед гугл -
Food and Drug Administration
когда мне в 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).
На мой взгляд это как-то странно звучит.
ЕС-1841 что-то говорит? ОС - АЛЬФА-ДОС. Дисковод там был двойной плотности именно 720кб, на 1.2 не замахивался, так как в 1993 году у меня уже был 286, а он их поддерживал.
FDA
FLoppy Disk Analiser неужели Яндекс забанили?
FDA
FLoppy Disk Analiser неужели Яндекс забанили?
Меня, наверное, забанили, на первых 20 страницах выдачи Яндекс и Гугл такой ссылки не нашел))