Arduino + Seriale (rxtx)

Ciao a tutti… da diverse ore sto provando senza risultati a comunicare con la porta seriale di Arduino per leggere o scrivere dati.
Ho i seguenti problemi:

1)Ho notato che quando voglio visualizzare i dati sul serial monitor dell’IDE (0022), il programma spesso si blocca o non riconosce la porta… e l’unico modo per evitarlo è (ho trovato questa soluzione su internet) inserire il cavo USB mentre si tiene premuto il tasto reset. Questa è la prima stranezza!
Per leggere dati senza problemi utilizzo Putty.

2)Con processing (1.2.1 e 1.9.2), quando eseguivo uno sketch per la comunicazione seriale mi dava mille errori legati alla libreria rxtx, poi ho provato a sostituire il file librxtxSerial.so di processing con quello di arduino IDE e, a differenza di prima posso invocare la funzione “println(Serial.list());” che mi elenca le porte seriali, ma tutto il resto del codice manda in crash il programma e il sistema operativo (e per bloccarsi linux ce ne vuole!)

Se può essere utile, questo è lo sketch di processing:

import processing.serial.*;
Serial port;

float val;
void setup() {
size(440, 220);
println(Serial.list());
String arduinoPort = Serial.list()[0];
port = new Serial(this, arduinoPort, 9600);
}
void draw() {
if (port.available() > 0) {
val = port.read();
val = map(val, 0, 255, 0, height); 
}
rect(40, val-10, 360, 20);
}

3)Ho provato anche con JAVA, sia da terminale che con Eclipse, seguendo questa guida: http://www.arduino.cc/playground/Interfacing/Java
Importo da eclipse RXTXcomm.jar, setto la variabile LD_LIBRARY_PATH, non ci sono errori segnati sul codice (senza i due passaggi precedenti sì), ma se lo avvio ho sempre questo errore:

java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path thrown while loading gnu.io.RXTXCommDriver
Exception in thread "main" java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1681)
	at java.lang.Runtime.loadLibrary0(Runtime.java:840)
	at java.lang.System.loadLibrary(System.java:1047)
	at gnu.io.CommPortIdentifier.<clinit>(CommPortIdentifier.java:83)
	at SerialTest.initialize(SerialTest.java:29)
	at SerialTest.main(SerialTest.java:102)

Vi ringrazio per l’attenzione… ciao!

P.S.
Utilizzo Linux Ubuntu 10.10 64bit (cpu AMD phenom II x4)

Intanto ti dico che la seriale è molto ostica, su Arduino. Se Arduino apre la seriale prima che sul PC ci sia qualcosa in ascolto, Arduino blocca la seriale ed il computer non è più in grado di aprirla. La procedura del cavetto USB con tastino di reset conferma che ill tuo sketch parte subito e blocca come ti ho detto.

Devi mettere minimo un delay(3000) o meglio delay(5000) (cioè di almeno 3/5 secondi) in setup() prima di aprire il canale con Serial.begin per avere il tempo di aprire il terminale. In questa maniera Arduino rimarrà per qualche secondo fermo permettendoti di anticiparlo.

Non è un bug ma è lo stesso un modo di operare che ha dato tantissimi grattacapi a un sacco di gente (me compreso).

Grazie mille ;)

E per quanto riguarda l'interfacciamento con Java o Processing? A te funziona?

Non uso Processing però puoi comunicare con Arduino tramite qualunque programma che sappia accedere alla seriale. Ricordati solo del problema di cui sopra.

Dato che il comportamento di Arduino con la seriale é normale, presumo che il mio sia un problema legato alla libreria rxtx (visto che si presenta con java e processing). A questo punto forse é meglio che chiedo aiuto nel forum di processing (su cui ho già cercato problemi simili al mio), ma in ogni caso qualsiasi vostro consiglio/esperienza può essermi utile!

supergiox:
1)Ho notato che quando voglio visualizzare i dati sul serial monitor dell’IDE (0022), il programma spesso si blocca o non riconosce la porta… e l’unico modo per evitarlo è (ho trovato questa soluzione su internet) inserire il cavo USB mentre si tiene premuto il tasto reset. Questa è la prima stranezza!
Per leggere dati senza problemi utilizzo Putty.

Mi capita solo se metto la seriale a velocità massima. A te succede anche con velocità basse?

supergiox:
2)Con processing (1.2.1 e 1.9.2), quando eseguivo uno sketch per la comunicazione seriale mi dava mille errori legati alla libreria rxtx, poi ho provato a sostituire il file librxtxSerial.so di processing con quello di arduino IDE e, a differenza di prima posso invocare la funzione “println(Serial.list());” che mi elenca le porte seriali, ma tutto il resto del codice manda in crash il programma e il sistema operativo (e per bloccarsi linux ce ne vuole!)

brutta idea, prima di tutto la versione che esce con arduino o con processing potrebbe essere stata modificata “ad hoc”, poi piuttosto scarica la rxtx dal sito ufficiale così sei sicuro di avere l’ultima versione, però non credo che funzioni per via della “native library” (vedi sotto)
AH! sei sicuro si sia bloccato tutto? hai provato a fare ctrl-alt-F2? vieni “catapultato” in una shell di emergenza (ci sono da f1 a f7, in ubuntu mi pare che f7 sia usata per il desktop). A questo punto fai “killall java”, oppure “top” (mostra i processi che stanno usando più cpu) e killall nomeprogrammacheusatroppacpu :smiley:
in casi estremi “sudo killall X” riavvia tutta l’interfaccia grafica, e “sudo shutdown -r now” riavvia il PC

supergiox:
3)Ho provato anche con JAVA, sia da terminale che con Eclipse, seguendo questa guida: http://www.arduino.cc/playground/Interfacing/Java
Importo da eclipse RXTXcomm.jar, setto la variabile LD_LIBRARY_PATH, non ci sono errori segnati sul codice (senza i due passaggi precedenti sì), ma se lo avvio ho sempre questo errore:

java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path thrown while loading gnu.io.RXTXCommDriver

Exception in thread “main” java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1681)
at java.lang.Runtime.loadLibrary0(Runtime.java:840)
at java.lang.System.loadLibrary(System.java:1047)
at gnu.io.CommPortIdentifier.(CommPortIdentifier.java:83)
at SerialTest.initialize(SerialTest.java:29)
at SerialTest.main(SerialTest.java:102)

Ferrmo, con eclipse non è necessario settare nulla da riga di comando. Devi fare così:

  1. destro sul progetto, proprità, java build path
  2. add jar e aggiungi rxtxcomm.jar e fai ok
  3. ora nel menu ti si è aggiunta rxtx, clicca sulla freccina a sinistra e usciranno un pò di voci
  4. clicca 2 volte su Native Library Location e scegli il file, all’interno della cartella di rxtx, riguardante il tuo sistema operativo (win linux, mac e 32/64bit)
  5. enjoy :slight_smile:

Grazie per tutti i consigli :) tra un paio d'ore sarò a casa e faccio queste prove! Per quanto riguarda la velocità, ho sempre usato 9600.. é troppo alta?

Per "andare in crash'' intendo che non posso neanche aprire le altre shell con ctrl+alt+f* (Non ho provato via ssh perché faccio prima a riavviare :)) e riesco solo a muovere il mouse!

Con eclipse quindi, non ho bisogno di settare le variabili d'ambiente? (Oltre a quello che mi hai detto tu)

no 9600 è bassa

uhh potrebbe essere lo stesso problema che è capitato anche a me, se ci fai caso è proprio la tastiera che non funziona più, come se fosse scollegata (connessa via ps2)

eclipse fa tutto "in automatico". Netbeans invece in automatico per le librerie, ma le native vanno specificate tra gli argomenti della JVM. Ovviamente per lanciare il programma da riga di comando tutto va impostato a mano :)

Eccomi.. ho provato quello che mi hai detto per eclipse e adesso, quando premo RUN mi spunta questa schermata

Tra quelle che vengono elencate, non ci sono le due periferiche che possono interessarmi, cioè /dev/ttyS0 e /dev/ACM0. Se scrivo una di queste due in basso a sinistra (port name) e clicco su SAVE, mi da quest'errore:

/usr/lib/jvm/java-6-openjdk/jre/lib/gnu.io.rxtx.SerialPorts
IOException!

E lo stesso con qualsiasi altra porta :(

piccolo suggerimento prima di impazzire: stau usando la openjdk, fai qualche esperimento usando la sun jdk...

Ho fatto come mi hai detto, ho selezionato da eclipse la sun-jdk (1.6.0_24) scaricata dal sito ufficiale, e adesso l'output è:

Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version   = RXTX-2.1-7
Could not find COM port.
Started
Experimental:  JNI_OnLoad called.

è un buon segno?

Per quanto riguarda Processing ho notato che quello sketch blocca il pc anche se non c'è arduino collegato! Però l'ho provato su windows 7 (stesso pc) e funziona perfettamente con o senza arduino... Come faccio a sapere qual è la versione di Java utilizzata da Processing? e posso dirgli di utilizzare quella che ho scaricato?

l'errore adesso è "Could not find COM port." prova a stampare a video il contenuto dell'array Serial.list(); magari stai cercando di accedere alla parallela e non alla simulata.

Come faccio a sapere qual è la versione di Java utilizzata da Processing? e posso dirgli di utilizzare quella che ho scaricato?

la versione di java non è un problema perchè retrocompatibile. Se intendi quale virtual machine stai usando, se sei in ubuntu puoi cambiare quella di default: sudo update-alternatives --config java ti compare un menu dove inserisci il numero della JVM da usare. e per il compilatore di default: sudo update-alternatives --config javac

Attento: riscaricati processing, il blocco del PC sono abbastanza sicuro sia legato al fatto che hai cambiato la libreria rxtx senza cambiare la native

lesto: l'errore adesso è "Could not find COM port." prova a stampare a video il contenuto dell'array Serial.list(); magari stai cercando di accedere alla parallela e non alla simulata.

Questo devo farlo con Processing o su eclipse?

Ho riscaricato processing 1.2.1, e lo sketch non funziona ovviamente. Adesso cosa devo fare per installare correttamente la libreria? Quì dice di scaricare questa versione particolare di processing, devo fare così? http://www.arduino.cc/playground/Interfacing/Processing

La libreria l'ho sempre installata su processing copiando "rxtx-2.1-7-bins-r2/RXTXcomm.jar" e "rxtx-2.1-7-bins-r2/Linux/x86_64-unknown-linux-gnu/librxtxSerial.so" nella cartella "processing1.2.1/libraries/serial/library/"

Ho eseguito su processing println(Serial.list()) e mi da questo output:

Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version   = RXTX-2.1-7
[0] "/dev/ttyS0"

e quando fermo l'esecuzione:

Experimental:  JNI_OnLoad called.

Stesso messaggio di Eclipse.

In realtà la porta a cui è collegato Arduino è /dev/ttyACM0

/dev/ttyS0 è la seriale vera! quindi al momento la libreria non sta riconoscendo la tua seriale, probabilmente perchè ACM0 non è un nome standard.

allora dovresti: 1. da terminale lsusb -> e ti leggi idProduct, idVendor e nome della periferica 2. andare da terminale nella directory /etc/udev/rules.d/ 3. creare un file, nome a scelta che inizia con un numero grande-nome esplicativo.rules: ad esempio 99-arduinouno.rules 4. nel file scrivi:

SUBSYSTEMS=="usb", ATTRS{product}=="nome trovato", ATTRS{idProduct}=="id trovato", ATTRS{idVendor}=="id trovato", SYMLINK+="ttyUSB%n"

In pratica dici ad UDEV (gestore autorilevamento dell'hardware) che se una USB con le caratteristiche specificate viene inserita, deve creare un collegamento alla periferica (SYMLINK) chiamato ttyUSB0, ttyUSB1, ttyUSB2

non so più dove sbattere la testa :( Adesso neanche arduino IDE mi vede più /dev/ACM0 l'output di lsusb è questo:

Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 003: ID 046d:c316 Logitech, Inc. HID-Compliant Keyboard
Bus 006 Device 002: ID 046d:c018 Logitech, Inc. Optical Wheel Mouse
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 003: ID 093a:2468 Pixart Imaging, Inc. SoC PC-Camera
Bus 004 Device 002: ID 2341:0001  
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

e quello di dmesg è questo:

[   29.998434] vboxdrv: Successfully done.
[   29.998435] vboxdrv: Found 4 processor cores.
[   29.998514] VBoxDrv: dbg - g_abExecMemory=ffffffffa0decd60
[   29.998556] vboxdrv: fAsync=0 offMin=0x53a offMax=0x20b8
[   29.998605] vboxdrv: TSC mode is 'synchronous', kernel timer mode is 'normal'.
[   29.998606] vboxdrv: Successfully loaded version 3.2.8_OSE (interface 0x00140001).
[  121.993023] lo: Disabled Privacy Extensions
[  322.625042] usb 4-1: USB disconnect, address 2
[  325.960076] usb 4-1: new full speed USB device using ohci_hcd and address 4
[  326.155040] cdc_acm 4-1:1.0: ttyACM0: USB ACM device

Probabilmente tra i mille tentativi avrò toccato qualcosa che non dovevo... il problema è ricordarsi cosa! :(

Almeno il problema dell'IDE l'ho risolto (installando i pacchetti deb di Ubuntu Natty) :)

Adesso vorrei fare quello che mi hai suggerito tu, però lsusb non mi da quelle informazioni (Arduino è quello senza nome)

uhmm starno, dmesg dice che è collegato... dovrebbe comparire sia nell'ide che in lsusb, e da lì prendi le info. magari prova con sudo lsusb ma non credo caverai molto..

Si avevo pensato la stessa cosa, ma non è cambiato niente.. So che è Arduino perchè se lo scollego non compare più quella voce senza nome

La cosa che mi insospettisce è che prima utilizzavo l'IDE scaricato dal sito Arduino e funzionava, adesso non funziona e riesco ad usare solo quella dei repository di Natty (stessa versione 2.2)

Ho appena provato ad avviare Ubuntu in modalità live, ed lsusb mi da lo stesso risultato di prima... Ho provato anche su un altro pc con Ubuntu, però Lucid 32bit, e su lsusb c'è sempre quella riga vuota! è colpa di arduino?

allora è lui, semplicemente a quanto pare non si identifica con in nome! semplicemente non metti ATTRS{product}=="nome trovato" nel file che crei, lasci solo i due ID: vendor:2341 product: 0001