View Full Version : Dati provenienti da accelerometro in spostamento
suspence
05-11-2009, 16:59
Ciao a tutti,
ho un accelleromentro a due assi della memsic. Dovrei riuscire a trasformare i dati provenienti dall'accelerometro in uno spostamento X-Y per usarlo come mouse.
Purtroppo il mio spostamento lo ottengo solo se mi muovo al massimo di 90° in un verso, se mi muovo nell'altro verso non succede niente... ed il cursore non torna indietro ma rimane fermo.
ecco i dettagli dal datasheet dell'accelerometro
http://img196.imageshack.us/img196/3496/senzatitolo2rp.jpg
Devo fare qualche trasformazione?
Ecco il prodotto in questione: http://www.memsic.com/products/MXC6202.htm
Satviolence
05-11-2009, 20:00
-edit-
Non avevo capito bene il problema... strano questo accelerometro!
suspence
05-11-2009, 20:03
A questo ci ho pensato, ma considera che devo fare il tutto su un PIC a 8 bit. In pratica non riesco a capire cosa caspita mi sputa fuori sto accelerometro sulla porta I2C... :mc: :help:
Satviolence
05-11-2009, 20:38
Se noti, X output e Y output sono le componenti di un vettore unitario (cioè x^2+y^2=1).
Praticamente, usato con x e y messi su un piano verticale, ti da le componenti dell'accelerazione di gravità lungo x e y.
Se l'accelerazione è pari a 1 g, allora il modulo del vettore è 1.
Se metti l'accelerometro con x e y sul piano orizzontale, ti darà in uscita le componenti in x e y dell'accelerazione nel piano orizzontale. Il modulo del vettore risultante non sarà unitario, ma sarà il valore dell'accelerazione espresso in g. Allo stesso modo le componenti in x e y sono decimali di 1 g.
killercode
05-11-2009, 20:44
Attacca l'uscita ad uno oscilloscopio e guarda cosa esce
suspence
05-11-2009, 20:49
Attacca l'uscita ad uno oscilloscopio e guarda cosa esce
Non lo posso fare... ho solo una connessione USB
suspence
05-11-2009, 20:57
Se noti, X output e Y output sono le componenti di un vettore unitario (cioè x^2+y^2=1).
Praticamente, usato con x e y messi su un piano verticale, ti da le componenti dell'accelerazione di gravità lungo x e y.
Se l'accelerazione è pari a 1 g, allora il modulo del vettore è 1.
Se metti l'accelerometro con x e y sul piano orizzontale, ti darà in uscita le componenti in x e y dell'accelerazione nel piano orizzontale. Il modulo del vettore risultante non sarà unitario, ma sarà il valore dell'accelerazione espresso in g. Allo stesso modo le componenti in x e y sono decimali di 1 g.
Non ti seguo...
Quello che vorrei ottenere è che, se mi sposto in un verso l'uscita sia negativa, nell'altro sia positiva...
Satviolence
05-11-2009, 21:15
Non ti seguo...
Quello che vorrei ottenere è che, se mi sposto in un verso l'uscita sia negativa, nell'altro sia positiva...
Una cosa: leggi bene il datasheet http://www.memsic.com/data/products/MXC6202XMP/MXC6202xMP.pdf , quello che hai messo all'inizio è solo un esempio e può essere fuorviante (per me lo è stato).
A pagina 2 è scritto chiaramente che l'intervalli di misura è +2 g / -2 g.
A pagina 9 c'è la tabellina:
Resolution - Refreshing rate - Zero-G Offset
10 bits - 400Hz - 512
12 bits - 100Hz - 2048
Cioè col campionamento a 400 Hz la risoluzione del segnale in uscita è di 10 bit (valori da 0 a 1023), con lo zero corrispondente al valore 512. Quindi 0 sarà pari a -2 g, 1023 sarà +2 g.
suspence
05-11-2009, 21:33
Una cosa: leggi bene il datasheet http://www.memsic.com/data/products/MXC6202XMP/MXC6202xMP.pdf , quello che hai messo all'inizio è solo un esempio e può essere fuorviante (per me lo è stato).
A pagina 2 è scritto chiaramente che l'intervalli di misura è +2 g / -2 g.
A pagina 9 c'è la tabellina:
Resolution - Refreshing rate - Zero-G Offset
10 bits - 400Hz - 512
12 bits - 100Hz - 2048
Cioè col campionamento a 400 Hz la risoluzione del segnale in uscita è di 10 bit (valori da 0 a 1023), con lo zero corrispondente al valore 512. Quindi 0 sarà pari a -2 g, 1023 sarà +2 g.
Penso che adesso sia un pò più chiaro, quindi per eventualmente ottenere il valore negativo posso fare che: se x è minore di 512 allora trasmetto -x, altrimenti x-512...?
Se prendessi solo il byte più significativo?
Satviolence
05-11-2009, 21:43
Penso che adesso sia un pò più chiaro, quindi per eventualmente ottenere il valore negativo posso fare che: se x è minore di 512 allora trasmetto -x, altrimenti x-512...?
No, devi fare x-offset sempre.
Ricordati della doppia integrazione per ottenere lo spostamento...
suspence
05-11-2009, 21:47
No, devi fare x-offset sempre.
Ricordati della doppia integrazione per ottenere lo spostamento...
l'offset è il valore precedentemente ottenuto?
PS
Per evitare di farla diventare una conversazione a due ho provato a mandarti un PM, ma hai la casella piena
Satviolence
05-11-2009, 21:54
l'offset è il valore precedentemente ottenuto?
PS
Per evitare di farla diventare una conversazione a due ho provato a mandarti un PM, ma hai la casella piena
L'offset è il valore dello 0, cioè 512 o 2048. A quello che ti da in uscita, togli semplicemente 512 o 2048.
Lasciamo stare i PM, perché comunque più di tanto non ti potrò aiutare, visto che sono un meccanico. Magari così si aggrega qualcuno...
suspence
05-11-2009, 22:05
L'offset è il valore dello 0, cioè 512 o 2048. A quello che ti da in uscita, togli semplicemente 512 o 2048.
Lasciamo stare i PM, perché comunque più di tanto non ti potrò aiutare, visto che sono un meccanico. Magari così si aggrega qualcuno...
Beh, magari si aggregasse qualcuno... inizio ad odiare gli accelerometri... :D
poichè io salvo solamente il byte più significativo, allora:
Se X è minore di 128 invio -X (lo spostamento sarà da -0 a -127)
Se X è maggiore di 128 invio X-128 (spostamento fra 0 e 127)
85francy85
06-11-2009, 06:16
Beh, magari si aggregasse qualcuno... inizio ad odiare gli accelerometri... :D
poichè io salvo solamente il byte più significativo, allora:
Se X è minore di 128 invio -X (lo spostamento sarà da -0 a -127)
Se X è maggiore di 128 invio X-128 (spostamento fra 0 e 127)
Già sono pochi bit usali tutti :stordita: perchè lo devi troncare di 2/4bit :mbe: ?
Ad ogni modo prendendo 8 bit l'uscita di ogni asse va da 0 a 255 :read: e l'offset lo hai a 128.
Quindi se ricevi 129 invii 1 se ricevi 98 invii -30
Inoltre devi gestire il fatto della doppia integrazione per ottenere una posizione il che può rilevarsi problematico.
E' un progetto che devi fare sulla carta o fisicamente :stordita: ?
suspence
06-11-2009, 08:05
Già sono pochi bit usali tutti :stordita: perchè lo devi troncare di 2/4bit :mbe: ?
Ad ogni modo prendendo 8 bit l'uscita di ogni asse va da 0 a 255 :read: e l'offset lo hai a 128.
Quindi se ricevi 129 invii 1 se ricevi 98 invii -30
Inoltre devi gestire il fatto della doppia integrazione per ottenere una posizione il che può rilevarsi problematico.
E' un progetto che devi fare sulla carta o fisicamente :stordita: ?
Progetto fisico... :cry:
quindi per cui devo sempre inviare x-128?
85francy85
06-11-2009, 08:21
Progetto fisico... :cry:
quindi per cui devo sempre inviare x-128?
ti prego niente MP ( se non per inviarmi qualche contatto di utentesse carine e disponibili :stordita: )
Siccome oltre che il mouse dovrai fare pure i driver dello stesso mouse vedi tu è esattamente la stessa cosa togliere prima o dopo il numero. A questo punto ti conviene toglierlo con il programma sul PC in modo da far girare numeri solo positivi ( e ti risparmi un po' di seghe mentali :stordita: )
suspence
06-11-2009, 08:23
ti prego niente MP ( se non per inviarmi qualche contatto di utentesse carine e disponibili :stordita: )
Siccome oltre che il mouse dovrai fare pure i driver dello stesso mouse vedi tu è esattamente la stessa cosa togliere prima o dopo il numero. A questo punto ti conviene toglierlo con il programma sul PC in modo da far girare numeri solo positivi ( e ti risparmi un po' di seghe mentali :stordita: )
Niente driver, solo profili HID
85francy85
06-11-2009, 08:38
Butta giu un minimo di progetto almeno, ho l'impressione che tu voglia sparare direttamente il valore in uscita dall'accelerometro al PC :stordita:
Niente driver, solo profili HID
Da quel poco che vedo richedono una posizione assoluta sul piano XY che tu gli devi passare.
suspence
06-11-2009, 08:43
Butta giu un minimo di progetto almeno, ho l'impressione che tu voglia sparare direttamente il valore in uscita dall'accelerometro al PC :stordita:
Da quel poco che vedo richedono una posizione assoluta sul piano XY che tu gli devi passare.
Il progetto c'è... per quanto riguarda X e Y, il profilo prevede anche l'invio di dati relativi...
L'unica cosa che mi manca è trasformare i dati provenienti di quell'accelerometro in spostamento...
85francy85
06-11-2009, 08:45
Il progetto c'è... per quanto riguarda X e Y, il profilo prevede anche l'invio di dati relativi...
L'unica cosa che mi manca è trasformare i dati provenienti di quell'accelerometro in spostamento...
Dall'accelerometro ricavi l'accelerazione "istantanea" da questa "integrando" ricavi la velocità e "integrando" nuovamente ricavi la posizione.
detto questo auguri :stordita: non ho idea della precisione che ne derivi siccome teoricamente se non integri giusto allora non distingui la differenza tra un moto uniforme e quando sei fermo :stordita:
suspence
11-11-2009, 17:57
Sono riuscito a fare tutto.... più o meno... :-D
adesso devo regolare gli offset. Nel senso che l'accelerometro indica l zero G a 2048 quando è messo a 90 gradi... Se io volessi lo zero G a 45 gradi avevo pensato di sottrarre/aggiungere 1024. Inoltre devo scalare per diminuire la sensibilità dividendo per un valore.....
così facendo però il mouse schizza in un angolo...
Satviolence
11-11-2009, 19:23
Sono riuscito a fare tutto.... più o meno... :-D
adesso devo regolare gli offset. Nel senso che l'accelerometro indica l zero G a 2048 quando è messo a 90 gradi... Se io volessi lo zero G a 45 gradi avevo pensato di sottrarre/aggiungere 1024. Inoltre devo scalare per diminuire la sensibilità dividendo per un valore.....
così facendo però il mouse schizza in un angolo...
Ehm... a sto punto un po' di trigonometria ti tornerebbe utile...
suspence
11-11-2009, 21:32
Per la rotazione già fatto, ho usato:
x'=x*cos + y*sin;
y'=-x*sin + y*cos;
il mio problema rimane sistemare l'offset della verticale dell'accelerometro, rispetto a quella voluta dall'utente...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.