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
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.
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)
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
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 | }
|
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!
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.
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.
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?
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.
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.
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.
Halten Mäuse überhaupt bei Geschwindigkeiten von 2 m/s mit?
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.
>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.
@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
Jetzt nenne noch eine Maus, in der sich dieser Sensor befindet.
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...
Belass doch den Sensor in der Maus, da stimmen die Abstände. Allerdings ist dann die Bodenfreiheit =0
> 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...
>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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.