| |
| | #1 (permalink) Top |
| User Data registr.: 13-09-2012
Messaggi: 4.690
|
Piccola precisazione: le resistenze di pull up dovrebbero essere presenti sulla scheda. Proverò ad aggiungerne di più grandi se può fare la differenza ma non so se posso modificare il circuito. Stasera ci guardo Inviato dal mio Mi A1 utilizzando Tapatalk Ultima modifica di Minestrone : 10 maggio 19 alle ore 14:54 |
| | |
| | #3 (permalink) Top |
| User Data registr.: 13-09-2012
Messaggi: 4.690
|
Sono in viaggio e ne ho approfittato per spulciare lo schema della scheda gy 521 contenente il mpu6050 , sembra che siano previste resistenze di pull up da 4.7K. Evidentemente non è quello il problema. L'unico dubbio è che, siccome la scheda può essere alimentata a 5V ma l'MPU lavora a 3.3 può essere che non sia tollerante ai segnali a 5V provenienti dalla Arduino e dal display. In rete ho visto millemila applicazioni di gy521 collegate direttamente all Arduino. Inviato dal mio Mi A1 utilizzando Tapatalk |
| | |
| | #4 (permalink) Top |
| User |
Per la comunicazione I2C è importante che i livelli del segnale siano congrui, cioè se la MPU prevede sui segnali SCK e SDA un livello di 3,3V anche il micro deve poter funzionare con tali tensioni e le resistenze di pull up vanno connesse al +3,3V e di valore adatto (3,3kohm in genere vanno bene) nel caso ambedue i dispositivi abbiano i pin 5V tollerant è bene mettere le resistenze di pull up (4,7kohm) al +5V. Altro punto importante è, se possibile, configurare i pin in modo Open Drain e non PushPull; essendo i segnali SDA e SCK non bilanciati non penso sia indicato usare un doppino twistato, meglio un classico flat cable.
__________________ Peace & Love Fate le cose nel modo più semplice possibile, ma senza semplificare. (A. Einstein) |
| | |
| | #5 (permalink) Top |
| User Data registr.: 13-09-2012
Messaggi: 4.690
|
Mi sono procurato uno scatolone di convertitori di livello (me ne serviva uno ma tant'è...) e, effettivamente, sembra andare meglio ma, dopo un po' che l'ambaram funziona, comincia ad impallarsi. Probabilmente una libreria simil wire.h non bloccante potrebbe aiutare ma non può essere quella la soluzione al problema. Idee? Gli I2c extender non mi piacciono molto come soluzione. Ne andrebbero usati 4 (due per sensore, o sbaglio?) e allora preferirei mettere un paio di arduini pro micro assieme ai sensori che si occuperebbero di comunicare con i sensori tramite I2C (a breve distanza) e un terzo arduino che si occuperebbe di interfacciarsi con il resto dell'hardware. In questo modo dovrei trasferire gran parte del codice sui due arduini in periferia e sgraverei un po' l'arduino che prima doveva occuparsi di tutto. Facendo tutto ciò però dovrei comunicare in seriale, purtroppo gli arduino che ho possiedono solo una seriale. Potrei risolvere con un arduino mega (che non ho) o con un arduino due (che ho e che non ho mai usato) ma mi sembra di starmi addentrando parecchio nell'ufficio UCAS. Se avete idee illuminanti (dal basso della mia esperienza a me ne vengono poche) sono tutt'orecchi. |
| | |
| | #6 (permalink) Top | |
| User | Citazione:
Per prima cosa tutti i dispositivi devono usare la stessa tensione del bus I2C o 3,3V o 5V e quindi un pull-up unico, fare mescola e combina non va bene, se hai bisogno di un convertitore di livello del bus, le resistenze di pull-up vanno messe sia in ingresso che uscita del convertitore. Altri punti importanti sono: - gli indirizzi dei dispositivi devono essere tutti differenti. - la frequenza del bus I2C deve essere la più bassa di quelle accettetata dai dispositivi connessi. - quando connessi singolarmente i dispositivi devono funzionare in modo affidabile e sicuro. Se come dici, il sistema per un po funziona e poi si impalla il problema è da ricercare nel fw e non nel hw; probabilmente hai temporizzazioni d'interrogazione errate o routine che interferiscono a vicenda (occhio se usi più di un interrupt). Come ho scritto per leggere 8 sensori sul bus I2C utilizzo un micro a 32bit, però ho realizzato anche uno strumento "da cantiere" basato su Arduino Mega 2560 che non solo legge i sensori, può programmarne gli indirizzi fa da tester hw, li visualizza su display touch a colori e può anche loggare i dati scrivendoli su una SD, quindi anche il piccol Arduino ce la può fare.... ![]()
__________________ Peace & Love Fate le cose nel modo più semplice possibile, ma senza semplificare. (A. Einstein) | |
| | |
| | #7 (permalink) Top | |
| User Data registr.: 13-09-2012
Messaggi: 4.690
| Citazione:
Siccome l'arduino e il display viaggiano a 5 V ho messo il convertitore tra l'arduino e i due sensori. I due sensori sono collegato in parallelo (ovvio) con DUE cavi di circa un metro per ogni cavo. Il convertitore di livello converte i segnali da 3V a 5V e viceversa. Il parallelo tra i SCL e SDA dei sensori è al comparto a 3.3V del convertitore. Al comparto a 5 V c'è il parallelo tra convertitore e I2C del display. Le resistenze di pull up non le ho messe perchè sia arduino sia schede dei sensori dovrebbero averle già a bordo. Quì trovi lo schema dell'integrato GY-521 che monta il sensore MPU 6050 http://www.haoyuelectronics.com/Atta...GY-521-SCH.jpg Gli indirizzi sono ovviamente diversi. La frequenza non dovrebbe essere il problema perchè ho provato diverse frequenze senza successo mentre ho avuto successo quando provavo i pezzi del programma con i sensori vicino all'arduino su bread board. Lo sketch utilizza due interrupt provenienti dai sensori (uno a testa) che insicano all'arduino quando il buffer del sensore è pieno e vanno scaricati i dati. | |
| | |
| | #8 (permalink) Top |
| User Data registr.: 13-09-2012
Messaggi: 4.690
|
Ho provato di tutto a parte il dissaldare le resistenze di pull up delle schede. Le pull up sull Arduino le ho cambiate ma nulla. Gli interrupt li ho tolti ma nulla. Oramai mi rimane solo cercare una soluzione software ai blocchi della libreria. Ho provato una libreria wire non bloccante ma non funziona, evidentemente è stata fatta per vecchie versioni dell IDE e su quella più recente non funziona. Avete idea di come fare a rendere non bloccante la libreria wire? Ho anche incluso la libreria liquidcrystal i2c ma mi sembra di capire che faccia uso anche lei a sua volta della wire.h. Inviato dal mio Mi A1 utilizzando Tapatalk |
| | |
| | #9 (permalink) Top |
| User Data registr.: 13-09-2012
Messaggi: 4.690
| Aggiornamenti finali
Alla fine ho portato a termine il progettino ma ho cambiato completamente strada. Ho abbandonato l'idea del processore centrale con display unico LCD I2C e i due giroscopi montati sulle unità di misura. Ora ho due arduino pro mini , ognuno a bordo di un'unità di misura, che pilotano due display a 7 segmenti e 4 cifre e che ricevono direttamente i dati dai sensori. Una di queste unità è master ed è dotata di batteria mentre l'altra è slave e riceve tensione dalla prima. Le due unità dialogano tramite seriale in modo da lasciare il bus I2C libero per il sensore. Ora il tutto funziona benissimo e ho potuto anche mettere qualche menù e qualche controllo della tensione della batteria. Detto questo però non sono mai riuscito a capire il perchè il primo approccio non funzionasse e mi mandasse in tilt l'arduino (o i sensori). Questa settimana ho dovuto fare delle prove per lavoro con un sensore giroscopico/accelerometrico ed ho imbastito una sorta di plc "casereccio" con un arduino uno, qualche relè ed il buon vecchio lcd avanzato dal "vecchio" progetto. Stessi problemi e stesse noie!!! Stavolta non c'erano problemi di cavi e di lunghezze degli stessi perchè ho preparato una scheda con una piastra preforata. Il sensore era nuovo. A questo punto ho cambiato il codice eliminando l'utilizzo del DMP del sensore e dell'interrupt ed ho fatto fare i calcoli all'arduino invece che al sensore; così facendo tutto funziona in modo stabile e senza problemi. A questo punto mi vien da dire che il problema non fosse affatto il bus I2C ma qualcosa d'altro legato all'interrupt, non so che dire. Di fatto l'interrupt mette semplicemente a 1 una variabile booleana che poi, tornando al loop, avvia il processo di scarico dei dati dal buffer del sensore. Mi vien da pensare che se l'interrupt viene avviato durante una comunicazione sul bus I2C (ad esempio con il display) la comunicazione I2C salti (il bus I2C non è tollerante agli errori). Boh.. |
| | |
| | #10 (permalink) Top |
| User Data registr.: 13-09-2012
Messaggi: 4.690
|
A proposito di giroscopi: Mi sarebbe servito un giroscopio preciso che rilevasse l'angolo con l'orizzontale di una barra che sale e scende sorretta da due cilindri pneumatici all'estremità. Mi son trovato che il MPU6050 non è affatto abbastanza veloce e preciso per il lavoro che serviva a me. Probabilmente ho sbagliato qualcosa ma ho provato anche a variare i fondoscala dei sensori senza trarne beneficio. Avete da consigliarmi qualche giroscopio che possa fare al caso mio e che possa correggere la deriva con l'accelerometro che sia facile da gestire (magari analogico) ? Grazie |
| | |
![]() |
| Bookmarks |
| |
Discussioni simili | ||||
| Discussione | Autore discussione | Forum | Commenti | Ultimo Messaggio |
| Radiocomando 3 motori DC e 2 sensori di T con Arduino su trenino | spraity | Radiocomandi | 3 | 09 febbraio 17 14:07 |