AlphaBot: Linienverfolger kalibrieren: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung |
||
Zeile 12: | Zeile 12: | ||
<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 */ | |||
#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 | |||
} | |||
</pre> | </pre> | ||
</div> | </div> | ||
Zeile 19: | Zeile 86: | ||
<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 */ | |||
#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); | |||
} | |||
} | |||
</pre> | </pre> | ||
</div> | </div> |
Version vom 12. Mai 2022, 16:28 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 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