Forum: Mikrocontroller und Digitale Elektronik Lineare Geschwindigkeit mit ADNS 3050


von Daniel (Gast)


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 User
von Denker (Gast)


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)


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)


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)


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)


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)


Lesenswert?

Hi

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

MfG Spess

von Daniel (Gast)


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)


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)


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)


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)


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)


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)


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)


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)


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)


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)


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)


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)


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)


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)


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)


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)


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)


Lesenswert?

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

von spess53 (Gast)


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)


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)


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)


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

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.