CNY 70 Opto Reflexkoppler zur Odometrie

Veröffentlicht von

IMG_3851Odometrie die Wissenschaft der Wegmessung/Positionsbestimmung. In meinem Fall dem Zählen der Radumdrehungen meines neuen Roboters „Daisy“.

Ich verwende dazu einen CNY 70 Reflexkoppler (Datenblatt Vorsicht, es gibt zwei Typen die nicht Pin kompatibel sind), da dieser recht preiswert ist und sich einfach auswerten lässt. Näheres dazu könnt ihr hier nachlesen. Da ich den Sensor direkt mit einem Analogport auswerten will sind nur zwei Widerstände nötig. Mit meiner selbst gedruckten (Laserjet) Encoderscheiben (Vorlagen bekommt man z.b. hier) bekomme ich aus dem AD/Wandler des Atmega werte von 30 bis 900.  Also deutliche Unterschiede die man gut auswerten kann.

Hier mal meine Schaltung. Da ich selten lange plane nur eine einfache Skizze,  ich denke aber man kann etwas erkennen 🙂 Der ganze „Schaltplan“ stellt die Basis von Daisy dar.  Hier werden die zwei Servomotoren, zwei LEDs und die beiden CNY 70 mit dem Arduino verbunden. Rechts die Belegung des 10pol Flachbandkabel.

IMG_3855



Hier noch ein Teil meines  Testprogramms, die Motoren werden gegenläufig angesteuert, die Odometrie Daten an die serielle Schnittstelle gesendet und bei Werten größer 400 eine LED eingeschaltet. Die selbst geschriebenen Funktionen   spare ich mir, deren Namen sind aussagekräftig genug:

 
motorR (150,0);
motorL (150,1);
Serial.print(" Odometrie Rechts/Links ");
for (int i = 0; i <= 20; i++)
{
int valR = readOdoR();
int valL = readOdoL();
Serial.print(" ");Serial.print(valR,DEC);Serial.print("/");
Serial.print(valL,DEC);Serial.print(";");
delay (50);
if (valR > 400)
{
digitalWrite(PinLedR,HIGH);
}
else {
digitalWrite(PinLedR,LOW);
}
if (valL > 400)
{
digitalWrite(PinLedB,HIGH);
}
else {
digitalWrite(PinLedB,LOW);
}
}
Serial.println(" ");
motorR (0,0);
motorL (0,0);
delay (1000);

In der seriellen Konsole sieht das Ganze dann so aus. Unten noch die Ausgabe des Sharp GP2D12, dabei wird er von einem  Serv0 in der Vertikalen bewegt.


daisyselbsttest



13 Kommentare

  1. Hallo Willi,
    ich denke die vertikale oder horizontale Anordnung des CNY macht keinen Unterschied, der Messpunkt dürfte klein genug sein. Wenn es generell geht (ich vermute wenn du von Hand drehst) würde ich den Fehler eher bei den Encoderscheiben suchen, vielleicht sind sie bei der Geschwindigkeit der Motoren zu hoch auflösend. Nicht zu verachten sind auch die Ströme die von den Motoren gezogen werden. Wenn du die Elektronik und die Motoren aus einem Akku speist könnte das auch Probleme bringen. ist aber schwer aus der Entfernung zu sagen.
    Da ich kürzlich auf Win7 umgestiegen bin (und die Codes auf irgendwelchen CDs liegen) Kann ich nicht nachsehen, ich glaube aber die Funktion OdoData lieferte ein Array mit den werten der rechten und linken Odeometrie zurück.
    Bilder kannst du hier gar nicht einfügen, wenn du möchtest kannst du es per Mail senden, meien Adresse hast du ja.
    Gruß Ingo
    Ps: alle Beiträge auf der Seite sind von mir 🙂

  2. Hallo Ingo,
    habe es nun endlich geschafft, einen Scheibenbot zu bauen. Hat etwas gedauert, aber die Mechanik und der Aufbau waren doch aufwendiger als ich gedacht habe. Ich habe z.B. keine Servomotoren, sondern 2 Akkuschraubermotoren mit Getriebe verwendet. Als H-Bridge habe ich einen L298H genommen. Würde Dir gerne ein Foto zukommen lassen. Aber ich weis nicht wie das hier geht. Mit Deinen Codeschnippseln habe ich es auch geschafft den Encoder auszulesen. Die Werte liegen zwischen 40 und 900. Jedoch nicht immer abwechselnd. Nun habe ich in Deinem Foto gesehen, dass Du den CNY70 horizontal zur Encoderscheibe positioniert hast. Bei mir liegt er vertikal. Kann das der Grund sein? Im zweiten Schritt wollte ich nun die Odometrie angehen. In Deinem Code hast Du eine Funktion „void odometrie(void)“. Darin liegt die Funktion „odoData(data);“. Diese werden aber vom Programm ignoriert. In der loop-Schleife wird die Funktion nicht erwähnt. An welcher Stelle muss diese Funktion aufgerufen werden? Habe mehrere Versuche gemacht, leider ohne Erfolg. Kannst Du mir bitte einen Tipp geben.
    Gruß Willi
    P.S. habe eben Gerald für seine Hilfe zu Eclipse gedankt.

  3. Hallo Willi,

    ich betreibe ihn über eine 220 Ohm widerstand an 5v. Mehr solltest du ihm auch nicht zumuten, das nimmt er dir auf jeden Fall übel.
    Arduino und Eclipse hört sich auch interessant an, könnte ich auch mal probieren. Für meine bisherigen Mini Anwendungen reicht aber auch die Arduino IDE.

  4. Hallo Ingo,
    ich bin´s wieder. Kannst Du mir die Spannung nennen, mit der Du den CNY70 betreibst. Mit 5Volt bekomme ich keine Ergebnisse, will aber auch nichts kaputt machen.
    Dank im Voraus.
    Willi
    P.S. habe die Zwischenzeit damit verpleppert, dass ich Eclipse beibringen wollte, einen Arduino zu flashen. Ohne Erfolg.

  5. Unten links im Schaltplan. Ist ja gut gegangen. Vielen Dank für die Antwort.
    Habe bereits einen Versuchsaufbau auf dem Steckboard realisiert. Läuft auch, nur das die Werte am Serialmonitor sind nicht so different wie Du beschrieben hast. Liegt aber vielleicht daran, dass ich noch kein Chassis habe (sondern Motor mit Encoderscheibe mit der Hand an Optokoppler halten).
    Gruß Willi

  6. Wo hast du denn den „20“ gesehen? Ist dann ein Schreibfehler, das hier beschrieben gilt für den CNY70

  7. Danke fürs Wissen Teilen!

    hab mir auch so einen CNY70 bestellt und lange zuhause rumliegen gehabt. Ich werde mich mal an dieses Projekt machen, da es wirklich überschaubar gehalten wurde!
    Großes Lob und viele Grüße

    Sebastian

  8. Hallo Ingo,
    ich hab´noch ´ne Frage. In Deiner Beschreibung hast Du den CNY70 beschrieben, den ich auch bestellt habe. Nun sehe ich aber gerade (warum eigentlich nicht früher??), dass Du dort den CNY20 genannt hast. Hat das Einfluß auf das Projekt?
    Noch einen schönen Ostermontag,
    Willi

  9. Hallo Ingo,
    vielen vielen Dank für die ausführliche Antwort. Wie Du siehst, war ich sehr gespannt darauf. Jetzt gehe ich meinem Haupthobby nach. Ich werde Dich auf dem laufenden halten.
    Einen schönen Tag
    Willi

    P.S. Hatte das schon heute ganz früh geschrieben (Antwort per E-Mail).

  10. Hallo Ingo,
    vielen Dank für die schnelle Antwort. Habe mir gestern direkt den CNY70 bei Conrad bestellt. Sobald die da sind, werde ich das versuchen. Wenn es funktioniert melde ich mich mal.
    Schönes Wochenende
    Kucky

  11. Hallo Kucky,
    Sensor1 und 2 sind die Anschlüsse die an die analogen Ports des Arduino gehen, die eigentlichen Hell/Dunkel Werte liefern und im Arduino mittels analogRead ausgelesen werden.
    Gruß Ingo

  12. Hallo,
    ich bin Anfänger in Punkto Roboter. Ich habe eine Steuerung für 2 Motoren mit einem Arduino 2009 gebaut. Dazu würde Deine Odometrieschaltung ganz gut passen. Könntest Du mir mehr Infos zukommen lassen? Ich verstehe z.B. nicht was Sensor 1+2 bedeuten soll. Wäre nett, wenn ich was von Dir hören würde.
    Grüße aus Leverkusen
    Kucky

Kommentar verfassen