Torna indietro   BaroneRosso.it - Forum Modellismo > Elettronica > Circuiti Elettronici


Rispondi
 
Strumenti discussione Visualizzazione
Vecchio 15 maggio 19, 14:07   #41 (permalink)  Top
User
 
L'avatar di Minestrone
 
Data registr.: 13-09-2012
Messaggi: 3.309
Citazione:
Originalmente inviato da ElNonino Visualizza messaggio
Se ho capito bene devi leggere i dati da due MPU e visualizzarli su un display, tutti e tre i dispositivi sono collegati ad un unico bus I2C e la lunghezza massima del bus è inferiore 1m.

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....







Rispondo con ordine alle domande. Nel leggere le mie risposte tieni sempre a mente che sono ignorante in materia perciò, se dico castronerie, fammele notare così imparo qualcosa.
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.
Minestrone non è collegato   Rispondi citando
Vecchio 15 maggio 19, 14:25   #42 (permalink)  Top
User
 
L'avatar di ElNonino
 
Data registr.: 06-05-2007
Residenza: Tre Ville (Preore)
Messaggi: 3.508
Invia un messaggio via MSN a ElNonino
Citazione:
Originalmente inviato da Minestrone Visualizza messaggio
Rispondo con ordine alle domande. Nel leggere le mie risposte tieni sempre a mente che sono ignorante in materia perciò, se dico castronerie, fammele notare così imparo qualcosa.
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.
Per prima cosa ti consiglio di disabilitare le resistenze di pull-up sia su Arduino che sui sensori che sul display e mettere resistenze esterne da 4,7k per i 5V e 3,3k per i 3,3V vicino ad Arduino ed al convertitore di livello e di configurare i pin di Arduino come output open drain.

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)
ElNonino non è collegato   Rispondi citando
Vecchio 15 maggio 19, 15:10   #43 (permalink)  Top
User
 
L'avatar di Minestrone
 
Data registr.: 13-09-2012
Messaggi: 3.309
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.
Minestrone non è collegato   Rispondi citando
Vecchio 15 maggio 19, 16:55   #44 (permalink)  Top
User
 
L'avatar di Minestrone
 
Data registr.: 13-09-2012
Messaggi: 3.309
Citazione:
Originalmente inviato da Minestrone Visualizza messaggio
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.
A proposito...come faccio a baypassare le resistenze di pull up dei due integratoi dei sensori. Sulla scheda non credo ci siano pin per poterlo fare a meno di non saldare direttamente sulla scheda.
Minestrone non è collegato   Rispondi citando
Vecchio 15 maggio 19, 18:11   #45 (permalink)  Top
User
 
L'avatar di ElNonino
 
Data registr.: 06-05-2007
Residenza: Tre Ville (Preore)
Messaggi: 3.508
Invia un messaggio via MSN a ElNonino
Citazione:
Originalmente inviato da Minestrone Visualizza messaggio
A proposito...come faccio a baypassare le resistenze di pull up dei due integratoi dei sensori. Sulla scheda non credo ci siano pin per poterlo fare a meno di non saldare direttamente sulla scheda.
Se la scheda è quella dello schema che hai allegato basta dissaldarle dal PCB, devi toglierle perchè se le lasci e colleghi altri slave + il master alla fine ti ritrovi con 4 resistenze in parallelo e potrebbe capitare che i circuiti interni dei vari dispositivi non riescano a commutare bene per la troppa corrente richiesta.

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)
ElNonino non è collegato   Rispondi citando
Vecchio 15 maggio 19, 18:46   #46 (permalink)  Top
User
 
L'avatar di Minestrone
 
Data registr.: 13-09-2012
Messaggi: 3.309
Citazione:
Originalmente inviato da ElNonino Visualizza messaggio
Se la scheda è quella dello schema che hai allegato basta dissaldarle dal PCB, devi toglierle perchè se le lasci e colleghi altri slave + il master alla fine ti ritrovi con 4 resistenze in parallelo e potrebbe capitare che i circuiti interni dei vari dispositivi non riescano a commutare bene per la troppa corrente richiesta.



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.



Arduino si ma questo integrato non credo che lo permetta, almeno vedendo lo schema. A questo punto penso di fare qualche prova di tipo diverso. Stasera provo a pensarci.


Inviato dal mio Mi A1 utilizzando Tapatalk
Minestrone non è collegato   Rispondi citando
Vecchio 15 maggio 19, 20:08   #47 (permalink)  Top
User
 
L'avatar di ElNonino
 
Data registr.: 06-05-2007
Residenza: Tre Ville (Preore)
Messaggi: 3.508
Invia un messaggio via MSN a ElNonino
Ho guardato le schede GY-521, puoi dissaldare le resistenze dal PCB, sono marchiate "222" levale e prova. sono quelle vicino a C3.

__________________
Peace & Love
Fate le cose nel modo più semplice possibile, ma senza semplificare. (A. Einstein)
ElNonino non è collegato   Rispondi citando
Rispondi

Bookmarks



Strumenti discussione
Visualizzazione

Regole di scrittura
Non puoi creare nuove discussioni
Non puoi rispondere alle discussioni
Non puoi inserire allegati
Non puoi modificare i tuoi messaggi

BB code è Attivato
Le faccine sono Attivato
Il codice [IMG] è Attivato
Il codice HTML è Disattivato
Trackbacks è Disattivato
Pingbacks è Disattivato
Refbacks è Disattivato


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



Tutti gli orari sono GMT +2. Adesso sono le 01:44.


Basato su: vBulletin versione 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
E' vietata la riproduzione, anche solo in parte, di contenuti e grafica. Copyright 1998/2019 - K-Bits P.I. 09395831002