AlphaBot: Linienverfolger kalibrieren
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
unsigned int Messwerte[NUM_SENSORS]; // Meswert Array
/* Ports festlegen */
int IN1 = A1;
int IN2 = A0;
int IN3 = A2;
int IN4 = A3;
void setup() {
// put your setup code here, to run once:
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...");
for (int i = 0; i < 400; i++) // Die Kalibrierung dauert ca. 10s
{
trs.calibrate(); // alle Sensoren 10x auslesen
}
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");
}
void loop() {
/* Messwertdarstellung */
unsigned int position = trs.readLine(Messwerte);
for (unsigned char i = 0; i < NUM_SENSORS; i++)
{
Serial.print(Messwerte[i]);
Serial.print('\t');
}
Serial.print('\n'); // Serial.println(position); Zusätzliche Anzeige des gewichteten Mittelwerts
}
Linienverfolger
/* 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
unsigned int Messwerte[NUM_SENSORS]; // Meswert Array
/* Ports festlegen */
int IN1 = A1;
int IN2 = A0;
int IN3 = A2;
int IN4 = A3;
int ENA = 5; // Motoren Ports
int ENB = 6;
void setup() {
// put your setup code here, to run once:
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);
analogWrite(ENA,0);
analogWrite(ENB,0);
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");
}
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);
}
}

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