Ciao a tutti, sono uno studente che frequenta il quinto anno di un ITIS.
Scrivo qui per chiedervi un aiuto.
Quest'anno all'esame di maturità vorrei portare un progetto che consiste in una maschera capace di replicare il movimento della testa tramite un cerchietto in cui sono situati un accellerometro ed un magnetometro. Il problema è che da poco ho iniziato ad usare l'arduino in maniera autonoma dato che nella mia scuola non si tratta, ma nonostante questo sono riuscito a fare qualcosina di banale, grazie alla conoscenza del C. Il sito da cui ho preso spunto per il progetto è questo:http://www.marcopucci.it/tutorial-arduino-13-arduino-robotic-face/
Ora ho alcune domande a cui devo dare risposta prima di acquistare i sensori, in modo da iniziare a lavorare sul progetto:
Perchè si utilizza un accellerometro e un magnetometro? Non se ne può usare solo uno di questi per gestire la testa sia verticalmente che orizzontalmente, dato che questi sensori rilevano entrambi la posizione della testa?
2)Come funzionano questi sensori e come si programmano? Devo sapere tutto ai riguardi di questo progetto perchè devo esporlo agli esami.
2)L'accellerometro MMA7361L non è più in produzione. Quale accellerometro posso acquistare in modo che sia compatibile con questo tipo di progetto? Come si fa a capire quale si possa usare per questo progetto? Io non riesco a capirlo dato che non sono molto esperto.
A parte il fatto che alla prima domanda la risposta è contenuta nella stessa pagina che hai linkato (ma l'hai letta???), ossia "La risposta è no, dobbiamo utilizzare due sensori per controllare tutti i movimenti della nostra testa. Con l’accelerometro possiamo individuare l’inclinazione della testa (su, centro, giù) mentre con il magnetometro abbiamo la posizione della testa se è rivolta verso sinistra, al centro o a destra."
In ogni caso prima che te lo dica un moderatore: essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.
Si ho letto, ma non capisco il perchè non posso usare solo uno dei due sensori. Lo voglio capire perchè non voglio copiare il codice, o copiare il progetto, voglio prendere spunto, ma se non capisco questo non posso andare avanti, anche perchè se me lo chiedono agli esami non so dare risposta.
warrock10091:
Si ho letto, ma non capisco il perchè non posso usare solo uno dei due sensori. Lo voglio capire perchè non voglio copiare il codice, o copiare il progetto, voglio prendere spunto, ma se non capisco questo non posso andare avanti, anche perchè se me lo chiedono agli esami non so dare risposta.
Ma ci arrivi se provi a ragionarci sopra: l'accelerometro misura l'accelerazione di gravità, che come saprai va verso il basso, quindi può determinare l'inclinazione alto/basso, e non la rotazione sinistra/destra. Per capire DOVE sta "guardando" la testa serve un magnetometro ossia (per semplificare il concetto) una "bussola" che capisce la direzione rispetto al Nord.
Teoricamente potresti anche determinarlo in modo inerziale: partendo da una posizione nota misuro l'accelerazione lungo l'asse e determino quindi la velocità di rotazione, ma oltre a non essere facile né precisa richiede appunto una "posizione zero" nota a priori. Che in genere NON hai.
Quindi se ho capito bene, dato che l'accellerometro lavora sulle accellerazioni di gravità, può ottenere solo parametri che riguardano la y, dato che la gravità va verso il basso; mentre il magnetometro è come se fosse una bussola. Mi sorge una domanda: "Allora il magnetometro perchè non può essere usato da solo, senza accellerometro?"
Come vedi le mie domande sono banali, ma solo riuscendo a rispondere a queste posso comprendere tutto ai riguardi del progetto.
Nel fine settimana mi muoverò nell'acquistare i componenti necessari, sperando di riuscire a concludere il progetto in tempo per gli esami, data la mia poca esperienza con i sensori e con la loro programmazione.
Be' , tecnicamente, l'accelrometro, essendo in genere a tre assi, puo ottenere le accelerazioni di gravita' su tutti e tre' ... con la bussola, rilevi la direzione verso cui stai guardando ... ed unendoci anche un giroscopio, hai tutti i parametri in modo piu corretto ...
Ci sono schedine che integrano tutti e tre i sensori in un solo oggetto abbastanza piccolo, cerca "9 DOF sensor" o simili ... ad esempio, una cosa tipo questa ... oppure anche questa ... o altre simili ...
Poi ci sono i vari algoritmi, kalman, eccetera, che dai dati di questi sensori ti forniscono posizione e rotazione, ma li andiamo sulla programmazione, che non e' certo il mio forte, per cui ti serve un softwarista ...
Adesso forse ho capito, se la faccia la tengo abbassata, al centro o alzata, il magnetometro punta sempre a nord, quindi non rileva la variazione e non basta; così, si utilizza l'accellerometro che lavorando sull'accellerazione di gravità, che va verso il basso, possiamo rilevare delle variazioni quando muoviamo la testa dall'alto verso il basso. Quindi, il magnetometro da solo non si può usare per questo motivo e l'accellerometro neanche perchè lavora sulle variazioni della testa verso il basso. Adesso che so la teoria, acquisterò i componenti e vedo come funzionano ai riguardi della programmazione, dopo aver fatto la struttura.
E' "leggermente" piu complesso (appena appena :D) ... l'accelerometro misura l'accelerazione gravitazionale su tutti e tre gli assi, e misura sia quella statica (cioe' la gravita' terrestre) che quella dinamica (cioe' i movimenti spaziali) ... il giroscopio, che sostanzialmente nella versione elettronica e' una specie di accelerometro, solo con struttura interna differente e funzionante in base all'effetto Coriolis, misura piu che altro le rotazioni sugli assi, piu che le accelerazioni laterali ... mentre il magnetometro o bussola ovviamente misura il campo magnetico ...
Poi c'e' da considerare che l'accelerometro da solo e' quasi privo di deriva, ma e' "poco reattivo" sugli assi, mentre il giroscopio e' molto piu reattivo sui propri assi, ma soffre di parecchia deriva (un giroscopio da solo darebbe a causa di questa deriva un valore che continua lentamente a cambiare anche se l'oggetto e' fermo) ... il Kalman si occupa di integrare tutti i dati in modo da avere una buona reattivita' e compensare la deriva, per cui andrebbero sempre usati insieme ... piu ovviamente la bussola per sapere in che direzione e' rivolta ... allo stesso tempo i dati di accelerometro e giroscopio compensano l'inclinazione della bussola (che da sola darebbe valori errati se non fosse mantenuta perfettamente in piano) ... in pratica, per avere buoni risultati, sarebbero da usare tutti e tre insieme ...
Adesso che ho compreso perchè per questo progetto servono sia un accellerometro che un magnetometro, devo proseguire all'acquisto di quest'ultimi. Dato che ho iniziato da poco con arduino, potete aiutarmi all'acquisto dell'accellerometro MMA7361L e del magnetometro MAG 3110, come consiglia colui che ha fatto il progetto, magari linkandomi l'acquisto in qualche sito che fornisce anche le librerie dei componenti che vende.
warrock10091:
Adesso che ho compreso perchè per questo progetto servono sia un accellerometro che un magnetometro, devo proseguire all'acquisto di quest'ultimi.
Bene, per gli acquisti io vado in genere su eBay, cerco venditori italiani (per non perdere troppo tempo in spedizioni internazionali, e per avere un minimo di possibilità di contatto in caso di problemi).
Ma nella tua tesina mi raccomando, se non vuoi problemi ricorda che si scrive "accelerometro" e "accelerare" con una "l" sola...
Ho acquistato il tutto, adesso sto aspettando che il corriere mi consegni il pacco. Nel frattempo mi sono sorte due domande:
Perchè il magnetometro si mette nella parte superiore del cerchietto, mentre l'accellerometro nella parte laterale?
2)Quando dovrò pensare al programma, dovrò scriverlo seguendo la logica di tradurre istante per istante ogni piccola variazione della testa, con una conseguente variazione di grado dei servomotori(uno per i movimenti orizzontali e uno per i movimenti verticali della testa), oppure secondo se la testa è in basso o a destra ecc, muovo i servomotori di un tot. di grado?
Secondo me', se vuoi che la testa replichi il movimento dei sensori, devi rilevare istante per istante la nuova posizione, e se e' cambiata rispetto a quella vecchia, inviare ai motori il numero di step necessari perche' si posizioni in quella nuova (cosi a logica ;)) ... poi molto probabilmente ci sara' da integrare tutti i dati con un PID, in modo che non "saltelli" qui e la' ad ogni minimo tremolio ed abbia un po di controllo inerziale ...
Adesso che ancora non ho il materiale, e quindi ancora non sto "smanettando" con il progetto, non riesco a capire come attuare questa logica in linguaggio C; esistono infinite posizioni, quando ne assumo una qualsiasi, i servomotori si devono muovere di un certo grado, secondo i dati inviati dall'accellerometro e dal magnetometro. Quindi, si dovrebbe trovare una relazione per conoscere di quanti gradi si devono muovere i servomotori, in base ai dati inviati della "vera posizione della testa umana" dall'accellerometro e dal magnetometro. È troppo difficile, credo che nell'esempio fatto dal sito, colui che ha fatto il progetto, non ha usato questa logica.
Il principio di funzionamento e' simile a quello dei "gimbal" delle telecamere, solo applicato alla rovescia ... nel gimbal, i sensori rilevano il movimento e trasmettono i dati ai motori, per farli muovere in modo che l'elemento di supporto centrale rimanga sempre nella stessa posizione ... nel tuo caso, i dati rilevati sono trasmessi a motori esterni che muoveranno la testa per fargli cambiare posizione seguendo quella dei sensori ... i movimenti sono invertiti, ma il principio di funzionamento e' piu o meno lo stesso, quindi se trovi uno sketch o un tutorial per programmare un gimbal (io non ne ho purtroppo, ma in rete ci dovrebbe essere qualcosa, e magari qualche altro utente piu "programmatore" di me potra anche dirti dove cercare), hai gia un punto di partenza da cui iniziare a studiarti le modalita' di funzionamento ...
Avevo compreso questa logica, sfortunatamente non riesco a trovare nessuno sketch sui gimbal, spero che qualche utente esperto intervenga, perchè davvero non capisco.. un esempio banale: mettiamo caso che quando la mia testa è girata a destra, il magnetometro, che controlla i movimenti orizzontali della mia testa, rileva x=15.4(sto sparando), allora saprò che quando x=15.4, posso far ruotare il servomotore, che controlla i movimenti orizzontali della faccia robotica, di 90 gradi verso destra. Ma, quando, mettiamo caso, x=13.4, il servomotore non dovrà ruotare di 90 gradi, ma di meno, come faccio a capire di quanto..
Capisco il tuo punto di vista ma non mi sembra una gran mossa..
Studiati lo sketch, se non capisci dei passaggi chiedili qui sul forum. Quando ti senti pronto puoi partire a scrivere il tuo programmma con tutte le modifiche/miglioramenti che ti pare.
Diversamente, secondo me, perdi solo tempo a porre questioni su cose già risolte nello sketch originale
Guardando lo sketch, ho visto la funzione map che non conoscevo ed ho capito tutto... però non capisco perchè colui che ha fatto il progetto, la utilizza solo nei movimenti orizzontali(magnetometro), e non la utilizza anche nei movimenti verticali (accellerometro), dove invece utilizza gli if, per vedere se la testa "umana" ha raggiunto una certa posizione, così da muovere di un certo grado i servomotori.
Forse perchè gli bastava che la testa si muovesse solo in due o tre posizioni, oppure perchè l'accelerometro, non filtrato, fornisce letture troppo sporche per avere un movimento fluido della testa.
Questa potrebbe essere una modifica che potresti studiare tu