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

Oggi approfittando dell'assenza dei bambini ho smontato tutto, ho accorciato il cavo che in totale poteva essere circa 50/60 cm (I2C level converter compreso) portandolo a 25 cm circa. E' peggiorato talmente tanto che era praticamente inutilizzabile. Si bloccava continuamente durante i test....

... poi Eureka...

mi sono accorto che con le vibrazioni della moto ma anche solo toccando il sensore si bloccava. Allora ho smontato anche il sensore (o meglio il suo case) ed i connettori erano per metà fuori dai pin.

Rimesso tutto a posto adesso non si blocca più toccando il sensore e dovrei fare una prova su strada... ma è tardi. Temo che il problema sia nei connettori che vibrando possono dare qualche falso contatto e dare fastidio al bus.

Speriamo che erano lenti e che adesso non succede più altrimenti il prossimo step è saldare direttamente il cavo sui pin.... un lavoraccio

niente si blocca

penso che le vibrazioni possano incidere sulla connessione I2C forse qualche leggera perdita di contatto con i connettori che vibrano, non saprei fatto sta che non funziona

adesso mi chiedo..

uso moduli con uscite analogiche o saldo tutto? Ammesso che la seconda funzioni

folagana:
uso moduli con uscite analogiche o saldo tutto? Ammesso che la seconda funzioni

I connttori "Jumper" si usano SOLO sulla breadboard e SOLO sul tavolo del laboratorio ...
... qualunque cosa si utilizzi poi nella realtà deve ovviamente avere tutte le connessioni saldate o l'affidabilità dei contatti è quella che è.

Detto questo è chiaro che un accelerometro analogico, tipo il ADXL335 (ad esempio), NON ha questi problemi di I2C, ma con i segnali analogici ed i disturbi della moto ... potresti avere altri tipi di problemi ... ::slight_smile:

Guglielmo

Ho fatto esperienza Guglielmo, adesso ripenso al tutto saldato e vediamo se risolvo definitivamente. Chiaramente è vincolante perché con i connettori in caso di manutenzione della moto posso disassemblare tutto, saldando è un problema, per questo ho pensato ad un sensore analogico (mi occorre anche il giroscopio oltre che l'accelerometro). Il problema sta nel fatto che mi occorre trovare un posto relativamente vicino dove installare il sensore possibilmente dove non dovrò staccarlo più.

Buonasera

essendo io dotato di una pazienza infinita, oltre l'inverosimile che mi induce ad affermare che probabilmente sono l'uomo più paziente del mondo, ho terminato il lavoro di saldatura.

Quindi adesso è tutto saldato.

E non funziona, si blocca.

Ho notato che con la libreria wire si blocca entro 10, 15 secondi mentre con i2cdev in diversi minuti.

Adesso ho finito le cartucce, ho veramente bisogno di aiuto.

Tutti i test li ho fatti a moto spenta, senza alcun disturbo, senza vibrazioni.

Mi rimane nell'ordine:

  1. sostituire arduino nano, magari si è rotto;
  2. provare un altro modulo, magari si è rotto;
  3. bypassare l'I2C utilizzando un accelerometro ed un giroscopio analogico;
  4. passare al nano 33 ble

1. sostituire arduino nano, magari si è rotto;
2. provare un altro modulo, magari si è rotto;
3. bypassare l'I2C utilizzando un accelerometro ed un giroscopio analogico;
4. passare al nano 33 ble

meno 1

non è arduino l'ho sostituito

  for (int k = 0; k < 400; k++) {
    Wire.beginTransmission(MPU);
    Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
    Wire.endTransmission(false);
    Wire.requestFrom(MPU, 14, true); // request a total of 14 registers

    AcX_ = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
    AcY_ = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
    AcZ_ = Wire.read() << 8 | Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)

    Tmp_ = Wire.read() << 8 | Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)

    GyX_ = Wire.read() << 8 | Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
    GyY_ = Wire.read() << 8 | Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
    GyZ_ = Wire.read() << 8 | Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)

    aF[0] += adjust(AcX_, 0);
    aF[1] += adjust(AcY_, 1);
    aF[2] += adjust(AcZ_, 2);

  }

Non è che nella lettura dei valori c'è qualche problema, per esempio manca un delay che permette di riempire il buffer.... o non so cosa?

... ma che valori hai per le resistenze di pull-up sul bus I2C ? ? ?

Guglielmo

Il wiring è quello in allegato.

Lato 3.3 ci sono le pull-up da 2k2 nel modulo stesso, ne avevamo parlato nei post precedenti, mentre nell'I2C level converter si sono delle resistenze da 10k. Forse lato 5v sono basse?

IMG_3812.jpg

correggo, nello schema l'2C level converter ha i 5v lato arduino e i 3.3 lato modulo gy521

IMG_3813.jpg

... prova a portare anche quelle lato 5V prima a 4.7K e poi eventualmente a 2.2K e vedi come va, così almeno escludiamo uno dei possibili problemi.

Guglielmo

Grazie Guglielmo, stasera ci provo e vediamo un pò. In effetti quando ne abbiamo discusso il modulo gy521 era connesso all'arduino direttamente quindi c'erano le pull-up ma il livello di tensione era diverso tra arduino e modulo, adesso con il level converter di mezzo le resistenze sono differenti. Avevo visto uno schema di questo level converter in cui le resistenze erano da 4k7 ma a questo punto essendo una cineseria chi lo sa. Provo e ti faccio sapere

Allora, ho installato le pull-up e non è cambiato nulla. Ha continuato a bloccarsi dopo qualche secondo.

Però il tuo suggerimento non è stato inutile forse. Ho notato da qualche giorno che i faretti si spegnevano per poi riaccendersi. In tutti questi giorni ho notato che lo faceva a spot. Oggi, che ho lavorato per 5 ore consecutive, ha iniziato a farlo di continuo. Per questo motivo avevo pensato a cambiare l'arduino immaginando che fosse andato.
Invece facendo i checks per installare le pull-up sulla della tensione di alimentazione ed ho notato con mia sorpresa che era a oscillante tra 4.6 e 4.75 mentre se alimentavo con la usb sul pin 5V c'era una tensione non superiore a 4.8v (perché era in parallelo con l'alimentatore della moto)

Premesso che l'arduino come tutti gli altri facenti parte del sistema sono alimentati sul pin 5V da una alimentatore stabilizzato ma regolabile. Allora mi si è accesa una lampadina ed ho provato ad alimentare l'arduino esternamente a 5V certi ed ho notato che il sistema ha ripreso a funzionare senza interruzioni.

Ho smontato l'alimentatore ed ho modificato la tensione di uscita riportandola da 4.8 a 5 e dopo qualche minuto di test non ho visto blocchi. Adesso ci vuole la prova su strada.

Evidentemente si sarà starato nei due anni di esercizio e la tensione è scesa.

Adesso la domanda è: possibile che la tensione di alimentazione al pin 5v tra 4.6 e 4.8 max poteva determinare questi problemi?

Adesso la domanda è: possibile che la tensione di alimentazione al pin 5v tra 4.6 e 4.8 max poteva determinare questi problemi?

Si, ci sarebbe da vedere la tensione sotto forma di onda con un oscilloscopio, magare scende sotto il BOD che comunque puoi configurare credo anche a 2.7V anziché 4.4V (informazioni imprecise, scusa).

Ciao.

grazie, invece è chiarissimo

Vi aggiorno sulla situazione:

Il problema permane ma adesso avendo eliminato definitivamente (parola grossa... ) il blocco dell'arduino dovuto al blocco dell'I2C credo sia uscita alla luce la vera problematica.

L'arduino si riavvia continuamente. Probabilmente c' è qualche problema che bloccava anche il bus. Ho allegato uno schema per rappresentare meglio il vario cablaggio. Scusate se non è molto dettagliato ma il cablaggio è veramente complesso specie quello relativo alla parte del sistema funzionante.

Ho letto sul forum ed in rete che questo tipo di problema potrebbe essere dovuto alle seguenti cause:

1. l'arduino è costretto a fornire più mA di quelli che può;
2. memoria piena
3. BOD come menzionato nel post precedente.

Io non ho l'oscilloscopio ma ho potuto fare seguenti misure e considerazioni:

1. l'arduino con i faretti spenti consumo 22 mA
2. ogni mosfet attuato per accendere il faretto consuma circa 5/6 A
3. il totale con i 4 faretti accesi è appunto 45/46 mA.

il suddetto consumo comprende:
arduino
4 mosfet
modulo GY521
2 resistenze di pull-up da 3k7

Anomalia

l'unica cosa strana che ho misurato è una tensione residua sul pin 5 v di arduino con l'alimentazione 5V disconnessa. Ho verificato che il partitore collegato ad un pin analogico che misura la tensione della batteria introduce questa tensione residua sul pin 5V. E' normale?

Considerazioni

la linea a 5V che è sotto chiave come si vede dallo schema allegato, alimenta tutti gli altri arduino i quali non soffrono di nessun disturbo, quindi mi sento di escludere che l'alimentazione possa essere la causa del problema. Anche il consumo in mA non mi sembra proprio eccessivo. L'arduino da solo consuma 22 mA. Inoltre nell'incertezza ho saldato i pin 5V, GND e A4, A5, 3.3V per essere certo che la vibrazioni della moto non comportino problemi.

Ho fatto un test eliminando dal programma tutta la parte relativa al trattamento del modulo gy521 e relativi calcoli dell'angolo di piega per testare se la memoria fosse il problema. Nulla non funziona e d'altronde anche il check della memoria libera con l'apposita libreria mi dava ampi spazi.

detto questo, quale test ulteriore posso fare per verificare la causa del reboot?

ho allegato il codice. Supera abbondantemente i 9000 caratteri

Codice_Faretti_ver11_noserial.ino (20.1 KB)

.... intato comincia con correggere TUTTE le Serial.print() e Serial.prinln() in cui stampi delle stringhe costanti, es. "Serial.println("Avvio lettura dati tilted...........");", con l'utilizzo della macro F().

Per cui, ogni volta che stampi una stringa costante, nelle parentesi NON metti solo la stringa, ma, riprendendo l'esempio che ho messo sopra, scrivi: "Serial.println(F("Avvio lettura dati tilted..........."));" e verifica cosa succede.

Guglielmo

l'unica cosa strana che ho misurato è una tensione residua sul pin 5 v di arduino con l'alimentazione 5V disconnessa.

Male, non dovrebbe esserci tensione applicata alla MCU quando vcc non è presente. Comunque mi pare di capire che c'è un partitore RR, ora sarebbe bene che tra il pin e gnd ci sia un condensatore.
Se si potesse indagare circa il segnale sul pin attraverso un oscilloscopio si potrebbe procedere per esclusione.

Non vedo il cablaggio.

Visto, ci va il condensatore 100nF (R22k e R9.8k) tra il pin e gnd.
Ciao.

gpb01:
.... intato comincia con correggere TUTTE le Serial.print() e Serial.prinln() in cui stampi delle stringhe costanti, es. "Serial.println("Avvio lettura dati tilted...........");", con l'utilizzo della macro F().

Per cui, ogni volta che stampi una stringa costante, nelle parentesi NON metti solo la stringa, ma, riprendendo l'esempio che ho messo sopra, scrivi: "Serial.println(F("Avvio lettura dati tilted..........."));" e verifica cosa succede.

Guglielmo

nulla… non cambia molto, poi nel codice finale io tipicamente elimino tutti i serial… non mi servono sulla moto.

Aggiornamento

Partendo dal presupposto che possa essere una interferenza (ho letto anche troppo stanotte) ho iniziato a smontare un pezzo alla volta dal sistema eliminando il relativo codice per capire cosa non andava. Alla fine non è rimasto niente…. solo l'arduino con il pulsante e la lettura della tensione della batteria. A questo punto ha smesso di riavviarsi. Allora ho ripreso a rimontare ed alla prima coppia di faretti (SPOT), per la cronaca quelli già presistenti da 2 anni e funzionanti correttamente ha iniziato a dare i numeri. Allora ho invertito la coppia di faretti eliminando gli SPOT e mettendo nel codice i FLOOD. A questo punto tutto ha iniziato a funzionare. Allora ho capito che per qualche motivo erano i faretti SPOT a dare i problemi.

Ho fatto molte prove ed ho concluso quanto segue: tutti i faretti sono attivati da IRF520 ed ho notato che a valle del mosfet c'è tensione sulla linea GND (per intenderci sul pin v- del modulino).
Allora ho pensato che per qualche motivo quando il mosfet viene attivato, sul GND di arduino ritorna della tensione per qualche pico-istante e si spegne.

Allora ho notato che il GND era così cablato (da 2 anni!!!):

2 gnd mosfet faretti SPOT+ 2 gnd moduli irf520 + gnd arduino + gnd pulsante + gnd partitore = gnd scatola

questo filo usciva dalla scatolina ed andava a riunirsi fuori con il resto:

gnd scatola + 2 gnd mosfet faretti FLOOD + 2 gnd moduli IRF520 + GND BATTERIA

allora ho ricablato come segue:

filo A: 2 gnd mosfet faretti SPOT;
filo B: 2 gnd moduli irf520 + gnd pulsante + gnd partitore
filo C: gnd arduino

fuori dalla scatola ho riunito tutto:

filo A + filo B + filo C + 2 gnd mosfet faretti FLOOD + 2 gnd moduli IRF520 + GND BATTERIA

Ed adesso non registro più reboot per il brevissimo test che ho fatto.

Praticamente ho messo direttamente sull'arrivo della batteria il gnd di arduino.