Processing-Java

Ciao a tutti, sono nuovo del forum!
Mi chiamo Leonardo e sono uno studente al quarto anno di ITIS di informatica, sono un grande appassionato di Programmazione, di Elettronica e chiaramente di Arduino. :slight_smile:

In questo periodo sto studiando in modo abbastanza approfondito il linguaggio di programmazione Java e avrei bisogno di alcuni chiarimenti per quanto riguarda l' "iterazione" tra Processing e Java.
Siccome Processing è in parte anche basato su Java mi piacerebbe sapere se esiste qualche libreria(o qualcosa di simile) per Java che permette di interfacciare Arduino direttamente con un IDE(eclipse, netbeans).

Esempio:
Da un semplice potenziometro collegato ad Arduino a sua volta collegato via USB a un PC, leggerne il valore e stamparlo in una finestra di un'applicazione .java

Grazie, è un onore essermi aggregato a voi! :slight_smile:

Ciao Leo e benvenuto!

La modalità più facile per far "parlare" Arduino con un sw su PC è utilizzare la porta seriale (Arduino Uno ad es. ha già un adattatore seriale -> usb a bordo quindi non ti serve una seriale "vera" lato PC). Con Java puoi usare le librerie Rx/Tx per parlare via seriale.

Un ottimo esempio già pronto é il firmware Firmata lato Arduino
http://firmata.org/wiki/Main_Page

con un programma su PC scritto in Java:

Quindi se non ho capito male RxTx, è un insieme di librerie che si installano in Java e poi senza alcun hardware aggiuntivo si può avviare una comunicazione.

Classi, Metodi e docs vari dove potrei reperirli?

Ciao

il sito ufficiale della libreria -> http://rxtx.qbang.org

per essere precisi, RxTx è una implementazione delle API JavaComm

come per altri aspetti di Java, Sun (Oracle) ha rilasciato delle specifiche di libreria, ovvero qualcosa del tipo "una libreria per accedere alla seriale deve implementare questi metodi, questi oggetti..." lasciando poi alla comunità lo sviluppo vero e proprio di tale libreria (sebbene per alcuni S.O. vi sia una implementazione "ufficiale").

con tale libreria puoi, da un programma java, accedere alla porta seriale quindi inviare/ricevere dati... se Arduino è connesso a tale seriale ecco che hai instaurato una comunicazione.

per inciso le librerie rxtx sono anche quelle usate proprio dall'IDE di Arduino per inviare gli sketch o per il serial monitor
bye

Grazie Mille! :slight_smile:

prego :wink:

se hai qualche problema sulla programmazione java con rxtx chiedi pure, le utilizzo spesso (anche se in effetti nel sito ho messo solo tutorial per c# ]:smiley:

Ok, se ho qualche difficoltà ti contatto anche via mex privati :slight_smile: Grazie mille mi sei di grandissimo aiuto!!!

lucadentella:
prego :wink:

se hai qualche problema sulla programmazione java con rxtx chiedi pure, le utilizzo spesso (anche se in effetti nel sito ho messo solo tutorial per c# ]:smiley:

Dopo i tuoi consigli riguardo le RxTx ho trovato questa guida in inglese per l'installazione e l'utilizzo delle librerie: Arduino and Java – silveira neto
L'ho seguita in modo minuziosa riguardo l'installazione nell'IDE etc etc..

Quando però, con Arduino connesso alla porta USB e il prg in Processing che gira, compilo le poche righe di codice del tutorial scritte in Java mi da un errore al livello di "Preferences.init();" la prima istruzione all'interno del main.
il metodo init(), controllando nei metodi della classe Preferences vuole un parametro, String commandLinePrefs , che però nell'eseguibile non gli viene passato.
Qualche idea per risolvere il mio problema?

posta l'errore completo, comunque se stai usando eclipse tanto vale slegarsi completamente da processing e usare il java puro.
comuque come parametro dovresti passargli quello che ti entra dal main (args), oppure passagli sempre una stringa vuota e sei a posto :slight_smile:

Questo è il codice(in NetBeans):

package serialtalk;

import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import java.io.InputStream;
import java.io.OutputStream;
import processing.app.Preferences;

public class Main {
static InputStream input;
static OutputStream output;

public static void main(String args) throws Exception{
Preferences.init();
System.out.println("Using port: " + Preferences.get("serial.port"));
CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier(
Preferences.get("serial.port"));

SerialPort port = (SerialPort)portId.open("serial talk", 4000);
input = port.getInputStream();
output = port.getOutputStream();
port.setSerialPortParams(Preferences.getInteger("serial.debug_rate"),
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
while(true){
while(input.available()>0) {
System.out.print((char)(input.read()));
}
}
}
}

Questo è l'errore che da in compilazione:

init(java.lang.String) has protected access in processing.app.Preferences

Cosa intendi per "slegarsi da processing"?
comunque ho provato sia con la stringa vuota "" sia con il classico(args0) e (args) ma non ho concluso nulla.

un metodo protected può essere acceduto solo dalla classe stessa o da una sua sottoclasse. Il programma che stai avviando non è una sottoclasse di Preferency e quindi non può accedere al metodo. Non usare quella classe, che fa parte di processing, e che tanto non ti serve a nulla.

Se non faccio riferimento alle classi di processing come faccio a comunicare con arduino scusa? :relaxed:

perchè processing si appoggia su java, quindi qualsiasi cosa usa processing, c'è anche in java :slight_smile:
per esempio la RXTX, ovvero la libreria che usi per comunicare con arduino, è una libreria Java, tra l'altro usata anche dall'arduino IDE (che è scritto in java)

ciao

concordo, guarda gli esempi RxTx ti viene illustrato come utilizzarle da java (senza processing):
http://rxtx.qbang.org/wiki/index.php/Writing_"Hello_World"_to_a_USB_to_serial_converter

lucadentella:
ciao

concordo, guarda gli esempi RxTx ti viene illustrato come utilizzarle da java (senza processing):
Writing "Hello World" to a USB to serial converter - Rxtx

Grandee!!! funziona!! Ultimo dubbio, se modificando questo programma volessi far inviare sulla COM una stringa da far leggere ad arduino tramite Serial.read() ci sarebbero degli inconvenienti?

Delle referenze per i metodi RxTx tipo qualcosa simile a docs.oracle.org per le classi di java esistono?

A breve... un braccio robotico(comandato dal pc ovviamente :slight_smile: ) che disegna funzioni matematiche con una penna su un foglio ]:slight_smile:

ciao

per le stringhe nessun problema... per la documentazione mi pare che nello zip sia incluso anche un javadoc in html... comunque più efficaci penso siano esempi e tutorial che trovi in rete

ciao, il programma che mi avevi consigliato scrive "Hello, world!" sulla seriale.
Per essere inviato deve essere convertito in Byte (c'è anche il metodo messageString.getBytes()) per essere "spedito".

Ora, con arduino e in particolare con la Classe Serial ci sono dei metodi come read() che servono per leggere dalla seriale. read() legge Byte (cioè un int formato da 8 cifre 0-1 giusto?).
La domanda è questa: esiste un metodo in processing che converta il byte in una stringa, per poi farci delle operazioni di controllo*?
Grazie! :slight_smile:

*Esempio: se la stringa letta equivale a "Hello, world!", far lampeggiare/accendere un LED.

questo è il link del sorgente: Oracle Java Technologies | Oracle

ciao

devi leggere stringhe via seriale da arduino, se cerchi nel forum ci sono tantissimi post a riguardo

c'è molta confusione, LEO_o

un byte è formato da 8 bit, un bit è un 1 o uno 0, ed è rappresentabile da "non c'è tensione" e "c'è tensione".

un int è un tipo di dato formato da due byte che rappresenta un numero intero con segno.

anche il byte rappresenta un numero, come anche i caratteri: per l'elettronica tutto è un numero, ovvero un insieme di segnali c'è o non c'è corrente. per passare da numero a carattere, esiste una comoda tabella detta ASCII(vedi wikipedia): un byte corrisponde ad UN carattere, e quindi un numero imprecisato di byte (quindi caratteri) corrisponde ad una STRINGA.

Ciao!

Ho provato a fare qualche piccola modifica a questo programma: http://java.sun.com/developer/releases/javacomm/SimpleWrite.java per fargli inviare un intero direttamente in questo modo:

import java.io.;
import java.util.
;
import gnu.io.*;

public class Serial {
static Enumeration portList;
static CommPortIdentifier portId;
static int numeroDaInviare = 0;
static SerialPort serialPort;
static OutputStream outputStream;
static boolean outputBufferEmptyFlag = false;

public static void main(String args) {
boolean portFound = false;
String defaultPort = “COM3”;

if (args.length > 0) {
defaultPort = args[0];
}

portList = CommPortIdentifier.getPortIdentifiers();

while (portList.hasMoreElements()) {
portId = (CommPortIdentifier) portList.nextElement();

if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {

if (portId.getName().equals(defaultPort)) {
System.out.println("Found port " + defaultPort);

portFound = true;

try {
serialPort =
(SerialPort) portId.open(“SimpleWrite”, 2000);
} catch (PortInUseException e) {
System.out.println(“Port in use.”);

continue;
}

try {
outputStream = serialPort.getOutputStream();
} catch (IOException e) {}

try {
serialPort.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException e) {}

try {
serialPort.notifyOnOutputEmpty(true);
} catch (Exception e) {
System.out.println(“Error setting event notification”);
System.out.println(e.toString());
System.exit(-1);
}

System.out.println(
"Writing “” + numeroDaInviare + “” to " + serialPort.getName());

for(int i=0; i<20; i++){
System.out.println(“Scrittura del numero su seriale”);
try {

outputStream.write(numeroDaInviare);

} catch (IOException e) {}

try {
Thread.sleep(1000); // Be sure data is xferred before closing
} catch (Exception e) {}
}
serialPort.close();
System.exit(1);
}
}
}

if (!portFound) {
System.out.println(“port " + defaultPort + " not found.”);
}
}

}

Mentre in arduino ho scritto questo:
void setup(){
pinMode(13, OUTPUT);
Serial.begin(9600);

}

void loop(){
int x;
while (Serial.available() > 0) {
int x;
x = Serial.parseInt();
if(x == 2){
digitalWrite(13, HIGH);
delay(150);
digitalWrite(13, LOW);
delay(150);
digitalWrite(13, HIGH);
delay(150);
}
}

Cioè se legge dalla seriale un intero (2), deve far lampeggiare il led sul pin 13.
Ho tentato in tutti i modi di illuminare quel dannato led ma non c’è verso.
E’ un problema di sincronizzazione? Metodi sbagliati? Inesperienza?