Realizzare programma alternativo al "Serial monitor" di Arduino.

Ciao a tutti, nei vai test che sto facendo con flash e Arduino, ho realizzato una piccola applicazione identica al Serial monitor di Arduino.

Ho pensato ad aggiungere altre funzionalità: tenere traccia delle ultime stringe inviate per poterle inviare nuovamente (attualmente il campo di testo del serial Monitor, si cancella dopo l'invio. settare un timer per inviare le stringhe ripetutamente. inviare valori Random. scrivere più righe, in modo che vengano inviate una dopo l'altra.

Vi vengono in mente altre cose che potrebbe fare?

Qualche stringa che permetta di formattare il testo ? ex. tabulazioni, numero decimali da visualizzare

lluuccaa: Ciao a tutti, nei vai test che sto facendo con flash e Arduino, ho realizzato una piccola applicazione identica al Serial monitor di Arduino.

Non per sminuire il tuo lavoro, però al posto del serial monitor basta usare un qualunque programma di comunicazione per avere tutto quello che serve, p.e. l'ottimo realterm che ha anche una versione free, lo stesso HyperTerminal di Windows è 1000 volte meglio del serial monitor per comunicare con Arduino e/o realizzare un classico menù testuale, cosa quasi impossibile da fare con il serial monitor.

astrobeed:

lluuccaa: Ciao a tutti, nei vai test che sto facendo con flash e Arduino, ho realizzato una piccola applicazione identica al Serial monitor di Arduino.

Non per sminuire il tuo lavoro, però al posto del serial monitor basta usare un qualunque programma di comunicazione per avere tutto quello che serve, p.e. l'ottimo realterm che ha anche una versione free, lo stesso HyperTerminal di Windows è 1000 volte meglio del serial monitor per comunicare con Arduino e/o realizzare un classico menù testuale, cosa quasi impossibile da fare con il serial monitor.

Posso confermare che l'HyperTermnal, che sto usando come alternativa al Serila Monitor, sul mio Programmatore HV, funziona a meraviglia; il RealTerm che avevo provato a suo tempo, ha il vantaggio di avere un sacco di impostazioni personalizzabili, ma per l'utente medio (quello come me, che vuole vedere una cosa funzionare e basta :D)credo sia solo casino aggiunto. Invece colgo l'occasione per chiedere ad Astro che fine ha fato il suo progetto virtualLCD, che prometteva benissimo, mi pareva fosse in fase di completamento, per la parte del numero di righe & caratteri a libera scelta. Accantonato?

io aggiungerei la possibilità di usare valori di baudrate "qualsiasi", il log su file, la possibilità di fare da ponte tra 2 o più seriali (per esempio per debuggare 2 arduino che si parlano)

Io uso Putty e mi trovo bene, programmabile a piacere, con log :D

Ciao,
grazie per avermi indicato questi programmi veramente interessanti.

baudrate “qualsiasi”

intendi dire un campo di testo libero?, per il log sul file non c’è problema, mentre per la versione che faccia da ponte devo pensare a come riuscire a aprire due porte in simultanea.

Qualche stringa che permetta di formattare il testo ? ex. tabulazioni, numero decimali da visualizzare

Cerco qualcosa da realizzare per fare esperienza, comincio col postarvi il codice sorgente in Flex ed un’immagine dell’applicazione.

per poterlo compilare bisogna scaricare la libreria ANE http://code.google.com/p/as3-arduino-connector/

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
					   xmlns:s="library://ns.adobe.com/flex/spark" 
					   xmlns:mx="library://ns.adobe.com/flex/mx"
					   creationComplete="initApp()"
					   close="arduino.dispose()">
	<s:layout>
		<s:VerticalLayout/>
	</s:layout>
	<fx:Script>
		<![CDATA[
			import com.quetwo.Arduino.ArduinoConnector;
			import com.quetwo.Arduino.ArduinoConnectorEvent;
			
			import flash.sampler.NewObjectSample;
			
			import mx.collections.ArrayCollection;
			import mx.events.FlexEvent;
			
			import org.osmf.events.TimeEvent;
			
			import spark.events.IndexChangeEvent;
			
			public var arduino:ArduinoConnector;
			
			[Bindable]
			private var listaPorte:ArrayCollection;
			[Bindable]
			private var listaCache:ArrayCollection;
			
			public function initApp():void
			{
				arduino = new ArduinoConnector();
				listaPorte = new ArrayCollection(arduino.getComPorts());
				listaCache = new ArrayCollection();
				findAndConnect();
				arduino.addEventListener(ProgressEvent.SOCKET_DATA, onSocketData);
				arduino.addEventListener(ProgressEvent.PROGRESS, onProgress);
			}
			
			protected function closeApp(event:Event):void
			{
				arduino.dispose();                              
			}
			
			protected function send_clickHandler(event:MouseEvent):void
			{
				arduino.writeString(testo.text);
				
				if(listaCache.getItemIndex(testo.text) == -1)
					listaCache.addItem(testo.text);
			}
			
			protected function onSocketData(event:Event):void
			{
				trace("ArduinoSerialMonitor.onSocketData(event)");
				console.appendText(arduino.readBytesAsString() + "\n");
			}
			
			protected function onProgress(event:Event):void
			{
				trace("ArduinoSerialMonitor.onProgress(event)");
			}
			
			protected function comList_changeHandler(event:IndexChangeEvent):void
			{
				if(arduino.portOpen){
					arduino.dispose();
					arduino = new ArduinoConnector();
				}
				
				connect(comList.selectedItem, 9600);
				
				if(arduino.portOpen)
					trace("mi sono collegato");
				else
					trace("non mi sono collegato");
				
			}
			
			// motodo spartano per cercare la porta COM attualmente in uso da Arduino
			// viene comunque data la possibilità di selezionare una porta alternativa.
			protected function findAndConnect():void
			{
				for (var i:int = 0; i < listaPorte.length; i++) 
				{
					connect(String(listaPorte.getItemAt(i)), 9600);
					if(arduino.portOpen){
						comList.selectedIndex = i;
						break;
					}
				}
			}
			
			private static const START_TIMER:String = "Start timer";
			private static const STOP_TIMER:String = "Stop timer";
			private var timer:Timer;
			protected function timerButton_clickHandler(event:MouseEvent):void
			{
				if(timerButton.label == START_TIMER){
					timerButton.label = STOP_TIMER;
					timer = new Timer(Number(interval.text));
					timer.addEventListener(TimerEvent.TIMER, onTimer);
					timer.start();
				}
				else
				{timer.stop();
					timerButton.label = START_TIMER;
					
				}
			}
			
			protected function onTimer(event:TimerEvent):void
			{
				send_clickHandler(null);
			}
			
			private function connect(comPort:String, baud:Number=57600):void{
				arduino.connect(comPort, baud);
				arduino.addEventListener(ProgressEvent.SOCKET_DATA, onSocketData);
				arduino.addEventListener(ProgressEvent.PROGRESS, onProgress);
			}
			
			protected function cache_changeHandler(event:IndexChangeEvent):void
			{
				testo.text = cache.selectedItem;
			}
			
		]]>
	</fx:Script>
	<fx:Declarations>
		<!-- Place non-visual elements (e.g., services, value objects) here -->
	</fx:Declarations>
	<s:HGroup width="100%">
		<s:TextInput id="testo" width="100%"/>
		<s:Button label="send" id="send" click="send_clickHandler(event)"/>
		<s:TextInput id="interval" text="1000"/>
		<s:Button label="{START_TIMER}" id="timerButton" click="timerButton_clickHandler(event)"/>
	</s:HGroup>
	<s:HGroup width="100%" height="100%">
		<s:TextArea id="console" width="100%" height="100%"/>
		<s:List id="cache" dataProvider="{listaCache}" change="cache_changeHandler(event)" width="200" height="100%"/>
	</s:HGroup>
	<s:ComboBox id="comList" dataProvider="{listaPorte}" change="comList_changeHandler(event)"/>
</s:WindowedApplication>

Io al mio primo posto di lavoro realizzare uno strumento di analisi della seriale, ne è venuto un tool niente male, solo che è sviluppato in vb6 e non so se ho ancora i sorgenti. Anche io programmo in flex, quindi potrei anche dare una mano. Il tool che avevo sviluppato permetteva di registrare porzioni di trasmissione, inviare macro ed era strutturato a doppia linea, in modo di avere una corrispondenza tra IN e OUT (era utilizzato per testare a "mano" il protocollo con le nostre macchine) , magari l'idea ispira..

mmmm... interessante, quindi registravi tutto quello arrivava dalla seriale e permettevi di salvarlo e successivamente riprodurlo?

ho già una classe che uso per altre cose che registra e riproduce dati...

mooolto interessante.

lluuccaa:
mmmm…
interessante, quindi registravi tutto quello arrivava dalla seriale e permettevi di salvarlo e successivamente riprodurlo?

ho già una classe che uso per altre cose che registra e riproduce dati…

mooolto interessante.

quando registrava la macro registrava solo la serie di comandi che inviavi tu, poi li riproduceva carattere per carattere con un delay tra uno e l’altro di N millisecondi configurati.
Altrimenti potevi salvarti il blocco di dati scambiati in modo da poterteli leggere successivamente.

Altre cosa utile che avevo fatto era per i dati con caratteri speciali (per esempio ACK) in quel caso scrivevo il numero esadecimale corrispondente racchiuso tra doppio minore e maggiore (esempio <<06>>), rendendo così più chiaro che cosa veniva inviato\ricevuto.

lesto:
io aggiungerei la possibilità di usare valori di baudrate “qualsiasi”, il log su file, la possibilità di fare da ponte tra 2 o più seriali (per esempio per debuggare 2 arduino che si parlano)

ho fatto una prova velocissima, per verificare se si possono collegare due dispositivi seriali, sembra funzionare.
La tua proposta è quella di visualizzare i messaggi dei due o + dispositivi collegati, o di fare da internediario, in modo da visualizzare tutto quello che transita?

lollotek:

lluuccaa:
mmmm…
interessante, quindi registravi tutto quello arrivava dalla seriale e permettevi di salvarlo e successivamente riprodurlo?

ho già una classe che uso per altre cose che registra e riproduce dati…

mooolto interessante.

quando registrava la macro registrava solo la serie di comandi che inviavi tu, poi li riproduceva carattere per carattere con un delay tra uno e l’altro di N millisecondi configurati.
Altrimenti potevi salvarti il blocco di dati scambiati in modo da poterteli leggere successivamente.

Altre cosa utile che avevo fatto era per i dati con caratteri speciali (per esempio ACK) in quel caso scrivevo il numero esadecimale corrispondente racchiuso tra doppio minore e maggiore (esempio <<06>>), rendendo così più chiaro che cosa veniva inviato\ricevuto.

ok, questo lo vedo fattibile, in parte l’ho già implementato, attualmente viene riprodotto ad un intervallo costante il comando scritto nel campo testo, mentre devo fare in modo di scorrere l’elenco dei comandi precedenti.

Serve solo l’intervallo temporale rispetto al comando precedente o devo salvare altre impostazioni?

Direi di salvare i dati in locale come xml, cosa ne pensi? così se qualcuno è più smanettone può editare l’xml a mano.

Tempo fà realizzai un'applicazione in vb6 che faceva sia da serial monitor alternativo che da serial proxy multiclient che datalogger ed altre amenità :P se vuoi ispirarti trovi la discussione qui: http://www.gioblu.com/community/forum/topic?id=290 spero che serva :)

ho fatto una prova velocissima, per verificare se si possono collegare due dispositivi seriali, sembra funzionare. La tua proposta è quella di visualizzare i messaggi dei due o + dispositivi collegati, o di fare da internediario, in modo da visualizzare tutto quello che transita?

la seconda che hai detto, per la prima credo basti lanciare due volte il programma :)

lesto:

ho fatto una prova velocissima, per verificare se si possono collegare due dispositivi seriali, sembra funzionare.
La tua proposta è quella di visualizzare i messaggi dei due o + dispositivi collegati, o di fare da internediario, in modo da visualizzare tutto quello che transita?

la seconda che hai detto, per la prima credo basti lanciare due volte il programma :slight_smile:

credo che non sia un proble, devo solo dire al sistema di riprodurre i comandi che arrivano su un canale di riprodurli sul secondo canale.
Non ho molta esperina nella comunicazione seriale, e non so bene se devo controllare io che non ci siano collisioni di dati (mentre ricevo dei dati cerco di inviarne) o se la porta seriale mette in coda le varie richieste.

ho creato un componente in flex, questo mi permette di duplicare i SerialMonitor, quante volte voglio.
Allega una immagine con due pannelli affiancati allìinterno della stessa applicazione.
Fatemi sapere se l’immagine che allero riuscite a vederla.

BrainBooster: Tempo fà realizzai un'applicazione in vb6 che faceva sia da serial monitor alternativo che da serial proxy multiclient che datalogger ed altre amenità :P se vuoi ispirarti trovi la discussione qui: http://www.gioblu.com/community/forum/topic?id=290 spero che serva :)

Io non mi ispiro, copierò a peine mani. Grazie ancora, uso arduino da pochissimo, e non so quali possano essere le caratteristiche interessanti per un'applicazione di questo tipo.

ho anche poco tempo a disposizione, spero di portare ad un buon punto l'applicazione per rilasciare i sorgenti.

ho letto tutta la prima pagina del forum, complimenti per il programma, veramente interessante, per prima cosa copierò i vari parametri di configurazione, anzi, ti chiedo a che servono.... parity, stop bit... non li conosco neppure, forse è questo che mi faceva impazzire quando cercavo di inviare dati ad arduino.

Con flex, lo sviluppo di applicazioni per android e iOs sono netive, qundi se mai dovessi realizzare anche la parte che permette di fare da server, potremmo realizzare un programma per dispositivi mobili che funzioni sia col mio che col tuo programma, basta usare lo stesso protocollo.

L'intento originale di quel softare era di rendere disponibilii dati del serialmonitor sulla rete locale e poter interagire tramite essa da qualsiasi pc della casa e comandare arduino di conseguenza, senza usare l'ethernet shield ma usando il pc a cui è connesso arduino come server. I parametri importanti della seriale sono: il numero della porta (default com1)(com1 , com 2, ecc..) la velocità di comunicazione in bps (default 9600) il numero di bit di dati (default 8) (il numero di bit di dati che l'UART deve aspettarsi) il controllo di parità (default N) (bit di controllo di parità, usato raramente) il numero di bit di stop (default 1) (il numero di bit necessari per comunicare la fine della trasmissione) Per esempio per settare la seriale per una connessione qualsiasi di solito si inizia con i valori di default passati nell'ordine velocità,controllo_parità,numero_bit_dati,numero_bit_stop quindi 9600,N,8,1 Nel software che avevo sviluppato avevo impostato un'architettura client/server in modo che il pc servisse sul suo ip i dati provenienti da arduino e che tutti i client potessero vederli contemporaneamente in "realtime" e che ogni client potesse inviare dei comandi (via ip) alla seriale di arduino .

Ciao, praticamente hai già fatto gran parte di quello che sto sviluppando.

Devo controllare se la libreria che sto usando prevede l'invio dei dati che mi hai spiegato, forse il tipo che ha creato la libreria ANE, non ha pensato che potevano servire.

Hai detto che sai programmare in flex? non appena finisco di riscrivere il codice lo carico su qualche spazio per condividerlo, spero tu voglia continuare ciò che avevi cominciato.

Ho intenzione di usare PureMvc multicore, sono abituato ad usarlo e magari integro anche le librerie SpringActionscript.

Sto compilando con le sdk 4.6 con componenti solo Spark.

no, purtroppo non conosco Flex :) ed anche il resto "sounds like japanese 4 me" :D

lluuccaa: Serve solo l'intervallo temporale rispetto al comando precedente o devo salvare altre impostazioni?

L'avevo fatto proprio come delay tra l'invio di ogni singolo byte, perché se hai una serie di istruzioni potrebbe dare problemi all'interprete se gli mandi tutta una serie di comandi in un'unico blocco..