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


von Cornelius R. (cornelius_r)


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: http://www.youtube.com/watch?v=cGseeyrSLAg

Viele Grüße
Cornelius

von Lukas K. (carrotindustries)


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_WheelMouse_optical.htm 
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-WheelMouse-Optical-M-5400-USB-PS-2-weiss.html
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.

von Cornelius R. (cornelius_r)


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)

von Frank K. (fchk)


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

von Lukas K. (carrotindustries)


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.
1
#define DATA_DDR DDRB
2
#define DATA_PORT PORTB
3
#define DATA_PIN PINB
4
#define DATA_LINE PB0
5
6
#define CLOCK_DDR DDRB
7
#define CLOCK_PORT PORTB
8
#define CLOCK_PIN PINB
9
#define CLOCK_LINE PB1
10
11
void data_high(void) {
12
  DATA_DDR |= (1<<DATA_LINE);
13
  DATA_PORT |= (1<<DATA_LINE);
14
}
15
16
void data_low(void) {
17
  DATA_DDR |= (1<<DATA_LINE);
18
  DATA_PORT &= ~(1<<DATA_LINE);
19
}
20
21
void data_highz(void) {
22
  DATA_DDR &= ~(1<<DATA_LINE);
23
  DATA_PORT &= ~(1<<DATA_LINE);
24
}
25
26
27
void clock_high(void) {
28
  CLOCK_PORT |= (1<<CLOCK_LINE);
29
}
30
31
void clock_low(void) {
32
  CLOCK_PORT &= ~(1<<CLOCK_LINE);
33
}
34
35
void adns_write(unsigned char adr, unsigned char dat) {
36
  unsigned char adrbits[8];
37
  unsigned char datbits[8];
38
  unsigned char i = 0;
39
  while(i < 8) {
40
    if(adr & (1<<i)) {
41
      adrbits[7-i] = 1;
42
    }
43
    else {
44
      adrbits[7-i] = 0;
45
    }
46
    if(dat & (1<<i)) {
47
      datbits[7-i] = 1;
48
    }
49
    else {
50
      datbits[7-i] = 0;
51
    }
52
    i++;
53
  }
54
  
55
  i = 0;
56
  
57
  while(i < 8) {
58
    data_high();
59
    if(adrbits[i] == 0) {
60
      data_low();
61
    }
62
    
63
    clock_low();
64
    _delay_us(350);
65
    clock_high();
66
    _delay_us(350);
67
    i++;
68
  }
69
  
70
  i = 0;
71
  
72
  while(i < 8) {
73
    data_high();
74
    if(datbits[i] == 0) {
75
      data_low();
76
    }
77
    
78
    clock_low();
79
    _delay_us(350);
80
    clock_high();
81
    _delay_us(350);
82
    i++;
83
  }
84
  
85
}  
86
87
88
unsigned char adns_read(unsigned char adr) {
89
  unsigned char adrbits[8];
90
  unsigned char datbits[8];
91
  unsigned char i = 0;
92
  while(i < 8) {
93
    if(adr & (1<<i)) {
94
      adrbits[7-i] = 1;
95
    }
96
    else {
97
      adrbits[7-i] = 0;
98
    }
99
    i++;
100
  }
101
  
102
  i = 0;
103
  
104
  while(i < 8) {
105
    data_high();
106
    if(adrbits[i] == 0) {
107
      data_low();
108
    }
109
    
110
    clock_low();
111
    _delay_us(350);
112
    clock_high();
113
    _delay_us(350);
114
    i++;
115
  }
116
  
117
  
118
  data_highz();
119
  i = 0;
120
  
121
  _delay_us(500);
122
  
123
  while(i<8) {
124
    clock_low();
125
    _delay_us(300);
126
    if(DATA_PIN & (1<<DATA_LINE)) {
127
      datbits[i] = 1;
128
    }
129
    else {
130
      datbits[i] = 0;
131
    }
132
    clock_high();
133
    _delay_us(300);
134
    i++;
135
  }
136
  
137
  data_highz();
138
  
139
  i = 0;
140
  unsigned char readbyte = 0;
141
  while(i < 8) {
142
    if(datbits[i] == 1) {
143
      //uart_putc('1');
144
      readbyte |= (1<<(7-i));
145
    }
146
    else {
147
      //uart_putc('0');
148
    }
149
    i++;
150
  }
151
  return readbyte;
152
}
153
154
signed char get_delta_y(void) {
155
  unsigned char val = adns_read(0b00000010);
156
  
157
  signed char delta_y;
158
  
159
  if(val <= 127) {
160
    delta_y = val;
161
  }
162
  if(val > 127) {
163
    delta_y = val - 256;
164
    
165
  }
166
  return delta_y;
167
}
168
169
signed char get_delta_x(void) {
170
  unsigned char val = adns_read(0b00000011);
171
  
172
  signed char delta_x;
173
  
174
  if(val <= 127) {
175
    delta_x = val;
176
  }
177
  if(val > 127) {
178
    delta_x = val - 256;
179
    
180
  }
181
  return delta_x;
182
}

von Cornelius R. (cornelius_r)


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!

von Simon K. (simon) Benutzerseite


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.

von Lukas K. (carrotindustries)


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.

von Cornelius R. (cornelius_r)


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?

von Lukas K. (carrotindustries)


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.

von Tine S. (tine)


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.

von Lukas K. (carrotindustries)


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.

von Cornelius R. (cornelius_r)


Lesenswert?

Halten Mäuse überhaupt bei Geschwindigkeiten von 2 m/s mit?

von Lukas K. (carrotindustries)


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.

von holger (Gast)


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.

von Sigint 112 (sigint)


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

von Lukas K. (carrotindustries)


Lesenswert?

Jetzt nenne noch eine Maus, in der sich dieser Sensor befindet.

von Cornelius R. (cornelius_r)


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...

von Lukas K. (carrotindustries)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Es gibt optische Mousechips mit Quadraturausgang.
> Zum Beispiel der ADNS-2051.
Leider per default zu langsam:
1
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...

von Guido Körber (Gast)


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.

von Uwe H. (uwehermann) Benutzerseite


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.

von Cornelius R. (cornelius_r)


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,

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.