Credo mi sfugga qualcosa.
Sto tentando di muovere i primi passi nella comunicazione arduino-python e già mi son bloccato!
Ho scritto un semplicissimo sketch che blinda il led integrato a velocità differenti a seconda del char che riceve da python. Lo sketch e' il seguente:
int tde;
void setup() {
tde=1000;
Serial.begin(9600);
pinMode(13, OUTPUT);
}
void loop() {
char d;
if(Serial.available()) d=Serial.read();
if (d=='a') tde=500;
if (d=='b') tde=5000;
digitalWrite(13,HIGH);
delay(tde);
digitalWrite(13,LOW);
delay(tde);
}
dalla parte python il programma e' anche più semplice:
import serial
ser = serial.Serial('/dev/cu.usbmodem411', 9600)
ser.write('b')
tutto funziona bene se le tre istruzioni python vengono inserite in modalità interprete (aprendo python e inserendo a mano riga per riga nel prompt >>>>)
Se invece creo un file .py contenente le stesse tre righe di codice e lo eseguo da terminale (python prova.py) il codice sembra non venir eseguito.
Cosa sbaglio? Cosa mi manca?
Uso Arduino Uno e un Mac aggiornato all'ultima versione di macOS.
Ma... non è che nella versione interattiva non fai caso all'autoreset di Arduino all'apertura della porta?
Su Mac succede?
E se si, allora cosa succede se importi anche [color=green]time[/color], e prima della [color=green]ser.write[/color] scrivi un [color=green]time.sleep(3)[/color] ?
Concordo. Meglio ancora se da Arduino invii un carattere dalla seriale appena è pronto (alla fine di setup() insomma) e dal Python aspetti che arrivi.
Inoltre inizializzerei d a un carattere sensato, tipo '\0', altrimenti assumerà un valore casuale che potrebbe anche essere 'a' o 'b' con le conseguenze del caso.
Tensore79:
quindi ogni volta che inizializzo una comunicazione seriale arduino si restarta?
SI, è il meccanismo grazie al quale funziona il bootloader che permette il caricamento dei programmi da USB/seriale.
In ogni caso, se fai un po' di ricerche su Google, ci sono vari metodi per bloccare questo "auto reset" ...
... meccansismi che però occorre siano rimovibili per permettere, quando occorre, la programmazione via USB.