gps e strisce led indirizzabili dubbio collegamento, nessuna ricezione dati gps

Buongiorno a tutti,
ho provato a cercare un topic che mi potesse aiutare ma non ho trovato nulla, mi scuso se per caso ho creato un topic su qualcosa di già discusso.

Ho iniziato a giocare con arduino uno.
Sto cercando di costruire un orologio led, con strisce led indirizzabili singolarmente, che legge l'ora da un RTC e sincronizza l'RTC una volta al giorno prendendo il segnale da un GPS.

Alcune informazioni tecniche:

  • le strisce rgbw sono le SK6812, 300 led complessivi;
  • sto utilizzando un alimentatore meanwell 60W - 5V ( al massimo devo accendere 60 led contemporaneamente);
  • come GPS, un NEO-6M STM32;
  • come RTC, un DS3231;

Se collego GPS, RTC e arduino (alimentandolo con un alimentatore esterno) ricevo i dati correttamente dal satellite (li ricevo e riesco ad aggiornare l'RTC).

Se collego RTC, strisce led e arduino (alimentando arduino e led con un alimentatore esterno, secondo i collegamenti suggeriti dal sito delle strisce) i led si accendono in modo corretto secondo l'orario RTC.

Se collego GPS,RTC,Led e arduino (alimentando arduino e led con un alimentatore esterno) non riesco più a ricevere i dati dal GPS (ho collegato i 2 fili rossi insieme e inseriti nello stesso pin 5V, mentre i neri li ho messi in due GND differenti)

Da qui sono tornata ai fondamentali, forse sbaglio a collegare i dispositivi, ed ecco il perché del mio topic.

Sono andata per gradi.

Arduino che legge RTC: ok.
Arduino che riceve i dati dal GPS: ok.
Arduino che riceve i dati e aggiorna RTC: ok.
Arduino che riceve i dati GPS, aggiorna RTC e scrive su monitor seriale i led da accendere: ok.

Arduino che accende i led: ok
Arduino che accende i led in base a RTC: ok.

Perché se collego led e gps non ricevo più i dati da gps?

Spero di essere stata abbastanza chiara.

Grazie
Daniela

Che Arduino? Su che seriale è collegato il GPS?

Guglielmo

Aiuterebbe tanto avere uno schema teorico dei collegamenti per fare chiarezza.
Una cosa non mi torna in particolare,

(ho collegato i 2 fili rossi insieme e inseriti nello stesso pin 5V, mentre i neri li ho messi in due GND differenti)

Viene da pensare che usi due alimentatori 5Volt e ai collegato i GND assieme e ciò è corretto, mentre i due rossi 5Volt non devono essere collegati assieme.

Da qui la domanda, quanti alimentatori usi quando non funziona?

Ciao.

La scheda è Arduino Uno
Il GPS è collegato con i pin 3 e 4, mentre le strisce led con il pin 6.

Io utilizzo un solo alimentatore, sto cercando di seguire il più possibile gli schemi che vi ho allegato.

Adesso che ho collegato tutto:
al rosso dell'alimentatore ( e i rispettivi neri al nero dell'alimentatore) sono collegate 3 cose:

  • inizio striscia led
  • fine striscia led
  • alimentazione usb arduino

Come da schema led, devo collegare l'altro rosso e l'altro nero dell'inizio striscia al pin 5V di arduino e GND, mentre il terzo filo al pin 6.

Ma devo anche allo stesso pin 5v collegare il gps, quindi li ho messi insieme (connettore a molla) e poi li ho inseriti nel pin 5V.

Ho cercato di rappresentare la situazione complessiva nell'ultimo file allegato.

  • alimentazione usb arduino

Questo vuole dire che alimenti arduino tramite la USB, se è così non devi fornire alimentazione +5V ad arduino proveniente dall'alimentatore poiché esso risulta già alimentato da USB,

Quindi scolleghi il pin +5V di arduino dal filo rosso proveniente dall'alimentatore. Lasci collegato il GND che è il riferimento comune.

Per alimentare la breakout board RTC usa 5Volts invece di 3.3V, questo perché i chip DS3231 e la eeprom accettano tensione di alimentazione nel range 3.3V÷5.0V. Puoi quindi scegliere di alimentare la breakout board prelevando la +5V dal pin di arduino, oppure collegare la breakout all'alimentatore.

Se ti funziona anche a 3.3V è per puro caso poiché quando il pin SDA è in ingresso per leggere cosa c'è nel bus considera come HIGH il valore di tensione a partire da 0.7xVcc = 0.7x5.0 = 3.5V fino a 5V.

Quando alimenti il DS3231 a 3.3V le pull-up sono alimentate a 3.3V che è un valore inferiore a 3.5V.

Ciao.

Mauro, non so se le via dell'alimentazione sia quella giusta ...
... mi preoccupa molto di più che stia usano la SoftwareSerial, che usa gli interrupt per ricevere i caratteri, assieme ai neopixel la cui libreria, notoriamente, per rispettare le tempistiche, disabilita gli interrupt. Se il GPS trasmette la posizione sulla seriale mentre sta aggiornando i neopixel, i dati vanno persi.

C'è da vedere il codice e vedere se l'aggiornamento dei neopixel è fatto UNA sola volta in determinate condizioni, ed allora la mia supposizione decade, ma se invece è fatto nel loop(), in modo continuativo ... la cosa potrebbe essere ... ::slight_smile:

Guglielmo

Concordo con @Guglielmo, una volta risolti i piccoli problemi di alimentazione, è bene verificare se si fa "uso contemporaneo" della seriale e dei led (Neopixel), che solitamente produce effetti strani!
Purtroppo è un problema con il quale mi sono già scontrato, e l'unica soluzione è separare completamente le due operazioni.

Se effettivamente il problema è questo, in questo mio post (e successivo) ci sono vari link dove si parla del problema e delle possibili soluzioni (qui).
Io ho risolto semplicemente non utilizzando la seriale, mentre invio i dati alla striscia.

Federico

Federico66:
Io ho risolto semplicemente non utilizzando la seriale, mentre invio i dati alla striscia.

... cosa che però, con un GPS che invia LUI i dati con una periodicità prefissata, diventa difficile. ::slight_smile:

Nel suo caso, occorre accertarsi che i dati alla striscia vengano inviati UNA sola volta quando serve (magari si perderà una lettura dal GPS) e NON venga fatto una aggiornamento continuo nel loop().

Guglielmo

gpb01:
... cosa che però, con un GPS che invia LUI i dati con una periodicità prefissata, diventa difficile. ::slight_smile:

Vero :frowning:
Nel mio caso, ho un BT, che però ignoro mentre invio i dati alla striscia.

Federico

Intanto vi ringrazio.
Innanzitutto rispondo a quanto posso.

Alimentazione arduino: ho letto che è in generale sconsigliato ai principianti collegare l'alimentatore direttamente al pin VIN, così ho preso un vecchio cavo usb, l'ho tagliato, ho quindi collegato rosso e nero all'alimentatore esterno. Quindi non mi è chiaro il suggerimento di staccare il rosso che collega arduino e l'alimentatore esterno.

Alimentazione RTC: provo a collegarlo a 5v e vi faccio sapere.

Seriale e neopixel: in teoria il LED si aggiorna ogni 60 s, intervallo nel quale il GPS dovrebbe ( una volta al giorno) aggiornare l' RTC. Mi riservo di studiare i link che mi avete suggerito e vi aggiorno.

Grazie
Daniela

Ho provato a collegare RTC a 5V.

Devo aver sbagliato qualcosa, penso di doverlo riacquistare.
Non si accende più, nemmeno riportando le connessioni iniziali.

Ho letto i suggerimenti sugli APA102, troppo tardi ... sto verificando intanto la comunicazione con i led

Daniela76:
Quindi non mi è chiaro il suggerimento di staccare il rosso che collega arduino e l'alimentatore esterno.

@Maurotec si riferisce al cavo rosso che va da Arduino alla striscia led, perchè quel cavo in realtà va ad alimentare Arduino, ma non è necessario in quanto usi l'usb.

Daniela76:
Seriale e neopixel: in teoria il LED si aggiorna ogni 60 s, intervallo nel quale il GPS dovrebbe ( una volta al giorno) aggiornare l' RTC. Mi riservo di studiare i link che mi avete suggerito e vi aggiorno.

Forse sarebbe meglio vedere quel pezzo di codice, ma tu stai dicendo che vai a leggere la seriale solo una volta al giorno.

Federico

Daniela76:
Ho provato a collegare RTC a 5V.
Devo aver sbagliato qualcosa, penso di doverlo riacquistare.
Non si accende più, nemmeno riportando le connessioni iniziali.

Mi spiace, anche se non capisco cosa tu possa aver sbagliato :slight_smile:
ma stai usando una breadboard o i fili sono volanti?!?!

Daniela76:
Ho letto i suggerimenti sugli APA102, troppo tardi ... sto verificando intanto la comunicazione con i led

Tranquilla, anche io l'ho scoperto dopo, ma vedrai che se il problema è li, una soluzione si trova...

Federico

Fili volanti...

Intanto ho trovato dove si accavallano le chiamate, oggi sistemo il software e se domani mi arriva il nuovo RTC riattacco il tutto....

Intanto grazie, vi aggiorno quanto prima!

Daniela76:
Fili volanti...

mannaggia... ::slight_smile:

Federico

Fili volanti...

Vai dal rivenditore di materiale elettrico e acquista dei morsetti a cappuccio.

Vero è che l'uso di questi non è usuale in elettronica ma per la sperimentazione sono comodi e funzionali ed meglio averli nel cassetto assieme ai mammut.

Alimentazione arduino: ho letto che è in generale sconsigliato ai principianti collegare l'alimentatore direttamente al pin VIN, così ho preso un vecchio cavo usb, l'ho tagliato, ho quindi collegato rosso e nero all'alimentatore esterno. Quindi non mi è chiaro il suggerimento di staccare il rosso che collega arduino e l'alimentatore esterno.

Ok, ora mi spiego i due fili rosso e nero che dall'alimentatore vanno verso la USB, non ci ero arrivato ad intuito.

@Maurotec si riferisce al cavo rosso che va da Arduino alla striscia led, perchè quel cavo in realtà va ad alimentare Arduino, ma non è necessario in quanto usi l'usb.

Esattamente, la +5V entra in USB passa attraverso un mosfet che risulta chiuso ed esce dal pin +5V di arduino header a questo pin non serve fornire alimentazione ma la si può prelevare per alimentare il RTC.
Mentre per alimentare i led poiché possono assorbire corrente importante si consiglia di collegarli direttamente all'uscita dell'alimentatore così da evitare che la corrente assorbita passi attraverso il mosfet.

Mauro, non so se le via dell'alimentazione sia quella giusta ...

Certamente non è detto che sia la via che appare risolutiva, ma è sempre quella giusta anche se poi non funziona per il problema che hai esposto, per fortuna sembra che si possa sistemare via software, aspettiamo il codice per capire se è fattibile.

PS: mai piaciuti i WS28, funziona fintantoché la MCU non ha altro da fare, ancora peggio con la sofware serial.

Ho letto i suggerimenti sugli APA102, troppo tardi ... sto verificando intanto la comunicazione con i led

mmm... nel senso che hai acquistato una valanga di SK68... e non vorresti averlo fatto? :smiling_imp:

Ho provato a collegare RTC a 5V.

Devo aver sbagliato qualcosa, penso di doverlo riacquistare.
Non si accende più, nemmeno riportando le connessioni iniziali.

ahi, mi sento in colpa, ma ho controllato più volte nonostante lo avessi controllato centinaia di volte in precedenza, che il range di alimentazione è quello che ho specificato 3.3÷5.0V.

Ciao.

In attesa dell'RTC.

Leggendo i link suggeriti da voi, ogni 4 led si parla di un'attesa di 138 microsecondi.

Io ne accendo solo 60 alla volta, però ho calcolato il tempo per tutti e 300, per stare larga: siamo sugli 11 millisecondi.

Se ho capito bene se richiamo strip.show() devo attendere 11 millisecondi prima di richiamare i dati del gps.

Giusto?

Daniela76:
Se ho capito bene se richiamo strip.show() devo attendere 11 millisecondi prima di richiamare i dati del gps.

Non credo che tu "richiami" i dati del GPS ... ::slight_smile:

Normalmente i GPS inviano i dati con una certa periodicità prefissata, i dati vengono letti dalla seriale e messi in un buffer ed è quello che tu leggi. Ora, dato che, come credo, non conosci quando il GPS invia, se aggiorni in continuazione la striscia, sicuramente disturbi la ricezione.

Tu devi leggere i dati del GPS e, solo se necessario, aggiornare la striscia ... in tal caso il disturbo è solo per quella volta e poi non ci sono più problemi.

Tutto questo è vero se il GPS funziona come credo, se invece hai un GPS a cui TU, in un determinato momento, chiedi la lettura, ritiro tutto, ma ... mi sembrerebbe strano ... ::slight_smile:

Guglielmo

Maurotec:
ahi, mi sento in colpa, ma ho controllato più volte nonostante lo avessi controllato centinaia di volte in precedenza, che il range di alimentazione è quello che ho specificato 3.3÷5.0V.

Io ne ho qualcuno, e tutti a 5V, quindi non credo che sia li il problema, comunque, magari @Daniela76 prima di collegarlo nuovamente può inviare link o foto, non si sa mai ... ::slight_smile:

Federico

Normalmente i GPS inviano i dati con una certa periodicità prefissata, i dati vengono letti dalla seriale e messi in un buffer ed è quello che tu leggi. Ora, dato che, come credo, non conosci quando il GPS invia, se aggiorni in continuazione la striscia, sicuramente disturbi la ricezione.

Era proprio questo su cui mi stavo documentando, c'è da vedere quale librerie usa, il codice ecc.

Sto leggendo questa lib online e mi pare di capire che il GPS lavora come uno slave e quindi risponde solo se interrogato, se è così basta aspettare che la software serial faccia il lavoro e completi la trasmissione.

void loop()
{
    //Just simple do getDataGPRMC, and the method solve everything.
    gps.getDataGPRMC(latitud,
                    latitudHemisphere,
                    longitud,
                    longitudMeridiano);

   Serial.println(latitud);
   Serial.println(latitudHemisphere);
   Serial.println(longitud);
   Serial.println(longitudMeridiano);
  // già qui la seriale ha lavorato ma per prudenza ci aggingo un delay.
   delay(10); 
   //  qui il codice per aggiornare la striscia.
   
}

Non è così, non lavora come uno slave, ma invia su seriale o meglio io non vedo alcun comando di scrittura
su seriale che comanda il GPS e fornire i dati. Quindi mi sa che è come dice gpb01, ma in tal caso basta sapere con che tempistiche il GPS invia dati e se sono tempistiche costanti si può temporizzare il codice se invece invia ogni qualvolta rileva delle variazioni le tempistiche non possono essere costanti e appunto non si sa quando invierà dati.

Visto che Daniela76 è un docente forse ci possiamo spingere a spiegare nel dettaglio il problema con
gli interrupt, che dite?

Brevemente, la software serial per trasmettere e ricevere non usa uno specifico hardware ma le semplici porte I/O, questo vuole dire che il timing dei segnali è affidato al software e questo tiene impegnata la CPU. In ricezione anziché controllare lo stato del pin RX si attiva una interruzione di tipo PIN CHANGED, cioè ogni volta che il pin cambia stato il codice attualmente eseguito viene interrotto e avviene il salto ad una specifica
locazione in cui c'è il codice di gestione della interruzione (ISR).

Tutto funziona fintantoché per necessità di timing per controllare la striscia il codice spegne gli interrupt globalmente per tot tempo per poi riattivarli, durante questo tempo sarà impossibile ricevere qualcosa da seriale in background.

Ciao.