So, das Problem hab ich ein bisschen ruhen lassen, weil es nicht so wichtig war, aber nun wollt ich mich darum kuemmern.
Das Programm besteht aus 3 Teilen.
- Die "Main" funktion mit der Deklaration der Variablen, Hauptschleife usw.
- Dem Tab/ Der Funktion Checktransmitter, die den Wert vom RC Empfaenger einliest
- Der Funktion Sweep
Hier ist der Original Code, der funktioniert. Aendere ich allerdings waehrend des Wischzyklus den Wert vom RC Empfaenger, so dauert es einen Wischzyklus bis der neue Wert umgesetzt wird.
Main Programm
//Imports servo library
#include <Servo.h>
//Initializes servos
Servo servo;
unsigned long transmitterThrottlee=0; //these store the current transmitter positions/values
unsigned long transmitterThrottleeLow=0; //these store the current transmitter positions/values
//Constants for actual frequency, minimum target angle, and maximum target angle
const int minAngle=45;
const int maxAngle=135;
void setup()
{
servo.attach(11);
pinMode (9, INPUT); //Input of Throttle
transmitterThrottleeLow = ((pulseIn (9, HIGH, 100000))/10);
}
void loop()
{
checkTransmitter(); //check the data being received by the transmitter.
sweepfunction();
}
CheckTransmitterFunction
void checkTransmitter()
{
transmitterThrottlee = ((pulseIn (9, HIGH, 100000))/10)-transmitterThrottleeLow; //read RC channel, wait max of 0.1 seconds for pulse
if (transmitterThrottlee > 42000)
transmitterThrottlee =0;
}
Sweepfunction
void sweepfunction()
{
if(transmitterThrottlee>=5&&transmitterThrottlee<95)
{
for(int pos = minAngle; pos < maxAngle; pos+=1) // goes from 0 degrees to 180 degrees
{
servo.write(pos);
delay((transmitterThrottlee*-.1143)+13.4286);
}
for(int pos = maxAngle; pos > minAngle; pos-=1) // goes from 180 degrees to 0 degrees
{
servo.write(pos);
delay((transmitterThrottlee*-.1143)+13.4286);
}
}
else if(transmitterThrottlee>=95)
{
for(int pos = minAngle; pos < maxAngle; pos+=1) // goes from 0 degrees to 180 degrees
{
servo.write(pos);
delay(2);
}
for(int pos = maxAngle; pos > minAngle; pos-=1) // goes from 180 degrees to 0 degrees
{
servo.write(pos);
delay(2);
}
}
else
{
servo.write(90);
}
}
So nun habe ich dies Modifiziert in der Hoffnung, dass die Aenderung des RC Signales sofort in eine Geschwindigkeitsaenderung des Wischens umgesetzt wird.
Leider funktioniert anscheinend der Funktionsaufruf nicht.
Erneut MainFunction (alles identisch mit oben, bis auf dass die Function checkTransmitter nicht mehr aufgerufen wird. Dies passiert in der Funktion sweepfunction.Daher nur die main loop, den Rest spare ich ma aus.)
void loop()
{
sweepfunction();
}
Checktransmitterfunction
identisch, siehe oben
Sweepfunction
void sweepfunction()
{
int i=0;
checkTransmitter();
if(transmitterThrottlee>=5&&transmitterThrottlee<95)
{
for(int pos = minAngle; pos < maxAngle; pos+=1) // goes from 0 degrees to 180 degrees
{
if (i=5) // habe dies aus dem folgenden Grund gemacht, dass alle 5 Grad Wischaenderung eine "Ueberpruefung"
{ //erfolgt, ob das RC Signal noch das Selbe ist, und Falls nicht sollte mit dem neuen weitergearbeitet
checkTransmitter(); //werden. Aber wo ist der Fehler? Wieso wird der neue Wert nicht in die Haupt For Schleife uebernommen
i=0;
}
i++;
servo.write(pos);
delay((transmitterThrottlee*-.1143)+13.4286);
}
for(int pos = maxAngle; pos > minAngle; pos-=1) // goes from 180 degrees to 0 degrees
{
if (i=5)
{
checkTransmitter();
i=0;
}
i++;
servo.write(pos);
delay((transmitterThrottlee*-.1143)+13.4286);
}
}
else if(transmitterThrottlee>=95)
{
for(int pos = minAngle; pos < maxAngle; pos+=1) // goes from 0 degrees to 180 degrees
{
if (i=5)
{
checkTransmitter();
i=0;
}
i++;
servo.write(pos);
delay(2);
}
for(int pos = maxAngle; pos > minAngle; pos-=1) // goes from 180 degrees to 0 degrees
{
if (i=5)
{
checkTransmitter();
i=0;
}
i++;
servo.write(pos);
delay(2);
}
}
else
{
servo.write(90);
}
}
Hoffe, mein anliegen wird nun klarer und verstaendlicher.
MfG