Forum: Mikrocontroller und Digitale Elektronik Lineare Geschwindigkeit mit ADNS 3050


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Daniel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Moin,

Ich versuche seit einem Monat die Geschwindigkeit von einem Band mit 
Hilfe des Sensors ADNS3050 zu ermitteln aber bis jetzt habe ich nur 
geschafft die Register Delta x bzw. delta y abzulesen. Wie gehts 
eigentlich weiter!

Bin für jede Hilfe sehr Dankbar.

Daniel

: Verschoben durch Moderator
von Denker (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Mit dem Satz des Pythagoras bestimmst du den Betrag des 
Wegänderungsvektors und mit der Formel
 ermittelst du die mittlere Geschwindigkeit je Abtastung.

von Daniel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
hi Denker,

Danke erstmal für deine Antwort. Aber hier gehts um die ADNS3050, daher 
muss man die Geschwindigkeit andersrum berechnen und nicht nur einfach 
V=S/t.

Ich habe mein Maus [ADNS3050] mit Arduino UNO angeschlossen und kriege 
die Delta X bzw. delta Y, aber ich weiss nicht was für Werte sind die 
und was man damit anfangen könnte, um die Geschwindigkeit zu berechnen.

von Denker (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Daniel schrieb:
> daher muss man die Geschwindigkeit andersrum berechnen

Ich verstehe nicht was du meinst, aber ich denke du irrst dich.


Daniel schrieb:
> kriege die Delta X bzw. delta Y, aber ich weiss nicht was für Werte sind

Die Werte repräsentieren die Verschiebung des Sensors in x- bzw. 
y-Richtung. Diese Verschiebung wird in Inkrementen gemessen; die reale 
Strecke ist abhängig von der Auflösung des Sensors ("DPI Zahl"). Um den 
Betrag der resultierende Bewegung aus der Überlagerung der Bewegungen in 
x- und y-Richtung zu erhalten, kannst den Satz des Pythagoras anwenden.

Die Geschwindigkeit berechnet sich immer mit der oben genannten Formel, 
denn sie entspricht der Definition der Geschwindigkeit ("Änderung des 
Weges in einer bestimmen Zeit").
Der Trick ist, das Delta t durch die Abtastrate deines Arduino-Programms 
festzulegen. Zum Beispiel, indem der Sensor in einem festen Intervall in 
einem Timer-Interrupt ausgelesen wird.

von Daniel (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
ja genau du hast recht.
Also mien Code sieht folgendermassen aus:


void loop() {

int SqrtW=0;
int A = 0;
byte ProID = 0;
byte x = 0;
byte y=0;
byte M = 0;
int  X1=0;
int Y1=0;

 M = Read(0x02); // Motion
 x = Read(0x03); // Delta x
 y=Read(0x04); // Delta y
 ProID = Read(0x00); // Seriel- schnittstelle testen


X1= convTwosComp(x);
Y1=convTwosComp(y);

Sqrt= sqrt((pow(X1,2))+pow((Y1,2))); // Pytagoras

}

Aber mit Timer-Interrupt habe ich bis jetzt keine Erfahrung.
kannst du mir das bitte erläutern bzw. paar Hinweise zu dem Code geben?

von Daniel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
ich habe jetzt paar Teste auf einem Band, die mit 0,8 mm/s 
läuft,durchgeführt, und habe folgendes bekommen:


Motion:  0        x:      0              y:    125
Motion:  0        x:      0              y:    124
Motion:  0        x:      0              y:    125
Motion:  0        x:      0              y:    124
Motion:  0        x:      0              y:    125
Motion:  0        x:      0              y:    125
Motion:  0        x:      125              y:    64
Motion:  0        x:      0              y:    125
Motion:  0        x:      0              y:    125
Motion:  0        x:      0              y:    124
Motion:  0        x:      0              y:    124
Motion:  0        x:      0              y:    124
Motion:  0        x:      0              y:    124
Motion:  0        x:      0              y:    125
Motion:  0        x:      0              y:    125
Motion:  0        x:      0              y:    124
Motion:  0        x:      0              y:    123
Motion:  0        x:      0              y:    125
Motion:  0        x:      0              y:    124
Motion:  0        x:      0              y:    124
Motion:  0        x:      0              y:    125
Motion:  0        x:      0              y:    125
Motion:  0        x:      124              y:    64
Motion:  0        x:      0              y:    125
Motion:  0        x:      0              y:    125
Motion:  0        x:      0              y:    124
Motion:  0        x:      0              y:    125
Motion:  0        x:      0              y:    125
Motion:  0        x:      0              y:    125
Motion:  0        x:      0              y:    125
Motion:  0        x:      0              y:    125
Motion:  0        x:      0              y:    125
Motion:  0        x:      0              y:    125
Motion:  0        x:      0              y:    125
Motion:  0        x:      0              y:    124
Motion:  0        x:      0              y:    125
Motion:  0        x:      0              y:    125
Motion:  0        x:      0              y:    125
Motion:  0        x:      0              y:    125
Motion:  0        x:      0              y:    124
Motion:  0        x:      0              y:    124

ich habe die Geschwingkeit geändert manchmal auf 0,2 mm/s geändert, 
trotzdem bekomme ich immer die gleiche Werte.
ist das so oder stimmt da irgendwas net?

von spess53 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hi

Wieso ist bei dir immer 'Motion:  0'? Da müsste doch wenigstens ab und 
zu 0x80 auftauchen.

MfG Spess

von Daniel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
hallo,

auf Binär bekomme ich jetzt 10000000 für Motion, weil da die siebte Bit 
laut Datenblatt gesetzen werden soll, wenn ein Motion detektiert wird.

von Daniel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Daniel schrieb:
> hallo,
>
> auf Binär bekomme ich jetzt 10000000 für Motion, weil da die siebte Bit
> laut Datenblatt gesetzen werden soll, wenn ein Motion detektiert wird.

aber wieso bekommen ich die gleiche Werte, wenn Motion auch 0 spuckt !

von Cyblord -. (cyblord)


Bewertung
0 lesenswert
nicht lesenswert
Daniel schrieb:
> Daniel schrieb:
>> hallo,
>>
>> auf Binär bekomme ich jetzt 10000000 für Motion, weil da die siebte Bit
>> laut Datenblatt gesetzen werden soll, wenn ein Motion detektiert wird.
>
> aber wieso bekommen ich die gleiche Werte, wenn Motion auch 0 spuckt !

Vielleicht schaust du erstmal dass deine Werte vom Sensor überhaupt 
korrekt übertragen und von dir interpretiert werden.

von spess53 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hi

>auf Binär bekomme ich jetzt 10000000 für Motion, weil da die siebte Bit
>laut Datenblatt gesetzen werden soll, wenn ein Motion detektiert wird.

Und wieso taucht das in der Tabelle nicht als 128 auf?

MfG Spess

von Daniel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Hi
>
>>auf Binär bekomme ich jetzt 10000000 für Motion, weil da die siebte Bit
>>laut Datenblatt gesetzen werden soll, wenn ein Motion detektiert wird.
>
> Und wieso taucht das in der Tabelle nicht als 128 auf?
>
> MfG Spess

Also ich habe es jetzt separat gestestet :

Motion, DEC = 64
Motion, BIN = 1000000

von spess53 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hi

>Also ich habe es jetzt separat gestestet :

>Motion, DEC = 64
>Motion, BIN = 1000000

Das ist aber lt. Datenblatt falsch und taucht auch noch in der falschen 
Spalte auf. Mach das, was  Cyblord -. (cyblord) vorgeschlagen hat:

>Vielleicht schaust du erstmal dass deine Werte vom Sensor überhaupt
>korrekt übertragen und von dir interpretiert werden.

MfG Spess

von Ma.Thematikus (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Denker schrieb:
> Mit dem Satz des Pythagoras bestimmst du den Betrag des
> Wegänderungsvektors …

Bei dir ist die Schule wohl schon länger her …
https://www.mathematik-nachhilfe.de/mathematik/satz-des-pythagoras/

von Daniel (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Ma.Thematikus schrieb:
> Denker schrieb:
>> Mit dem Satz des Pythagoras bestimmst du den Betrag des
>> Wegänderungsvektors …
>
> Bei dir ist die Schule wohl schon länger her …
> https://www.mathematik-nachhilfe.de/mathematik/satz-des-pythagoras/

was meinst du damit. Pythagoras versteht jeder...und Denker hat recht 
gehabt

von Daniel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> spess53

jetzt abgesehen davon was Motion spuckt, will ich nur wissen, wie man 
die Geschwindigkeit mittes DeltaX bzw. DeltaY berechen.
wir gehen davon aus, dass  die Werte von beiden Deltas richtig 
übertragen werden.Also wie gehts dann weiter ?

von spess53 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
HI

>jetzt abgesehen davon was Motion spuckt, will ich nur wissen, wie man
>die Geschwindigkeit mittes DeltaX bzw. DeltaY berechen.

Wenn schon dein Motion falsch ist, dann sind wahrscheinlich deine 
anderen Werte auch falsch. Was willst du mit den falschen Werten 
berechnen?

Bring das erst mal in Ordnung.

MfG Spess

von Daniel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
#define PIN_NCS    3
 #define PIN_MOTION 5

ich habe Motion bzw. Chip-select so definiert und sind jeweils an 
Arduino am Ports 3 und 5 angeschloßen.
wo kann der Fehler liegen ?

von spess53 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hi

>wo kann der Fehler liegen ?

Da ich das Arduinogedöhns nicht kenne, kann ich dir nicht weiter helfen.

MfG Spess

von Daniel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Also ich habe gerade nochmal die verkablung geprüft und da stimmt alles.
ich bekomme noch die 64 auf MOTION_ST.Merkwürdig. Kann sein, dass die 
sexte Bit ausgelesen werden soll, anstatt die Siebte !

int Sqrt=0;
int A = 0;
byte ProID = 0;
byte x = 0;
byte y=0;
int M=0 ;
int  X1=0;
int Y1=0;




M = Read(MOTION_ST); // Motion
 x = Read(0x03); // Delta x
 y=Read(0x04); // Delta y
 ProID = Read(0x00); // Seriel- schnittstelle testen


X1= convTwosComp(x);
Y1=convTwosComp(y);


Serial.println ("M");
Serial.println (M); delay(100);
Serial.println ("X1");
Serial.println (X1); delay(100);
Serial.println ("Y1");
Serial.println (Y1); delay(100);

von spess53 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hi

>Also ich habe gerade nochmal die verkablung geprüft und da stimmt alles.
>ich bekomme noch die 64 auf MOTION_ST.Merkwürdig. Kann sein, dass die
>sexte Bit ausgelesen werden soll, anstatt die Siebte !

Vielleicht stimmt auch einfach dein SPI-Mode nicht.

MfG Spess

von Daniel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Respekt .ich habe jetzt alle MODEs probiert und das funktioniert nur mit 
MODE3. ich habe am Anfang gedacht, es ist egal welches MODE hat man 
gewählt,  der Unterschied liegt normalerweise nur bei CPHA bzw. CPHA.
Aber jetzt funktioniert und bekomme ich 128 für Motion und auch negative 
Werte bei DeltaX, DeltaY.

Danke Spess

von spess53 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hi

>der Unterschied liegt normalerweise nur bei CPHA bzw. CPHA.

Bei CPOL und CPHA. Wenn du dort was falsches einstellst, kann es 
passieren das MOSI im falschen Moment abgetastet wird.

Wenigstens funktioniert es jetzt.

MfG Spess

von Daniel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
ja genau
4:17:09.907 -> Motion:  128|        x:      -128|              y:    -1
14:17:09.907 -> Motion:  128|        x:      -128|              y:    2
14:17:09.907 -> Motion:  128|        x:      -128|              y:    4
14:17:09.907 -> Motion:  128|        x:      -128|              y:    3
14:17:09.907 -> Motion:  128|        x:      -128|              y:    0
14:17:09.907 -> Motion:  128|        x:      -128|              y:    0
14:17:09.907 -> Motion:  128|        x:      -128|              y:    -2
14:17:09.941 -> Motion:  128|        x:      -128|              y:    5
14:17:09.941 -> Motion:  128|        x:      -128|              y:    1
14:17:09.941 -> Motion:  128|        x:      -128|              y:    9
14:17:09.941 -> Motion:  128|        x:      -128|              y:    8
14:17:09.941 -> Motion:  128|        x:      -128|              y:    3
14:17:09.941 -> Motion:  128|        x:      -128|              y:    3
14:17:09.941 -> Motion:  128|        x:      -128|              y:    -3
14:17:09.974 -> Motion:  128|        x:      -128|              y:    4
14:17:09.974 -> Motion:  128|        x:      -128|              y:    0
14:17:09.974 -> Motion:  128|        x:      -128|              y:    -9

von Daniel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
wieso änderen sich die Werte von DeltaX bzw. DeltaY wenn ich die 
Geschwindigkeit vom Band ändere.!

von spess53 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hi

>wieso änderen sich die Werte von DeltaX bzw. DeltaY wenn ich die
>Geschwindigkeit vom Band ändere.

Vielleicht ist dein Band etwas gewellt oder wird bei verschiedenen 
Geschwindigkeiten unterschiedlich straff gezogen.

Was anderes: Dein dX-Wert liegt an einem Ende des Bereichs. 
Möglicherweise ist die Geschwindigkeit zu groß. Überprüfe mal mit 
MOTION_EXT (Register 0x1b) ob da nicht auch ein Überlauf stattfindet.

MfG Spess

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Daniel schrieb:
> was meinst du damit. Pythagoras versteht jeder...und Denker hat recht
> gehabt

Bei dir ist das Thema wohl auch schon länger her ;-(
Hast du dir mal die Mühe gemacht, dem Link zu folgen, um dein Wissen 
über den Inhalt des Satzes des Pythagoras etwas aufzufrischen?

von Daniel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
bin erst 18 und versuche was zu lernen,aber bedauerlichweise meine Maus 
funktioniert jetzt nicht mehr, und soll ein neues bestellen.

Welches soll ich am besten bestellen ?

von Daniel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
hallo,

laut meinen Freunden ist die ADNS 3090 viel besser als 3050.
ich habe die bestellt und habs heute Morgen bekommen. Ich würde nochmal 
das selbe experimentieren.

Gruß, Daniel

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]
  • [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.