Moin, moin...
Ich bin neu im Thema Arduino und möchte mir eine Sicherheitsschaltung für meinen RC Truck bauen.
Die Grundidee : Die Arduino Platine empfängt auf einem Pin das Servosignal für den Fahrregler (Vorwärts/Rückwärts) und leitet diesen auf einem anderen Pin weiter. In regelmäßigen Abständen misst die Platine mit einem Ultraschallsensor (Parallax) die Entfernung zu nahen Objekten. Wenn ein Objekt näher als 10 cm ist, soll die Weiterleitung des Signals unterbrochen werden, der Truck hält an.
Dazu habe ich eine entsprechende Platine und ein Breadboard bestückt. Eine grüne LED sagt alles OK, eine rote sagt Hindernis!!.
Soweit so gut.
Hier nun erst einmal der Code:
int digitalIn = 8;
int digitalOut = 11;
const int ledPinRed = 5;
const int ledPinGreen = 3;
const int sensorPin = 4;
int nDistance = 999;
int nLastMillis = 0;
void setup( )
{
Serial.begin( 9600 );
pinMode( digitalIn, INPUT );
pinMode( digitalOut, OUTPUT );
pinMode( ledPinRed, OUTPUT );
pinMode( ledPinGreen, OUTPUT );
nLastMillis = millis( );
}
int GetDistance( )
{
// wir intialisieren den Sensor, indem wir ihm einen kurzen "Low"-Pulse senden,
// dann einen 5 mS "High-Pulse"
pinMode(sensorPin, OUTPUT);
digitalWrite(sensorPin, LOW);
delayMicroseconds(2);
digitalWrite(sensorPin, HIGH);
delayMicroseconds(5);
digitalWrite(sensorPin, LOW);
// wir benutzen denselben Pin als Eingang und berechnen die Dauer des Pulses zwischen
// ausgehendem und eingehendem Signal
pinMode(sensorPin, INPUT);
nDistance = pulseIn(sensorPin, HIGH) / 29 / 2;
// wir berechnen die Entfernung aus der Zeitdifferenz
}
void loop()
{
int nMillis = millis( );
if ( ( nMillis - nLastMillis ) > 500 )
{
// Die letzte Messung war mehr als 500ms her
GetDistance( );
nLastMillis = nMillis;
}
if ( nDistance < 10 )
{
// Hier machen wir erst einmal nix.
// Spaeter soll hier ein Null-Signal (Knueppel losgelassen) simuliert werden.
digitalWrite( ledPinRed, HIGH );
digitalWrite( ledPinGreen, LOW );
}
else
{
digitalWrite( ledPinRed, LOW );
digitalWrite( ledPinGreen, HIGH );
digitalWrite( digitalOut, digitalRead( digitalIn ) );
}
delay(10);
}
Mein Problem ist nun, dass die Zeile digitalWrite( digitalOut, digitalRead( digitalIn ) ); IMMER ausgeführt wird, egal ob die rote oder die grüne LED leuchtet, egal ob der if oder der else Zweig ausgeführt wird. Wenn ich die Zeile in den If Block packe, steht der Servo am Anfang erst einmal still, es erfolgt keine Weiterleitung. Erst wenn ein Hindernis auftaucht bewegt er sich. Nehme ich dann das Hindernis aber wieder weg, schaltet die grüne LED wieder, aber die Weiterleitung bleibt aktiv !!!
Ich verstehe es nicht. Es scheint so als ob Arduino nach dem ersten read/write die Verbindung dauerhaft herstellt.
Kann mir jemand sagen was hier schief läuft ?
Greetinx
Peter