Roboter gerade fahren lassen

Hallo,

ich versuche seit einigen Wochen einen Roboter zu bauen. Allerdings habe ich das Problem, dass dieser nie gerade fährt. Wäre es umsetzbar, den Roboter via Software gerade fahren zu lassen? Reichen da Ultraschallsensoren aus, oder müssen die Werte genauer sein? (zum Beispiel ToF oder so)

Mit freundlichen Grüßen
Itsybitsybootsy

Damit der einiger maßen gerade fährt Vorderrad Drehzahl messen und drauf reagieren,
oder nach Leserstrahl sich richten.
Ultraschalsensoren sind nicht so genau, außer du willst im Tunnel fahren.
Die frage ist auch, ist ist er Lenkbar oder Star aufgebaut.

Mein Auto ist grau. Wann habe ich Geburtstag?

Mit sooo wenig information was du für einen Antrieb benutzt kann man da nicht beraten.
Das Mindeste wäre ein Foto dass die Mechanik des Antriebs so zeigt, dass man versteht wie er funktioniert
oder eine Beschreibung:
wie viele Motoren?
was für eine Art Motor?
Wie viele Räder?
welche der Räder werden aktiv gelenkt?
Wie fährst du Kurven wenn du wirklich Kurven fahren willst?
vgs

Ich nehme mal an daß der Roboter mit 2 Rädern und 2 Motoren ist und Kurven durch unterschiedliche Drehzahl der Motoren gegeneinander gefahren werden.
Damit ein Robotter geradeausfährt. müssen beide Motoren gleich schnell drehen.
Das erreicht man indem man Schrittmotore verwendet die man gleichschnell ansteuert oder man nimmt Gleichstrommotoren oder Dauerdreh-Servos (Auch 360 Grad Servo genannt) und kontrolliert die Drehgeschwindigkeit bzw die gemachten Umdrehungen und regelt die Motore dementsprechend.

Grüße Uwe

Der Roboter hat zwei fest verbaute Motoren. Kurven fährt er nicht, sondern dreht sich (ein Motor dreht nach vorne, der andere nach hinten).
Die Motoren sind so ähnlich wie diese:

Das ganze wird mit einem Arduino mega gesteuert.

Mit freundlichen Grüßen
itsybitsybootsy

Für die Motoren gibt's eine Art Lochscheiben womit man die Drehzahl messen, auswerten kann.

zB solche:

Grüße Uwe

Du arbeitest im weitesten Sinne an einem Informatik-Projekt.
Und was in einem Informatik-Projekt am meisten gebraucht wird ist Information.

Die Information "Roboter dreht sich im Kreis" ist dermaßen wichtig, das du das gleich schreiben solltest. Na gut wenn du jeweils nur ein Schrittchenen pro Woche weiterkommen willst, reicht es natürlich die Infos bitweise zu geben.
Wenn du flott vorankommen willst dann nimm dir mal 30 Minuten Zeit um ausführlich zu beschreiben:
Was für ein Roboter
Bilder oder Link posten
verwendeten Code posten usw. usw.

Dann gibt es mehrere Möglichkeiten das zu ändern:

  • Plus und Minuspol eines Motors vertauschen.

  • Den Code mit dem die Motoren angesteuert werden hier als Code-Section posten
    und dann entweder

    • bei den entsprechenden Ausgängen die IO-Nummern tauschen
    • LOW / HIGH-Pegel beim schalten vorwärts/rückwärts tauschen

wo man das genau machen muss kann erst gesagt werden wenn der Code hier gepostet wurde.

vgs

Genau die, nur vergessen wo ich die gesehen habe, die Frage ist ob die drauf passen, die oben gezeigte Motoren haben an beiden seiten Wellen,

Deswegen heißt es ja auch INFORMatik. :grin: :grin:
Konnte mich nciht zurückhalten.
Uwe

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

Hallo @itsybitsybootsy

super Code als Code-Section und Bilder wie der Roby aussieht.
Wenn ich das richtig verstehe werden Kurvenfahrten über unterschiedliche Drehzahlen der beiden Antriebsräder gemacht.
Das bedeutet für das geradeausfahren müssen linkes und rechtes Rad exakt die gleiche Drehzahl haben.

Die beiden Motoren werden sich in den Reibungsverlusten und weiteren Dingen ein bisschen unterscheiden. Das heißt wenn man die beiden Motoren mit dem gleichen PWM-Signal ansteuert werden sie sich wegen der Unterschiede in der Reibung doch ein bisschen unterschiedlich schnell drehen. Daher die Kurvendrift.

Wenn das jetzt sehr genau werden soll braucht man:

  • eine Rückmeldung wie groß denn die Drehzahl gerade ist und dann einen Regelalgorythmus der die Drehzahlen abgleicht.

  • ein anderes Steuerungsprinzip mit "klassischer" Lenkung

  • Schrittmotoren bei denen es sehr einfach ist zwei Schrittmotoren mit exakt gleicher Drehzahl laufen zu lassen

  • Viel Geduld um ohne Rückmeldung der Drehzahlen die PWM-Zahlen (Motor1 / Motor2 so anzupassen, das Geradeausfahren dabei herauskommt.
    Wobei das immer noch empfindlich gegenüber Veränderungen des Untergrundes ist.

Was mir noch nicht klar ist was die Motorkorrektur genau macht.
Werden die IR-Sensoren benutzt um einer Linie zu folgen?

vgs

Du reagierst auf Kompass-Abweichungen erst, wenn diese > 30 (grad ?) sind.
Da mir nicht klar ist, was man an Messergebnissen von diesem Kompass erwarten kann, kann ich dir auch nicht sagen, was passiert, wenn du diese Grenze verkleinerst.
Ist auch die Frage, ob es nur geradeaus gehen soll, egal in welche Richtung genau ...

Also hier noch mal der Code, bei dem ich (versuche) die Motorkorrektur zu erklären

@StefanL38 die IR Sensoren werden nur zur erkennung von Objekten an der Front verwendet. Wenn ein Objekt erkannt wird ändert sich einfach die Richtung in die der Roboter fahren sollte. Dann erkennt der Algorithmus (mit dem Kompass) das die Abweichung der gewünschten Richtung und der aktuellen Richtung größer als 30 ist und dreht den Roboter in die gewünschte Richtung, in die dieser dann auch weiter fährt.

Mit freundlichen Grüßen
itsybitsybootsy

@michael_x,
Die Library vom Kompass gibt den Wert von 0-255 aus. Er ist auch nicht sonderlich genau und braucht etwas länger um den Wert auszulesen. Die Reaktion erfolgt erst, wenn die Richtung größer als 30 ist, weil ich den Algorithmus trainieren will.

Beim setzten der Richtung ist der Kompass nicht schnell genug und ich kann den Roboter nicht langsamer drehen, weil der Motor sonst stoppt (mit einem sehr unangenehmen Geräusch)

Mit freundlichen Grüßen
itsybitsybootsy

Hallo,
könnte es sein das der Kompass ungeeignet ist ? Eventuell baust Du besser eine Schildkröte, die sich nur gaaanz langsam bewegt. Im Ernst bau eine Drehzahlregelung ein, das ist üblich und klappt auch. Wenn das ein magnetischer Kompass ist wird der doch ständig von den Motoren verwirrt. Damit der nicht rumspinnt wird der eine starke Dämpfung haben. Das mit dem Hinderniss erkennen und einen besimten Winkel drehen kannst Du doch ebenfalls mit einer Lochscheibe machen, dazu brauchst Du Doch den Kompass nicht. Zudem für die Aufgabe würden Schrittmotoren besser geeignet sein, aber das wurde bereits gesagt.
Heinz

1 Like

@Rentner,
Ich dachte mir, das ich den Kompass nehme, damit ich auch mit der Zeit keinen Fehler beim drehen habe. Ist es möglich (und wenn ja wie) einen Kompass mit den Schrittmotoren zu kombinieren? Oder ist das sinnlos? Welchen Schrittmotor würdet ihr empfehlen?

Mit freundlichen Grüßen
itsybitsybootsy

Kompass reagiert auf das extrem schwache Magnetfeld der Erde
Elektro-Motoren aller Art erzeugen Magnetfelder
==> Kompass-Sensor braucht einen Mindestabstand von den Motoren

Einen Schrittmotor der genug Drehmoment hat deinen Roby mit der von dir gewünschten Geschwindigkeit zu bewegen.

Jetzt biste schlauer.
Der hier ist sehr preiswert und wird es für deine Zwecke wohl tun

Du brauchst dann aber auch für jeden Schrittmotor einen Schrittmotortreiber DRV8825 oder TMC2209

Und das Fachwissen, dass man Schrittmotoren immer nur spannungsfrei an den Treiber anschließt
Wenn man die Motorleitungen anschließt oder abstöpselt während Spannung drauf ist entstehen Spannungsspitzen die den Schrittmotortreiber ruckzuck zerstören

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.