INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Encoder enc 01 a
22.09.2014, 13:15
Beitrag #1
Encoder enc 01 a
Hallo Leute, wir sollen im Vorsemesterprojekt einen Roboter bauen der durch ein Labirinth fährt und die Grüne Fläche findet.
Wir haben den Roboter nun aufgebaut und können die Motoren ansteuern damit er in der Logik nach geradeausfährt und sich auf der Stelle dreht.

Unser jetziges Problem ist folgendes:
Wir können die Motoren zwar ansteuern und von der Logik geradeaus fahren lassen, aber die Motoren drehen sich unterschiedlich schnell. Dasselbe Problem haben wir bei Drehungen, da drehen wir uns unterschiedlich oft je nachdem wie schnell wir zu beginn der Drehung sind.
Jetzt haben wir unter dem Reifen einen Encoder (enc 01 a) und wollen damit die Geschwindigkeit der beiden Reifen messen und steuern. Leider haben wir im Internet keine Beispiele gefunden die uns weiterhelfen deswegen frag ich hier einfach mal wie man mit diesen Encodern arbeitet und wie man Sie ausliest um ihre Ausgabe auf unsere Motoren zu übertragen
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.09.2014, 19:56
Beitrag #2
RE: Encoder enc 01 a
hallo,
ich kenne den enc o1 a nicht - ich würde einen Quadraturencoder ( == Rotationsencoder) empfehlen mit mindestens 1° Auflösung an der Radachse.
Wie du so etwas auswerten kannst, könnte ich dir sagen, das habe ich selber in Gebrauch, und Odometrie-Navigation damit ebenfalls.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.09.2014, 07:59
Beitrag #3
RE: Encoder enc 01 a
Wir müssen unseren nehmen^^

Ich habe jetzt dieses Programm dazu gefunden, habe aber noch verständnissschwierigkeiten.
Kann mir jemand genau erklären was das Programm grade macht?
Weil ich werde es ja so abändern müssen das sich 2 Encoder vergleichen und dann die Räder in Einklang bringen

const byte OutA = 2; //A pin -> the interrupt pin 0
const byte OutB = 4; //B pin -> the digital pin 4
byte OutALast;
int duration; //the number of the pulses
boolean Direction; //the rotation direction


void setup()
{
Serial.begin(9600); //Initialize the serial port
EncoderInit(); //Initialize the module
}


void loop()
{
duration = 0;
delay(100);
}


void EncoderInit()
{
Direction = true; //default -> Forward
pinMode(OutB,INPUT);
attachInterrupt(0, wheelSpeed, CHANGE);
}


void wheelSpeed()
{
int Lstate = digitalRead(OutA);
if((OutALast == LOW) && Lstate==HIGH)
{
int val = digitalRead(OutB);
if(val == LOW && Direction)
{
Direction = false; //Reverse
}
else if(val == HIGH && !Direction)
{
Direction = true; //Forward
}
}
OutALast = Lstate;
if(!Direction) duration++;
else duration--;
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.09.2014, 18:16 (Dieser Beitrag wurde zuletzt bearbeitet: 23.09.2014 18:28 von Thorsten Pferdekämper.)
Beitrag #4
RE: Encoder enc 01 a
Hi,
ok, ich erklaere das jetzt mal. Aber bitte nehmt meine neue Signatur ernst...
Im Prinzip macht der Sketch (soweit ich das verstehe) nichts anderes, als die "gefahrene Strecke" in der Variablen duration abzulegen, aber der Wert wird alle 100ms wieder auf Null gesetzt. Also er macht eigentlich gar nichts nach aussen sichtbares.
Im Einzelnen:

Code:
const byte OutA = 2; //A pin -> the interrupt pin 0
const byte OutB = 4; //B pin -> the digital pin 4
byte OutALast;
int duration; //the number of the pulses
boolean Direction; //the rotation direction
Das duerfte klar sein.

Code:
void setup()
{
Serial.begin(9600); //Initialize the serial port
EncoderInit(); //Initialize the module
}
Das Serial.begin ist ueberfluessig, da der Sketch damit gar nichts macht.
Ansonsten ruft er EncoderInit auf, siehe weiter unten.

Code:
void loop()
{
duration = 0;
delay(100);
}
Das sorgt dafuer, dass duration alle 100ms wieder auf Null gesetzt wird.

Code:
void EncoderInit()
{
Direction = true; //default -> Forward
pinMode(OutB,INPUT);
attachInterrupt(0, wheelSpeed, CHANGE);
}
Das macht ein bisschen Initialisierung. Womoeglich ist attachInterrupt unklar. Das was da steht heisst im Prinzip: Wenn sich Pin 2 aendert, dann rufe die Funktion wheelSpeed auf. (Pin 2 ist fuer Interrupt 0 beim Uno fest verdrahtet.)

Code:
void wheelSpeed()
{
int Lstate = digitalRead(OutA);
if((OutALast == LOW) && Lstate==HIGH)
Das detektiert eine aufsteigende Flanke am Pin 2.

Code:
{
int val = digitalRead(OutB);
if(val == LOW && Direction)
{
Direction = false; //Reverse
}
else if(val == HIGH && !Direction)
{
Direction = true; //Forward
}
Das ermittelt, ob sich das Rad vorwaerts oder rueckwaerts dreht.

Code:
}
OutALast = Lstate;
Damit merkt sich das Teil den letzten Stand von Pin 2.

Code:
if(!Direction) duration++;
else duration--;
}
Das zaehlt im Endeffekte die Pulse vom Encoder unter Beruecksichtigung, ob wir gerade vorwaerts oder rueckwaerts fahren.

Gruss,
Thorsten

Hi,
mein Vorschlag damit weiter zu machen:
1. Korrigiert den Sketch: Alle globalen Variablen, die in der Interrupt-Routine (wheelSpeed) geaendert werden, sollten mit "volatile" deklariert werden. Ausserdem sollte in der loop() nach dem delay() der momentane Stand von duration ueber Serial ausgegeben werden. Dann dreht mal am Rad... Die momentane Geschwindigkeit sollte dann ueber den seriellen Monitor sichtbar sein.
2. Schaut Euch die Doku zu attachInterrupt an. Ihr muesst dann wahrscheinlich obiges Coding so erweitern, dass der zweite Encoder Pin 3 und einen weiteren Pin benutzt. Jetzt habt Ihr zwei "Geschwindigkeiten" zum Ausgeben.
3. Zum Geradeausfahren muessen die Zaehler fuer beide Raeder moeglichst gleich sein. Wenn der Zaehler fuer ein Rad groesser ist, als der fuer's andere, dann muss der entsprechende Motor gebremst werden. D.h. Ihr muesst sowas wie einen Regelalgorithmus implementieren.

Gruss,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  encoder clemens5555 17 393 20.10.2016 15:48
Letzter Beitrag: hotsystems
  LCD Menue mit u8glib und Encoder stefanch 1 359 04.06.2016 21:02
Letzter Beitrag: hotsystems
  Encoder auslesen Phil333 1 666 23.03.2016 21:40
Letzter Beitrag: hotsystems
  Drehgeber - Encoder - Wertebereich eingrenzen Nimes 3 474 14.03.2016 12:38
Letzter Beitrag: Nimes
  Rotary Encoder - Anschließen King2k7 10 1.148 18.01.2016 12:38
Letzter Beitrag: hotsystems
  Encoder s_fr 3 498 10.01.2016 19:41
Letzter Beitrag: hotsystems
  Rotary Encoder zählt nicht Rückwerts elmo 8 2.181 20.05.2015 20:05
Letzter Beitrag: elmo
  Rotary Encoder: schneller drehen > Wert mehr verändern Foto-Ralf 7 1.430 28.02.2015 15:50
Letzter Beitrag: HaWe
  Encoder: Zahl mit einer Nachkommastelle erzeugen Cray-1 68 10.500 27.08.2014 16:33
Letzter Beitrag: Cray-1
  8 Channel PPM Encoder dante 2 1.815 17.01.2014 08:46
Letzter Beitrag: dante

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste