La seriale funziona solo al secondo colpo

Ciao a tutti,
sto smadonnando per uno sketch che non riesco a far funzionare, a proposito del quale ho gia’ postato qualche giorno fa.

Siccome e’ un problema di comunicazione via seriale, ho provato a ripartire dalle basi con un codice come questo

/*
 * Serial Read Blink
 * -----------------
 * Turns on and off a light emitting diode(LED) connected to digital  
 * pin 13. The LED will blink the number of times given by a 
 * single-digit ASCII number read from the serial port.
 *
 * Created 18 October 2006
 * copyleft 2006 Tod E. Kurt <tod@todbot.com>
 * http://todbot.com/
 * 
 * based on "serial_read_advanced" example
 */

int ledPin = 3;   // select the pin for the LED
int val = 0;       // variable to store the data from the serial port

void setup() {
  pinMode(ledPin,OUTPUT);    // declare the LED's pin as output
  Serial.begin(9600);        // connect to the serial port
}

void loop () {
  val = Serial.read();      // read the serial port

  // if the stored value is a single-digit number, blink the LED that number
  if (val > '0' && val <= '9' ) {
    val = val - '0';          // convert from character to number
    for(int i=0; i<val; i++) {
      Serial.println("blink!");
      digitalWrite(ledPin,HIGH);
      delay(150);
      digitalWrite(ledPin, LOW);
      delay(150);
    }
    //Serial.println();
  }
}

e ho provato a inviare dati alla seriale sia tramite python, sia tramite software in c (tanto per fugare dubbi di programmazione lato client)

Quello che ho notato e’ che se attacco arduino all’usb, e invio ‘5’ ad esempio, non fa niente. Se lo reinvio, esegue. Ho notato questo comportamento anche nel software che sto cercando di far funzionare, e non capisco a cosa sia dovuto. Non ho trovato soluzioni tramite timer o delay.

Il codice viene eseguito solo dalla seconda volta che lo richiamo, dopo il plug di arduino all’usb.

A cosa puo’ essere dovuto?? Il comportamento non e’ identico sui diversi pc dal quale ho provato (proprio per fugare ogni sospetto). Sul mio eeepc ad esempio il codice non funziona mai, a meno di chiamarlo direttamente da console interattiva di python, in quel caso funziona. Ho provato anche in windows (dove, poi il mio codice in realta’ dovra’ funzionare) e non ottengo risultati diversi.

Sto veramente andandoci scemo…
Va forse arduino inizializzato in qualche modo ?

ma guarda un pò chi si trova su questo form!!! non sei l'unico ad andare scemo con arduino... ma alla fine worka sempre!

io cmq ho usato http://todbot.com/arduino/host/arduino-serial/arduino-serial.c e non ho avuto questo problema

Il mondo e' piccolo... Quando mi riferivo nel post precedente a codice c, mi riferivo essattamente a quel programma. Quando lo lancio ottengo questo

blackman@altair ~ $ ./a.out -b 9600 -p /dev/ttyUSB0 -s "s 1 1" -d 100 -r read: s 1 1 blackman@altair ~ $ ./a.out -b 9600 -p /dev/ttyUSB0 -s "s 1 1" -d 100 -r read: Accendo Rme...

La seconda volta e' corretto, e funziona. La prima volta ritorna quello che gli ho scritto, anche se nel mio codice di test non c'e' niente che preveda quel ritorno. In particolare, non lo fa solo col mio codice...

Ho anche i tempi stretti, vorrei presentare un lavoro il 25 aprile ma se questo non funziona non riusciro' proprio a fare niente...

hai provato a dargli un delay di almeno 10 subito dopo il serial begin?

dimmi qualcosa su sto progetto... sai che sono una persona curiosa :p

un delay a livello di setup() ? non so, devo riguardare, ho provato un po' di tutto

per questa parte di codice, nel particolare si tratta di accendere due relè in ordine e a distanza di dato tempo, dopo l'accensione del computer. ho un sistema hifi in auto comandato da pc (ne avevamo parlato) e ho bisogno di accendere amplificatori e scheda audio in dato ordine. Poi arduino mi servira' anche per altre cose che vorrei fare, ma per iniziare mi andrebbe bene cosi.

Uso gia' arduino in auto a questo scopo, ma non e' molto preciso il sistema e preferirei comandarlo da seriale, e non funziona.

Ieri notte nel dubbio di avere un arduino rotto, ho provato anche il secondo che possiedo, ma il risultato non cambia...

Provero' col delay che mi suggerisci. Ho notato che subisce una sorta di reset quando apro la seriale, non so come descriverlo bene...

quando attivi la seriale riparte dal setup non so se dalla riga in cui inizialilizzi o dal setup intero ma riavvia. prova dal programma ad apsettare che si sia inizializzato

ciao

per permettere all'arduino di resettarsi da sola prima della programmazione, c'è un condensatore collegato tra il DTR della porta seriale e il piedino di reset...

Quando apri o chiudi la porta seriale questo dtr cambia stato e resetta l'arduino...

il modo migliore è (dal lato python) è aprire la porta seriale... attendere 300 o 400 msec e poi scrivere...

se la cosa non ti piace puoi rimuovere il condensatore da 100nf che effettua l'auto reset. sulla duemilanove è il condensatore sotto il due pad scoperti (due palline di stagno a 2 mm di distanza)

grazie della delucidazione massimo non avevo mai capito perchè faceva così se lo elimino cosa devo modificare in fase di uplod degli sketch?

credo che dopo l'upload devi premere fisicamente (con il dito) il reset :)

Grazie Massimo, adesso mi e' chiaro qualcosa di piu'. Anche se ho chiaro il come dovrebbe funzionare, tuttavia non funziona :( Anche provando, relativamente allo sketch di esempio sotto riportato, un codice py di questo tipo

import serial, time ser=serial.Serial(6) time.sleep(0.4) ser.write('5') ser.flush()

time.sleep(2) #test

ser.close()

non accade nulla. Effettivamente vedo le lucine sull'arduino (Diecimila) rx e tx lampeggiare, ma niente avviene sui pin. Qualcuno puo' provare il suddetto codice e vedere se risulta? "import serial" si riferisce alla libreria pyserial. Attenzione: il codice da console interattiva py funziona, e non funziona da script.

Sempre in tutti i test che ho fatto, ho visto che funziona al primo colpo questo: http://www.bryanchung.net/?p=233 . Che processing piaccia di piu' ai miei arduini ??

Sto notando alcune cose che non mi tornano. Ho visto che la seriale su questi semplici sketch si attiva se metto uno sleep di 2 secondi dopo l'apertura da parte del pc.

int ledPin = 2;   // select the pin for the LED
int val = 0;       // variable to store the data from the serial port
int fede = 0;

void setup() {
  pinMode(ledPin,OUTPUT);    // declare the LED's pin as output
  Serial.begin(9600);        // connect to the serial port
}

void loop () {
  val = Serial.read();      // read the serial port

  // if the stored value is a single-digit number, blink the LED that number
  if (val == '2') {
          fede=1;
    }
  if (fede == 1) {
  digitalWrite(ledPin,HIGH);
  }   
    //Serial.println();
}

Provando un codice cosi, o come quello che postavo inizialmente, noto che riesco a percepire l'avvenimento del tutto se metto uno sleep anche prima della chiusura della seriale.

Ne evinco che se utilizzo serial, quello che avviene nel loop avviene fin tanto che la seriale e' aperta, e viene resettato appena viene chiusa... ma non credo sia il comportamento previsto, no ?