Hallo,
Ich baue als Schulprojekt einen Linienfolger-Roboter. Er soll einem schwarzen Klebeband entlang fahren. Dafür verwende ich zwei kleine dc motoren mit getriebe box .Ansteuerung der motoren funktioniert.
Da ich keine Infrarot sensoren zu verfügung habe, muss der Roboter mit einer Led(strahlt auf Boden) und einem ldr sensor erkennen ob Schwarz (wenig reflektion= Klebestreifen) oder Weiß(mehr reflektion=boden), bauen. Ich habe zwei ldr sensoren nebeneinander mit jeweils einer Led. Es soll so fahren werden, dass das Klebeband möglichts in der Mitte beider ldr sensoren bleibt und immer wenn ein ldr sensor auslöst gegengesteuert werden.
Damit der Roboter weiß welcher Wert für schwarz gilt und welcher für weiß wird im setup kalibriert indem man den roboter manuel jeweils auf weiß und schwarz schiebt.
Mein PROBLEM: die Motoren ändern nicht ihre Drehrichtung; wie in den If schleifen programmiert. Zudem, immer wenn schwarz an einem Sensor erkannt wird, hört der Arduino auf weitere informationen im Seriellen Moniotor auszugeben (Werte von "LdrL" und "LdrR" ). Er bleibt also irgendwo "stecken" was verhindert, dass er das void loop immer wieder von oben ausführt.
Ich habe aus Verzweiflung unterprogramme erstzellt, davor hat es aber auch nicht besser funktioniert
Ich weiß, dass ich es nicht gut erklärt habe, wenn ihr mehr infos braucht sagt bescheid.
LG
#include <Adafruit_MotorShield.h>
// Dezimalzahl um Geschwindigkeit der Motoren prozentual zu verändern
int Motorspeed = 1;
// Definition der Pins für die LDR-Sensoren
int LDR_LEFT_PIN = A5;
int LDR_RIGHT_PIN = A4;
// Variablen für die Kalibrierungswerte
int blackLeft, whiteLeft, blackRight, whiteRight;
// Variablen, die angeben, ob schwarz oder weiß erkannt wurde (schwarz=2; weiß=1)
int LdrL = 0;
int LdrR = 0;
// Motor Shield Objekt und Motoren initialisieren
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_DCMotor *MotorL = AFMS.getMotor(1);
Adafruit_DCMotor *MotorR = AFMS.getMotor(2);
void setup() {
// Initialisiere seriellen Monitor
Serial.begin(9600);
// Kalibrierung für den linken LDR-Sensor
Serial.println("Bitte schwarzen Wert für linken Sensor messen...");
delay(3000); // Warte 3 Sekunden, um Zeit zu geben, auf Klebeband zu schieben
blackLeft = analogRead(LDR_LEFT_PIN);
Serial.print("Schwarz (links): ");
Serial.println(blackLeft);
Serial.println("Bitte weißen Wert für linken Sensor messen...");
delay(3000); // Warte 3 Sekunden, um Zeit zu geben, auf Holz zu schieben
whiteLeft = analogRead(LDR_LEFT_PIN);
Serial.print("Weiß (links): ");
Serial.println(whiteLeft);
// Kalibrierung für den rechten LDR-Sensor
Serial.println("Bitte schwarzen Wert für rechten Sensor messen...");
delay(3000); // Warte 3 Sekunden, um Zeit zu geben, auf Klebeband zu schieben
blackRight = analogRead(LDR_RIGHT_PIN);
Serial.print("Schwarz (rechts): ");
Serial.println(blackRight);
Serial.println("Bitte weißen Wert für rechten Sensor messen...");
delay(3000); // Warte 3 Sekunden, um Zeit zu geben, auf Holz zu schieben
whiteRight = analogRead(LDR_RIGHT_PIN);
Serial.print("Weiß (rechts): ");
Serial.println(whiteRight);
// Initialisiere das Motor Shield
AFMS.begin();
//Rechne Geschwindigkeit aus
MotorR->setSpeed(110 * Motorspeed);
MotorL->setSpeed(107 * Motorspeed);
//Motoren armen (entsischern)
MotorR->run(RELEASE);
MotorL->run(RELEASE);
}
void loop() {
// Lesen der aktuellen Werte der LDR-Sensoren
int currentLeft = analogRead(LDR_LEFT_PIN);
int currentRight = analogRead(LDR_RIGHT_PIN);
Serial.print("LdrL: ");// Überprüfen, ob der linke Sensor schwarz erkennt
if (currentLeft <= (blackLeft + whiteLeft) / 2) {
LdrL = 2;
Serial.print("Schwarz");
} else {
LdrL = 1;
Serial.print("Weiß");
}
Serial.print(" - LdrR: ");// Überprüfen, ob der rechte Sensor schwarz erkennt
if (currentRight <= (blackRight + whiteRight) / 2) {
LdrR = 2;
Serial.print("Schwarz");
} else {
LdrR = 1;
Serial.print("Weiß");
}
Serial.println();
// Motorsteuerung basierend auf den Sensorwerten
if (LdrL == 1 && LdrR == 1) {
Serial.print("forward")
forward();
}
if (LdrL == 2 && LdrR == 1) {
Serial.print("Right")
driveRight();
}
if (LdrL == 1 && LdrR == 2) {
Serial.print("Left")
driveLeft();
}
delay(50); // Kurze Pause, um arduino nicht zu überlasten
}
void forward(){
// Beide Sensoren erkennen weiß -> Beide Motoren vorwärts
MotorR->run(FORWARD);
MotorL->run(FORWARD);
LdrL = 0;
LdrR = 0;
}
void driveRight(){
//Linker Sensor erkennt schwarz-> rechter Motor muss nachziehen
MotorR->run(FORWARD);
MotorL->run(RELEASE);
LdrL = 0;
LdrR = 0;
}
void driveLeft(){
//Rechter Sensor erkennt schwarz-> linker Motor muss nachziehen
MotorR->run(RELEASE);
MotorL->run(FORWARD);
LdrL = 0;
LdrR = 0;
}