Der Roboter verwendet eine L289N Motorsteuerung. Der Code unterhalb ist ein Test, der versucht, den Roboter mit dem Kompass gerade fahren zu lassen. Der Roboter fährt zwar etwas gerader, doch perfekt ist es nicht.
// Libraries importieren
#include <Wire.h>
#include <QMC5883LCompass.h>
//kompass definieren
QMC5883LCompass compass;
byte a = 0;
// Motoren Definieren
// Motor 1
int GSM1 = 3;
int in1 = 4;
int in2 = 5;
// Motor 2
int GSM2 = 8;
int in3 = 7;
int in4 = 6;
//Serielle Verbindung Einschalten, wenn dies gewünscht ist
#define SerialOn
//Ir-Sensoren Variablen Definieren:
int IrL = 0; //IR Left
int IrM = 0; //IR Middle
int IrR = 0; //IR Right
int IrS = 0; //IR Side
//Gerade Fahr algorithmus:
//Motoren
float Motor1 = 100;
float Motor2 = 100;
//Anderes
int Drivespeed = 90;
int DriveDir = 90;
void setup() {
//Motoren Pins Vorbereiten
pinMode(GSM1, OUTPUT);
pinMode(GSM2, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
//Seriellen Monitor Verbinden, falls Notwendig:
#if defined SerialOn
Serial.begin(9600);
#endif
compass.init(); // Kompass initialisieren
Setdir(DriveDir); // Richtung auf die gewünschte Fahrtrichtung setzten
}
void loop() {
MesureAll(); // alle Sensoren auslesen
if (difference(DriveDir, a) > 30) { // wenn der unterschied der gwollten richtung und der aktuellen richtung größer als 30 ist...
Setdir(DriveDir); // ...dreht sich der Roboter in die gewünschte Richtung
}
Forward(Motor1, Motor2); //vorwärtsfahren mit den korrigierten werten
CorrectDrive(); // werte anhand des Kompasses korrigieren
if (IrL == 0 || IrR == 0 || IrM == 0) { // wenn ein Objekt erkannt wird...
if (DriveDir == 90) { //...setzt der Roboter die gewollte Richtung auf eine andere, und dreht sich somit vom Objekt weg
DriveDir = 0;
}
else{
DriveDir = 90;
}
}
}
void Forward(int Speed1, int Speed2)
{
#if defined SerialOn
Serial.print("/Driving_Forward"); // Forwärtsfahren ausgeben, falls der Serielle Monitor gewünscht ist
#endif
//Motor 1 Update
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
analogWrite(GSM1, Speed1);
//Motor 2 Update
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
analogWrite(GSM2, Speed2);
}
void Backward(int Speed)
{
#if defined SerialOn
Serial.print("/Driving_Backward"); //Rückwärtsfahren ausgebwn, wenn dies gewünscht ist
#endif
//Motor 1 Update
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(GSM1, Speed);
//Motor 2 Update
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
analogWrite(GSM2, Speed);
}
void MesureAll()
{
#if defined SerialOn
Serial.print("/Mesuring_All"); // wenn gewünscht, ausgeben, das die Werte gemessen werden
#endif
//Read IR Sensores:
IrL = digitalRead(12); //IR Left
IrM = digitalRead(11); //IR Middle
IrR = digitalRead(13); // IR Right
IrS = analogRead(A0); //IR Side -->reads Distance to Right Wall
#if defined SerialOn
Serial.print("/IR_Sensor_Data:"); // wenn gewünscht, IR sensor Daten ausgeben
Serial.print(IrL);
Serial.print("/");
Serial.print(IrM);
Serial.print("/");
Serial.print(IrR);
Serial.print("/");
Serial.print(IrS);
Serial.print("/");
#endif
compass.read(); //kompass auslesen
a = compass.getAzimuth();
#if defined SerialOn
Serial.print("/Compass_Data:");
Serial.print(a);
#endif
}
// unterschied zwischen zwei Werten berechnen
int difference(int a, int b) {
int calculate = 0;
if (a > b) {
calculate = a - b;
return calculate;
}
else {
calculate = b - a;
return calculate;
}
}
void CorrectDrive() {
//Motoren Korrigieren
if ((a - DriveDir) > 1) {
Motor1 += ((255 - (difference(a, DriveDir))) / 500);
Motor2 -= ((255 - (difference(a, DriveDir))) / 500);
}
else {
Motor1 -= ((255 - (difference(a, DriveDir))) / 500);
Motor2 += ((255 - (difference(a, DriveDir))) / 500);
}
return;
//Falschkorrektur der Motoren korrigieren
if (difference(Motor1, Motor2) > 50) {
//Motor 1
if (Motor1 > 0) {
Motor1 -= 3;
}
else {
Motor1 += 3;
}
//Motor2
if (Motor2 > 0) {
Motor2 -= 3;
}
else {
Motor2 += 3;
}
}
//Zu langsame Motoren Verschnellern
if (Motor1 < Drivespeed) {
Motor1 += 5;
}
if (Motor2 < Drivespeed) {
Motor2 += 5;
}
}
//in eine bestimmte Richtung drehen
void Setdir(int Dir) {
a = 10000;
//Drehung mit hoher Geschwindigkeit Starten ( damit die Motoren anlaufen und nicht stecken bleiben)
//Motor 1 Update (dreht sich schnell)
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(GSM1, 80);
//Motor 2 Update (dreht sich nicht)
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
analogWrite(GSM2, 0);
delay(300);
//Motor 1 Update (motor 1 verlangsamen)
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(GSM1, 50);
MesureAll();
while (difference(Dir, a) > 30) {
MesureAll();
}
//Motoren Stoppen!! (nachdem der unterschied zwischen der Richtung und der gewünschten Richtung kleiner als 30 ist)
//Motor 1 Update
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(GSM1, 0);
//Motor 2 Update
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
analogWrite(GSM2, 0);
delay(300);
}
Hier ist ein Foto von meinem Roboter:
ich bin leider zu unfähig, ein Video hochzuladen...
(sonst hätte ich den ausgeführten Code gezeigt)
Mit freundlichen Grüßen
itsybitsybootsy