Programmieren eines Mähroboters mit dem Arduino Mega 2560

Hallo Leute ich hoffe ihr könnt mir helfen,

ich tüftle an einem Mähroboter den ich selbst gebaut und mit diversen Teilen dimensioniert habe.
Jetzt bin ich gerade dabei das Programm zu schreiben und merke, das das gar nicht so einfach ist wie ich mir das dachte:

Ich habe 2 Sicherheitsendlagenschalter eingebaut, die den Mähmotor ausschalten sollen (Motortreiber L298N), sobald er angehoben wird. (Endlagenschalter sind über interne Pullup Widerstande im Arduino angeschlossen siehe Programm).

Desweiteren sind 2 Endlagen mit einer Stoßstange vorne montiert, damit erkannt werden kann, von welcher Seite der Roboter anstößt. Jenachdem soll der Motortreiber (L298N) die jeweiligen Motoren ansteuern und zurückfahren und dabei in einer bestimmten Zeit drehen. Danach soll er weiter fahren bis er zum nächsten Hinderniss kommt (Wie ein einfacher Staubsaugerroboter eben)

Der Arduino und die 3 Motoren werden über eine 12V Gleichspannung (Bleiakku) angetrieben und die gesamte Anlage kann mit einem Schalter Ein/Aus geschaltet werden.

Später soll er weiter ausgebaut und verfeinert werden.

Hier mein derzeitiger Programmcode:
(code tags please!)

int w = 50; //Vereinfachung Sicherheitsschalter S1
int x = 51; //Vereinfachung Sicherheitsschalter S2
int y = 52; //Endschalter Links
int z = 53; //Endschalter Rechts

void setup()
{
 Serial.begin(9600);       //Starte mit Baudenrate 9600
 pinMode(50, INPUT);     //Sicherheitsschalter S1
 digitalWrite(50, HIGH);  //schaltet den Pullup Widerstand ein
 pinMode(51, INPUT);    //Sicherheitsschalter S2
 digitalWrite(51, HIGH);  //schaltet den Pullup Widerstand ein
 pinMode(52, INPUT);    //Endschalter Links
 digitalWrite(52, HIGH); //schaltet den Pullup Widerstand ein
 pinMode(53, INPUT);    //Endschalter Rechts
 digitalWrite(53, HIGH); //schaltet den Pullup Widerstand ein

 pinMode(24, OUTPUT);   //Ansteuerung 1 Mähmotor 
 pinMode(26, OUTPUT);   //Ansteuerung 2 Mähmotor 
 
 pinMode(44, OUTPUT);   //Ansteuerung 1 Motor Rechts
 pinMode(46, OUTPUT);   //Ansteuerung 2 Motor Rechts
 pinMode(6, OUTPUT);    //PWM Signal Motor Rechts

 pinMode(34, OUTPUT);   //Ansteuerung 1 Motor Links
 pinMode(36, OUTPUT);   //Ansteuerung 2 Motor Links
 pinMode(2, OUTPUT);    //PWM Signal Motor Links
}

void loop()
{  
 if ( w==x, LOW)            //Wenn S1 und S2 nicht Low sind, dann
{
 digitalWrite (24, LOW);  
 digitalWrite(26, LOW);   //Mähmotor stoppt (Vollbremsung) 
}
 else                              //Wenn S1 und S2 High sind, dann
{
 digitalWrite(24, HIGH);  
 digitalWrite(26, LOW);   //Mähmotor startet
}
 delay (5000);                //Warte 5 Sekunden für nächsten Befehl
 
 if ( y==z, HIGH)             //Wenn S3 und S4 betätigt sind, dann
{
 digitalWrite(44, HIGH);  
 digitalWrite(46, LOW);   //Motor Rechts fährt vorwärts
 analogWrite(6, 255);     //Motor Rechts hat maximale Leistung 
 digitalWrite(34, HIGH);  
 digitalWrite(36, LOW);   //Motor Links fährt vorwärts
 analogWrite(10, 255);    //Motor Links hat maximale Leistung
}
 else if (y!=z, LOW)        //Wenn S3 betätigt und S4 nicht, dann
{
 digitalWrite(44, LOW);  
 digitalWrite(46, LOW);   //Motor Rechts bremst (Vollbremsung)
 analogWrite(6, 0);         //Motor Rechts hat minimale Leistung 
 digitalWrite(34, LOW);  
 digitalWrite(36, LOW);   //Motor Links bremst (Vollbremsung)
 analogWrite(10, 0);      //Motor Links hat minimale Leistung
 delay (5000);               //Warte 5 Sekunden
 digitalWrite(44, LOW);  
 digitalWrite(46, HIGH);  //Motor Rechts fährt rückwärts
 analogWrite(6, 255);     //Motor Rechts hat maximale Leistung 
 delay (3000);               //Warte 3 Sekunden
}
 else (z!=y, LOW);        //Wenn S4 betätigt und S3 nicht, dann
{
 digitalWrite(44, LOW);  
 digitalWrite(46, LOW);   //Motor Rechts bremst Vollbremsung
 analogWrite(6, 0);        //Motor Rechts hat minimale Leistung 
 digitalWrite(34, LOW);  
 digitalWrite(36, LOW);   //Motor Links bremst (Vollbremsung)
 analogWrite(10, 0);      //Motor Links hat minimale Leistung
 delay (5000);               //Warte 5 Sekunden
 digitalWrite(34, LOW);  
 digitalWrite(36, HIGH);   //Motor Links fährt rückwärts
 analogWrite(6, 255);     //Motor Links hat maximale Leistung 
 delay (3000);               //Warte 3 Sekunden
}
}

Mein Problem ist, das der Arduino immer das void loop abspielt. Was dazu führt, das der Mähroboter trotz ausgeschalteten Mähmotor losfährt, ob er garnicht mäht. Hat da jemand eine gute Idee oder einen anderen Ansatz, da ich zur Zeit nicht mehr weiter komme. Die delay Zeiten sind für mich damit ich ihn ruhe schauen kann ob er alles macht, später nehme ich sie raus oder kürze sie.
Der Programmcode müsste fehlerfrei sein, zumindestens kann ich ihn ohne Probleme übertragen.

Ich hoffe und bedanke mich schonmal fürs durchlesen. Vll findet sich einer der mir Helfen kann.

Mit Freundlichen Grüßen

aus Leipzig

Fang mit Basics, vorallem mit blinkwithoutdelay!!

Sicherheitsketten werden so nicht aufgebaut werden. Sowas wird direkt über den Strompfad erledigt! Sprich die Sensoren müssen den L298 direkt ausschalten können. Lediglich eine Überwachung des Signals kannst du mit dem Arduino machen.

Was für Motoren kommen hier zum Einsatz. Vom Gefühl her sage ich, der L298 ist unterdimensioniert für ein Mähwerk.

??

if ( w==x, LOW)

if ( (w==LOW) && (x==LOW) )

Hallo,

hier hatte sein Zwillingsbruder zufällig genau die gleiche Idee. :grin:

Link

Zwillinge haben selten den gleichen Namen,

aber dass du fremdgehst, ts, ts, ts...