INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Programmieren eines Mähroboters mit dem Arduino Mega 2560
30.03.2015, 20:14
Beitrag #1
Photo 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.

Bilder:
Übersicht Roboter    
Endlagenschalter Rechts/Links    
Sicherheitsschalter Mähmotor    

Später soll er weiter ausgebaut und verfeinert werden.

Hier mein derzeitiger Programmcode:

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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.03.2015, 21:09
Beitrag #2
RE: Programmieren eines Mähroboters mit dem Arduino Mega 2560
Hallo,
ohne jetzt jede Zeile deines Programmes gelesen zu haben wäre es möglich die Fahrbefehle in eine If Bedingung zu packen. Dazu könntest du eine Abfrage oder Variable für den Lauf des Mähmotores einbauen.

Gru? Sven

Nichts auf der Welt ist unnütz, es kann im schlimmsten Fall immer noch als schlechtes Beispiel dienen.
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.03.2015, 21:16
Beitrag #3
RE: Programmieren eines Mähroboters mit dem Arduino Mega 2560
Hi,
was ist denn Deine Erwartung bezüglich dieser Syntax?
Code:
if ( w==x, LOW)

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
31.03.2015, 15:41 (Dieser Beitrag wurde zuletzt bearbeitet: 31.03.2015 15:42 von Leipzig.)
Beitrag #4
RE: Programmieren eines Mähroboters mit dem Arduino Mega 2560
(30.03.2015 21:16)Thorsten Pferdekämper schrieb:  Hi,
was ist denn Deine Erwartung bezüglich dieser Syntax?
Code:
if ( w==x, LOW)

Hallo Thorsten,

ich meine damit die Bedingung für das Ausschalten des Motors der if Bedingung zu setzten.
Da ich die Software Pullup widerstände benutzt habe und somit die ganze Zeit eine logische 1 (High) am Pin anliegt. Wenn jetzt der Schalter gedrückt wird, dachte ich wird daraus ein 0=Low Signal was ich als Bedingung benutzten kann, nämlich das beide Schalter betätigt sein müssen, damit der Motor startet.

(30.03.2015 21:09)Eichner schrieb:  Hallo,
ohne jetzt jede Zeile deines Programmes gelesen zu haben wäre es möglich die Fahrbefehle in eine If Bedingung zu packen. Dazu könntest du eine Abfrage oder Variable für den Lauf des Mähmotores einbauen.

Gru? Sven

Danke dir Eichner, werde es mal heute Abend ausprobieren melde mich wenn es klappt.

Danke für den kleinen Denkanstoß.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
31.03.2015, 16:15
Beitrag #5
RE: Programmieren eines Mähroboters mit dem Arduino Mega 2560
(31.03.2015 15:41)Leipzig schrieb:  
Code:
if ( w==x, LOW)
ich meine damit die Bedingung für das Ausschalten des Motors der if Bedingung zu setzten.
Also der "Komma-Operator" bedeutet in dem Fall, folgendes: Zuerst wird "w==x" ausgewertet. Das Ergebnis davon ist aber egal, da bei dieser Verwendung des Kommas nur der letzte Ausdruck beachtet wird. D.h. das Ergebnis von "w==x,LOW" ist immer LOW, unabhängig von w und x. Da LOW, 0 und false im Prinzip dasselbe ist wird der Rumpf des if nie durchlaufen.
Was Du wahrscheinlich meinst ist folgendes:
Code:
if( w == LOW && x == LOW )
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
31.03.2015, 20:52 (Dieser Beitrag wurde zuletzt bearbeitet: 31.03.2015 20:55 von Leipzig.)
Beitrag #6
RE: Programmieren eines Mähroboters mit dem Arduino Mega 2560
(31.03.2015 16:15)Thorsten Pferdekämper schrieb:  
(31.03.2015 15:41)Leipzig schrieb:  
Code:
if ( w==x, LOW)
ich meine damit die Bedingung für das Ausschalten des Motors der if Bedingung zu setzten.
Also der "Komma-Operator" bedeutet in dem Fall, folgendes: Zuerst wird "w==x" ausgewertet. Das Ergebnis davon ist aber egal, da bei dieser Verwendung des Kommas nur der letzte Ausdruck beachtet wird. D.h. das Ergebnis von "w==x,LOW" ist immer LOW, unabhängig von w und x. Da LOW, 0 und false im Prinzip dasselbe ist wird der Rumpf des if nie durchlaufen.
Was Du wahrscheinlich meinst ist folgendes:
Code:
if( w == LOW && x == LOW )
Gruß,
Thorsten

Guten Abend Thorsten,

ich habe die ganze Zeit am Projekt gewerkelt. Habe jetzt erstmal probehalber nur die Sicherheitsfunktion versucht zu realiesieren.
Das void setup lasse ich mal weg.

void loop()
{
if (digitalRead (x)==HIGH) //Wenn S2 nicht betätigt, dann
{
digitalWrite (24, LOW);
digitalWrite(26, LOW); //Mähmotor stoppt (Vollbremsung)
}
else //Wenn S2 betätigt, dann
{
digitalWrite(24, HIGH);
digitalWrite(26, LOW); //Mähmotor startet
}
}

dieses Programm geht und funktioniert auch. nur leider kann ich nicht

if (digitalRead (x && w)==HIGH) //Wenn S2 und S1 nicht betätigt, dann Aus

dann springt mein Motor garnicht mehr an. Egal ob einer oder beide Endschalter betätigt sind.
Ist doch so richtig, dass && für eine AND-Verknüpfung steht, so steht es zumindestens im Arduino Programmier Handbuch aus dem I-Net?
Wenn ich das mal erklärt bekomme, wie man 2 Variablen richtig verknüpfen kann in einer IF-Bedingung, dann wäre mir sehr geholfen.

Danke dir schonmal im Vorraus für die Mühe und Zeit.

Mit freundlichen Grüßen aus

Leipzig
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
31.03.2015, 21:36
Beitrag #7
RE: Programmieren eines Mähroboters mit dem Arduino Mega 2560
Hi,
oh, ich hatte nicht beachtet, dass x, y etc. für die Pin-Nummern stehen und nicht für die Zustände. Ok, fangen wir mal wieder an, das bisher gemachte zu zerlegen:
Code:
if (digitalRead (x && w)==HIGH)
Das wird dann sozusagen folgendermaßen ausgewertet:
x ist 51, w ist 50. Also ist "x && w" dasselbe wie "51 && 50". Da das "&&" ein boolescher Operator ist (also einer, der mit Wahrheitswerten umgeht), werden die Zahlen als true bzw. false interpretiert. 0 ist dabei false, alles andere true. Du hast da also "true && true" stehen, was als Ergebnis true ergibt. Deine Coding-Zeile ist also dasselbe wie:
Code:
if (digitalRead (true)==HIGH)
Die Funktion digitalRead erwartet eine Pin-Nummer. D.h. das true wird jetzt wieder als Zahl aufgefasst. Das kann jetzt irgendwas ungleich Null sein, aber ich denke, es ist 1. Du fragst damit also wahrscheinlich Pin 1 ab. Zufällig ist der anscheinend immer auf HIGH.

Das, was Du wahrscheinlich eigentlich willst, ist folgendes:
Code:
if( digitalRead(x) == HIGH && digitalRead(w) == HIGH )
D.h. es wird sowohl Pin x als auch Pin w abgefragt und das jeweilige Ergebnis wird mit HIGH verglichen. Wenn beide Vergleiche erfolgreich sind, dann geht's in den if-Ast.
Da LOW == 0 und HIGH <> 0, also ähnlich wie bei true und false, kann man auch kurz schreiben:
Code:
if( digitalRead(x) && digitalRead(w) )
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Arduino Mega 2560 und Ethernetshield mit SD Card OLDARDUINO 0 55 29.11.2016 09:50
Letzter Beitrag: OLDARDUINO
  Tasten eines E-Bike Controllers mit Arduino steuern skyflo 9 811 31.07.2016 16:35
Letzter Beitrag: hotsystems
  U-Boot zur Reinigung eines Aquariums Feli 7 2.604 03.07.2016 16:34
Letzter Beitrag: Binatone
  6 Projekte fuer Arduino MICRO, UNO, MEGA ... andreas002 20 9.757 28.11.2015 18:34
Letzter Beitrag: andreas002
  Tasterabfrage mit Arduino Mega 2560 robotzzz 13 3.359 19.09.2015 20:43
Letzter Beitrag: robotzzz
  Beispiel: Mega Uhr RTC DS3231 Anzeige auf LCD1602 HaWe 3 4.710 04.08.2015 21:26
Letzter Beitrag: HaWe
  Arduino Mega Netzwerkkarte MTML/CSS Haustechno 3 1.270 03.08.2015 21:18
Letzter Beitrag: Haustechno
  10-20 Volt Sensor am Arduino MEGA Nopody33 4 1.485 03.08.2015 10:57
Letzter Beitrag: Nopody33
  Steuerung eines höhenvestellbaren Luftfahrwerk m@rkus 1 1.610 05.05.2015 17:45
Letzter Beitrag: dqb312
  Datenlogger zur Auswertung Eines Ladeluftkühlers Vinreeb 18 3.899 20.04.2015 18:48
Letzter Beitrag: MaHa1976

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste