AlphaBot: Linienverfolger kalibrieren: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Zeile 19: Zeile 19:
/* Die Sensoren 1..5 sind an die analogen Eingänge 0..4 angeschlosse */
/* Die Sensoren 1..5 sind an die analogen Eingänge 0..4 angeschlosse */
TRSensors trs =  TRSensors();      // Handle zum Sensor
TRSensors trs =  TRSensors();      // Handle zum Sensor
unsigned int Messwerte[NUM_SENSORS]; // Meswert Array
/* Ports festlegen */
int IN1 = A1;
int IN2 = A0;
int IN3 = A2;
int IN4 = A3;


/* Einmalige Systeminitialisierung              */
void setup() {
void setup() {
  // put your setup code here, to run once:
   Serial.begin(9600); // Init für serielle Ausgabe mit 9600 Baud
   Serial.begin(115200); // Achtung hohe Geschwindigkeit für den seriellen Monitor
  pinMode(ENA, OUTPUT);
  pinMode(ENB, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);


   Serial.println("Kalibrierung startet für 10s...");
   Serial.println("Kalibrierung startet für 10s...");
   for (int i = 0; i < 400; i++)                  // Die Kalibrierung dauert ca. 10s
   for (int i = 0; i < 400; i++)                  // make the calibration take about 10 seconds
   {
   {
     trs.calibrate();                            // alle Sensoren 10x auslesen
     trs.calibrate();                            // reads all sensors 10 times
   }
   }
   Serial.println("Kalibrierung beendet");
   Serial.println("Kalibrierung beendet");
Zeile 63: Zeile 46:
   }
   }
   Serial.println();
   Serial.println();
 
   delay(1000);
   delay(1000);
    
    
   Serial.println("SETUP beendet");
   Serial.println("SETUP beendet");
}
}
 
/* Main Schleife */
void loop() {
void loop() {
  /* Messwertdarstellung */
    unsigned int Messwerte[NUM_SENSORS]; // Meswert Array
     unsigned int position = trs.readLine(Messwerte);
     unsigned int position = trs.readLine(Messwerte);
     for (unsigned char i = 0; i < NUM_SENSORS; i++)
     for (unsigned char i = 0; i < NUM_SENSORS; i++)
Zeile 78: Zeile 59:
       Serial.print('\t');
       Serial.print('\t');
     }
     }
     Serial.print('\n'); // Serial.println(position); Zusätzliche Anzeige des gewichteten Mittelwerts
     Serial.println(position);
}
}
</pre>
</pre>
Zeile 86: Zeile 67:
<div style="width:1200px; height:300px; overflow:auto; border: 2px solid #088">
<div style="width:1200px; height:300px; overflow:auto; border: 2px solid #088">
<pre>
<pre>
/* Sensorbibliothek hinzufügen */
/* Bibliotheken hinzufügen */
#include "TRSensors.h"
#include "AlphaBot.h"                  // Arduino Bibliothek für die Motoren einbinden   
#include "TRSensors.h"                 // Tracker Sensor Bibliothek


#define NUM_SENSORS 5


/* Die Sensoren 1..5 sind an die analogen Eingänge 0..4 angeschlosse */
AlphaBot  Alf = AlphaBot();              // Instanz des AlphaBot wird erzeugt
TRSensors trs =   TRSensors();       // Handle zum Sensor
TRSensors trs = TRSensors();         // Instanz des Sensors wird erzeugt
unsigned int Messwerte[NUM_SENSORS]; // Meswert Array


/* Ports festlegen */
#define NUM_SENSORS 5                  // 5 Tracker Sensoren, Daten via I2C
int IN1 = A1;
unsigned int Messwerte[NUM_SENSORS];   // Meswert Array wird angelegt
int IN2 = A0;
int IN3 = A2;
int IN4 = A3;
int ENA = 5;  // Motoren Ports
int ENB = 6;


void setup() {
void setup() {
   // put your setup code here, to run once:
   // put your setup code here, to run once:
   Serial.begin(115200); // Achtung hohe Geschwindigkeit für den seriellen Monitor
   Serial.begin(9600); // Achtung hohe Geschwindigkeit für den seriellen Monitor
   pinMode(ENA, OUTPUT);
   KalibriereLinienVerfolger(); // kalibrierung des Linienverfolgers
  pinMode(ENB, OUTPUT);
 
  pinMode(IN1, OUTPUT);
 
  pinMode(IN2, OUTPUT);
   Serial.println("SETUP beendet");
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  analogWrite(ENA,0);
   analogWrite(ENB,0);


}
void loop() {
  unsigned int position = trs.readLine(Messwerte);
  Serial.println(position); // Istwert ausgeben
 
  /* 2-Punkt-Regler */
  if (position > 2000) {
    Alf.MotorRun(0, -80); // VZW um vorwärts zu fahren
  }
  else {
    Alf.MotorRun(-80, 0);
  }
}
void KalibriereLinienVerfolger() {
   Serial.println("Kalibrierung startet für 10s...");
   Serial.println("Kalibrierung startet für 10s...");
   for (int i = 0; i < 400; i++)                  // make the calibration take about 10 seconds
   for (int i = 0; i < 400; i++)                  // make the calibration take about 10 seconds
Zeile 125: Zeile 108:
   }
   }
   Serial.println("Kalibrierung beendet");
   Serial.println("Kalibrierung beendet");
 
 
   // Ausgabe der Minimalwerte während der Kalibrierung
   // Ausgabe der Minimalwerte während der Kalibrierung
   for (int i = 0; i < NUM_SENSORS; i++)
   for (int i = 0; i < NUM_SENSORS; i++)
Zeile 132: Zeile 115:
     Serial.print(' ');
     Serial.print(' ');
   }
   }
   Serial.println();  
   Serial.println();


    // Ausgabe der Maximalwerte während der Kalibrierung
  // Ausgabe der Maximalwerte während der Kalibrierung
   for (int i = 0; i < NUM_SENSORS; i++)
   for (int i = 0; i < NUM_SENSORS; i++)
   {
   {
Zeile 141: Zeile 124:
   }
   }
   Serial.println();
   Serial.println();
 
 
   delay(1000);
   delay(1000);
 
  Serial.println("SETUP beendet");
}
void loop() {
    unsigned int position = trs.readLine(Messwerte); // Istwert auslesen
    Serial.println(position);                        // Ausgabe des Istwertes: 2000 = Mitte
    if(position > 2000) {  // Linie ist rechts
      analogWrite(ENA,0);
      analogWrite(ENB,80); // Fahre nach rechts
    }
    else{                  // Linie ist links
      analogWrite(ENA,80); // Fahre nach links
      analogWrite(ENB,0);
    }
}
}
</pre>
</pre>
</div>
</div>
[[Datei:Linienverfolger.jpg|thumb|right|550px|Abb. 1: Motorenbezeichnung in Fahrtrichtung]]
[[Datei:Linienverfolger.jpg|thumb|right|550px|Abb. 1: Motorenbezeichnung in Fahrtrichtung]]


== Hausaufgaben bis zum 10. Termin ==
== Hausaufgaben bis zum 10. Termin ==

Version vom 12. Mai 2022, 17:32 Uhr

Autor: Prof. Dr.-Ing. Schneider

Inhalt des 9. Termins

  • Ich stelle Euch den Sensor "Linienverfolger" vor.
  • Wir kalibrieren den Sensor.
  • Wir lesen die Messwerte ein.
  • Wir programmieren einen 2-Punkt-Regler, um einer Linie zu folgen.

Quelltext

Kalibrierung

/* Sensorbibliothek hinzufügen */
#include "TRSensors.h"

#define NUM_SENSORS 5

/* Die Sensoren 1..5 sind an die analogen Eingänge 0..4 angeschlosse */
TRSensors trs =   TRSensors();       // Handle zum Sensor

/* Einmalige Systeminitialisierung               */
void setup() {
  Serial.begin(9600); // Init für serielle Ausgabe mit 9600 Baud

  Serial.println("Kalibrierung startet für 10s...");
  for (int i = 0; i < 400; i++)                  // make the calibration take about 10 seconds
  {
    trs.calibrate();                             // reads all sensors 10 times
  }
  Serial.println("Kalibrierung beendet");
  
  // Ausgabe der Minimalwerte während der Kalibrierung
  for (int i = 0; i < NUM_SENSORS; i++)
  {
    Serial.print(trs.calibratedMin[i]);
    Serial.print(' ');
  }
  Serial.println(); 

     // Ausgabe der Maximalwerte während der Kalibrierung
  for (int i = 0; i < NUM_SENSORS; i++)
  {
    Serial.print(trs.calibratedMax[i]);
    Serial.print(' ');
  }
  Serial.println();
  delay(1000);
  
  Serial.println("SETUP beendet");
}
/* Main Schleife */
void loop() {
    unsigned int Messwerte[NUM_SENSORS]; // Meswert Array
    unsigned int position = trs.readLine(Messwerte);
    for (unsigned char i = 0; i < NUM_SENSORS; i++)
    {
      Serial.print(Messwerte[i]);
      Serial.print('\t');
    }
    Serial.println(position);
}

Linienverfolger

/* Bibliotheken hinzufügen */
#include "AlphaBot.h"                   // Arduino Bibliothek für die Motoren einbinden    
#include "TRSensors.h"                  // Tracker Sensor Bibliothek


AlphaBot  Alf = AlphaBot();              // Instanz des AlphaBot wird erzeugt
TRSensors trs = TRSensors();          // Instanz des Sensors wird erzeugt

#define NUM_SENSORS 5                   // 5 Tracker Sensoren, Daten via I2C
unsigned int Messwerte[NUM_SENSORS];    // Meswert Array wird angelegt

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600); // Achtung hohe Geschwindigkeit für den seriellen Monitor
  KalibriereLinienVerfolger(); // kalibrierung des Linienverfolgers


  Serial.println("SETUP beendet");

}

void loop() {
  unsigned int position = trs.readLine(Messwerte);

  Serial.println(position); // Istwert ausgeben
  
  /* 2-Punkt-Regler */
  if (position > 2000) {
    Alf.MotorRun(0, -80); // VZW um vorwärts zu fahren
  }
  else {
    Alf.MotorRun(-80, 0);
  }
}
void KalibriereLinienVerfolger() {
  Serial.println("Kalibrierung startet für 10s...");
  for (int i = 0; i < 400; i++)                  // make the calibration take about 10 seconds
  {
    trs.calibrate();                             // reads all sensors 10 times
  }
  Serial.println("Kalibrierung beendet");

  // Ausgabe der Minimalwerte während der Kalibrierung
  for (int i = 0; i < NUM_SENSORS; i++)
  {
    Serial.print(trs.calibratedMin[i]);
    Serial.print(' ');
  }
  Serial.println();

  // Ausgabe der Maximalwerte während der Kalibrierung
  for (int i = 0; i < NUM_SENSORS; i++)
  {
    Serial.print(trs.calibratedMax[i]);
    Serial.print(' ');
  }
  Serial.println();

  delay(1000);
}
Abb. 1: Motorenbezeichnung in Fahrtrichtung

Hausaufgaben bis zum 10. Termin

  • Bastelt Euch einen Rundkurs.
  • Folgt der Linie auf dem Rundkurs.
  • Ist eine Fahrt in beide Richtungen möglich?


Hinweise:

  • Einen Artikel zum Linienverfolger findet Ihr hier.
  • Die Jumper von Block F müssen alle links gesetzt sein.

Musterlösung


→ zurück zum Hauptartikel: Projekt Alf