InviareComandiUSB a Arduino senza usare il monitor seriale dell'IDE [RISOLTO]

Devo controllare un rover mandando ad Arduino dei comandi tramite la porta USB. I comandi sono dei caratteri char (w: vai avanti, s: indietro etc). I comandi sono inviati da una BeagleBone Black, con sopra Ubuntu, da un programma scritto in C++. Tutto funziona perfettamente, a patto però di avviare PRIMA sulla BealeBone l’IDE di Arduino. Poi, anche chiudendo l’IDE, il mio programma continua a funzionare perfettamente; se però non si avvia l’IDE di Arduino, il rover non si muove. Penso che l’IDE invii ad Arduino qualche comando per inizializzare la porta USB e io vorrei fare la stessa cosa, direttamente dal mio programma, senza dover ogni volta lanciare prima l’IDE Arduino. Qualche idea?

main.cc (1.05 KB)

serial.cpp (788 Bytes)

serial.h (191 Bytes)

Se apri il terminale del IDE quello resetta l'arduino.
Ognitanto qualcuno scrive di avere il problema che il collegamento seriale funziona solo dopo un reset.
L' altro giorno qualcuno lo spiegava perché Arduino ricevesse dei dati mentre il bootloader era ancora attivo (i primi secondi dopo l' accensione)
Ciao Uwe

giurizza:
Penso che l'IDE invii ad Arduino qualche comando per inizializzare la porta USB

No, l'IDE invia solo il segnale DTR per resettare la scheda quando deve spedire un nuovo sketch.
Non è che forse non apri correttamente dal tuo programma la linea seriale?

Grazie per la tempestiva risposta! Allora, io uso questo comando per aprire la seriale:

porta = open ("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);

La seriale è settata così:

struct termios options;
	tcgetattr(porta, &options);
	cfsetispeed(&options, B9600);
	            cfsetospeed(&options, B9600);
	options.c_cflag &= ~CSIZE;
	options.c_cflag |=CS8;
	options.c_oflag &= ~OPOST;
	options.c_cflag |= (CLOCAL | CREAD);
	tcsetattr(porta, TCSANOW, &options);

Lato Arduino c'è invece questo codice:

Serial.begin(9600); //Set Baud Rate
char val = Serial.read();

switch(val)
con i vari case (case w: avanti; s: indietro etc)
Cosa sbaglio?

Ma che modello di Arduino hai?
Perché su Linux le seriali virtuali come quelle aperte dal chip convertitore della Uno sono indicate come /dev/ttyACMx, le periferiche /dev/ttyUSBx indicano le Arduino 2009, con il chip convertitore FT232.

Ho una Romeo-All in one, basata sul microcontrollore ATmega328. E' una scheda di controllo della DFRobot fornita in kit col robot 4WD Mobile Platform. Posso provare a usare /dev/ttyACMx, ma l'IDE mi dice che è connesso a /dev/ttyUSB0 o USB1...

Risolto! Il problema è che come segnalato da uwefed, quando si apre la porta seriale, Arduino si resetta. Cercando di inviare un comando mentre si sta resettando non lo riceve, perchè il programma non è ancora partito. Ho risolto aspettando 3 secondi (sleep(3)) dopo aver aperto la porta seriale. Una soluzione ancora migliore sarebbe quella di generare un segnale di "ready".
Grazie mille a tutti per l'aiuto!