Реализация проекта:Связка Taranis QX7 +приемник на NRF24

klin1974

Добрый день!
Может кто поможет с реализацией проекта создания приемника для Тараньки на модуле:

(nrf24l01 или nrf24l01-pa-nla+Arduino(Nano).

С учетом перерытой информации ,как я понимаю в Тараньку надо воткнуть связку (nrf24l01 или nrf24l01-pa-nla+Arduino(Nano))через PPM ,как внешний передающий модуль.
Нужен скетч для прошивки ардуино для вывода на принимающей стороне: (nrf24l01 или nrf24l01-pa-nla+Arduino(Nano),четырех-пяти PWM каналов.
Приемник ес-но будет использоваться без контроллера.
P.S.
Возможна ли реализация на данной прошивке минимальная телеметрия по питанию и уровню сигнала?

Заранее спасибо.

dima043

Единственный вопрос. Зачем так делать ? На ардуино с модулем NRF24 можно и свой передатчик сделать и приемник. Но зачем делать то что уже есть ?

klin1974

Согласен,что есть много реализованных проектов с самодельными TX, на nrf-ке,но если уж есть на руках Таранька,а ребенку не хочется давать управлять пенолетом с приемником на r9slim+(дороговатое удовольствие с учетом того ,что пару квадриков уже улетело в небытиё),а сей девайс будет не особо жалко,как «расходный материал».

=HAP=

А не лучше купить приёмник за 10 зелёных

klin1974

Может я плохо искал,но frsky-приемника за 10 зеленых я не нашел.
Самое дешевое,что есть-это RXF801 на али и бангуде от 1000 руб и то под вопросом.
Конечно можно и аппу взять бу за «бесплатно» типа fly,но если есть подобные готовые решения на примере беспроводного симулятора на nrf и usb,то может кто поделится подобным.!?

EHOT

У Вас есть мультимодуль 4in1 для Тараниса?
Если нет, то Ваша идея имеет негативный смысл.
Если есть, то почему NRF24? Тогда как есть 2хканальные приемники с сервами по $16 на банггуде.

klin1974

Мультимодуля ес-но нет!
Почему негативный смысл?В чем проблема подать управляющий ppm с Тараньки на ардуинку и транслировать его через nrf.Далее принимающая сторона раскладывает ppm на pwm для серв!?Есть же готовое решение в инете на данной сборке только для usb(беспроводной симулятор на компе)
Двухканальные приемники на бангуде за 16 долларов для самолета?

rcopen.com/blogs/255272/23241

EHOT

я в сообщении темы про моторизацию пенолетов давал ссылки на приемники.
Но как я понимаю, смысл делать приемник из ардуины на NRF24 есть тогда, если УЖЕ есть внешний ВЧ модуль. За исключением, если хочется самому попридумывать. (вариант “чукча писатель” 😉 )
Если ВЧ модуля в пульт нет в наличии, то стоимость в деньгах и ВРЕМЕНИ всего оборудования (Tx+Rx) перевесит стоимость одного FrSky приемника.
Но ладно со стоимостью и со временем.
А будет ли чотко работать? Как Вы будете отлаживать эту связку с двумя неизвестными по обе стороны?

Для приемников по приведенным ссылкам нужно еще подобрать/реализовать подходящий протокол связи. Даже в рамках NRF24 их много.
Как вариант для вашей исходной затеи можно в ардуино прошить сильно усеченную(только для NRF24) прошивку 4in1. Это пока будет ВЧ модуль. Можно надеяться что подберете протокол. Как сделать приемник с PWM не разбирался, своих хотелок хватает.

EHOT

в барахолке продают FrSky V8R4-II
Надеюсь 4х каналов хватит? если да, то берите и летайте. Он нормально работает с внутренним ВЧ модулем QX7, не надо сочинять, отлаживать, бить, рвать волосы на …
кроме того можно исключить BEC, если есть HV сервы.

EHOT
klin1974:

есть много реализованных проектов с самодельными TX, на nrf-ке,но если уж есть на руках Таранька

Во встроенном модуле QX7 нет поддержки nrf и пр. протоколов. Это не мультимодуль. Только FrSky. И то не все.

klin1974

Коллеги!!!
Еще раз ссылка на данную реализацию,только через usb:
rcopen.com/blogs/255272/23241

Да понятно,что в Таранисе нет поддержки nrf.
Таранис транслирует ppm сигнал в ардуину,потом все это уходит в эфир через nrf,далее принимающая сторона на nrf через ардуино ppm сигнал дешифрует на несколько pwm

Ozyris
klin1974:

Еще раз ссылка на данную реализацию,только через usb:

Там рядом версия с PPM приемником.

klin1974:

Таранис транслирует ppm сигнал в ардуину,потом все это уходит в эфир через nrf,далее принимающая сторона на nrf через ардуино ppm сигнал дешифрует на несколько pwm

Олег выше ссылку давал для приемника с PWM

klin1974

Олег,Станислав,спасибо,буду разбираться!

MFer
klin1974:

Может я плохо искал,но frsky-приемника за 10 зеленых я не нашел.

“Frsky d8 receiver” забейте на банггуде

klin1974

А разве frsky d8 не под внешний модуль djt?

Ozyris
klin1974:

А разве frsky d8 не под внешний модуль djt?

В обычном Q X7 есть поддержка приемников D8

=HAP=
klin1974:

Может я плохо искал,но frsky-приемника за 10 зеленых я не нашел.
Самое дешевое,что есть-это RXF801 на али и бангуде от 1000 руб и то под вопросом.
Конечно можно и аппу взять бу за «бесплатно» типа fly,но если есть подобные готовые решения на примере беспроводного симулятора на nrf и usb,то может кто поделится подобным.!?

не реклама
banggood.com/2_4G-4CH-Mini-Frsky-D8-Compatible-Rec…

banggood.com/2_4G-8CH-D8-Mini-FrSky-Compatibel-Rec…

13 days later
klin1974

Добрый день!
Вот сваял проект приемника из NRF24 и аппаратуры имеющей PPM выход.
Ардуинка сразу подрубилась к PPM выходу.
Подцепил библиотеку PinChangeInt.h
Потом посмотрел уровни в Serial.
Подкорректировал пид-ы на сервах.Все крутится,вертится.
Будем испытывать теперь в полевых условиях.

TX

#include <Arduino.h>
#include <PinChangeInt.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <SPI.h>

#define PPM_PIN 6
#define MAX_CHANNELS 12
int EndPointLTx=988; // Нижняя граница pwm канала TX (подключаемого передатчика) в мкрсек.
int EndPointHTx=2016; // Верхняя граница pwm канала TX (подключаемого передатчика) в мкрсек.
int EndPServoL=30; // Нижняя граница серво в градусах.
int EndPServoH=150; // Верхняя граница серво в градусах.

RF24 radio(9, 10); //(CE, CSN)

byte transmit_data[4];

volatile int pwm_value[MAX_CHANNELS] = { 0 };
volatile int prev_time = 0;
volatile int curr_channel = 0;
volatile bool overflow = false;

void rising()
{
int tstamp = micros();

/* overflow should never acutally happen, but who knows… */
if(curr_channel < MAX_CHANNELS) {
pwm_value[curr_channel] = tstamp - prev_time;
if(pwm_value[curr_channel] > 2100) { /* it’s actually a sync */
pwm_value[curr_channel] = 0;
curr_channel = 0;
} else
curr_channel++;
} else
overflow = true;

prev_time = tstamp;
}

void setup()
{

Serial.begin(9600);

pinMode(PPM_PIN, INPUT_PULLUP);
PCintPort::attachInterrupt(PPM_PIN, &rising, RISING);

radio.begin(); //активировать модуль
radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток)
radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал
radio.setPayloadSize(12); //размер пакета, в байтах
radio.openWritingPipe( 0xAABBCCDD11LL); //мы - труба 0, открываем канал для передачи данных
radio.setChannel(120); //выбираем канал (в котором нет шумов!)
radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
radio.setDataRate (RF24_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
radio.powerUp(); //начать работу
radio.stopListening(); //не слушаем радиоэфир, мы передатчик

}

void loop()
{
transmit_data[0] = map(pwm_value[0], EndPointLTx, EndPointHTx, EndPServoL, EndPServoH);
transmit_data[1] = map(pwm_value[1], EndPointLTx, EndPointHTx, EndPServoL, EndPServoH);
transmit_data[2] = map(pwm_value[2], EndPointLTx, EndPointHTx, EndPServoL, EndPServoH);
transmit_data[3] = map(pwm_value[3], EndPointLTx, EndPointHTx, EndPServoL, EndPServoH);
radio.write(&transmit_data, sizeof(transmit_data));
}

RX

#include <Arduino.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <SPI.h>
#include <Servo.h>

byte recieved_data[4]; // массив принятых данных

byte servo1 = 2; // сервопривод 1 канала TX на 2 цифровом
byte servo2 = 3; // сервопривод 2 канала TX на 3 цифровом
byte servo3 = 4; // сервопривод 3 канала TX на 4 цифровом
byte servo4 = 5; // сервопривод 4 канала TX на 5 цифровом

RF24 radio(9, 10);
#define MAX_CHANNELS 12 // задания pwm каналов, не более 12(в настройках используемого передатчика выставить не более, чем в скетче)

Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;

void setup()
{
Serial.begin(9600);

myservo1.attach(servo1);
myservo2.attach(servo2);
myservo3.attach(servo3);
myservo4.attach(servo4);

radio.begin(); //активировать модуль
radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток) в ответ на входящий сигнал
radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал
radio.setPayloadSize(12); //размер пакета, в байтах
radio.openReadingPipe(1, 0xAABBCCDD11LL); //
radio.setChannel(120); //выбираем канал (в котором нет шумов!)
radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
radio.setDataRate (RF24_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
radio.powerUp();
radio.startListening();

}

void loop()
{
if(radio.available())
{
radio.read( &recieved_data, sizeof(recieved_data)); // чиатем входящий сигнал

myservo1.write(recieved_data[0]); //
myservo2.write(recieved_data[1]); //
myservo3.write(recieved_data[2]); //
myservo4.write(recieved_data[3]); //
}
}