www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Geschwindigkeitsmessung mit Quadraturausgang einer optischen Maus und ATMega


Autor: Cornelius R. (cornelius_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin Schüler und Mitglied einer Roboter-AG. Wir möchte gerne die 
Geschwindigkeit meines Fußballroboters bestimmen können. Er misst 20cm 
im Durchmesser und fährt mit maximal 2 m/s. Gefahren wird auf grünem 
Teppich. Ein Drehwinkelgeber mit Lichtschranke scheidet aus, da er 
erstens nicht mehr zeitgemäß ist, es finden sich fast keine Scheiben 
mehr, und zweitens zu sperrig für den eng gepackten Roboter ist. Unsere 
Idee ist nun also einen optischen Maussensor zur Geschwindigkeitsmessung 
zu Nutzen und ihn mit meinem ATMega 2560 über die Quadraturausgänge 
abzufragen.

Leider habe wir aber auf diesem Themengebiet noch keine Erfahrung und 
würden uns deshalb über Hilfestellungen freuen. Ist das für uns 
realisierbar? Wer sich über unseren Fortschritt informieren will, kann 
sich dieses Video anschauen: Youtube-Video "Team Tactic bei den RCJ German Open Soccer Version B 2010"

Viele Grüße
Cornelius

Autor: Lukas K. (carrotindustries)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sensoren mit Quadraturausgängen sind überaus selten geworden. Die 
"modernen" Sensoren verfügen über eine SPI-Artige Schnittstelle.
In dieser Maus 
http://www.cherry.de/deutsch/produkte/kabelmaeuse_... 
befindet sich ein ADNS 2610/1610 Sensor. Das Datenblatt gibt es bei 
http://www.avagotech.com/docs/AV02-1184EN
Informationen zu diesem Sensor gibt es bei 
http://www.heise.de/ct/06/13/226
Wenn du willst, kann ich dir noch den Quellcode zur Ansteuerung des 
Sensors (AVR, C) zukommen lassen.
Die Maus kostet bei Arlt 7€74 und ist damit auch noch sehr Preisgünstig. 
http://www.arlt.com/Eingabegeraete/Maeuse/Cherry-W...
Des weiteren empfehle ich dir, die Maus in ihrem Gehäuse zu lassen und 
nur die Anschlüsse des Controller-ICs (Daten, Takt), die zum Sensor 
führen, zu entfernen.

Autor: Cornelius R. (cornelius_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antwort. Es gibt also keine Quadraturchips mehr? Mit SPI 
fühle ich mich überfordert, habe damit noch nie etwas gemacht... (Wir 
programmieren mit Bascom)

Autor: Frank K. (fchk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit diesen Sensoren habe ich noch nichts gemacht. Ich habe aber eine 
andere Idee. Was für Motoren verwendet Ihr? Normale Gleichstrommotoren?

Im Modellbau werden immer öfter sogenannte Brushless DC Motoren 
verwendet, die bei weniger Gewicht einen viel höheren Wirkungsgrad 
haben. Ohne solche Antriebe fliegt heutzutage kein 
Elektro-Hubschraubermodell mehr.

Diese Brushless-DC-Motoren sind im Prinzip Drehstrommotoren, und der 
Drehstrom wird praktisch softwaremäßig über einen kleinen dafür 
ausgelegten Microcontroller mit 3 oder 6 PWM-Ausgängen und einer 
Dreiphasen-MOSFET-Vollbrücke erzeugt. Der Anker folgt dem erzeugten 
Drehfeld, je höher die Frequenz, desto höher die Drehzahl. Da das 
Drehfeld ohnehin softwaremäßig erzeugt wird, weiß der Controller auch 
exakt die Drehzahl und die Anzahl der Umdrehungen, die der Motor 
gefahren hat.

Das könnt Ihr Euch ja mal überlegen. Im Netz gibt es genügend Material 
zu dem Thema. Die dahinter stehende Theorie, insbesondere die Bestimmung 
der momentanen Ankerposition nur aus den Spulenströmen und -spannungen, 
ist jedoch nicht ganz ohne.

fchk

Autor: Lukas K. (carrotindustries)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Cornelius R. schrieb:
> Danke für die Antwort. Es gibt also keine Quadraturchips mehr? Mit SPI
> fühle ich mich überfordert, habe damit noch nie etwas gemacht... (Wir
> programmieren mit Bascom)
Sind eher unüblich. Im Datenblatt ist die Ansteuerung relativ 
detailliert beschrieben. Das Interface ist auch mehr SPI-Artig als SPI 
(wegen HIGH-Z Daten)
Hier ist noch mein Quic'n Dirty Quelltext (nich hauen wegen (1<<i)), ist 
auch schon 1 Jahr her, dass ich den geschrieben hab. Soll dir auch nur 
als Anregung für dein BASCOM-Programm dienen.
Anmerkung: Den Sensor sooft wie möglich auslesen, sonst läuft das 
Positionsregister über und du erhältst falsche Daten.
#define DATA_DDR DDRB
#define DATA_PORT PORTB
#define DATA_PIN PINB
#define DATA_LINE PB0

#define CLOCK_DDR DDRB
#define CLOCK_PORT PORTB
#define CLOCK_PIN PINB
#define CLOCK_LINE PB1

void data_high(void) {
  DATA_DDR |= (1<<DATA_LINE);
  DATA_PORT |= (1<<DATA_LINE);
}

void data_low(void) {
  DATA_DDR |= (1<<DATA_LINE);
  DATA_PORT &= ~(1<<DATA_LINE);
}

void data_highz(void) {
  DATA_DDR &= ~(1<<DATA_LINE);
  DATA_PORT &= ~(1<<DATA_LINE);
}


void clock_high(void) {
  CLOCK_PORT |= (1<<CLOCK_LINE);
}

void clock_low(void) {
  CLOCK_PORT &= ~(1<<CLOCK_LINE);
}

void adns_write(unsigned char adr, unsigned char dat) {
  unsigned char adrbits[8];
  unsigned char datbits[8];
  unsigned char i = 0;
  while(i < 8) {
    if(adr & (1<<i)) {
      adrbits[7-i] = 1;
    }
    else {
      adrbits[7-i] = 0;
    }
    if(dat & (1<<i)) {
      datbits[7-i] = 1;
    }
    else {
      datbits[7-i] = 0;
    }
    i++;
  }
  
  i = 0;
  
  while(i < 8) {
    data_high();
    if(adrbits[i] == 0) {
      data_low();
    }
    
    clock_low();
    _delay_us(350);
    clock_high();
    _delay_us(350);
    i++;
  }
  
  i = 0;
  
  while(i < 8) {
    data_high();
    if(datbits[i] == 0) {
      data_low();
    }
    
    clock_low();
    _delay_us(350);
    clock_high();
    _delay_us(350);
    i++;
  }
  
}  


unsigned char adns_read(unsigned char adr) {
  unsigned char adrbits[8];
  unsigned char datbits[8];
  unsigned char i = 0;
  while(i < 8) {
    if(adr & (1<<i)) {
      adrbits[7-i] = 1;
    }
    else {
      adrbits[7-i] = 0;
    }
    i++;
  }
  
  i = 0;
  
  while(i < 8) {
    data_high();
    if(adrbits[i] == 0) {
      data_low();
    }
    
    clock_low();
    _delay_us(350);
    clock_high();
    _delay_us(350);
    i++;
  }
  
  
  data_highz();
  i = 0;
  
  _delay_us(500);
  
  while(i<8) {
    clock_low();
    _delay_us(300);
    if(DATA_PIN & (1<<DATA_LINE)) {
      datbits[i] = 1;
    }
    else {
      datbits[i] = 0;
    }
    clock_high();
    _delay_us(300);
    i++;
  }
  
  data_highz();
  
  i = 0;
  unsigned char readbyte = 0;
  while(i < 8) {
    if(datbits[i] == 1) {
      //uart_putc('1');
      readbyte |= (1<<(7-i));
    }
    else {
      //uart_putc('0');
    }
    i++;
  }
  return readbyte;
}

signed char get_delta_y(void) {
  unsigned char val = adns_read(0b00000010);
  
  signed char delta_y;
  
  if(val <= 127) {
    delta_y = val;
  }
  if(val > 127) {
    delta_y = val - 256;
    
  }
  return delta_y;
}

signed char get_delta_x(void) {
  unsigned char val = adns_read(0b00000011);
  
  signed char delta_x;
  
  if(val <= 127) {
    delta_x = val;
  }
  if(val > 127) {
    delta_x = val - 256;
    
  }
  return delta_x;
}

Autor: Cornelius R. (cornelius_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht kam das falsch rüber, wir möchten nicht die Position 
bestimmen sondern nur die Geschwindigkeit, also die erste Ableitung der 
Position, die Veränderung der Position in einer bestimmten Zeit.

Leider verstehe ich bei deinem Code nur Bahnhof. Ich hoffe, das geht 
auch einfacher. Ich dachte man könne einfach die Zahl der Pulse in einer 
bestimmten Zeit messen und das dann in eine Geschwindigkeit umrechnen. 
Das mit SPI übersteigt meine Fähigkeiten, außer jemand hilft uns...

Was haltet ihr von sogenannten Trackballs? Das wäre doch auch eine 
Möglichkeit!

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sensoren mit Quadraturausgang sind selten geworden?! Ein Lichtschranken 
Drehwinkelgeber nicht mehr zeitgemäß?
Den Eindruck habe ich nicht. Gerade im industriellen Bereich ist das 
völlig üblich.

Autor: Lukas K. (carrotindustries)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Geschwindigkeit lässt sich durch v=s/t berechnen. Den 
Umrechnungsfaktor für Pixel / cm lässt sich leicht experimentell 
ermitteln.
Mein Code ist nur die Ansteuerung des Sensors und das Auslesen der 
Positionsänderung. Das ausrechnen der Geschwindigkeit ist nicht 
enthalten. War für meine Anwendung nicht vonnöten. Trackballs sind 
mechanisch anfällig.
So schwer ist die Implementierung des synchronen seriellen Protokolls 
nun wieder auch nicht, weil im Datenblatt beschrieben. Was BASCOM 
anbetrifft kann ich dir leider nicht helfen.
>Sensoren mit Quadraturausgang sind selten geworden?!
Bei optischen Maussensoren, die mit Bilderkennung arbeiten, schon. 
Sensor war auf den Sensor in optischen Mäusen bezogen.
PS: http://www.roboternetz.de/phpBB2/portal.php Frag mal da nach, da 
sitzen die ganzen BASCOM-Freaks.

Autor: Cornelius R. (cornelius_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es wirklich keine Mäuse mit Quadraturausgang. Seht ihr da 
Schwierigkeiten? Ich würde einfach jedes Mal die Richtung bestimmen und 
dann Zeit und Pulse messen. Ich möchte ein Programm, das so einfach wie 
möglich ist, die Geschwindigkeitsbestimmung ist nur eines vieler 
Probleme!

Ich möchte zuerst Quadratur ausloten bevor ich mit SPI beschäftige. 
Kennt irgenjemand Quadratur-Mäuse?

Autor: Lukas K. (carrotindustries)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alternativ kannst du dich mit dem PS/2-Interface beschäftigen, da gibt 
es sicherlich fertige BASCOM-Libs dafür. Ob es für den Avago Maussensor 
aus der Cherry Maus BASCOM-Libs hat, weiß ich nicht, aber ich hindere 
dich auch nicht daran, nach solchen zu suchen.
PS: Avago hat nur Maussensoren mit SPI oder USB. Ersteres ist noch 
einfacher.

Autor: Tine Schwerzel (tine)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es vielleicht einfach die Möglichkeit die Radumdrehungen mit einem 
impulsgeber zu messen? Das ist doch wohl das einfachste. Drehrate lässt 
sich durch die Differenz verschiedener Räder korrigieren.

Autor: Lukas K. (carrotindustries)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man Lese den Eröffnungsbeitrag und Staune
>Ein Drehwinkelgeber mit Lichtschranke scheidet aus, da er
>erstens nicht mehr zeitgemäß ist, es finden sich fast keine Scheiben
>mehr, und zweitens zu sperrig für den eng gepackten Roboter ist.
BTW: Solche Scheiben für Reflexlichtschranken kann man sich auch selber 
mit Zirkel und Geodreick malen. Zeitgemäß ist es IMHO immer noch.

Autor: Cornelius R. (cornelius_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Halten Mäuse überhaupt bei Geschwindigkeiten von 2 m/s mit?

Autor: Lukas K. (carrotindustries)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Cornelius R. schrieb:
> Halten Mäuse überhaupt bei Geschwindigkeiten von 2 m/s mit?
Weiß ich nicht. Probier es aus oder seh ins Datenblatt. Voraussetzung 
ist, dass du den Sensor oft genug ausliest, damit dieser nicht 
überläuft.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Halten Mäuse überhaupt bei Geschwindigkeiten von 2 m/s mit?

Ich würde mich lieber fragen ob sie auch immer etwas sehen
was sie auswerten können. Optische Mäuse arbeiten nicht unbedingt
mit jedem Untergrund. Die Wahrscheinlichkeit Informationen/Impulse
zu verlieren ist höher als bei den mechanischen Drehdingern.

Autor: Sigint 112 (sigint)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Cornelius:
   Lass dir nichts von den Leuten hier einreden. Es gibt optische 
Mousechips mit Quadraturausgang. Zum Beispiel der ADNS-2051. Den hatte 
ich selbst in einer Maus. Wobei die alten Encoderscheiben wirklich noch 
nicht veraltet sind und selbst in modernen Geräten verwendet werden.

Gruß,
  SIGINT

Autor: Lukas K. (carrotindustries)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt nenne noch eine Maus, in der sich dieser Sensor befindet.

Autor: Cornelius R. (cornelius_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber mit dem Quadraturausgang ist es ja noch nicht zu Ende. Wir müssten 
dann alles noch richig anschließen, was nicht allzu einfach ist oder? 
Und die Distanz und Linse müsste auch richtig eingestellt sein...

Autor: Lukas K. (carrotindustries)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Belass doch den Sensor in der Maus, da stimmen die Abstände. Allerdings 
ist dann die Bodenfreiheit =0

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Es gibt optische Mousechips mit Quadraturausgang.
> Zum Beispiel der ADNS-2051.
Leider per default zu langsam:
with rates of motion up to 14 inches per second.
Wobei sich diese Geschwindigkeit auf die Standard-Maus-Optik bezieht. 
Mit einer anderen (Mini-Kamera-)Optik lassen sich auch deutlich höhere 
Geschwindigkeiten verarbeiten...

Autor: Guido Körber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ein Drehwinkelgeber mit Lichtschranke scheidet aus, da er
>erstens nicht mehr zeitgemäß ist, es finden sich fast keine Scheiben
>mehr, und zweitens zu sperrig für den eng gepackten Roboter ist.

Wissen das die Hersteller von Drehgebern schon? Wenn nein, dann sollte 
man ihnen das endlich mal erzählen, damit die aufhören diesen veralteten 
Kram zu bauen...

Die optischen Maussensoren sind für die Messung von Geschwindigkeit 
nicht gut geeignet, da es bei einer Maus nicht auf eine genaue Messung 
ankommt, sondern nur darauf fest zu stellen ob sich das Ding denn 
überhaupt bewegt und das dann fein aufzuteilen, ist es mit der Präzision 
und Wiederholbarkeit nicht so weit her.

Aber wenn die Shutterscheibe mit den Gabellichtschranken zu altmodisch 
ist, gibt es auch Drehgeber mit Hall-Effekt oder mit GMR.

Autor: Uwe Hermann (uwehermann) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Luk4s K. schrieb:
> Jetzt nenne noch eine Maus, in der sich dieser Sensor befindet.

Ich hatte wegen einem anderen Projekt (das zur Zeit ziemlich auf Eis 
liegt) vor längerem mal angefangen eine Tabelle für Mäuse und 
Maussensoren zu erstellen. Ist zwar nicht annähernd vollständig, aber 
immerhin. Wer da noch Sachen nachtragen will kann das gerne machen, ist 
ein Wiki:

http://opensourcemouse.org/wiki/Optical_Mouse_Survey
http://opensourcemouse.org/wiki/Optical_Sensors

Zur Frage: U.A. zwei Logitech-Mäuse und eine Typhoon haben den ADSN-2051 
drin, siehe Tabellen.

HTH, Uwe.

Autor: Cornelius R. (cornelius_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wisst ihr wo man eine Auswahl an verschiedenen Scheiben für Drehgeber 
hat? Mit ein Problem ist, dass wir keine Scheibe gefunden haben, die 
groß genug ist, damit sich Sensor und Motor nicht streiten,

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.