15 maggio 19, 14:07 | #41 (permalink) Top | |
User Data registr.: 13-09-2012
Messaggi: 4.686
| 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. | |
15 maggio 19, 14:25 | #42 (permalink) Top | |
User | Citazione:
Come seconda cosa non utilizzare interrupt dai sensori ma vai in polling degli stessi e controlla il bit di (data ready), l'ideale sarebbe avviare da sw lo start di lettura del sensore ed attendere che i dati siano disponibili e poi passare al successivo. In alternativa dare lo start di lettura in rapida sequenza ad ambedue i sensori e poi attendere in polling il risultato, quindi elaborare i dati e poi mandarli al display. Il problema al 90% è imputabile al fw, i due interrupt possono arrivare insieme od a breve distanza e poichè Arduino non brilla per la gestione degli stessi è facile incappare in un blocco del sistema o nella lettura di dati farlocchi. Come consigliato prova prima, dopo le modifiche hw, con un solo sensore e senza interrupt, poi aggiungi il secondo.
__________________ Peace & Love Fate le cose nel modo più semplice possibile, ma senza semplificare. (A. Einstein) | |
15 maggio 19, 15:10 | #43 (permalink) Top |
User Data registr.: 13-09-2012
Messaggi: 4.686
|
Dopo essermi documentato mi è parso di capire che la gestione delle routine di interrupt sia non simultanea ovvero il secondo interrupt attende la fine dell'esecuzione del primo per avviare la sua funzione. In ogni modo le 2 funzioni di interrupt mettono semplicemente a 1 una variabile booleana che, a sua volta, attende di essere letta per avviare con un if la funzione di lettura dati. In ogni modo domani sera mi rileggo il tuo messaggio e cerco di capirlo meglio, studio e provo a fare come mi hai consigliato. Intanto ti ringrazio infinitamente per l'aiuto. PS. dopo aver letto in rete ho appreso che la libreria wire.h è bloccante ovvero, in caso di errore sul bus, rimane in un loop infinito all'interno di un while(). Potrei risolvere con una libreria (se esiste) non bloccante ma preferirei eliminarli quegli errori piuttosto che accettarli ed ignorarli. |
15 maggio 19, 16:55 | #44 (permalink) Top | |
User Data registr.: 13-09-2012
Messaggi: 4.686
| Citazione:
| |
15 maggio 19, 18:11 | #45 (permalink) Top | |
User | Citazione:
In altri casi ci sono dei dispositivi (a memoria anche Arduino) che consento di disabilitare i pull-up-dwn settando dei bit in un registro.
__________________ Peace & Love Fate le cose nel modo più semplice possibile, ma senza semplificare. (A. Einstein) | |
15 maggio 19, 18:46 | #46 (permalink) Top | |
User Data registr.: 13-09-2012
Messaggi: 4.686
| Citazione:
Inviato dal mio Mi A1 utilizzando Tapatalk | |
29 maggio 19, 21:57 | #48 (permalink) Top |
User Data registr.: 13-09-2012
Messaggi: 4.686
|
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 |
31 luglio 19, 14:51 | #49 (permalink) Top |
User Data registr.: 13-09-2012
Messaggi: 4.686
| 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.. |
31 luglio 19, 14:57 | #50 (permalink) Top |
User Data registr.: 13-09-2012
Messaggi: 4.686
|
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 Commento |
Radiocomando 3 motori DC e 2 sensori di T con Arduino su trenino | spraity | Radiocomandi | 3 | 09 febbraio 17 14:07 |