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

PigTail

Общая мысль была в том, что не сателлит не биндится к передатчику у Дмитрия, а передатчик при бинде с голым сателлитом не понимает какой приемник и какой протокол надо гнать на вч-модуль, т.е бинд не происходит на стороне передатчика.
Вот собственно цитата от Спектрума
Q: Sometimes my receiver loses its bind and won’t connect requiring rebinding. What happens if the bind is lost in flight?
A: The receiver will never lose its bind unless it’s instructed to. It’s important to understand that during the binding process the receiver not only learns the GUID (code) of the transmitter but the transmitter learns and stores the type of receiver that it’s bound to. If the transmitter is placed into bind mode, the transmitter looks for the binding protocol signal from a receiver. If no signal is present, the transmitter no longer has the correct information to connect to a specific receiver and in essence the transmitter has been “unbound” from the receiver. We’ve had several DX7 customers that use transmitter stands or trays that unknowingly depress the bind button and the system is then turned on losing the necessary information to allow the connection to take place. We’ve also had DX7 customers that didn’t fully understand the range test process and pushed the bind button before turning on the transmitter also causing the system to “lose its bind.”
Т.е. получается, что слишком умные Спектрумовские передатчики вроде как не должны работать с голым сателлитом, если только не присоединить на время бинда им подходящий приемник 😦

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, которую буду использовать.