Emulare il Reset USB

Ciao a tutti, sto sviluppando sulla board TiDiGino che, come è ormai noto a chi ci ha lavorato, spesso e volentieri non il modulo GSM non si inizializza dopo un power cycle, a meno che non gli venga dato un impulso di reset da USB.
Siccome nell'installazione che devo fare non posso avere sempre un Pc a disposizione vorrei sapere come poter, al momento dell'avvio della board, mandare un impulso di reset per inizializzare correttamente il tutto.
Per farlo potrei usare la board stessa(è il modulo a non partire, la board gira correttamente) oppure un hw esterno.

Grazie.

cirowner:
vorrei sapere come poter, al momento dell'avvio della board, mandare un impulso di reset per inizializzare correttamente il tutto.

Non ho capito... se l'alimentazione è staccata... più reset di quello... :sweat_smile: :sweat_smile:
A che ti serve spedire un ulteriore reset? :cold_sweat:

un condensatore da 100nF (o maggiore) posto tra il pin di reset del micro e GND dovrebbe provocare un reset iniziale, la cui durata è direttamente proporzionale alla capacità del condensatore, rapportata alla R di pull-up.

leo72:
Non ho capito... se l'alimentazione è staccata... più reset di quello... :sweat_smile: :sweat_smile:
A che ti serve spedire un ulteriore reset? :cold_sweat:

Il problema è che quando viene tolta e poi ridata l'alimentazione il modulo SIM900 non si inizializza e rimane in blocco, e solo un reset via USB(neanche col pulsante di reset sulla board funziona) riesce a farlo partire

Ma quel tipo di reset non è quello dato dal pulsante? Perchè in quel caso come già detto non funziona...
Che differenza c'è tra il reset via pulsante e quello usb?

Che differenza c'è tra il reset via pulsante e quello usb?

Assolutamente nessuna visto che agiscono allo stesso modo sulla stessa linea.

E allora perchè parte solo se collego la usb?

cirowner:
E allora perchè parte solo se collego la usb?

Perché si vede che il problema non è legato al solo reset, io ho un TiDiGino che ho utilizzato come "muletto" per i test legati allo sviluppo di questo articolo, non ho mai riscontrato i problemi che citi.

Sol forum della futura vedo che non sono l'unico ad avere questo problema, ed è il secondo TiDiGino che mi passa sottomano, quindi non è un un difetto del mio esemplare.
Sempre sul forum leggevo che avevano risolto modificando il file dei pin dell'IDE, ma si riferivano ad un IDE vecchio, e nella versione che uso io(l'ultima) quelle modifiche sono già applicate.

Hai qualche suggerimento da darmi?

L'unica, sottilissima, differenza che mi viene a mente fra un avvio della scheda con alimentazione ed un reset successivo è data dal diverso comportamento del bootloader.

Quando viene data alimentazione all'Atmega328P con bootloader Optiboot, questo va a leggere in un apposito registro per vedere se la scheda è stata alimentata per la prima volta oppure se si è dato un reset (fatto col pulsantino o tramite USB non fa differenza, te l'ha spiegato ora Astrobeed). Cambia però il comportamento che tiene il bootloader: nel caso di un primo avvio, fa partire immediatamente il programma. Nel caso di un reset, si mette prima in ricezione sulla seriale per vedere se è in arrivo uno sketch dall'USB da scrivere eventualmente sulla Flash. Se non arriva nulla, viene avviato il programma dell'utente.

Ora, potrebbe darsi che l'apertura/attività sulla seriale "svegli" la TiDiGino?
Forse, quella piccola attesa prima che venga avviato il programma dell'utente, basta alla scheda per inizializzarsi prima che lo sketch la interroghi, e non possa rispondere perché non è "pronta"?

Sono ipotesi, non so neanche cosa sia questa TiDiGino, quindi vado a tentoni.

leo72:
Cambia però il comportamento che tiene il bootloader: nel caso di un primo avvio, fa partire immediatamente il programma. Nel caso di un reset, si mette prima in ricezione sulla seriale per vedere se è in arrivo uno sketch dall'USB da scrivere eventualmente sulla Flash. Se non arriva nulla, viene avviato il programma dell'utente.

Vero, però non è questo il caso perché il TiDiGino lo devi alimentare a parte, la USB alimenta solo l'FTDI, ovvero quando lui connette la USB c'è solo il classico reset e non l'avvio a freddo.

inoltre lui parla di un blocco al GSM, non al micro arduinico

Ma il GSM come comunica con l'Arduino? Tramite seriale?
Forse è questo allora il nodo cruciale? Vi ricordate di quando abbiamo parlato tempo addietro della presenza di una minima corrente sulla linea RX o TX, non ricordo bene, data dalla presenza dell'Atmega8U2/16U2 che, con le sue pull-up teneva la linea alta e che Astrobeed aveva detto che tale stato era la norma della seriale?
Vi ricordate anche che dai test condotti tale stato svaniva non appena il pin suddetto veniva messo come output?

Siccome appunto il bootloader, quando viene avviata la scheda, non controlla la seriale per l'arrivo di uno sketch, tale piccola corrente di pull-up permane sulla linea. E forse dà noia alla TiDiGino?
Quando invece il chip viene resettato, la prima cosa che fa il bootloader è quella di "sentire" se sulla seriale arriva qualcosa. Ma così facendo fa sparire quella corrente, ed il TiDiGino magari parte regolarmente per questo?

Io non ho la scheda ma potrebbe essere un test da fare. Se fosse così, basterebbe mettere un

pinMode(pinRX, OUTPUT);
digitalWrite(pinRX, LOW);

per far sbloccare la TiDiGino?
Non so... pensieri in libertà

Questo è l'utente che ha avuto il mio stesso problema:FuturaNet: Il portale per makers ed elettronica by Futura Group
e ha risolto modificando il file pins come mostrato qui FuturaNet: Il portale per makers ed elettronica by Futura Group

Sinceramente non so se sia un problema della libreria GSM o se sia proprio una caratteristica HW.

cirowner:
Sempre sul forum leggevo che avevano risolto modificando il file dei pin dell'IDE, ma si riferivano ad un IDE vecchio, e nella versione che uso io(l'ultima) quelle modifiche sono già applicate.

Sei sicuro?
Io ho aperto ora nell'IDE 1.0.4 il file pins_arduino.h della Mega e non vedo traccia dei pin dal 70 in poi.
Che sia proprio in questo il bug?

a questo punto si, visto che e' proprio il pin77 l'incriminato.

Fai quindi cosi', modifica il file come da link da te indicato, e poi puoi fare dei test con questo codice.

Se hai ancora problemi puoi cmq usare questo codice per resettare la scheda a comando, come da tua originale domanda

#define GSM_ON 77
#define GSM_RESET 35 //piedino 6 della scheda GSM
//fine modif

void setup() {

//modif
pinMode(GSM_ON, OUTPUT); 
pinMode(GSM_RESET, OUTPUT);

digitalWrite (GSM_RESET, HIGH); //reset sempre off Con HIGH il pin 6 è sempre a +4V;

digitalWrite (GSM_ON, LOW); //impulso accensione
delay(1200);
digitalWrite (GSM_ON, HIGH);
delay(5000);

TiDiGino ha un header coi pin a parte, infatti sulla IDE viene visto come board propria.
Allego il file dei pin

pins_arduino.h (12.9 KB)

Sull'IDE 1.0.x questo file devi metterlo in una specifica cartella sotto /hardware/arduino/variants e poi la voce in boards.txt deve essere impostata in modo da usare quel file. Altrimenti compili per la scheda Arduino Mega2560, quindi con il pins_arduino.h originale.

La libreria che hai scaricato prevede questo?

Si è già tutto pronto.Il file pins è sotto /hardware/arduino/variants/tidigino e al file boards è stato aggiunto questo

tidigino.name=TiDiGino

tidigino.upload.protocol=stk500v2
tidigino.upload.maximum_size=258048
tidigino.upload.speed=115200

tidigino.bootloader.low_fuses=0xFF
tidigino.bootloader.high_fuses=0xD8
tidigino.bootloader.extended_fuses=0xFD
tidigino.bootloader.path=stk500v2
tidigino.bootloader.file=stk500boot_v2_tidigino.hex
tidigino.bootloader.unlock_bits=0x3F
tidigino.bootloader.lock_bits=0x0F

tidigino.build.mcu=atmega2560
tidigino.build.f_cpu=16000000L
tidigino.build.core=arduino
tidigino.build.variant=tidigino

Allora se le modifiche ci sono ma il bug è sempre lì, quel fix in realtà non fixa nulla. :sweat_smile:

Con qualcuno ha funzioanto.
E poi, come ha ha detto astrobeed, perchè pur avendo lo stesso hw e le stesse lib a lui funzionava?
Non vorrei dire ma secondo me riguarda l'IDE/compilatore.