Here is the transmitter code:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
const uint64_t pipeOut = 0xE8E8F0F0E1LL;
RF24 radio(9, 10);
struct MyData {
byte throttle;
byte yaw;
byte pitch;
byte roll;
};
MyData data;
void resetData()
{
data.throttle = 0;
data.yaw = 127;
data.pitch = 127;
data.roll = 127;
}
void setup()
{
radio.begin();
radio.setAutoAck(false);
radio.setDataRate(RF24_250KBPS);
radio.openWritingPipe(pipeOut);
resetData();
}
int mapJoystickValues(int val, int lower, int middle, int upper, bool reverse)
{
val = constrain(val, lower, upper);
if ( val < middle )
val = map(val, lower, middle, 0, 128);
else
val = map(val, middle, upper, 128, 255);
return ( reverse ? 255 - val : val );
}
void loop()
{
data.throttle = mapJoystickValues( analogRead(A3), 0, 500, 1023, true );
data.yaw = mapJoystickValues( analogRead(A2), 0, 500, 1023, false );
data.pitch = mapJoystickValues( analogRead(A1), 0, 500, 1023, true );
data.roll = mapJoystickValues( analogRead(A0), 0, 500, 1023, false );
radio.write(&data, sizeof(MyData));
}
And here is the receiver:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define channel_number 6
#define sigPin 2
#define PPM_FrLen 27000
#define PPM_PulseLen 400
int ppm[channel_number];
const uint64_t pipeIn = 0xE8E8F0F0E1LL;
RF24 radio(9, 8);
struct MyData {
byte throttle;
byte yaw;
byte pitch;
byte roll;
};
MyData data;
void resetData()
{
data.throttle = 0;
data.yaw = 127;
data.pitch = 127;
data.roll = 127;
setPPMValuesFromData();
}
void setPPMValuesFromData()
{
ppm[0] = map(data.throttle, 0, 255, 1000, 2000);
ppm[1] = map(data.yaw, 0, 255, 1000, 2000);
ppm[2] = map(data.pitch, 0, 255, 1000, 2000);
ppm[3] = map(data.roll, 0, 255, 1000, 2000);
}
void setupPPM() {
pinMode(sigPin, OUTPUT);
digitalWrite(sigPin, 0);
cli();
TCCR1A = 0;
TCCR1B = 0;
OCR1A = 100;
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS11);
TIMSK1 |= (1 << OCIE1A);
sei();
}
void setup()
{
resetData();
setupPPM();
radio.begin();
radio.setDataRate(RF24_250KBPS);
radio.setAutoAck(false);
radio.openReadingPipe(1,pipeIn);
radio.startListening();
}
unsigned long lastRecvTime = 0;
void recvData()
{
while ( radio.available() ) {
radio.read(&data, sizeof(MyData));
lastRecvTime = millis();
}
}
void loop()
{
recvData();
unsigned long now = millis();
if ( now - lastRecvTime > 1000 ) {
resetData();
}
setPPMValuesFromData();
}
#define clockMultiplier 2
ISR(TIMER1_COMPA_vect){
static boolean state = true;
TCNT1 = 0;
if ( state ) {
PORTD = PORTD & ~B00000100;
OCR1A = PPM_PulseLen * clockMultiplier;
state = false;
}
else {
static byte cur_chan_numb;
static unsigned int calc_rest;
PORTD = PORTD | B00000100;
state = true;
if(cur_chan_numb >= channel_number) {
cur_chan_numb = 0;
calc_rest += PPM_PulseLen;
OCR1A = (PPM_FrLen - calc_rest) * clockMultiplier;
calc_rest = 0;
}
else {
OCR1A = (ppm[cur_chan_numb] - PPM_PulseLen) * clockMultiplier;
calc_rest += ppm[cur_chan_numb];
cur_chan_numb++;
}
}
}
I am using the NRF24 radio module to make the communication.