Banner Ausblenden
Kleines Logo

Willkommen auf PSI-Online

Linienverfolgung

Linienverfolgung mit dem Arduino

 

Der Arduino soll bei diesem Programm einer weißen Linie auf dem Bodenfolgen. Er soll eigenständig zur Linie zurück finden können.

Verwendet wurden das Arduino Mega 2560 R3 4WD Mobile Car, zwei Lichtsensoren und eine Led.

Arduino Mega

Quelle: Sainsmart.com

 

Es wurde von einer weißen Linie ausgegangen die heller als 50 von 255 Einheiten des Lichtsensors ist.

 

Programm

 

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 sensorPin = A2;  //linker Sensor
int sensor2Pin = A3; // rechter Sensor
int ledPin = 13;
int sensorValue = 0;
int sensor2Value =0;
int ledState = 0;
int previousMillis = 0;
int Millis = 0;
int schnell = 200;
int mittel = 150;
int status_ = 0;
int status_alt = 0;

void setup () {
  Serial.println("Motor test!");
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
  pinMode(links_richtung,OUTPUT);
  pinMode(rechts_richtung,OUTPUT);
  pinMode(links_geschwindigkeit,OUTPUT);
  pinMode(rechts_geschwindigkeit,OUTPUT);
}

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 rechtskurvevorwaerts {  linksvor(schnell); rechtsvor(mittel);   }
void linkskurvevorwaerts  {  linksvor(mittel); rechtsvor(schnell);   }
void halt()               {  linkszurueck(0);   rechtszurueck(0);    }


void loop() {
 

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 sensorPin = A2;  //linker Sensor
int sensor2Pin = A3; // rechter Sensor
int ledPin = 13;
int sensorValue = 0;
int sensor2Value =0;
int ledState = 0;
int previousMillis = 0;
int Millis = 0;
int schnell = 200;
int mittel = 150;
int status_ = 0;
int status_alt = 0;

void setup () {
  Serial.println("Motor test!");
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
  pinMode(links_richtung,OUTPUT);
  pinMode(rechts_richtung,OUTPUT);
  pinMode(links_geschwindigkeit,OUTPUT);
  pinMode(rechts_geschwindigkeit,OUTPUT);
}

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 rechtskurvevorwaerts() {  linksvor(schnell); rechtsvor(mittel);   }
void linkskurvevorwaerts()  {  linksvor(mittel); rechtsvor(schnell);   }
void halt()               {  linkszurueck(0);   rechtszurueck(0);    }


void loop() {
   if (millis() - previousMillis >0){
   sensorValue = analogRead(sensorPin);

  Serial.println(sensorValue);
 
   digitalWrite(ledPin, HIGH);
   digitalWrite(sensorPin, HIGH);
   sensorValue = analogRead(sensorPin); 
   Serial.println(sensorValue);
   }
   if(millis() - previousMillis >100){
     sensor2Value = analogRead(sensor2Pin);
    
     Serial.println(sensor2Value);
    
     digitalWrite(ledPin, HIGH);
     digitalWrite(sensorPin, HIGH);
  
   if(sensorValue - sensor2Value >10) {
     linkskurvevorwaerts();
   }
   if(sensor2Value - sensorValue >10) {
     rechtskurvevorwaerts(); 
     }
      
       if(sensor2Value - sensorValue <10) {
         if(sensor2Value >50) {
             vorwaerts (schnell);
         }
       }

       //Ellipsenfahr      

 

Erklärung

 

Im Programm werden zunächst die einzelnen Pins festgelegt, wie Led's und Lichtsensoren. Danach werden einige einige Variablen geschaffen. Dazu zählen z.B. vorwaerts und rechtskurvevorwaerts. Darauf folgt der Void loop-Teil bei dem zunächst im Abstand von 10 ms die Lichtsensoren messen. Dies geschieht solange bis die Werte sich um mindestens 10 Einheiten unterscheiden. Ist dies der Fall fährt der Arduino eine Kurve zur helleren Seite. Zuletzt wird beim Vorwärtsfahren festgelegt, dass die Werte bei beiden Sensoren  50 oder höher betragen müssen. Sind die Werte jedoch kleiner als 50 fährt der Arduino  eine Ellipse und sucht dadurch nach der weißen Linie. Dadurch wird verhindert, dass der Arduino neben der weißen Linie vorwaerts fährt.

 

 

 

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