Banner Ausblenden
Kleines Logo

Willkommen auf PSI-Online

Sie befinden sich in: Unterrichtsangebote Fächer Fachbereich III Informatik Arduino_Hecker Fahrzeuge Fahrzeug bewegt sich in einem Raum

Fahrzeug bewegt sich in einem Raum

Das Projekt                                                                                                                      2.jpg

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

1.jpg

Schaltskizze.JPG

 

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:

void loop(){
  tatus = 0;                            //Status wird auf 0 gesetzt => vorne
  alt = analogRead(sensor);            //Abstand vorne
  drehen(STEPPER){90°};
  wert = analogRead(sensor);           //Abstand rechts
  if (wert > alt) {alt = wert &&
  tatus = 1};                           //Status wird auf 1 gesetzt => rechts
  drehen(STEPPER) {90°}
  wert = analogRead(sensor);           //Abstand hinten
  if (wert > alt) {alt = wert &&
  tatus = 2};                          //Status wird auf 2 gesetzt => hinten
  drehen(STEPPER) {270°};
  wert = analogRead(sensor);           //Abstand links
  if (wert > alt) {alt = wert &&
  tatus = 3};                          //Status wird auf 3 gesetzt => links
  
  if tatus == 0;
  void(vorne);
  if tatus == 1;
  void(rechts);
  if tatus == 2;
  void(hinten);
  if tatus == 3;
  void(links);
  
}

(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:

#include
 
#define STEPS  100
int anfang = 0;
Stepper stepper(STEPS, 1, 4, 5, 8);
 
void setup() {
  stepper.setSpeed(100);  
}
void loop() {
  anfang += 1;
  stepper.step(1);  //  =508.8
  
  if (anfang > 508) {
    stepper.setSpeed(0);
     anfang = 0;
     //messen
     delay(1000);
     stepper.setSpeed(100);}
 
}
 
 
Nächstes Problem: Das Stepperprogramm, den void()-Versuch und das Original-Programm verbinden, was sich schwieriger als erwartet gestaltete.

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!

 

 

 

 

 

 

Erstellt: Andreas Hecker (03.07.2014) Letzte Änderung: Andreas Hecker (03.12.2014)