Самосдельный приемник Spektrum/JR на 11 и более каналов.

RW9UAO

нарыл давным давно, может поможет

Description:
Arduino sketch for binding with Spektrum RC satellite receivers.
Private Clone URL:
git@gist.github.com:ef01907a5c90dd66f987.git
spektrum_sat_bind.pde #
// Spektrum satellite binding
// quick test sketch by Sam Kelly, sam@3drobotics.com
// with info from rcgroups, mikrokopter, etc.

unsigned long time;
int inData[16];
int inByte;
int index = 0;

void setup()
{
Serial.begin(115200); // to print data to the terminal
SpektrumBind(); // to interface with the Spektrum sat
Serial1.begin(115200);
}

void loop()
{
while(Serial1.available() > 0)
{
for(index = 0; index <= 15; index++)
{
inByte = Serial1.read();
inData[index] = inByte;
Serial.print(inByte);
Serial.print(" ");
}
Serial.println();
}
}

void SpektrumBind(void)
{
unsigned char connected = 0;

UCSR1B &= ~(1 << TXCIE1); // disable Tx interrupt
UCSR1B &= ~(1 << TXEN1); // disable USART1 Tx
PORTD &= ~(1 << PORTD3); // disable pull-up
DDRD |= (1 << DDD3); // Tx as output
PORTD |= (1 << PORTD3); // Set HIGH to enable adapter regulator

UCSR1B &= ~(1 << RXCIE1); // disable Rx interrupt
UCSR1B &= ~(1 << RXEN1); // disable USART1 Rx
PORTD &= ~(1 << PORTD2); // disable pull-up

Serial.println(“Spektrum Satellite binding test.”);

while(time <= 10000) // Wait 10 seconds for spektrum sat connection
{
time = millis();
if(PIND & (1 << PORTD2))
{
connected = 1;
break;
}
}

if(connected)
{
Serial.println(“Connected! Bind now!”);
DDRD |= (1 << DDD2); // Rx as output

delay(90); // Delay after Rx startup

// === Update 2011-08-18 ===
// Bind mode data gathered from Spektrum DX8
// 2 low pulses: DSM2 1024/22ms (this works with Doug Weibel’s PPM Encoder firmware)
// 3 low pulses: no result
// 4 low pulses: DSM2 2048/11ms
// 5 low pulses: no result
// 6 low pulses: DSMX 22ms
// 7 low pulses: no result
// 8 low pulses: DSMX 11ms

//PORTD |= (1 << PORTD2); delayMicroseconds(116);
//PORTD &= ~(1 << PORTD2); delayMicroseconds(116);
//PORTD |= (1 << PORTD2); delayMicroseconds(116);
//PORTD &= ~(1 << PORTD2); delayMicroseconds(116);
//PORTD |= (1 << PORTD2); delayMicroseconds(116);
//PORTD &= ~(1 << PORTD2); delayMicroseconds(116);
//PORTD |= (1 << PORTD2); delayMicroseconds(116);
//PORTD &= ~(1 << PORTD2); delayMicroseconds(116);
//PORTD |= (1 << PORTD2); delayMicroseconds(116);
//PORTD &= ~(1 << PORTD2); delayMicroseconds(116);
PORTD |= (1 << PORTD2); delayMicroseconds(116);
PORTD &= ~(1 << PORTD2); delayMicroseconds(116);
PORTD |= (1 << PORTD2); delayMicroseconds(116);
PORTD &= ~(1 << PORTD2); delayMicroseconds(116);
PORTD |= (1 << PORTD2); delayMicroseconds(116);
}
else
Serial.println(“Timeout.”);

DDRD &= ~(1 << DDD2); // Rx as input
PORTD &= ~(1 << PORTD2);
}

Карабас

Приехал кварц на волшебную частоту 14,7456Мгц, и я решил подружить контролер atmega32 сателитом Spektrum. Для контроля принимаемые данные выводились в терминальную программу.
Биндим сателит с ar6200, смотрим чего приходит с сателита. Тут первый сюрприз - приходит не 6, а 7 каналов. Наводит на мысль, что в ar6200 может 7канал не распаян. Теперь биндим сателит с китайским 9к приемником с Хоббикинга. Тут уже два сюрприза: идут все 11 каналов и каждый из них 11бит разрядностью. Неужели DSMX? ;)В приложенном файле я кратенько обощил, что известно и что сам наэксперементировал. Остается вопрос: если 11битнаые данные имеют место быть, а на экране аппы режим DSM, это как то невяжется. Может это неполноценные 11 бит, младший разряд не используется или еще чего.

DSMX_11ch.rar

Aleksey_Gorelikov

11бит и ДСМХ - никак не связаны. 😃 11 бит - один из протоколов “верхнего уровня”. ДСМ2\дсмх - нижний.
По второму байту - информация интересна, надо будет посмотреть повнимательнее. А в остальном - не отличается от описанного мною ранее.

Карабас

А вот такой вопрос к Aleksey Gorelikov и остальным: какой смысл знать номер пришедшего пакета (1 или 2)? Пишу окончательную программу и собираюсь просто считывать номер канала из 3,4,5,6 бита? Первые 4 байта каждого пакета понятно - игнорируем.

Aleksey_Gorelikov

У меня есть предположение, что это какая-нибудь вынужденная мера для облегчения жизни приемнику. Может критичные для времени места есть. Может последовательность каналов стандартна и приемик не разбирает номер канала, а тупо пропускает биты номера канала, ориентируясь на известную последовательность и номер пакета. Одно могу сказать, что признак номера пакета есть как в 1024 разрешении, так и в 2048. Так что вряд-ли этот бит используется для определения типа протокола. Протокол скорее определяется по FF в конце пакета.

RW9UAO

в первом пакете первые 7 каналов, во втором - вторые 7 каналов.

Aleksey_Gorelikov

Так фишка в том, что у каждого канала есть идентификатор номера этого канала. Ну и смысл тогда сами пакеты между собой различать?

Карабас

Вобщем, написал я прошивочку для АТмега32, что была под рукой. Проверил на предмет дрожания серв, потом сформировал ППМ из 8 каналов и подал в симулятор. Все работает изумительно четко. Приписал функцию файлсейва по каналам. Проблемы начались, когда стал формировать второй канал ППМ, чтоб засунуть в него оставшиеся 9,10, 11 каналы пульта. Без второго 16-разрядного таймера в микроконтролере ну очень неудобно.Нужна мега128. Дрожание по каналам 9,10,11 удалось свести к приемлимому минимуму, но все равно непорядочек. Пока решил остановиться на достигнутом, потому что непонятно в каком направлении двигаться дальше. Все зависит от конкретной LRS, которую буду использовать.