[supporto playground]Comunicazioni Java e Arduino

Dea1993:
il problema è questo che io in java non ho mai usato queste librerie per la comunicazione con l'USB e non saprei come fare, su internet non ho trovato guide.

ciao

ma qui non si tratta di saper usare o meno le librerie... quello è un semplice metodo statico che devi richiamare da una tua classe java (basta anche dal main): è una cosa semplicissima se hai già scritto codice java (addirittura senza scomodare Swing!)

si lesto anche :sweat_smile: perchè l'ho studiato a scuola ma tra la prof che non sapeva spiegarlo bene (mentre ce lo spiegava molte istruzioni che abbiamo sempre dovuto importare nei programmi non ci ha spiegato a cosa servivano realmente ma ci diceva solo di importarle) e tra me venendo dal C il java non mi è mai piaciuto com linguaggio, inoltre adesso è passato del tempo dall'ultima volta che l'ho usato quindi ora la mia preparazione in java non è un gran che, infatti anche vedendo gli esempi sulle librerie RXTX faccio molta difficoltà a capire cosa fa quel programma.
invecie gia il C o python mi sembrano molto più belli e semplici come linguaggi (praticamente leggere un programma scritto in questi linguaggi è cone leggere l'inglese :slight_smile: ), per questo preferirei visto le mie difficoltà con il java, a programmare in C o python, secondo voi cosa è meglio fare? visto che questo progetto deve essere pronto e funzionante entro aprile (o forse maggio?? :cold_sweat:) per la consegna della tesina, non vorrei che facendolo in java perdessi troppo tempo e per fare alla svelta non viene fuori un copia e incolla.

più che altro lucadentella il problema è che il java non mi è stato spiegato bene a scuola quindi faccio difficoltà a creare un programma da zero, infatti per il motivo che ho detto prima (che molte istruzioni da mettere nel programma non mi è mai stato detto il funzionamento) tutti i programmi che facevo erano quasi un copia e incolla dai programmi vecchi.

ciao

non l'ho provato ma dovrebbe andare...salvalo come ListCom.java

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

public class ListCom {

	public static String[] listSerialPorts() {
		 
		Enumeration ports = CommPortIdentifier.getPortIdentifiers();
		ArrayList portList = new ArrayList();
		String portArray[] = null;
		while (ports.hasMoreElements()) {
			CommPortIdentifier port = (CommPortIdentifier) ports.nextElement();
		    if (port.getPortType() == CommPortIdentifier.PORT_SERIAL) {
		    	portList.add(port.getName());
		    }
		}
		portArray = (String[]) portList.toArray(new String[0]);
		return portArray;
	}
	
	public static void main(String[] args) {
	
		for(String name : listSerialPorts())
			System.out.println(name);
	}
}

se hai scadenze da rispettare usa i linguaggi che già conosci, credimi ci risparmi un sacco di tempo

grazie luca per avermi scritto questo programma, però mi da un errore quando importo la classe

import gnu.io.*;   "The import gnu cannot be resolved"

dopo ci sono altri errori ma penso siano dovuti alla mancanza di questa libreria, perchè da errore in tutte le righe in cui è presente

CommPortIdentifier

comunque adesso vede se riesco a far comunicare il PC con arduino usando Java, provo a continuare in java studiandolo di più senò passo a pyserial o pyusb (non so quale sia meglio)

ciao

ma hai configurato Eclipse per utilizzare la libreria rxtx?
http://rxtx.qbang.org/wiki/index.php/Using_RXTX_In_Eclipse

comunque sì, sicuramente prima ti servono delle basi maggiori sul linguaggio che decidi di utilizzare, sia questo Java, C# (vedi tutorial sul mio sito) o Python...

avevo letto su internet che una volta installate le librerie eclipse le caricava in automatico senza bisogno di caricarle manualmente

ho importato il file RXTX.jar in eclipse ora il sorgente lo compila senza errori (solo qualche warning) e nella console mi restituisce

WARNING:  RXTX Version mismatch
	Jar version = RXTX-2.2-20081207 Cloudhopper Build rxtx.cloudhopper.net
	native lib Version = RXTX-2.1-7
/dev/ttyUSB0
Experimental:  JNI_OnLoad called.

ok sembra identificarti correttamente la porta "seriale" USB0... quindi dovrebbe essere ok!

bene grazie allora adesso comincerò a sbattere la testa sulla comunicazione tra java e arduino magari cominciando a dirgli di accendere un LED

comunque per la programmazione di arduino non ho roblemi, sono 3 giorni che lo sto programmando tutto il giorno staccando solo per mangiare e dormire :grin: e devo dire che è molto semplice e divertente usarlo, adesso ridarò una spolverata a java e cercherò di capire come funzionano queste librerie RXTX
intanto grazie a tutti per il supporto che mi avete dato

ho fatto un programma che accende un LED se viene digitato 1 e lo spegne se si digita 0 altrimenti se si digita un'altro carattere dice comando errato, i comandi li passo ad arduino tramite il serial monitor della IDE di arduino per ora.
il programma funziona, nel senso che se do 1 si accende e se do 0 si spegne però guardando nel serain monitor ad esempio premo 1 mi dice:
LED acceso
comando errato
comando errato
e lo stesso se premo 0 (solo al posto di darmi LED acceso dice LED spento)

questo è il sorgente del programma

#define LED 13  // led connesso al pin 13
int cmd = 0;    // variabile per contenere il carattere ricevuto
 
void setup() {
  Serial.begin(9600); // imposto la UART per lavorare a 9600
  pinMode(LED, OUTPUT); // imposto il pin sul quale è collegato il led come uscita
  Serial.flush(); // svuoto il buffer di ricezione seriale
}
 
void loop() {
  // Controllo se il buffer di ricezione contiene qualcosa
  if (Serial.available() > 0) {
    cmd = Serial.read(); // leggo il carattere ricevuto e lo memorizzo in rx
    Serial.flush(); // svuoto il buffer di ricezione seriale
    
    // se il comando è 0
    if (cmd == '0') {
      Serial.print(cmd);  //stampo il valore di cmd
      // controlloa se il LED era acceso
      if (digitalRead(LED) == HIGH) {
        digitalWrite(LED, LOW); // spengo il LED
        Serial.println("LED spento"); // scrivo nella seriale "LED Spento"
      }
      // se il led era spento			
      else
	Serial.println("Il LED e' gia spento, forse volevi accenderlo?? premi <1> per accendere il LED");
      
    }
    
    //se il comando è 1
    if (cmd == '1') {
      Serial.print(cmd);  //stampo il valore di cmd
      //controllo se il LED era spento 
      if (digitalRead(LED) == LOW) {
        digitalWrite(LED, HIGH);  //accendo il LED
        Serial.println("LED acceso");  //scrivo nella seriale "LED acceso"
      }
      
      else
        Serial.println("Il LED e' gia acceso, forse volevi spegnerlo?? premi <0> per spegnere il LED");
      
    }
    
    //se il comando non è ne 0 ne 1
    else {
      Serial.print(cmd);
      Serial.println("Comando errato! premere <1> per accendere il LED e <0> per spegnerlo");
    }
    
  }
  
}

questo è quello che restituisce nel serial monitor

49LED acceso
13Comando errato! premere <1> per accendere il LED e <0> per spegnerlo
10Comando errato! premere <1> per accendere il LED e <0> per spegnerlo
49Il LED e' gia acceso, forse volevi spegnerlo?? premi <0> per spegnere il LED
13Comando errato! premere <1> per accendere il LED e <0> per spegnerlo
10Comando errato! premere <1> per accendere il LED e <0> per spegnerlo
48LED spento
48Comando errato! premere <1> per accendere il LED e <0> per spegnerlo
13Comando errato! premere <1> per accendere il LED e <0> per spegnerlo
10Comando errato! premere <1> per accendere il LED e <0> per spegnerlo

guardando nella tabella del codice ASCII il 13 corrisponde a "carriage return" e il 10 a "linee feed"

una domanda cosa cambia se lavoro con UART a 9600, 4800 o ad un altro valore??

il baud rate è il numero di caratteri al secondo che possono essere inviati via seriale.

per quanto rigurda i caratteri \n\r (carriage return e line feed) sono i mormali caratteri che windows genera che vogliono dire "premuto tasto invio", nel serial monitor c'è una checkbox per disabilitare l'invio di questi caratteri.

sisi adesso funziona bastava mettere "no line editing" al posto di "both NL & CR", comunque ho dovuto fare anche una piccola modifica al sorgente perchè, cioè al posto dell'ultimo else mettere

if ((cmd != '0')&&(cmd != '1'))

perchè senò premendo 0 non non mi entrava nell'if con condizione cmd==1 e quindi entrava nell'ultimo else dicendomi carattere errato

la suluzione ideale è uno switch case

giusto hai ragione lo switch è la cosa migliore, va be comunque in questo programma non mi interessava tanto l'ottimizzazione del programma ma più che altro era un esercitazione per prendere confidenza con la comunicazione seriale

in rete ho trovato dopo una lunga ricerca queste due guide secondo me fatte molto bene per iniziare a programmare in java usando le librerie RXTX, le metto qua in caso a qualcuno potessero essere utili
http://www.electroyou.it/tardofreak/wiki/pc-e-linee-seriali in italiano
How to open serial port (using rxtx) | Embedded Freaks.. in inglese
adesso inizierò a studiarmele per bene e poi spero di riuscire (in settimana) ad accendere un LED da PC usando un software creato da me in java