arduino вместо FlySky ?

vlad007
kapelan:

тач на ардуину не совсем такой как телефон. В него можно палкой тыкать - он будет работать …

Да,если тач резистивный,а не капасити.

15 days later
kapelan

тестирую HC-12 модули.
проблема не в потерянных пакетах а в потеряной части пакета.
Если потерянный пакет можно смело игнорировать то с мусором в эфире боротса сложно.
нужно мастырить что-то типа контроля целостности пакета, что приводит к удлинению пакета, а чем больше пакет тем больше шансов потерять его часть.
вобщем замкнутый круг
Видимо это и остановило массовою замену существуюшей аппаратуры.

Sevas:

… на корабле ардуина считывает приемник и парсит его каналы - благо там SBUS - это обычный UART…

на UART приходят правильные данные всегда?
или ардуина как-то дополнительно их проверяет?
формат сообщения можете опубликовать?

Sevas

Данные приходят всегда. Ошибок пока не замечено. Хотя из спецификации 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.rar

kapelan
Sevas:

…Прикрепил файлик со спецификацией сбуса

спасибо, судя по коду работает так:

  • проверяет первый стартовый символ :SBUS_STARTBYTE
  • затем посылка из 25 байт
  • проверяет заключающий символ: SBUS_ENDBYTE
    если длинна сообщения 27 байт + первый + последний символ совпадают - значит посылка валидная.
    Иначе: пакет идет вмусор.
    Валидный пакет парсится по каналам, непонятно зачем пакет такой длинный - видимо в один байт значение канала не вмещается.
Sevas

Да, все так.
Один канал насколько я понял имеет разрядность 9 или 11, сейчас уже не помню, поэтому они их раскидали таким хитрым способом. 2 байта на канал много, осталось пару бит, они в этот хвост закинули начало следующего канала и т.д.

kapelan

угу:
по спецификации из rar (шикарная дока)
у них байт = 12 бит.
12 бит не хватает на канал и они раскидали каналы по разным байтам.
начало+конец+длинна является контрольной суммой.
Громоздко получается.
ардуина 8 битовая - тяжело это дело вместе прикрутить.

Sevas

По опыту скажу что ардуина со всем справляется за глаза.
У меня она отрабатывает 3 уартовских прерывания.
Работает с акселерометром, гиро, компасом по i2c. Считает честный кватернион, там под десяток операций с float, столько же синусов и прочей тригонометрии.
Один аппаратный таймер генерирует правильные импульсы для 3х каналов.
Со всем этим справляется на ура, зависаний не замечал, но я и вотчдог настроил.
Правда я все пишу, управляю голыми регистрами, ардуиновский IDE и его готовые функции лучше для таких задач не использовать, там много косяков есть.

2 months later
1 month later
Olger_spb

Делаю РУ на Ардуино+nRF
Детские болезни данной связки уже прошел
Плюсов данного варианта много, минусов не знаю.
Посмотреть можно на соседней ветке (копии- ЭБР “Пётр Великий”) и это не реклама )))

5 months later
Ozyris

РУ на ардуино - детская болезнь моделистов.

kapelan
Ozyris:

РУ на ардуино - детская болезнь моделистов.

когда-то расказывали про радиацию от монитора … и все покупали защитные экраны.
Сейчас пурга пошла насколько вредно 5Ж для мозга.
Так и тут с аппаратурой - не боги горшки лепят
Все просто как 3 копейки: зашифровать/рашифровать сигнал
Каким методом это достичь - вопрос третий, компьютером или шифратором/дешифратором - значения не имеет ровно никакого.

TGOdessa
kapelan:

когда-то расказывали про радиацию от монитора … и все покупали защитные экраны.
Сейчас пурга пошла насколько вредно 5Ж для мозга.
Так и тут с аппаратурой - не боги горшки лепят
Все просто как 3 копейки: зашифровать/рашифровать сигнал
Каким методом это достичь - вопрос третий, компьютером или шифратором/дешифратором - значения не имеет ровно никакого.

в слове “достичь” содержится слово “Дичь” совпадение?

Olger_spb
kapelan:

зашифровать/рашифровать сигнал

это делает сам радиомодуль. Подаешь ему массив байт он их шифрует и передает.
Всех делов.
Не понимаю, в чем страх использовать Ардуино. Не по фен-шую?

TGOdessa

Та можно вообще, просто зачем? Хотя каждому, конечно свое…

27 days later
kapelan

наверное потомушта хочется сделать лучше,
а на существующую аппаратуру исходников нет

TGOdessa

Сделать лучше? На ардуино? Вы серьезно? А параметры процессоров смотрели, сравнивали?

Olger_spb

а что там такого в этих параметрах процессоров?? И что, , 8-ми разрядной Atmega328 не хватит для радиоуправления?

Ozyris
kapelan:

на существующую аппаратуру исходников нет

Все есть, только надо ли? Купить приемник выйдет намного дешевле, чем сделать самому. Если цель обучение, тогда другое дело.

Olger_spb

так самому можно сделать приемник (да и пульт) с нужными тебе размерами и с нужными тебе функциями

kapelan
Ozyris:

Все есть, только надо ли? Купить приемник выйдет намного дешевле, чем сделать самому. Если цель обучение, тогда другое дело.

надо. кидайте ссылочку - сотворим супер девайс