disattivazione reset arduino via software(c++) da debian

Salve, sono un novellino nel campo di arduino.
Sto cercando di effettuare un sistema di sorveglianza con sensore Pir e Arduino Uno con atmega328p collegato ad un pc con debian sid facendo uso del solo paccheto arduino-core.
Ho quindi un problema quando metto in esecuzione -sul pc- un codice c che sta in ascolto sulla porta USB in attesa che arduino invii la segnalazione di un movimento.
Nel momento in cui il codice esegue la system call fd=open("/dev/ttyACM0", O_RDWR | O_NOCTTY | O_NDELAY), arduino effettua l’autoreset ed quello che non voglio succeda.
Subito dopo la open() viene eseguito questo codice:

//disable auto-reset arduino
void disable_autoresetarduino(int f_ard)
{ 
	int serial;
	if(ioctl(f_ard,TIOCMGET,&serial)<0)
		printf("error ioctl TIOCMGET\n");
	//clear DTR
	serial &= ~TIOCM_DTR;
	if(ioctl(f_ard,TIOCMSET,&serial)<0)
		printf("error ioctl TIOCMSET\n");
	
	/*metodo alternativo
    struct termios mode;
    memset(&mode,0,sizeof( mode));
    tcgetattr(f_ard,&mode);
    mode.c_cflag &= ~HUPCL;   // disable hang-up-on-close to avoid reset
    tcsetattr(f_ard,TCSANOW,&mode);
	*/
}

In questa maniera però riesco ad evitare l’autoreset di arduino solo nel momento in cui il codice esegue la system call close(fd).

Come si può disabilitare l’autoreset prima della chiamata open()?

grazie a chiunque voglia aiutare
federico

Volendo puoi farlo a livello Hardware… metti una resistenza da 470 ohm tra +5V e RESET

Si potrei ma devo aspettare una 10 di giorni perchè ora non ho una resistenzadi quel valore. E poi trovare anche una soluzione via software mi attira. :slight_smile:
Ma comunque in questo link Arduino Playground - HomePage dice che ci vorrebbe una resistenza da 120 ohm.
Cosa cambia?

Io l'ho fatto con resistenze da 100 ohm a 470 ohm e condensatori da 1 a 10uF :slight_smile:
tutto dipende dal micro perchè hanno comunque delle caratteristiche leggermente diverse...
Via sw non saprei proprio ma credo tu debba mettere mano al bootloader....

Non credo c'entri il bootloader, ma penso sia una cosa che riguarda la gestione che il SO fa dei canali seriali.
Mi pare che Linux ogni volta che accede alla porta seriale invii il segnale di reset. Se colleghi l'Arduino all'avvio del computer, vedrai infatti che la scheda si resetta 2 o 3 volte.

Però non so come si può risolvere

potresti disabilitare il reset tagliando la pista tra i 2 rettangoli stagnati nel cerchio della foto sottostante. Cosi disabili il segnale DTR che viene usato per resettare l’arduino durante il upload.
Per fare il upload dei sketch devi schiacciare il pulsante reset nel momento giusto. per ripristinare il reset colleghi i due rettangoli con un ponte di stagno
Ciao Uwe

Grazie per le risposte.

@ratto93
Ho trovato una resistenza da 1 watt(è grossa quasi come arduino) e 470 ohm, l'ho collegata tra il piedino RESET e +5V ma l'autoreset non se ne va.

@uwefed
Non ho mai fatto un lavoro del genere ad un circuito con delle dimenzioni abbastanza ridotte e non possiedo nemmeno gli strumenti, potrei fare un casino.

La soluzione con la resistenza tra il RESET e +5V è meno drastica.
Posso provare dei valori di resistenze diverse tra RESET e + 5V, fino ad eliminare l'autoreset, senza sciupare Arduino?
Non snobbo la soluzione via software.

federico

Sulle Arduino UNO in genere la soluzione della resistenza non funziona. Nella maggior parte dei casi va usato un condensatore da 10 uF: piedino corto infilato nel pin RESET e piedino lungo infilato nel pin 5V.

Con il mio 2009 va in entrmbi i casi 8)

Ma qui si parla di UNO :stuck_out_tongue:
A pochi va con la R, a me (ed a molti altri, dato che la soluzione è stata postata mesi fa sul forum internazionale ed ampiamente usata) va solo con il C.

In questa maniera però riesco ad evitare l'autoreset di arduino solo nel momento in cui il codice esegue la system call close(fd).

Il fatto che ioctl vuole come primo argomento il descrittore di file f_ard e questo presume che prima sia stata fatta una open che ha ritornato il descrittore. Io penso che ci sia un modo per ricavare il descrittore ed impostare il dtr ecc, ma ho idea di come si faccia.

Sto guardando il codice di una implementazione di una seriale in Qt, trovata qui http://www.inbiza.com/labs
la lib si chiama qserialport ed usa termios.h sys/ioctl.h.

prova anche a studiare qui http://www.makelinux.com/ldd3/?u=chp-18-sect-3

Ciao.

un'errore che ha fatto banzi e compagnia e' costringere la gente a tagliare la pista del reset in questi casi, quando invece la soluzione pulita e' sotto al naso ma non la vedono.
Dovevano, e spero che venga fatto in futuro, far passare direttamente il reset nelle due piazzole saldate, non in parallelo al taglio da eseguire.
Di fabbrica l'arduino deve uscire con la saldatura eseguita, ed a chi come in questo caso serve disabilitare il reset, lo deve solo dissaldare, per poi risaldarlo quando serve.
si passerebbe da una condizione all'altra senza tagliare nulla

allora meglio un jumper, se lo metti hai il reset, se lo togli no.

Testato:
un'errore che ha fatto banzi e compagnia e' costringere la gente a tagliare la pista del reset in questi casi, quando invece la soluzione pulita e' sotto al naso ma non la vedono.
Dovevano, e spero che venga fatto in futuro, far passare direttamente il reset nelle due piazzole saldate, non in parallelo al taglio da eseguire.
Di fabbrica l'arduino deve uscire con la saldatura eseguita, ed a chi come in questo caso serve disabilitare il reset, lo deve solo dissaldare, per poi risaldarlo quando serve.
si passerebbe da una condizione all'altra senza tagliare nulla

Secondo me un ponte di stagno tra 2 piazzole non é realizzabile sulle macchine automati in modo affidabile. dovrebbe essere eseguito a mano in un secondo momento. Visto che pochi veramente avranno bisogno di interrompere il collegamento é meglio farlo come é fatto.
Quei 100 Arduini che saranno modificati in tal senso non giustifica il lavoro su altri 300000

Ciao Uwe

Quei 100 Arduini che saranno modificati in tal senso non giustifica il lavoro su altri 300000

Sarà anche così. forse il principiante che si accontenta di fare qualche gioco di luce ed usa la seriale come debug, ma se vuoi realizzare un programma che dialoga con arduino il problema ci sta.

Se la devo dira la dico, ma si la dico. Hanno fatto la uno e potevano benissimo creare una sequenza di codici per abilitare il reset, di mode che se non la invio non si resetta.

Ciao.

lesto:
allora meglio un jumper, se lo metti hai il reset, se lo togli no.

L'ho detto anch'io tempo fa. Un jumper era la soluzione più pulita ed efficiente.

il jumper pero' costa, la saldatura no :slight_smile:
qui si guarda la virgola, infatti hanno risparmiato l'ICSP dell'8u2

anche io preferisco il jumper, per questioni di soldi la saldatura, cosi' come e' e' una stupidata.

Se ci sono problemi in fase di fabbricazione come dice uwe va bene anche un ponticello, quindi sempre solo dissaldare, senza dover tagliare nulla

Testato:
il jumper pero' costa, la saldatura no :slight_smile:

$)

qui si guarda la virgola, infatti hanno risparmiato l'ICSP dell'8u2

Che poi è stato rimesso sulla UNO R2. Forse perché l'8U2 della prima UNO ha dato problemi a diversa gente sotto Linux e spesso doveva essere riflashato.

A proposito, avete notato che è stata aggiornata la sezione Hardware del sito?
Curiosamente, però, continua a comparire la foto della UNO R1. Ma la UNO R2 dov'è? Cos'è? E' (stata) una scheda in tiratura limitata? E' una scheda che è stata tolta di produzione perché buggata?

Banzi ha ufficialmente annunciato la R3 al Make

Non hai risposto alla mia domanda :smiley: