interfacciarsi da linux con arduino da riga di comando

ciao
ho vari arduino (uno, mega, leonardo, due)
ho fatto varie prove e ci sto prendendo la mano

volevo interfacciarmi dal computer (linux) con la scheda arduino eseguendo comandi da riga di comando

non so come spiegare

vorrei fare questo:
pc> get pin11-status
arduino> high

e basta
cioe’ non voglio avere fissa attiva la connessione seriale/usb
deve interrogare arduino e poi uscire

cioe’ come se fosse un comando di sistema tipo ls, cat ecc ecc
non so se mi sono spiegato

vorrei fare questo:
pc>  get pin11-status
arduino> high

Interessante ma al momento non ho informazioni circa uno strumento da riga di comando che permetta di fare ciò che desideri. In mancanza questo tool si può pensare di crearlo in questa ottica la mia visione è la seguente:

Il programma si chiamerà: arduino-shell
Prende come argomento il device e serial speed. Dopo avere avviato il comando si apre un shell specifica con la quale dialogare con la board via usb to serial. Visto che la tua richiesta ogni comando all'interno della shell specifica per prima cosa apre la seriale, invia un codice che arduino board interpreta come un comando, si attende che arduino risponda e la connessione seriale viene chiusa, in questo modo la seriale risulta impegnata solo quando ad esempio scrivi "get -p1"

Prova a leggere cosa offre firmata

cioe' non voglio avere fissa attiva la connessione seriale/usb
deve interrogare arduino e poi uscire

Riguardo a questo punto puoi spiegare il perché questo sia un requisito, cioè in che modo vuoi usare la seriale
quando il comando è terminato?

Occhio anche al problema dell'auto reset che con le board arduino permettono di attivare il reset e al riavvia parte il bootloader e poi se non arrivano comandi specifica il bootloader avvia il firmware. Il reset avviene in automatico ogni volta che si apre la seriale.

Ciao.

PS: Attenzione non ho trovato una tua presentazione in questo thread, provvedi a presentarti e al leggere il regolamento poi proseguiamo.

Link al regolamento.

Benvenuto,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione tutto il su citato REGOLAMENTO ... Grazie. :)

nid69ita

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. ;)

ho scritto la presentazione

cioe' io vorrei poter leggere lo status dei pin di arduino con la stessa facilita' con cui leggo lo stato dei pin di una porta parallela

se potessi fare a meno della seriale, userei tranquillamente qualche altra cosa

ho provato a usare una ethernet shield e a prendere i dati via lan ma dopo un paio di giorni pare che qualcosa va in crash o finisce la ram e si blocca tutto e devo fare un reset di arduino + ethernet shield w5100

mi servirebbe qualcosa che possa funzionare 24h/24 al primo colpo

>vercinge: .... ho letto la tua presentazione e ... relativamente ad essa, ti consiglio di rileggere con molta attenzione il REGOLAMENTO ed in particolare (... sempre visto quello che dici nella presentazione) il punto 15 e tutti i suoi sottopunti, così ... evitiamo qualsiasi futuro problema :grin:

Guglielmo

cioe' io vorrei poter leggere lo status dei pin di arduino con la stessa facilita' con cui leggo lo stato dei pin di una porta parallela

Quindi ti serve la seriale per altri usi e vorresti interrogare i registri della mcu attraverso un'altra interfaccia. Purtroppo ti resta solo provare via i2c e via SPI ma dovrai usare una board aggiuntiva e scrivere un gateway seriale to SPI (o i2c).

Comunque c'è anche bitlash che però non ho sperimentato personalmente ma esiste da tanto tempo.

Però la Mega ha 4 seriali hardware e sono affidabili.

Ciao.

non e' che ho le seriali impegnate per altro..
ho varie porte seriali a disposizione, non e' questo il punto

il punto e' che vorrei leggere i dati non nel modo seriale

cioe' mi piacerebbe usare arduino come se fosse una scheda pci/pci-express all'interno di un computer

non so se mi sono spiegato

Si ti sei spiegato, ma Arduino NON è un dispositivo pci all'interno del PC.
E' un dispositivo esterno, non è neppure un USB HOST.
E' una semplice MCU atmega328P (arduino uno/nano) con un altro chip (atmega16u per Arduino Uno e nano originali) che gestisce il colloquio via seriale/USB.
Non ha un sistema operativo sopra, ma ci carichi semplicemente un firmware (lo sketch) scritto da te, che deve fare tutto da solo, senza un S.O. a cui appoggiarsi.

Una Leonardo/Micro può essere programmata come se fosse un mouse o una tastiera quando la colleghi al PC, ma è una cosa particolare.

Se carichi il firmware Firmata su Arduino si possono mandare comandi secondo quello standard e interagire via seriale/usb. Qualcuno ha scritto per Windows e Linux dei programmi da PC ma hanno una GUI.
http://firmata.org/wiki/Main_Page
Se non ti piacciono quei programmi con GUI, ti leggi lo standard Firmata e ti scrivi un tuo programma da linea di comando che interagisce con comandi decisi da te. Qui sta quindi alla tua capacità di programmatore lato PC.
O magari se cerchi in internet qualcuno lo ha già fatto. Ma non mi pare di aver mai visto un programma lato PC che sia tipo linea di comando per colloquiare con Firmata.

ho fatto qualche ricerca e ho trovato firmataC, un client firmata scritto in C per inviare a arduino i comandi tipo output LOW, output HIGH ecc

a funzionare funziona pure, ma secondo me e' proprio la comunicazione pc-arduino che e' lenta...
cioe' per es. invio il comando pin 13 ON ed esco
poi invio PIN 13 OFF ed esco
per fare questa cosa impiego piu' di 1 secondo, una cosa lentissima
per quanto apre la comunicazione usb seriale, legge scrive e chiude la comunicazione buonanotte

con la parallela, leggo e scrivo i pin almeno 10mila volte in 1 secondo...

Si

Ma non è la stessa cosa

La parallela è locale al pc

I pin di arduino sono remoti

Comunque a me, quando ho fatto queste cose nel mio 'era stagione di pin remoti' non sembrava così lento

Adesso vado a vedere

Si

Ricordavo bene

Meno di 50 millisecondi lato client

A parte il tempo per ‘scrivere’ il comando

a me impiega quasi 4 secondi per mettere HIGH il pin 13 via usb con standardfirmata

time ./pin13high
Opening device at: /dev/ttyACM0
Device opened at: /dev/ttyACM0
Name :: StandardFirmata.ino-2.5
Setting pinMode at: 13 with value: 1
Writting digitalWrite at: 13 with value: 1

real 0m3,732s
user 0m0,001s
sys 0m0,014s

poi ho fatto anche una prova con pyFirmata e ottengo tempi ancora maggiori:

time ./on.py 
ON

real	0m5,076s
user	0m3,447s
sys	0m1,628s



time ./off.py 
OFF

real	0m5,071s
user	0m3,416s
sys	0m1,652s

Si è lento il motivo non è da attribuire alla connessione seriale in se ma al fatto che quando apri il device /ttyAC0 la board si resetta e al riavvio parte il bootloader, questo è il responsabile principale ma è anche il metodo che ti permette di scrivere il firmware nella flash di arduino senza dovere usare un programmatore esterno via ICSP tipo il AVRisp mkii(non c'è più in commercio). Il bootloader si prende un poco di tempo durante il quale attende dei byte per verificare se si ha intenzione di dialogare con esso, verificato che non si vuole dialogare con il bootloader questo avvia il firmware utente.

Puoi ovviare aprendo il device una sola volta ed eseguire più comandi, cronometrarli e poi chiudere il device e terminare il programma. Inoltre la libreria firmataC imposta la seriale a 57600 ma tu puoi modificare il codice ed inserire 115200.

Occhio che mi pare ovvio che sia il client che il server (arduino board) devono viaggiare alla stessa velocità.

Per quanto riguarda pci e compagnia ti hanno già risposto e in sostanza non puoi poiché la board è esterna così come lo è una stampante, scanner ecc. Per di più stampanti e scanner scambiano informazioni tramite il protocollo USB e la conversione seriale non c'è e quindi il transfer rate in varie modalità è molto alta anche maggiore di 10Mbit/s.

Io con la seriale ricordo di avere condotto test con 250000 baud con successo.

Ciao.

Maurotec:
Si è lento il motivo non è da attribuire alla connessione seriale in se ma al fatto che quando apri il device /ttyAC0 la board si resetta e al riavvio parte il bootloader, questo è il responsabile principale ma è anche il metodo che ti permette di scrivere il firmware nella flash di arduino senza dovere usare un programmatore esterno via ICSP tipo il AVRisp mkii(non c'è più in commercio). Il bootloader si prende un poco di tempo durante il quale attende dei byte per verificare se si ha intenzione di dialogare con esso, verificato che non si vuole dialogare con il bootloader questo avvia il firmware utente.

si
ho visto che ogni volta che aprivo la connessione verso la seriale/usb arduino si resettava
allora ho messo un condensatore tra il pin di reset e gnd e in questo modo pare che arduino non si resetti piu'
non resettandosi piu' non ho piu' neanche il problema del tempo necessario per il riavvio (e per il bootloader)
a parte che potrei usare anche il programmatore per togliere il bootloader e buonanotte, pero' in questo momento, non riavviandosi, non e' piu' rilevante..

quindi secondo il tuo ragionamento ora dovrei essere assai piu' veloce comunicare con arduino da riga di comando

e invece, va sempre una schifezza come tempi:

 time ./on.py 
ON

real	0m5,095s
user	0m3,410s
sys	0m1,684s

time ./off.py 
OFF

real	0m5,067s
user	0m3,417s
sys	0m1,648s

5 secondi e rotti per inviare un comando!!
(e sono sicuro che arduino non si e' riavviato)

Puoi ovviare aprendo il device una sola volta ed eseguire più comandi, cronometrarli e poi chiudere il device e terminare il programma.

no, non voglio la seriale sempre aperta!
voglio aprirla, fare quello che mi serve e chiuderla

p.s.: ho fatto anche la prova a caricare lo sketch con il programmatore senza il bootloader e ovviamente non cambia niente

p.s.2: noto che molto tempo viene perso prima che cominciano a lampeggiare i lex rx/tx sulla scheda quindi io escluderei il problema della velocita di trasmissione, secondo me e' qualcosa che avviene prima dello scambio dei dati che fa perdere molto tempo

(e sono sicuro che arduino non si e' riavviato)

Sicuro lo puoi essere provando a fare upload di uno sketch dall'interno dell'ide. Se il reset è disabilitato la procedura terminerà con errore, mentre se termina con successo il reset non è disabilitato.

In ogni caso i tempi sono simili a quelli precedenti e sono troppo alti anche per aprire un device file scambiare del traffico e chiudere. Se il reset è disabilitato il problema è altrove e anche con baud 57600 dovrebbe essere molto più veloce.

Comunque non capisco perché vuoi aprire il device ad ogni comando, se non hai un buon motivo è lo vuoi così perché ti piace ti devi accollare l'overhead per ogni comando. In alternativa potresti un programma C sul pc di nome ad esempio "arducommand" e scrivere nel terminale bash:

arducommand -d /dev/ttyACM0 -s 115200
arducommand getPin(1)
arducommand close

mmmm..non funzionerebbe ci vuole un demone che resta residente o qualcosa di simile alla shell python.

A questo punto prova anche bitlash che lato pc permette di scrivere uno script quindi in flash di arduino gira un linguaggio interpretato che si prende le sue belle risorse.

Riguardo al bootloader ci puoi mettere il naso qui

Ciao.

Maurotec:
Sicuro lo puoi essere provando a fare upload di uno sketch dall'interno dell'ide. Se il reset è disabilitato la procedura terminerà con errore, mentre se termina con successo il reset non è disabilitato.

si, caricando un sketch via usb direttamente da l'errore durante l'upload
quindi il bootloader non c'e' piu' di sicuro

stavo pensando a una cosa: se al posto di usare la porta usb di arduino comprassi un adattatore usb ttl e mi collegassi direttamente sui pin della seriale di arduino? potrebbe cabmbiare qualcosa?

p.s.: ma non c'e' una scheda tipo la mega collegabile tramite slot pci?
ho provato anche a cercare ma ho trovato solo una scheda tipo pci ma con cui ci si comunica sempre via seriale/usb..
tecnicamente non si potrebbe comunicare l'ATmega2560 direttamente senza passare per seriali e usb?

stavo pensando a una cosa: se al posto di usare la porta usb di arduino comprassi un adattatore usb ttl e mi collegassi direttamente sui pin della seriale di arduino? potrebbe cabmbiare qualcosa?

No non risolve, c'è già il convertitore sulla MEGA che se è originale monta un 16U2 sempre Atmel ops ora Microchip.

Se ci riesci invece potrebbe fornire infomazioni interessanti verificare quanti caratteri (byte) è possibile inviare da PC verso arduino nel tempo di 1 secondo. Quindi niente firmata, ma solo un test di velocità.

p.s.: ma non c'e' una scheda tipo la mega collegabile tramite slot pci?
ho provato anche a cercare ma ho trovato solo una scheda tipo pci ma con cui ci si comunica sempre via seriale/usb..
tecnicamente non si potrebbe comunicare l'ATmega2560 direttamente senza passare per seriali e usb?

mmmmh...non saprei, prima di pensare a questo ti suggerisco di continuare con la usb perché le tempistiche che hai mostrato sono molto distanti dal ricordo che ho io, purtroppo non ho con me arduino e non posso verificare. Solo in seguito potresti pensare di acquistare una scheda con usb stack completo, più completo rispetto al 16U2 ma anche più complesso.

Ricorda che dialogare con un device file di questo tipo in user space è una forzatura, normalmente c'è un modulo del kernel che gestisce il device e crea uno specifico node device file esportando le funzionalità verso user space.

per documentarti sullo stack usb in user space puoi cercare libusb-1.0 o wikipedia e seguendo il link libusb.org si scopre che è stato archiviato.

Ciao.

Ma stai provando con una Arduino Mega ?

sul tavolo per fare le prove ho: 1xUNO, 1xMEGA, 1xLEONARDO come programmatore icsp, 1xDUE

le prove che ho postato le ho fatto con la UNO