Fahrzeug bewegt sich in einem Raum
Das Projekt
In diesem Projekt soll der Arduino sich in einem Raum bewegen ohne gegen Wände, Gegenstände oder herumlaufende Menschen zu fahren. Dafür sollte ein Lichtsensor mit einem Steppermotor sich im Kreis drehen, messen, wo am meisten Platz ist und dann dort hin fahren.
Material
- Arduino Fahrzeug mit Arduino Mega
- Echosensor
- Steppermotor
- Kabel
- Sensor Shield
- Motor Shield
Vorgehensweise und Probleme:
Da das Fahrzeug zu diesem Zeitpunkt schon fertig gebaut war, musste hier nur noch ein Stepper-Motor angebaut werden. Hier gab es schon unser erstes Problem: Der Steppermotor hatte vier Anschlüsse, die in ein kleines Shield führten, und wir wussten nicht wirklich, wie das angeschlossen werden sollte. So teilten wir uns in zwei Untergruppen:
Hardware (Maxi und Maxi) und Software (Lukas und Carl Georg). Während die Hardwaregruppe sich also um den Motor kümmerte, versuchten wir den Code zuschreiben.
Zuerst schrieben wir nur den void loop(), um zu planen, was in welcher Reihenfolge passieren sollte. Damals wussten wir noch nicht, wie der Steppermotor programmiert wurde, deshalb sind im folgenden Code nur Platzhalter:
(dieser Code ist nicht die endgültige Fassung, sondern dient nur als Planung!)
Gleichzeitig bearbeiteten wir auch ein Versuchsprogramm für den Steppermotor, welches leider fehlschlug. Nach einigen Versuchen konnte der Motor sich in ca. 89° Schritten drehen, jedoch nicht zurück, was besonders wichtig ist, da sich sonst das Kabel des Sensor verheddert.
Nach einiger Zeit entstand dann doch ein (halbwegs) funktionierendes Programm für den Stepper:
Hier nun das Programm:
#include
#define STEPS 100
Stepper stepper(STEPS, 1, 4, 5, 8);
const int echovorne = 6;
const int triggervorne = 7;
const int echohinten = 2;
const int triggerhinten = 3;
const int links_richtung = 9; // IN 4, HIGH = Vorwärts, LOW = Rückwärts
const int rechts_richtung = 10; // IN 1, HIGH = Vorwärts, LOW = Rückwärts
const int rechts_geschwindigkeit = 11; // IN 2, 0 = langsam, 255 = schnell
const int links_geschwindigkeit = 12; // IN 3, 0 = langsam, 255 = schnell
int anfang = 0;
int mittel = 150;
int status_ = 0;
int status_alt = 0;
float cmvorne = 0;
float cmhinten = 0;
float abstand = 30;
float alt;
float wert;
int tatus;
void setup () {
Serial.begin(9600);
pinMode(links_richtung,OUTPUT);
pinMode(rechts_richtung,OUTPUT);
pinMode(links_geschwindigkeit,OUTPUT);
pinMode(rechts_geschwindigkeit,OUTPUT);
pinMode(triggervorne,OUTPUT);
pinMode(echovorne,INPUT);
pinMode(triggerhinten,OUTPUT);
pinMode(echohinten,INPUT);
tatus = 4;
}
void linksvor(int v) { digitalWrite(links_richtung,HIGH); analogWrite(links_geschwindigkeit,255-v);} //Rechte Seite wird dadurch nicht beeinflusst
void linkszurueck(int v) { digitalWrite(links_richtung,LOW); analogWrite(links_geschwindigkeit,v);} //Rechte Seite wird dadurch nicht beeinflusst
void rechtsvor(int v) { digitalWrite(rechts_richtung,HIGH); analogWrite(rechts_geschwindigkeit,255-v);} //Linke Seite wird dadurch nicht beeinflusst
void rechtszurueck(int v) { digitalWrite(rechts_richtung,LOW); analogWrite(rechts_geschwindigkeit,v);} //Linke Seite wird dadurch nicht beeinflusst
void vorwaerts (int v) { linksvor(v); rechtsvor(v); }
void rueckwaerts (int v) { linkszurueck(v); rechtszurueck(v); }
void rechtsdrehen (int v) { linksvor(v); rechtszurueck(v); }
void linksdrehen (int v) { linkszurueck(v); rechtsvor(v); }
void halt() { linkszurueck(0); rechtszurueck(0); }
void messen() {digitalWrite(triggervorne, LOW); delayMicroseconds(2); digitalWrite(triggervorne, HIGH); delayMicroseconds(10); digitalWrite(triggervorne, LOW);
cmvorne = pulseIn(echovorne, HIGH) / 58.0; cmvorne = (int(cmvorne * 100.0)) / 100.0;}
void messen_hinten() {digitalWrite(triggerhinten, LOW); delayMicroseconds(2); digitalWrite(triggerhinten, HIGH); delayMicroseconds(10); digitalWrite(triggerhinten, LOW);
cmhinten = pulseIn(echohinten, HIGH) / 58.0; cmhinten = (int(cmhinten * 100.0)) / 100.0;}
void loop(){
void messen(); //Abstand vorne messen
alt = cmvorne; //alt wird auf den gemessenen Wert gestellt
anfang += 1; // der Drehzähler beginnt: pro Durchgang +1
stepper.step(1); // =508.8 // festlegung der Umdrehungen
if (anfang > 508) { // Wenn es schon 508 Durchgäng gab, dann
stepper.setSpeed(0); // anhalten
anfang = 0; // den anfang auf 0 setzen
void messen(); //Abstand rechts messen
wert = cmvorne; // den gemessenen Wert als wert speichern
if (wert > alt) // Wenn der Wert größer als der Vorherige ist,
{alt = wert; // dann diesen auf alt setzen und
tatus = 1;}; //Status auf 1 setzen => rechts drehen
stepper.setSpeed(100); // Die Geschwindigkeit wieder auf 100 setzen
anfang += 1;
stepper.step(1); // =508.8
if (anfang > 508) {
stepper.setSpeed(0);
anfang = 0;
void messen_hinten(); //Abstand hinten
wert = cmhinten;
if (wert > alt)
{alt = wert;
tatus = 2;}; //Status wird auf 2 gesetzt => nach hinten drehen
stepper.setSpeed(100);
anfang += 1;
stepper.step(1); // =508.8
if (anfang > 508) {
stepper.setSpeed(0);
anfang = 0;
void messen(); //Abstand links
wert = cmvorne;
if (wert > alt) {alt = wert;
tatus = 3;}; //Status wird auf 3 gesetzt => links drehen
stepper.setSpeed(100);
anfang += 1;
stepper.step(1); // =508.8
if (anfang > 508) {
stepper.setSpeed(0);
anfang = 0;
stepper.setSpeed(100);
}}}}
else {stepper.setSpeed(100);}
//wert = void messen(); //Abstand rechts
if (tatus == 4) {
void halt();}
if (tatus == 0)
void vorwaerts();
void messen();
if (cmvorne < 30);
{void halt();
tatus = 4;}
if (tatus == 1) {
void rechtsdrehen();
delay(1000);
void vorwaerts();
void messen();
if (cmvorne < 30);
{void halt();
tatus = 4;}}
if (tatus == 2)
void rueckwaerts();
void messen();
if (cmvorne < 30);
{void halt();
tatus = 4;}
if (tatus == 3){
void linksdrehen();
delay(1000);
void vorwaerts();
void messen();
if (cmvorne < 30);
{void halt();
tatus = 4;}}
}
Viel Spaß mit dem Programm!