arduino вместо FlySky ?
тач на ардуину не совсем такой как телефон. В него можно палкой тыкать - он будет работать …
Да,если тач резистивный,а не капасити.
тестирую HC-12 модули.
проблема не в потерянных пакетах а в потеряной части пакета.
Если потерянный пакет можно смело игнорировать то с мусором в эфире боротса сложно.
нужно мастырить что-то типа контроля целостности пакета, что приводит к удлинению пакета, а чем больше пакет тем больше шансов потерять его часть.
вобщем замкнутый круг
Видимо это и остановило массовою замену существуюшей аппаратуры.
… на корабле ардуина считывает приемник и парсит его каналы - благо там SBUS - это обычный UART…
на UART приходят правильные данные всегда?
или ардуина как-то дополнительно их проверяет?
формат сообщения можете опубликовать?
Данные приходят всегда. Ошибок пока не замечено. Хотя из спецификации sbus там нет чексуммы.
Прикрепил файлик со спецификацией сбуса.
А это код как распарсить посылку по каналам.
SBUS_channels[0] = ((SB_buffer[1] |SB_buffer[2]<<8) & 0x07FF);//ROLL
SBUS_channels[1] = ((SB_buffer[2]>>3 |SB_buffer[3]<<5) & 0x07FF);//PITCH
SBUS_channels[2] = ((SB_buffer[3]>>6 |SB_buffer[4]<<2 | SB_buffer[5]<<10) & 0x07FF);//THROTTLE
SBUS_channels[3] = ((SB_buffer[5]>>1 |SB_buffer[6]<<7) & 0x07FF);//RUDDER
SBUS_channels[4] = ((SB_buffer[6]>>4 |SB_buffer[7]<<4) & 0x07FF);//2х позиционный тумблер C
SBUS_channels[5] = ((SB_buffer[7]>>7 |SB_buffer[8]<<1 |SB_buffer[9]<<9) & 0x07FF);
SBUS_channels[6] = ((SB_buffer[9]>>2 |SB_buffer[10]<<6) & 0x07FF);
SBUS_channels[7] = ((SB_buffer[10]>>5|SB_buffer[11]<<3) & 0x07FF);
SBUS_channels[8] = ((SB_buffer[12] |SB_buffer[13]<<8) & 0x07FF);//тумблер B
SBUS_channels[9] = ((SB_buffer[13]>>3|SB_buffer[14]<<5) & 0x07FF);
SBUS_channels[10] = ((SB_buffer[14]>>6|SB_buffer[15]<<2|SB_buffer[16]<<10) & 0x07FF);
//SBUS_channels[11] = ((SB_buffer[16]>>1|SB_buffer[17]<<7) & 0x07FF);
//SBUS_channels[12] = ((SB_buffer[17]>>4|SB_buffer[18]<<4) & 0x07FF);
//SBUS_channels[13] = ((SB_buffer[18]>>7|SB_buffer[19]<<1|SB_buffer[20]<<9) & 0x07FF);
//SBUS_channels[14] = ((SB_buffer[20]>>2|SB_buffer[21]<<6) & 0x07FF);
//SBUS_channels[15] = ((SB_buffer[21]>>5|SB_buffer[22]<<3) & 0x07FF);
//if ((SB_buffer[23]) & 0x0001)
//{
//SBUS_channels[16] = 2047;
//}
//else SBUS_channels[16] = 0;
//
//if ((SB_buffer[23] >> 1) & 0x0001)
//{
//SBUS_channels[17] = 2047;
//} else SBUS_channels[17] = 0;
Посылку собираем в прерывании UART
ISR ( USART2_RX_vect )//прерывание SBUS от пульта
{
uint8_t rx = UDR2;
if (SB_buffer_index == 0 && rx != SBUS_STARTBYTE)
{
//incorrect start byte, out of sync
return;
}
SB_buffer[SB_buffer_index++] = rx;
if (SB_buffer_index == 25)
{
SB_buffer_index = 0;
if (SB_buffer[24] != SBUS_ENDBYTE)
{
//incorrect end byte, out of sync
return;
}
else
{
UCSR2B &= ~(1 << RXCIE2);//отключение прерывания UART2
UART2_RX_flag = true;//данные готовы
}
}
}
Если будете это всё пробовать то нужно сделать инвертер сигнала на транзисторе. сбус изначально ивертирует 0 на 1, то есть не так как UART согласно ASCII.
…Прикрепил файлик со спецификацией сбуса
спасибо, судя по коду работает так:
- проверяет первый стартовый символ :SBUS_STARTBYTE
- затем посылка из 25 байт
- проверяет заключающий символ: SBUS_ENDBYTE
если длинна сообщения 27 байт + первый + последний символ совпадают - значит посылка валидная.
Иначе: пакет идет вмусор.
Валидный пакет парсится по каналам, непонятно зачем пакет такой длинный - видимо в один байт значение канала не вмещается.
Да, все так.
Один канал насколько я понял имеет разрядность 9 или 11, сейчас уже не помню, поэтому они их раскидали таким хитрым способом. 2 байта на канал много, осталось пару бит, они в этот хвост закинули начало следующего канала и т.д.
угу:
по спецификации из rar (шикарная дока)
у них байт = 12 бит.
12 бит не хватает на канал и они раскидали каналы по разным байтам.
начало+конец+длинна является контрольной суммой.
Громоздко получается.
ардуина 8 битовая - тяжело это дело вместе прикрутить.
По опыту скажу что ардуина со всем справляется за глаза.
У меня она отрабатывает 3 уартовских прерывания.
Работает с акселерометром, гиро, компасом по i2c. Считает честный кватернион, там под десяток операций с float, столько же синусов и прочей тригонометрии.
Один аппаратный таймер генерирует правильные импульсы для 3х каналов.
Со всем этим справляется на ура, зависаний не замечал, но я и вотчдог настроил.
Правда я все пишу, управляю голыми регистрами, ардуиновский IDE и его готовые функции лучше для таких задач не использовать, там много косяков есть.
Демонстрация моего автопилота
Делаю РУ на Ардуино+nRF
Детские болезни данной связки уже прошел
Плюсов данного варианта много, минусов не знаю.
Посмотреть можно на соседней ветке (копии- ЭБР “Пётр Великий”) и это не реклама )))
РУ на ардуино - детская болезнь моделистов.
Обычное лучше?
РУ на ардуино - детская болезнь моделистов.
когда-то расказывали про радиацию от монитора … и все покупали защитные экраны.
Сейчас пурга пошла насколько вредно 5Ж для мозга.
Так и тут с аппаратурой - не боги горшки лепят
Все просто как 3 копейки: зашифровать/рашифровать сигнал
Каким методом это достичь - вопрос третий, компьютером или шифратором/дешифратором - значения не имеет ровно никакого.
когда-то расказывали про радиацию от монитора … и все покупали защитные экраны.
Сейчас пурга пошла насколько вредно 5Ж для мозга.
Так и тут с аппаратурой - не боги горшки лепят
Все просто как 3 копейки: зашифровать/рашифровать сигнал
Каким методом это достичь - вопрос третий, компьютером или шифратором/дешифратором - значения не имеет ровно никакого.
в слове “достичь” содержится слово “Дичь” совпадение?
зашифровать/рашифровать сигнал
это делает сам радиомодуль. Подаешь ему массив байт он их шифрует и передает.
Всех делов.
Не понимаю, в чем страх использовать Ардуино. Не по фен-шую?
Та можно вообще, просто зачем? Хотя каждому, конечно свое…
наверное потомушта хочется сделать лучше,
а на существующую аппаратуру исходников нет
Сделать лучше? На ардуино? Вы серьезно? А параметры процессоров смотрели, сравнивали?
а что там такого в этих параметрах процессоров?? И что, , 8-ми разрядной Atmega328 не хватит для радиоуправления?
на существующую аппаратуру исходников нет
Все есть, только надо ли? Купить приемник выйдет намного дешевле, чем сделать самому. Если цель обучение, тогда другое дело.
так самому можно сделать приемник (да и пульт) с нужными тебе размерами и с нужными тебе функциями
Все есть, только надо ли? Купить приемник выйдет намного дешевле, чем сделать самому. Если цель обучение, тогда другое дело.
надо. кидайте ссылочку - сотворим супер девайс