RP6 Fernsteuerung über RC-Empfänger
Hallo auch,
ich hab vor für meinen RP6 eine Art Fernsteuerung zu bauen.
Dazu habe ich von meinem damaligen Fluzeug noch Fernsteuerung und Empfänger sowie Servos übrig die alle noch funktionieren. (Bis auf die Akkus *g*)
Ich hatte mir überlegt, dass ich über Funk den RP6 am Anfang nur sage entweder vorwärts fahren, rückwärts fahren, links drehen oder rechts drehen. Alles einzeln also erstmal nicht manches gleichzeitig. Das kommt später evtl dazu.
Nun hab ich mir gedacht ich könnte ja das Signal des Empfängers irgendwie zur Fernsteuerung des RP6 nutzen. Da fängt aber auch schon mein Problem an. Der Empfänger gibt das empfangene Signal ja über eine Pulsweitenmodulation an die Servos weiter. Zumindest habe ich das so rausgefunden. Wie darf ich das denn aber verstehen. Pulst der zwischen 0V und +Vcc (Vcc nenn ich mal die Spannung die der über die Akkus bekommt) oder zw. -Vcc und +Vcc.
Und wenn er dann da die Pulsweite ändert, hat der dann ohne ein Signal nen Taktverhältnis von 1:1 und verschiebt das dann nur in Richtung von z.B. 2:1 bzw 1:2?
Falls der nämlich nur zw. 0 und +Vcc rumtaktet un da das Tastverhältnis ändert könnte ich ja einfach hingehen, das über ne Diode "gleichrichten" un dann an nen AD-wandler schicken. Wenn dann das Signal über dem wert von eben 1:1 ist soll er vorwärts fahren sonst rückwärts und für rechts und links eben analog dazu.
Liste der Anhänge anzeigen (Anzahl: 1)
Nochmal hallo
Nun habe ich die Funktion getestet, wie erwartet funktioniert das wunderbar:
Code:
// RC-Signal messen und auswerten 2.5.2008 mic
#include "rblib.h"
#include "rblib.c"
uint8_t servopos;
volatile uint16_t p=0;
void pause(uint16_t p_dauer)
{
p=p_dauer;
while(p);
}
uint16_t get_RC(uint8_t kanal)
{
uint16_t count=0;
if(kanal==1) // Erster RC-Kanal
{
while(PINA & 1); // warten bis Ende des aktuellen Impuls
while(!(PINA & 1)); // warten auf Ende Pause
while(PINA & 1) count++; // Impulslänge messen
}
return(count); // Zählwert übergeben
}
int main(void)
{
rblib_init();
DDRA |= 1;
servopos=0;
TCCR0 = (0 << WGM00) | (1 << WGM01); // CTC-Mode
TCCR0 |= (0 << COM00) | (0 << COM01); // ohne OCR-Pin
TCCR0 |= (0 << CS02) | (1 << CS01) | (0 << CS00); // prescaler /8
TIMSK = (1 << OCIE0); // Interrupt ein
OCR0 = 13;
sei();
servopos=40;
while(1)
{
writeInteger(servopos, 10);
writeString(" - ");
writeInteger(get_RC(1), 10);
writeString("\n\r");
servopos+=10;
if(servopos>170)
{
servopos=40;
writeString("\n\r");
pause(50);
}
pause(10);
}
return 0;
}
ISR(TIMER0_COMP_vect)
{
static uint16_t count=1;
if(count>servopos) PORTA&=~1; else PORTA|=1;
if(count<2000)count++; else { count=1; if(p) p--; }
}
Das Progamm steuert per ISR ein Servo an Pin ADC0 an. Gleichzeitig werden im Hauptprogramm am selben Pin die Impulslängen gemessen und angezeigt. (Ein auf Ausgang geschalteter Pin kann auch eingelesen werden: IR-Kommunikation mit dem RP6) Mit Prescaler /8 und OCR0=13 ist der Wert für Servomitte ungefähr 100 (Basis des Programms ist der Testcode meines aktuellen "Projekts"). Die Ausgabe am Terminal sieht so aus:
Code:
Terminal cleared!
[RP6BOOT]
[READY]
40 - 368
50 - 460
60 - 552
70 - 644
80 - 736
90 - 828
100 - 920
110 - 1012
120 - 1104
130 - 1196
140 - 1288
150 - 1380
160 - 1472
170 - 1564
40 - 368
50 - 460
60 - 552
Im Anhang nochmals meine minimale Lib auf Basis der RP6-Lib.
Gruß
mic