
Hatte ich vergessen anzupassen als ich GND und Vin getauscht habe.
Ist natürlich richtig, die LEDs müssen natürlich gedreht werden.
Mittlerweile habe ich das Einlesen der Empfängerkanäle ohne externe Bibliothek versucht. Siehe da, es ist einfacher als gedacht. Allerdings habe ich gelesen, das bei gleichzeitiger Ausgabe mittels der Servo-Bibliothek ungleiche Zyklen entstehen könen. Schuld sollen die Interrupts sein, die die Abarbeitungszeit der Schleifen durcheinander wirbeln können.helifan10 hat geschrieben:also geplant sind mal drei Eingänge. Ich möchte eigentlich die Standardbibliothek nutzen.
Code: Alles auswählen
// Empf�nger Kan�le auslesen und via Serial wieder ausgeben.
const int BAUD_RATE = 9600;
const int PIN_RC_KANAL_01 = 3; // Ausgangs Kanal am Empf�nger 01 wird an die PWM Leitung 3 angeschlossen.
const int PIN_RC_KANAL_02 = 4; // Ausgangs Kanal am Empf�nger 02 wird an die PWM Leitung 4 angeschlossen.
const int PIN_RC_KANAL_03 = 5; // Ausgangs Kanal am Empf�nger 03 wird an die PWM Leitung 5 angeschlossen.
const int DELTA = 7; // Rauschunterdr�ckung bei der Ausgabe auf Serial.
int Kanal_01; // Variablen erzeugen, in denen der jeweilige Empf�nger-Kanal gespeichert wird.
int Kanal_02;
int Kanal_03;
int Kanal_01_alt; // hier liegen dann die alten Werte, die zur Rauschunterdr�ckung auf Serial gebraucht werden.
int Kanal_02_alt;
int Kanal_03_alt;
void setup() {
pinMode(PIN_RC_KANAL_01, INPUT);
pinMode(PIN_RC_KANAL_02, INPUT);
pinMode(PIN_RC_KANAL_03, INPUT);
Serial.begin(BAUD_RATE);
Serial.println("Mirkos Empfaenger Test 01");
}
void Werte_auf_Serial_ausgeben() {
int diff; // Differenz des neuen und alten Wertes zur Rauschunterdr�ckung bei der Serial Ausgabe
int neu_schreiben; // steuert, ob die Textausgabe erfolgen mu�, oder eben nicht
neu_schreiben = 0; // Null hei�t, die Werte sind noch gleich => keine neue Ausgabe
diff = abs(Kanal_01 - Kanal_01_alt); // Absolut Wert von der Differenz der alt und neu-Werte bilden.
if (diff > DELTA) { neu_schreiben = 1; } // Wenn Differenz gr��er als Raussperre, dann Text neu ausgeben.
diff = abs(Kanal_02 - Kanal_02_alt);
if (diff > DELTA) { neu_schreiben = 1; }
diff = abs(Kanal_03 - Kanal_03_alt);
if (diff > DELTA) { neu_schreiben = 1; }
if (neu_schreiben == 1) {
Serial.print("Kanal 01: ");
Serial.println(Kanal_01);
Serial.print("Kanal 02: ");
Serial.println(Kanal_02);
Serial.print("Kanal 03: ");
Serial.println(Kanal_03);
Serial.println();
}
Kanal_01_alt = Kanal_01; // den aktuellen Wert in den alt Speicher schreiben, weil jetzt wieder neu eingelesen wird.
Kanal_02_alt = Kanal_02;
Kanal_03_alt = Kanal_03;
}
void loop() {
Kanal_01 = pulseIn(PIN_RC_KANAL_01, HIGH, 25000); // Empf�nger Kanal 01 einlesen.
Kanal_02 = pulseIn(PIN_RC_KANAL_02, HIGH, 25000); // Empf�nger Kanal 02 einlesen.
Kanal_03 = pulseIn(PIN_RC_KANAL_03, HIGH, 25000); // Empf�nger Kanal 03 einlesen.
Werte_auf_Serial_ausgeben();
}
Das werde ich auch, wenn es so weit ist. Zuerst möchte ich (zumindest) alle Grundlagen von der Basis her einmal selbst im Texteditor geschrieben haben. Mir geht es zumindest so, das ich es dann wirklich verstanden habe.Crizz hat geschrieben:Schau dir mal den Quellcode von MultiWii an, vielleicht hilft dir das weiter.
Code: Alles auswählen
ISR(USART_RX_vect)
{
static unsigned char rc_byteposition;
rc_rawdata[rc_byteposition]=UDR0;
if((rc_rawdata[rc_byteposition]==0x81)|(rc_rawdata[rc_byteposition]==0x01)&&(rc_rawdata[rc_byteposition-1]==0xA8))
{
rc_rawdata[0]=rc_rawdata[rc_byteposition-1];
rc_rawdata[1]=rc_rawdata[rc_byteposition];
rc_byteposition=1;
rc_newdata=1;
}
rc_byteposition++;
}
Code: Alles auswählen
void uart_interpret(volatile unsigned char *last_channel_count, volatile unsigned char rc_rawdata[],unsigned int *rc_data, volatile unsigned char *rc_newdata)
{
unsigned char data_ok=0;
*last_channel_count=rc_rawdata[2];
if (*last_channel_count<4)
*last_channel_count=4;
if(*rc_newdata==1)
{ //Nur wenn neue Daten vorhanden sind werden diese auch ausgewertet.
data_ok=uart_check(rc_rawdata);
if(data_ok==1)
{
for (unsigned char byte = 0; byte < *last_channel_count; byte++ ) //Wird so oft verrechnet wie der Empfänger uns über die Anzahl im letzten Telegram angegeben hat
rc_data[byte] = (((unsigned long)(rc_rawdata[(byte << 1) + 3]) << 8) + rc_rawdata[(byte << 1) + 4]) / 38.4 - 187.5;
/*
Zur einfacheren Weiterverarbeitung werden alle Werte vom ursprünglichen Wertebereich Dezimal 7200 (bei -150% in der Funke) über Dezimal 12000 (0% in der Funke) bis Dezimal 16800 (+150% in der Funke) in 0-255 umgerechnet.
Effektiver Wertebereich erstreckt sich von Dezimal 46 (bei -100% in der Funke) über Dezimal 127 (bei 0% in der Funke) bis Dezimal 209 (bei +100% in der Funke). Das ganze ist nicht sehr genau (Rundungsfehler) aber
völlig ausreichend. Wer erkennt schon mehr als 200 verschiedene Stufen für die jeweilige Farbe. Wir Männer sehen höhstens 5 :-)
Formel ergibt sich: (16800 - 7200) / 255 (neuer Bereich 0-100%) - 191 (Offset entfernen)
rc_data Kanalzuordnung ist wie folgt:
rc_data[0] == Kanal 1
rc_data[1] == Kanal 2
rc_data[n] == Kanal n
*/
*rc_newdata=0; //Falls neue Daten da waren wird dieser Indikator wieder abgearbeitet zurückgesetzt
}
}
}