Salve a tutti,
sto lavorando ad un progetto per la maturità e come da titolo ho la necessità di creare un' interfaccia grafica semplice che legga i dati, inviati da arduino, tramite seriale. Quindi una finestra con n caselle di testo dove riportare i dati, senza menù o altro. Ho cercato in lungo e in largo, ma molti threads sono incompleti, per questa ragione ho deciso di chiedere consiglio a voi. Spero di riuscirci in modo tale da poter essere di aiuto a chi si troverà nella medesima situazione.
Il tutto dovrebbe girare su linux e la board è arduino Due.
Per quanto riguarda la programmazione, sono a buon punto con il programma lato arduino, ma manca tutta la parte per comunicare i dati al programma lato pc che ovviamente è tutto da scrivere.
Non ho una grande conoscenza dei vari linguaggi, conosco solo le basi di C++, vi prego di essere clementi ahah. Quindi che sia java, python o processing comunque dovrei studiarmi quantomeno le basi.
Come è facilmente intuibile non ho molto tempo a mia disposizione, ma credo di potercela fare, pertanto vi chiedo quale sia la strada più semplice da percorrere. Non mi interessa una grafica eccezionale, ma il monitor seriale non va bene per mostrare in maniera chiara i dati alla commissione.
I principali problemi che sto riscontrando sono:
librerie da utilizzare per la comunicazione seriale da ambo i lati;
creazione dell' interfaccia grafica;
quale linguaggio mi conviene utilizzare per la creazione di suddetta interfaccia.
Se qualcosa non è chiara vi prego di scusarmi, attendo risposte, grazie in anticipo!
Secondo me per fare le cose bene e facilmente puoi provare con Python, per l'interfaccia grafica vedi queti articoli per la comunicazione seriale questo articolo
Se vuoi il trovi anche il progetto gia fatto
Grazie per la risposta, ho preso in considerazione python, ma sarei più indirizzato verso java. Alla fine devo solo leggere da seriale, creare dei JTextField e i rispettivi Jlabel. Consigli a riguardo?
Sì ho dato un' occhiata generale un po' a tutti per la creazione di una gui su distro linux e per la comunicazione della seriale, per questo sono indirizzato verso java. Cosa ne pensi di quest' ultimo?
UVreactive97:
per questo sono indirizzato verso java. Cosa ne pensi di quest' ultimo?
Processing è Java, o meglio è un framework per la programmazione Java dotato di molte librerie, alcune pensate per la comunicazione con Arduino, che semplifica molto il lavoro, più o meno l'equivalente del IDE di Arduino per realizzare software PC, con il grande vantaggio che è multipiattaforma e genera codice per Windows, Linux, OS X e Android.
astrobeed:
Processing è Java, o meglio è un framework per la programmazione Java dotato di molte librerie, alcune pensate per la comunicazione con Arduino, che semplifica molto il lavoro, più o meno l'equivalente del IDE di Arduino per realizzare software PC, con il grande vantaggio che è multipiattaforma e genera codice per Windows, Linux, OS X e Android.
Ho fatto delle prove con java utilizzando la libreria RXTXcomm, inviando "Hello World" da Arduino a Eclipse e funziona perfettamente. Rimane la programmazione della finestra con le caselle.
Il problema ora è creare l'intefaccia con i textField dove mostrare i dati ricevuti da Arduino, sto leggendo molto a riguardo, tuttavia non ho ancora capito come unire la ricezione da seriale all' interfaccia.
Come dovrei procedere?
nessuno mi pare ti abbia detto di abbandonare Java... almeno io ho detto che per queste cose mi trovo moooolto bene con Qt e python..poi ugnuno usi il linguaggio che piu gli piace
Martinix:
nessuno mi pare ti abbia detto di abbandonare Java... almeno io ho detto che per queste cose mi trovo moooolto bene con Qt e python..poi ugnuno usi il linguaggio che piu gli piace
Certamente, ma ahimè il problema è che di questi linguaggi so ben poco. Intendevo dire, c'è qualche motivo in particolare per cui conviene python piuttosto che java?
Sono sulla buona strada per la creazione dell' interfaccia, ma non capisco come fare per inserire ciò che invia arduino nella casella dell' interfaccia.
Questo è il codice che ho trovato in rete per la lettura da seriale, come dovrei fare? (oltre a ripulirlo dalle parti inutili ovviamente)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.util.Enumeration;
public class SerialTest implements SerialPortEventListener {
SerialPort serialPort;
/** The port we're normally going to use. */
private static final String PORT_NAMES[] = {
"/dev/tty.usbserial-A9007UX1", // Mac OS X
"/dev/ttyACM0", // Raspberry Pi
"/dev/ttyUSB0", // Linux
"COM3", // Windows
};
/**
* A BufferedReader which will be fed by a InputStreamReader
* converting the bytes into characters
* making the displayed results codepage independent
*/
private BufferedReader input;
/** The output stream to the port */
private OutputStream output;
/** Milliseconds to block while waiting for port open */
private static final int TIME_OUT = 2000;
/** Default bits per second for COM port. */
private static final int DATA_RATE = 9600;
public void initialize() {
// the next line is for Raspberry Pi and
// gets us into the while loop and was suggested here was suggested http://www.raspberrypi.org/phpBB3/viewtopic.php?f=81&t=32186
System.setProperty("gnu.io.rxtx.SerialPorts", "/dev/ttyACM0");
CommPortIdentifier portId = null;
Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();
//First, Find an instance of serial port as set in PORT_NAMES.
while (portEnum.hasMoreElements()) {
CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
for (String portName : PORT_NAMES) {
if (currPortId.getName().equals(portName)) {
portId = currPortId;
break;
}
}
}
if (portId == null) {
System.out.println("Could not find COM port.");
return;
}
try {
// open serial port, and use class name for the appName.
serialPort = (SerialPort) portId.open(this.getClass().getName(),
TIME_OUT);
// set port parameters
serialPort.setSerialPortParams(DATA_RATE,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
// open the streams
input = new BufferedReader(new InputStreamReader(serialPort.getInputStream()));
output = serialPort.getOutputStream();
// add event listeners
serialPort.addEventListener(this);
serialPort.notifyOnDataAvailable(true);
} catch (Exception e) {
System.err.println(e.toString());
}
}
/**
* This should be called when you stop using the port.
* This will prevent port locking on platforms like Linux.
*/
public synchronized void close() {
if (serialPort != null) {
serialPort.removeEventListener();
serialPort.close();
}
}
/**
* Handle an event on the serial port. Read the data and print it.
*/
public synchronized void serialEvent(SerialPortEvent oEvent) {
if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
try {
String inputLine=input.readLine();
System.out.println(inputLine);
} catch (Exception e) {
System.err.println(e.toString());
}
}
// Ignore all the other eventTypes, but you should consider the other ones.
}
public static void main(String[] args) throws Exception {
SerialTest main = new SerialTest();
main.initialize();
Thread t=new Thread() {
public void run() {
//the following line will keep this app alive for 1000 seconds,
//waiting for events to occur and responding to them (printing incoming messages to console).
try {Thread.sleep(1000000);} catch (InterruptedException ie) {}
}
};
t.start();
System.out.println("Started");
}
}
Un motivo c'è, se non riesci a combinare nulla con Java al massimo ci fai un caffè, con il pitone puoi farci un portafogli, una borsetta un paio di stivali.
OT: Scusa UVreactive97 ti stai per diplomare (non so in cosa ma credo qualcosa inerente all'elettronica/informatica) e vuoi portare un progetto basato sulla comunicazione tra una scheda dotata di microcontrollore (Arduino) ed un PC con uno dei migliori OS finora sviluppati (GNU/Linux) e non hai la minima idea di come si fa una trasmissione seriale? non sai nemmeno come interpretare i dati che tu hai deciso di inviare ecc. Forse stai sbagliando qualcosa a mio avviso, non voglio offenderti ma ti consiglierei di cambiare il tuo progetto per l'esame, non vorrai rischiare di arrivare il giorno dell'esame e non saper rispondere a qualche semplice domanda che ti verrà posta sulla programmazione o sull'hardware che proponi magari da un presidente appassionato di elettronica e Arduino o docente di informatica...
Fine OT.
Per iniziare NON scopiazzare codice a caso preso da internet se non hai idea di come funziona Java, non è un linguaggio di programmazione semplice e da molti problemi se non lo conosci, basta una virgola nel posto sbagliato e il programma crasha inaspettatamente. Decidi che linguaggio utilizzare, ne avrete studiato almeno uno durante il quinquennio o no? magari fatti aiutare dal tuo professore che in caso di necessità potrà aiutarti, hai circa un mese per terminare il progetto, non mi sembra che sei partito con il piede giusto ma puoi ancora recuperare.
In bocca al lupo!
Ciao
D
dinodf:
OT: Scusa UVreactive97 ti stai per diplomare (non so in cosa ma credo qualcosa inerente all'elettronica/informatica) e vuoi portare un progetto basato sulla comunicazione tra una scheda dotata di microcontrollore (Arduino) ed un PC con uno dei migliori OS finora sviluppati (GNU/Linux) e non hai la minima idea di come si fa una trasmissione seriale? non sai nemmeno come interpretare i dati che tu hai deciso di inviare ecc. Forse stai sbagliando qualcosa a mio avviso, non voglio offenderti ma ti consiglierei di cambiare il tuo progetto per l'esame, non vorrai rischiare di arrivare il giorno dell'esame e non saper rispondere a qualche semplice domanda che ti verrà posta sulla programmazione o sull'hardware che proponi magari da un presidente appassionato di elettronica e Arduino o docente di informatica...
Fine OT.
Per iniziare NON scopiazzare codice a caso preso da internet se non hai idea di come funziona Java, non è un linguaggio di programmazione semplice e da molti problemi se non lo conosci, basta una virgola nel posto sbagliato e il programma crasha inaspettatamente. Decidi che linguaggio utilizzare, ne avrete studiato almeno uno durante il quinquennio o no? magari fatti aiutare dal tuo professore che in caso di necessità potrà aiutarti, hai circa un mese per terminare il progetto, non mi sembra che sei partito con il piede giusto ma puoi ancora recuperare.
In bocca al lupo!
Ciao
D
Elettrotecnica, il progetto non è basato sulla comunicazione seriale, anzi tutt'altro, devo creare una gui dove mostrare in determinate caselle i vari dati acquisiti ed elaborati da Arduino. C'entro ben poco con l'informatica, tutto quello che so l'ho imparato da solo, perché fidati che il percorso di studi non è stato dei migliori.
Il codice non è uno a caso, se l'ho trovato proprio qui, sotto la voce "Learning", ci sarà un motivo. Non sono nè un guru di java nè di altri linguaggi, facemmo C++ molto superficialmente, quindi ti lascio immaginare, i prof sono le ultime persone alle quali chiedere aiuto in questo caso. Sinceramente mi sono buttato su java perchè l'argomento mi è sembrato molto discusso e argomentato in rete. Crepi!
visto che non conosci bene ne java ne python, se vuoi (e di SE) sta sera ti posto una cosa gia fatta che fa più o meno quello che vuoi afre tu!
ovvero arduino trasmette dei dati su seriale e l'interfaccia grafiaca te li mosta (son 3 se non ricordo mae e son numeri casuali).
Ma è in Python..... se ti in teressa posso postarti sia il cosice sul pc sia il codice su arduino ma per java mi dispiace ne son a digiuno completo!
Martinix:
visto che non conosci bene ne java ne python, se vuoi (e di SE) sta sera ti posto una cosa gia fatta che fa più o meno quello che vuoi afre tu!
ovvero arduino trasmette dei dati su seriale e l'interfaccia grafiaca te li mosta (son 3 se non ricordo mae e son numeri casuali).
Ma è in Python..... se ti in teressa posso postarti sia il cosice sul pc sia il codice su arduino ma per java mi dispiace ne son a digiuno completo!
Certo Martinix, suggerimenti, documenti, guide ed esempi in proposito sono ben accetti. Mi sto informando su pyQt, in un modo o nell'altro devo riuscirci.
UVreactive97:
Sono sulla buona strada per la creazione dell' interfaccia, ma non capisco come fare per inserire ciò che invia arduino nella casella dell' interfaccia.
Questo è il codice che ho trovato in rete per la lettura da seriale, come dovrei fare? (oltre a ripulirlo dalle parti inutili ovviamente)
System.out.println("Started");
Tutto quello che hai messo con System.out.println() va su una console testuale. In quel pezzo dove ricevi i dati devi avere il codice per analizzare la frase che ti arriva da Arduino, secondo un TUO protocollo capire cosa hai spedito e di conseguenza scrivere il dato nel campo Text o Label più opportuno.
Non conosco Java, ma guardando semplici esempi in giro, se il text field si chiama textField1
per leggerne il contenuto: String text = textField1.getText();
per scriverci dentro: textField1.setText("ciao");
Nel tuo caso, in evento della seriale:
String inputLine=input.readLine();
textField1.setText(inputLine);
Così dovrebbe scrivere tutta la frase ricevuta in un TextField di nome textField1.
Naturalmente manca l'analisi della frase, esempio tu dovresti stabilire un protocollo (non mi pare ci hai detto cosa spedisci).
Esempio di protocollo, un valore letto da Arduino Analogico 0-1023 potrebbe essere spedito come "A137@" ho spedito un valore 137 letto da pin analogico, @ per dire che è finito il messaggio.
Se Arduino legge un pin digitale, potrebbe essere un protocollo del tipo "D04x@" ho spedito la lettura del pin digitale 4 e il valore x dice era off, X maiuscolo sarebbe on. Bisogna naturalmente stabilire un protocollo e poi imparare i comandi Java per leggere i pezzi di una Stringa.
nid69ita:
Tutto quello che hai messo con System.out.println() va su una console testuale. In quel pezzo dove ricevi i dati devi avere il codice per analizzare la frase che ti arriva da Arduino, secondo un TUO protocollo capire cosa hai spedito e di conseguenza scrivere il dato nel campo Text o Label più opportuno.
Non conosco Java, ma guardando semplici esempi in giro, se il text field si chiama textField1
per leggerne il contenuto: String text = textField1.getText();
per scriverci dentro: textField1.setText("ciao");
Nel tuo caso, in evento della seriale:
String inputLine=input.readLine();
textField1.setText(inputLine);
Così dovrebbe scrivere tutta la frase ricevuta in un TextField di nome textField1.
Naturalmente manca l'analisi della frase, esempio tu dovresti stabilire un protocollo (non mi pare ci hai detto cosa spedisci).
Esempio di protocollo, un valore letto da Arduino Analogico 0-1023 potrebbe essere spedito come "A137@" ho spedito un valore 137 letto da pin analogico, @ per dire che è finito il messaggio.
Se Arduino legge un pin digitale, potrebbe essere un protocollo del tipo "D04x@" ho spedito la lettura del pin digitale 4 e il valore x dice era off, X maiuscolo sarebbe on. Bisogna naturalmente stabilire un protocollo e poi imparare i comandi Java per leggere i pezzi di una Stringa.
Grazie per l'intervento, allora, arduino dovrebbe leggere valori analogici da due sensori e dopo determinati calcoli scrivere i risultati sulla seriale. Solo numeri quindi, interi e decimali. Perchè le spiegazioni di ciò che contengono i textField andrebbero ai rispettivi lati con i label.
Un dubbio che vorrei chiarire: Arduino esegue un calcolo e scrive sulla seriale "220", successivamente ne fa un altro e scrive "10,155", poi un altro ancora e il ciclo inizia da capo, se nella mia gui ho bisogno di 3 textField come faccio a stabilire quale valore deve andare in una casella e quale in un'altra? Mi basta seguire lo stesso ordine di successione del programma lato Arduino? Ovviamente questi dati variano ad ogni ciclo che effettua Arduino.
Scusami pe le domande sciocche, ma non mi è chiaro come e dove scrivere questo protocollo per analizzare ciò che il programma legge da seriale.