Реализация проекта:Связка Taranis QX7 +приемник на NRF24
Еще раз ссылка на данную реализацию,только через usb:
Там рядом версия с PPM приемником.
Таранис транслирует ppm сигнал в ардуину,потом все это уходит в эфир через nrf,далее принимающая сторона на nrf через ардуино ppm сигнал дешифрует на несколько pwm
Олег выше ссылку давал для приемника с PWM
Олег,Станислав,спасибо,буду разбираться!
Может я плохо искал,но frsky-приемника за 10 зеленых я не нашел.
“Frsky d8 receiver” забейте на банггуде
А разве frsky d8 не под внешний модуль djt?
А разве frsky d8 не под внешний модуль djt?
В обычном Q X7 есть поддержка приемников D8
Может я плохо искал,но frsky-приемника за 10 зеленых я не нашел.
Самое дешевое,что есть-это RXF801 на али и бангуде от 1000 руб и то под вопросом.
Конечно можно и аппу взять бу за «бесплатно» типа fly,но если есть подобные готовые решения на примере беспроводного симулятора на nrf и usb,то может кто поделится подобным.!?
не реклама
banggood.com/2_4G-4CH-Mini-Frsky-D8-Compatible-Rec…
Добрый день!
Вот сваял проект приемника из 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]); //
}
}