Modulo GY-521 - Si blocca arduino dopo qualche minuto di funzionamento

Innanzitutto buongiorno a tutti,

ho installato 4 arduino nano sulla mia moto per fare alcune cose. Tutto funziona correttamente da oltre 2 anni ed adesso ho aggiunto un altro pezzo al puzzle.

Uno degli arduino gestisce i faretti spot facendo alcune cose, a questo arduino ho aggiunto un ulteriore pezzo ovvero due nuovi faretti che si accendono in funzione dell'inclinazione della moto. Quello di sx quando si piega a SX ecc.

Il codice è stato complesso ma funziona dai primi test.

Per fare questo nuovo macchingegno ho utilizzato un modulo GY-521 collegato ad uno degli arduino. L'accelerometro misurando accelerazione e velocità radiali mi permette di calcolare l'angolo di piega. Come sapete funziona con SDA SCL sui pin A4/5 di arduino nano. La tensione di alimentazione è presa dal 3.3V di arduino come anche il GND che è in comune con tutta la moto.
Sul modulo sono presenti altri pin ma non li ho utilizzati. Poiché dalle informazioni che ho reperito il modulo è dotato di resistenze di pull-up interne per il bus I2C non ho aggiunto null'altro.

Il problema è il seguente, l'arduino che prima funzionava correttamente adesso si blocca. In questo arduino c'è semplicemente la gestione dei faretti vecchi ed un pulsante che in funzione di come lo premo fa delle cose. Inoltre riceve un segnale da un altro arduino per attivare il lampeggio. Non vado nei dettagli della parte "vecchia" perché al momento non li ritengo necessari visto che non ho cambiato nulla e tutto funzionava correttamente.
Il codice aggiunto contiene la libreria wire per gestire la comunicazione con il modulo GY-521. Ho fatto alcune prove. Utilizzando il vecchio codice senza l'aggiunta di questo modulo tutto ritorna a funzionare correttamente mentre se uso la parte di codice che utilizza la libreria wire tutto si blocca dopo un pò.

So che ci sono problemi con questa libreria ma tutti gli altri arduino già sono tutti integrati con il bus I2C e non ci sono mai stati problemi, questo invece ha solo il modulo GY-521 e si blocca.

Le mie domande sono le seguenti:

  1. possibile che il problema risieda nell'alimentazione ovvero che è meglio mettere la 5v al modulo che in effetti ha un suo regolatore?
  2. possibile che non avendo collegato il pin AD0 per qualche motivo possa cambiare l'impostazione del pin e quindi, se non ho capito male, cambiare l'indirizzo e si blocca?
  3. non è che dovrei comunque mettere le resistenze di pull-up?
  4. il modulo è fallato .....

in molti esempi che ho visto il modulo GY-521 funziona con i soli collegamenti che ho fatto io però visti i problemi mi sorgono le domande di cui sopra.

Il problema è che ho tutto già installato sulla moto e quindi non affatto banale fare prove che non siano di esclusivo cambio di codice... cosa che non mi pare sia la causa di blocco anche perché in effetti il tutto funziona correttamente per alcuni secondi/minuto e quindi non vedo cosa possa centrare il codice in se.
Ritengo che possa essere hardware in particolare legato al pin che non ho collegato. Ma vorrei un vs autorevole parere prima di rismontare mezza moto per avere accesso al modulo ...

grazie in anticipo dell'aiuto

Magari se metti un link al modulo specifico che stai usando (quale è, quello di RobotStore o altro?), riusciamo a vedere esattamente come è fatto ... ::slight_smile:

Guglielmo

Scusa Guglielmo mi è sfuggito

Il modulo è questo

io ho seguito i collegamenti in questo tutorial

ultima domanda… non è che il pin 3.3V del nano non è in grado di erogare la corrente richiesta? Rispetto al UNO

Potrebbe essere lo stesso problema?

Intanto alimentalo con i 5V ... tu lo stai collegando ad una scheda che lavora a 5V quindi le pull-up DEVONO essere collegate verso i 5V, non 3V.

Il problema del tuo post #3, se ben ricordo, non c'è più (... li era il 2015) ... credo che la libreria sia stata modificata.

Altra cosa ... quanto dista il modulo dalla MCU? Come è collegato?

Guglielmo

Ciao Gugliemo,

non capito bene la tua risposta relativa al post #3.

In questo link c'è una wiring che mostra come sono collegati i pin SDa SCL... ora io non sono espertissimo ma mi pare di capire che hanno un pull-up a 3.3 quindi non posso collegarli direttamente alla nano perché lei lavora su A4 e A5 a 5v giusto?

Ci vuole un level shifter.... o mi sono perso qualcosa?

Relativamnete al post #3, dicevo che, se ben ricordo, dal 2015 ad oggi, la libreria è stata corretta e quel blocco non dovrebbe più presentarsi … ::slight_smile:

Mmmm … ho visto lo schema, quindi alimentare a 5V non serve a nulla, tanto lavora comunque a 3.3V e le pull-up a tale tensione sono collegate, però …
… data la pochissima corrente che da il pin 3.3V di Arduino e data la presenza del regolatore a bordo … alimentalo comunque a 5V. :wink:

Allora … se tutto fosse corretto, componenti di qualità (e non cinesi di seconda scelta), il ATmega328P, alimentato a 5V, dovrebbe leggere come valore HIGH tutto ciò che è dai 3V in su (vedi QUESTO mio vecchio post) e non ci dovrebbero essere problemi, anche se … sei proprio la limite (quindi un level-shifter non farebbe certo male).

L’altra domanda, a cui non hai risposto, è … a che distanza dalla MCU è l’accelerometro e come è collegato ?

Guglielmo

Non avevo capito che ti riferivi al post 3 dell'altro thread... sorry

Infatti per questo penso sia un problema hardware e non software.

Tornando alla tua domanda, sono ad una distanza di 40 cm circa ma avendo le pull-up non credo sia un problema. Tieni presente che uno degli arduino si trova 1.5 metri dal master e ci sono due pull-up da 2k2 ed un cavo speciale a bassa induttanza che per trovarlo ho penato ma tutto funziona correttamente da 2 anni.

folagana:
Tornando alla tua domanda, sono ad una distanza di 40 cm circa ma avendo le pull-up non credo sia un problema.

Le pull-up servono non per altro, ma perché le uscite I2C sono “open-drain” e quindi devi imporgli il livello HIGH …

40 cm sono tanti, ma se stai utilizzando un cavo speciale a bassa capacità (è quella che conta, sia sul bus SPI che su quello I2C … per ovvvie ragioni di influenza sui fronti di salita e discesa) può funzionare. Direi comincia a provare con un “level-shifter” adatto al I2C … come QUESTO … poi vediamo ::slight_smile:

Guglielmo

Grazie!

Intanto è un buon punto di partenza... per fare prove non mi toccherà smontare tutto almeno per adesso.
Per il cavo, mi sono espresso male... al tempo mi sono intrippato per la scelta delle pull-up ed mi pare di ricordare che lunghezze maggiori richiedono resistenze minori. Se trovo il link lo posto... però la soluzione è chiaramente il cavo a bassissima induttanza. E' sempre bene ridabire questi concetti a me aiuta quando leggo i post di altri

Grazie ti aggiorno.

Oggi ho terminato il lavoro installando l'adattatore di tensione I2C 3,3-5v ed ho alimentato il modulo a 5v come suggerito. Durante le prove che ho fatto il problema non si è presentato più.

Adesso ho solo un serio problema di de-bouncing con un pulsante ma è un altra storia. Cambio il pulsante, metto una resistenza da 100 ohm ed un condensatore da 100 nF e vediamo se risolvo.. altrimenti apro un thread specifico

Comunque grazie come al solito per il supporto

niente… ci mette adesso più tempo ma si blocca lo stesso

posso solo provare a ridurre la distanza per evitare che conti qualcosa, ma il fatto che durante le prove al banco si bloccava continuamente a distanza bassa, sebbene fosse alimentato a 3.3 e senza i2c level converter

visto che devo intervenire pesantemente e smontare tutto per ridurre la distanza, mi chiedo se posso fare qualche altro tentativo.

Lato software (scusate l’OT) non ho trovato info utili su come modificare la wire per escludere anche questo fenomeno

Ma uso variabili di tipo "String" (classe) ?

Guglielmo

no, il codice di arduino ha sempre funzionato senza questo modulo, poi ho aggiunto il modulo e la parte relativa all'acquisizione dei valori e qualche calcolo e si blocca.

se escludo la parte dell'acquisizione torna tutto a funzionare, quindi è proprio il modulo ed il codice ad esso relativo.

purtroppo smontare la moto per accorciare il cavo sarà un bel lavoro.... a proposito il cavo che ho utilizzato è questo tasker C128 con 55pF

folagana:
purtroppo smontare la moto per accorciare il cavo sarà un bel lavoro.... a proposito il cavo che ho utilizzato è questo tasker C128 con 55pF

Come sai il bus I2C è fatto per collegamenti a corta distanza (una decina di cm o poco più) altrimenti occorre usare degli extender, inolte, sulla moto, immagino che i disturbi si sprechino, per cui ... è abbastanza normale che si pianta tutto :confused:

Quel cavetto scheramto NON va bene ... la calza deve stare a massa e poi ti servono TRE QUATTRO conduttori, SCL, SDA, Vcc e GND ... NON puoi usare la schermatura per portare il GND!

Guglielmo

Guglielmo sulla mia moto ho 4 arduino nano di cui 3 connessi con I2C con questo cavo. Il più lontano è a circa 2 metri e tutto funziona correttamente da 2 anni senza mai un blocco.
Il quarto arduino non connesso adesso ha il modulo GY521 ed è ad una distanza di 40 cm, ben al di sotto dei 2 metri....

l'unica differenza è che nel caso dei 3 arduino connessi, io uso l'I2C sporadicamente per salvare dati trasmessi. In particolare, uno degli arduino, il master, ha un modulo GSM e con dei messaggi posso cambiare dei settaggi che poi vengono trasmessi una tantum agli altri.

Nel caso del quarto arduino la lettura è in continuo, forse questo, statisticamente può influire... non so

a suo tempo con un cavo 0.22 (da allarme per intenderci) massimo 30/40 cm e non funzionava niente (intendo i tre arduino connessi). Testato il cavo da 0.35 a bassa capacità ho testato che fino a 3 metri funzionava tutto correttamente per lo meno per i trasferimenti spot di informazioni.

Prima di chiedere sul forum spendo molto tempo a cercare capire e testare, ma in questo caso non so proprio che pesci prendere. Se riducendo la distanza non risolvo allora è un bel problema.

Potrei pensare di mettere un modulo accelerometro e giroscopio non operante su i2c... se c'è

Ti ripeto che quel cablaggio è sbagliato; devi provare con un cavetto schermato a TRE QUATTRO conduttori, con lo schermo a massa e i tre quattro conduttori per portare i segnali, Vcc e il GND ... poi fai come vuoi, ma quel cavo, come lo hai usato tu, NON svolge il suo compito, anzi, probabilmente, peggiora la situazione ... ::slight_smile:

Lo schermo deve fare da schermo, NON da conduttore dove circola corrente (... come nel caso del utilizzo come GND dei segnali) !

Guglielmo

Grazie come sempre Guglielmo, provo ad utilizzare un cavo normale a 20 cm max o meno e vediamo come va, dovrò fare tanto lavoro .... devo trovare lo spazio per il sensore a quella distanza dall'arduino e su una moto non è una cosa banale

mi studio anche quello che mi hai detto sui cavo schermato perché non l'ho capito bene, io l'ho usato senza collegare lo schermo a massa, intuitivamente ho utilizzato quel cavo solo per SDA e SCL per il fatto che ha una capacità di 55pF per metro e mi pare di aver letto a suo tempo che per far funzionare l'I2C occorre non superare 400pF

studio, lavoro e spero di aggiornare il thread con una buona notizia,

thanks

folagana:
mi studio anche quello che mi hai detto sui cavo schermato perché non l'ho capito bene, io l'ho usato senza collegare lo schermo a massa, intuitivamente ho utilizzato quel cavo solo per SDA e SCL ....

... e l'alimentazione da dove arriva ? ? ? :o :o :o

Guglielmo

P.S.: ... ho corretto i miei post, i conduttori devono essere 4: SCL, SDA, Vcc e GND oltre lo schermo a massa ::slight_smile:

ah... ecco non avevo capito nulla...

la VCC e il GND va per i fatti sui con un cavo normalissimo mentre solo l'SDA e l'SCL sono portati dal cavo a bassa capacità. Come ti dicevo a me ha funzionato tuttora fino a 2 metri senza problemi. Nell'ultima installazione con questo modulo GY-521 o mi è sfuggito qualcosa o c'è qualcosa di non funzionante.

Nella descrizione dei 3 arduino con il cavo da 2 metri, ho dimenticato di dire che le pull-up sono a 2.2k mentre nel 4 arduino non ci sono le pull-up perchè inserite nel modulo stesso se non ho capito male (da 4.7k). Inoltre avendo messo l'I2C level converter, mi pare anche in questo caso di aver capito che ci sono le pull-ip da 4.7k

non vorrei che mi sfugge qualcosa ma a pensarci non riesco a vedere errori