Hallo Ich bin noch dabei eine DIY RC Fernbedienung zu bauen.
Ich habe schon geschafft ein selbstgebauten Sender und Empfänger herzustellen.
Diese funktionieren simpel, PPM in den Sender rein und es kommt ein PPM Signal am Empfänger raus.
Nun zur eigentlichen Aufgabe in dieser Topic:
Ein PPM Signal zu erzeugen, dazu habe ich ein funktionierendes Beispiel weiter unten im Text.
Das ganze muss aber noch erweitert werden um:
- Anlaoge Potis sollen eingelesen werden und 6 Kanäle belegen
- Ein Taster soll bei Tastendruck ein kanal 7 bzw 8 auf 2000 setzten und beim nächsten drücken wieder auf 1000
- Ein OLED 128X64 soll mir die aktuellen werte Anzeigen
Das Klingt nach einer RIESEN Aufgabe aber ich hoffe ich hab es bald fertig.
Danke
//this programm will put out a PPM signal
//////////////////////CONFIGURATION///////////////////////////////
#define chanel_number 8 //set the number of chanels
#define default_servo_value 1500 //set the default servo value
#define PPM_FrLen 22500 //set the PPM frame length in microseconds (1ms = 1000µs)
#define PPM_PulseLen 300 //set the pulse length
#define onState 1 //set polarity of the pulses: 1 is positive, 0 is negative
#define sigPin 8 //set PPM signal output pin on the arduino
//////////////////////////////////////////////////////////////////
/*this array holds the servo values for the ppm signal
change theese values in your code (usually servo values move between 1000 and 2000)*/
int ppm[chanel_number];
void setup(){
//initiallize default ppm values
for(int i=0; i<chanel_number; i++){
ppm[i]= default_servo_value;
}
pinMode(sigPin, OUTPUT);
digitalWrite(sigPin, !onState); //set the PPM signal pin to the default state (off)
cli();
TCCR1A = 0; // set entire TCCR1 register to 0
TCCR1B = 0;
OCR1A = 100; // compare match register, change this
TCCR1B |= (1 << WGM12); // turn on CTC mode
TCCR1B |= (1 << CS11); // 8 prescaler: 0,5 microseconds at 16mhz
TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt
sei();
}
void loop(){
//put main code here
static int val = 1;
//TEST SIGNAL von 1000-1700
ppm[0] = 1000;
ppm[1] = 1100;
ppm[2] = 1200;
ppm[3] = 1300;
ppm[4] = 1400;
ppm[5] = 1500;
ppm[6] = 1600;
ppm[7] = 1700;
delay(10);
}
ISR(TIMER1_COMPA_vect){ //leave this alone
static boolean state = true;
TCNT1 = 0;
if(state) { //start pulse
digitalWrite(sigPin, onState);
OCR1A = PPM_PulseLen * 2;
state = false;
}
else{ //end pulse and calculate when to start the next pulse
static byte cur_chan_numb;
static unsigned int calc_rest;
digitalWrite(sigPin, !onState);
state = true;
if(cur_chan_numb >= chanel_number){
cur_chan_numb = 0;
calc_rest = calc_rest + PPM_PulseLen;//
OCR1A = (PPM_FrLen - calc_rest) * 2;
calc_rest = 0;
}
else{
OCR1A = (ppm[cur_chan_numb] - PPM_PulseLen) * 2;
calc_rest = calc_rest + ppm[cur_chan_numb];
cur_chan_numb++;
}
}
}