Serial Port e Auto Reset

Sarà un argomento stra-trattato, ma trovare una risposta è come cercare un ago in un pagliaio...c'ho provato, ma senza risultati accettabili!

Quindi vengo a chiedere il vostro aiuto x il mio problema, se esiste una soluzione!

Ho un Arduino Duemilanove che comanda delle prese elettriche tramite relè tramite comando inviato su porta seriale. Tale Arduino è in posizione inaccessibile...

In teoria io dovrei aprire una connessione alla seriale virtuale USB di Arduino, mandare un comando e chiudere la connessione...però questo ogni volta causa il reset dell'Arduino stesso, perdendomi lo stato delle altre porte settate con la connessione precedente. Conosco il motivo...e cioè il DTR che resetta l'arduino per consentire l'upload dello sketch...e sò anche che si può interrompere una pista x evitare l'autoreset...

...ma se interrompo la pista poi non ci posso più caricare un eventuale nuovo sketch a meno di resettare manualmente l'arduino...e tale arduino è inaccessibile!

Leggevo sul web che si può settare la seriale x non modificare il DTR all'atto della connessione...ne sapete qualcosa?

E poi: con che linguaggio fareste un eseguibile per inviare tale comando? Es. un command-line? Magari che sia pure portabile windows/linux?

Soluzioni multipiattaforma non credo esistano perché ogni SO gestisce la seriale in maniera differente. So per esempio che su Windows puoi disattivare il segnale DTR dalle impostazioni della porta mentre su Linux non puoi farlo perché la porta è gestita dal kernel. Mi pareva che qualcuno usasse uno script in Perl per aprire una seriale da terminale senza resettare l'Arduino ma non so come funziona.

Non potresti usare un Atmega in standalone? Elimineresti qualche problema.

EDIT:
In fondo a questa pagina:
http://www.arduino.cc/playground/Main/DisablingAutoResetOnSerialConnection
c'è lo script in Perl ed un link ad una discussione per Windows.

astroz78:
E poi: con che linguaggio fareste un eseguibile per inviare tale comando? Es. un command-line? Magari che sia pure portabile windows/linux?

Non esiste una soluzione unica, dipende dal sistema operativo, dal linguaggio di programmazione e dalla libreria utilizzata per gestire la seriale, e non è detto che è sempre possibile farlo.
Se non vuoi diventare "matto" col software usa una Luigino 328 che grazie al sistema SmartReset non si resetta quando apri la seriale per comunicare mentre si resetta quando invii gli sketch dall'IDE.

@Leo
Con una stand alone non risolve lo stesso perché ha il problema di non poter premere il tasto reset, o ripristinare la connessione per l'autoreset con un jumper, per aggiornare il software sulla scheda visto che è inaccessibile.

astrobeed:
@Leo
Con una stand alone non risolve lo stesso perché ha il problema di non poter premere il tasto reset, o ripristinare la connessione per l'autoreset con un jumper, per aggiornare il software sulla scheda visto che è inaccessibile.

Lui dice di voler anche aggiornare lo sketch, immagino quindi che l'inaccessibilità sia data dalla dislocazione dell'Arduino (magari è inscatolato in un muro o simili), non dalla sua distanza perché non credo che riesca con un cavo USB a fare decine di metri. Quindi potrebbe in teoria tirare i fili di un connettorino ISP per flashare lo sketch indipendentemente dalla normale comunicazione seriale tagliando contemporaneamente la pista del RESET-ENABLE, no? Magari mettere lo spinottino ISP fuori dalla scatola o dove ha contenuto l'Arduino.

leo72:
non dalla sua distanza perché non credo che riesca con un cavo USB a fare decine di metri.

Questo no perché la distanza massima per la USB è 5 metri, a meno di non usare dei costosi ripetitori, però potrebbe aver previsto un connettore USB montato su una scatola di derivazione in vicinanza della scheda.

Quindi potrebbe in teoria tirare i fili di un connettorino ISP

Ancora peggio, qui la distanza massima si misura in centimetri, la ISP in realtà è una porta SPI e anche se lavori a frequenza bassa e con limiti su i fronti molto più laschi di quelli standard non va molto d'accordo con i cavi lunghi.

:cold_sweat:

Il problema è che l'Arduino è in un sottoscala bloccato da un divano...e quindi non posso accedervi...mentre i cavi elettrici che gestiscono la "ciabatta comandata" escono da una scatola di derivazione e si inseriscono direttamente nel "cabinet" della ciabatta...

...l'Arduino è un Arduino 2009 e, quindi, non lo posso sostituire!

Se è così complicato taglio la pista del DTR e al diavolo le riprogrammazioni del firmware...tanto x ora il firmware accetta proprio 12 caratteri...6 x accendere la corrispondente porta e 6 x spegnerli...non sò e non credo serviranno grosse migliorie al software, ma cercavo di ottenere il miglior risultato...

X quanto riguarda lo sviluppo del "command line" possibile che non esista un linguaggio per cui, se scrivo un programma, esso è portabile? Ok che le librerire che gestiscono la seriale sono diverse...e sta bene che x ogni sistema operativo uso la corrispondente libreria, ma il programma "principale" quello dove includo la libreria "serial-communication" non può essere lo stesso?

Se non è così...madonna mia... :confused:

astroz78:
...l'Arduino è un Arduino 2009 e, quindi, non lo posso sostituire!

Questa non l'ho capita, un conto è se non vuoi acquistare un'altra scheda, un conto è se fai questa affermazione pensando che non esistono sostituti della 2009 che hanno lo stesso layout come nel caso della Luigino 328.

X quanto riguarda lo sviluppo del "command line" possibile che non esista un linguaggio per cui, se scrivo un programma, esso è portabile?

Non è così semplice come credi, purtroppo tra i vari sistemi operativi esistono delle differenze e quando parliamo di controllare la porta seriale, fisica o virtuale che sia, tocca fare i conti su come viene gestita dal sistema operativo.
In linea di massima puoi sviluppare la tua applicazione con processing che poi ti genera gli eseguibili per Windows, Linux e MAC OS, ma la compatibilità al 100% è garantita solo per il linguaggio standard, non appena entrano in gioco librerie di terze parti non hai più la certezza che tutto funziona bene su i vari sistemi operativi, e la seriale è uno di questi casi, sopratutto quando vuoi utilizzare funzionalità particolari come il controllo del DTR.

astrobeed:
pensando che non esistono sostituti della 2009 che hanno lo stesso layout come nel caso della Luigino 328.

Che integra il controllo intelligente dell'autoreset in modo da eseguirlo solo nel caso in cui riceva il segnale per la programmazione e non per la semplice apertura della comunicazione seriale.

astroz78:
Se è così complicato taglio la pista del DTR e al diavolo le riprogrammazioni del firmware...tanto x ora il firmware accetta proprio 12 caratteri...6 x accendere la corrispondente porta e 6 x spegnerli...non sò e non credo serviranno grosse migliorie al software, ma cercavo di ottenere il miglior risultato...

In realtà non credo che la cosa sia così drastica, se è solo per bloccare il DTR ti basta infilare un C da 10µF col + nel pin 3,3V ed il - nel pin RESET del connettore di Arduino; quando devi riprogrammare lo togli.

@ Leo: l'aveva già scritto lui prima... :slight_smile:

menniti:
In realtà non credo che la cosa sia così drastica, se è solo per bloccare il DTR ti basta infilare un C da 10µF col + nel pin 3,3V ed il - nel pin RESET del connettore di Arduino; quando devi riprogrammare lo togli.

Ma lui ha detto che l'Arduino non è accessibile, quindi immagino che non sia facile raggiungerlo. Doverlo programmare significa dover sfilare R e/o C infilati, ecco perché non gli ho suggerito la cosa.

@ Leo: l'aveva già scritto lui prima... :slight_smile:

Uh... oh... è vero... :astonished:
Ma tanto non ci fate caso ormai, lo sapete che sono rinco.... :sweat_smile:

leo72:

menniti:
In realtà non credo che la cosa sia così drastica, se è solo per bloccare il DTR ti basta infilare un C da 10µF col + nel pin 3,3V ed il - nel pin RESET del connettore di Arduino; quando devi riprogrammare lo togli.

Ma lui ha detto che l'Arduino non è accessibile, quindi immagino che non sia facile raggiungerlo. Doverlo programmare significa dover sfilare R e/o C infilati, ecco perché non gli ho suggerito la cosa.

Avendo detto che è disposto a tagliare la pista, mica lo può fare col laser attraverso il divano :grin:
Una volta che accede mette il C e se ne parla poi la volta che vorrà/dovrà aggiornare il firmware, almeno non deve risaldare la pista :fearful:

Io la butto lì....
E utilizzare un NE555 collegato ad un pin per gestire il reset?
Tipo mandi all' arduino la stringa RESET e lui tramite un pin attiva l' NE e poi lo riprogrammi...

Guglio:
Io la butto lì....
E utilizzare un NE555 collegato ad un pin per gestire il reset?
Tipo mandi all' arduino la stringa RESET e lui tramite un pin attiva l' NE e poi lo riprogrammi...

meglio che la raccogli di nuovo :smiley:

Dunque vorrei ringraziare tutti...ho risolto...in particolare ringrazio leo72 che mi ha indicato quel link sul Playground!

Su quella pagina era indicato come agire via "hardware" x interrompere la connessione al Reset-DTR, ma anche un link a un'altro post sul forum su come agire via software sulla seriale x disattivare il DTR nell'apertura della connessione...c'era proprio un sorgente in C++...

...ho usato quel sorgente compilato con MinGW su WinXP e funziona alla grande! Lo sketch si uploada con Arduino IDE e quando invece uso la seriale con quel programmino compilato non si resetta e quindi mantiene gli stati precedenti!

Grazie ancora a tutti...m'avete fatto un favore che manco ve lo immaginate...mi ci ero proprio impallato su quel problema! :slight_smile:

Mi fa piacere tu abbia risolto :wink: