PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RC Empfänger auswerten...



Spacecam
07.05.2015, 10:24
Hallo Leute,
ich möchte mit meinen Arduino einen RC Empfänger auswerten. Allerdings gleich 5 Kanäle.

Ich habe mal im Netz rumgeschaut und bin auf die Datei #include <RCReceive.h> gestoßen.

Anbei dieses Beispiel:


include "makros.h"
#include "debug.h"
#include "RCReceive.h"

const byte PIN_RC = 7;

// Der Empfänger
RCReceive rcReceiver;

void setup() {
Serial.begin(9600);
rcReceiver.attach(PIN_RC);

// put your setup code here, to run once:
}

void loop() {
// Aktuellen RC-Wert lesen
rcReceiver.poll();

// Nullpunktsbestimmung ?
if (rcReceiver.hasNP() && !rcReceiver.hasError()) {
doWork();
} else if (rcReceiver.hasError()) {
// Fehlerbehandlung failsafe oder sowas...
}
}

void doWork() {
byte value = rcReceiver.getValue();
Serial.print(value);
// put your main code here, to run repeatedly:

}

Dieser läuft auch wunderbar... aber wenn ich nun mehr als einen Kanal nutze wird der Script unglaublich Langsam.


Ich möchte eine Kamera über meine Funke bedienen. Dafür schalte ich mit Dioden die einzelnen Schalter -> das geht wunderbar.

Würde mich freuen wenn mir jemand bei den RC Problem helfen könnte.


MFG

- - - Aktualisiert - - -


Der Zweite Code laggt:

#include "makros.h"
#include "debug.h"
#include "RCReceive.h"

int zoomin = 3;
int zoomout = 5;
int foto = 4;
int Focus = 2;
int Video = 6;



const byte PIN_RC7 = 7;
const byte PIN_RC8 = 8;
// Der Empfänger
RCReceive rcReceiver;
RCReceive rcReceiver2;
void setup() {
rcReceiver.attach(PIN_RC7);
rcReceiver2.attach(PIN_RC8);
// put your setup code here, to run once:
}

void loop() {
pinMode(zoomin, OUTPUT);
pinMode(zoomout, OUTPUT);
// Aktuellen RC-Wert lesen
rcReceiver.poll();
rcReceiver2.poll();

// Nullpunktsbestimmung ?
if (rcReceiver.hasNP() && !rcReceiver.hasError()) {
zoomfunktion();
} else if (rcReceiver.hasError()) {
// Fehlerbehandlung failsafe oder sowas...
}

if (rcReceiver2.hasNP() && !rcReceiver2.hasError()) {
fotofunktion();
} else if (rcReceiver2.hasError()) {
// Fehlerbehandlung failsafe oder sowas...
}
}

void zoomfunktion() {
byte zoom = rcReceiver.getValue();

//Zoom
if(zoom > 150){
digitalWrite(zoomin, HIGH);

}else{
digitalWrite(zoomin, LOW);
}

if(zoom < 100){
digitalWrite(zoomout, HIGH);

}else{
digitalWrite(zoomout, LOW);
}





}

void fotofunktion () {
//Foto
byte foto = rcReceiver2.getValue();

if(foto > 150){
digitalWrite(foto, HIGH);

}else{
digitalWrite(foto, LOW);
}
}

Rabenauge
07.05.2015, 14:14
Da, wo du das "gefunden" hast, steht auch, wie mans macht, wenn man es eilig hat.
Dafür gibts dann die Interrupt-Methode. Das hat man davon, wenn man einfach nur bissel was zusammenkopiert, aber die Doku nicht liest. Willie hat auf seiner Seite alles wunderschön erklärt und auch, was _nicht_ geht.

i_make_it
07.05.2015, 15:43
rcReceiver.poll();

Ohne weiter nachzusehen denke ich mal da liegt das Problem.
Deshalb die Empfehlung der "Interrupt Methode".


http://de.wikipedia.org/wiki/Polling_(Informatik)


Nachteile:


Durch Polling ist häufig die Leistungsfähigkeit von Programmen nicht-deterministisch (z. B. variierende FPS (https://www.roboternetz.de/wiki/Bildfrequenz)) und meistens geringer als mit Alternativlösungen.
Die Effizienz bei der Verwendung von Systemressourcen kann signifikant geringer sein als Alternativansätze. Beispielsweise kann eine naive Polling-Implementierung, z. B. ein mit maximaler Geschwindigkeit pollendes Programm, die Systemlast auf 100 % treiben (mit unnötigem Stromverbrauch und Abwärme), wogegen eine Event-basierte (https://www.roboternetz.de/wiki/Ereignis_(Programmierung)#Ereignisorientierte_Prog rammierung)- oder Hardwareinterrupt (https://www.roboternetz.de/wiki/Hardwareinterrupt)-Lösung praktisch keine Systemressourcen verbraucht.