Finalmente ho avuto un po’ di tempo per lavorare sui codici del Rover 5 bluetooth. Ho deciso di realizzare un programma Windows vista la mia conoscenza di C# .Net
L’ambiente di sviluppo è l’ottimo Visual Studio nella versione Express.
Il download è disponibile sul sito dedicato dalla Microsoft alla sua suite.
Con questo ambiente è anche possibile sviluppare per Windows Phone quindi è tutto pronto per entrare nel mondo mobile.
L’ambiente di sviluppo
VisualStudio è un ambiente di sviluppo completo, abbastanza facile da utilizzare e con molte caratteristiche che rendono agevole la programmazione.
Una volta completata la procedura di installazione scegliamo Nuovo Progetto dal menu File. A seconda delle versioni installate è possibile scegliere il tipo di progetto e il linguaggio, nel nostro caso selezioniamo Applicazione Windows Form, scegliamo il nome da dare alla soluzione e la cartella in cui salvare i file.
A questo punto possiamo “costruire” la nostra form semplicemente trascinando i controlli che ci servono dalla casella degli strumenti e posizionandoli, trascinandoli, come meglio crediamo. Realizzare una interfaccia utente funzionale è un processo che richiede un po’ di studio e prove ma lo strumento ci aiuta attraverso dei righelli che vengono visualizzati quando i controlli da spostare si avvicinano e allineano ad altri controlli o ai bordi.
Vediamo nel dettaglio quali sono i controlli utilizzati nella nostra interfaccia di guida del Rover 5 BT:
- Label: visualizza del testo alfanumerico non editabile da parte dell’utente. La proprietà Text può essere impostata anche runtime.
- TextBox: campo di testo editabile da parte dell’utente, la proprietà che riporta il testo è sempre Text, può essere variata runtime e bloccata per avere campi in sola lettura.
- Button: classico pulsante la cui pressione scatena l’evento Click.
- ComboBox: campo a scelta preimpostata, serve per selezionare dei valori fissi. Può essere “caricata” sia in designtime che runtime.
- WebBrowser: è un controllo che permette di navigare verso un indirizzo internet ed interagire con il contenuto della pagina.
- Timer: come sempre il linguaggio di programmazione è molto discorsivo quindi rappresenta un timer, la cui scadenza è espressa in millisecondi, e scatena l’evento Tick ad ogni scadenza.
L’aspetto della nostra form è solo una faccia della medaglia, infatti “dietro” ad ogni interfaccia abbiamo il codice che serve a far funzionare il programma e l’interazione tra macchina e utente.
Per accedere a questo piccolo mondo nascosto è sufficiente cliccare 2 volte su un controllo per accedere direttamente alla sua funzione principale, ad esempio l’evento click di un bottone.
In alternativa possiamo cliccare con il tasto destro sulla form nel riquadro Esplora soluzioni sulla destra e poi su visualizza codice.
Apro una breve parentesi sulla differenza di logica tra questo tipo di programmi e quelli di Arduino. La programmazione di Arduino è fondamentalmente di tipo top-down e quindi il programma viene eseguito “tutto in fila”. In realtà l’esecuzione della funzione loop esce un po’ da questo schema essendo richiamata ad ogni ciclo ma, ogni volta, il programma viene eseguito linearmente.
Una windows form invece viene programmata ad eventi quindi, semplificando, il programma non fa nulla fino allo scatenarsi di un evento che sia esso il click di un bottone, la pressione di un tasto sulla tastiera ecc. Con Arduino possiamo avere qualcosa di simile con gli interrupt.
Controllare Arduino via Bluetooth
Il linguaggio, come accennato, è C# (si pronuncia C sharp, non do diesis :-)) quindi facilmente leggibile per chiunque abbia un po’ di dimestichezza con le altre versioni di C, Arduino compresa.
Questo è il LINK per scaricare il progetto del “telecomandando”.
Le variabili
Iniziamo l’analisi del codice dalla definizione della struttura che organizza la lista di comandi.
L’istruzione enum permette di definire una sorta di tipo composto. I singoli elementi possono avere valori numerici o alfanumerici come nel nostro caso.
Le altre variabili definite sono:
- conta: contatore del numero di comandi inviati
- ultimoComando: serve a memorizzare l’ultimo comando inviato e confrontarlo con quello attualmente richiesto
- connesso: per memorizzare lo stato della connessione
- _serialPort: è l’oggetto che gestisce la connessione sulla porta seriale
Le funzioni
La prima funzione che viene eseguita è l’equivalente della setup che abbiamo con Arduino.
In questo caso vengono inizializzati gli eventi KeyUp e KeyDown della form.
+= funziona sia con valori numerici che con le funzioni quindi in pratica si “aggiunge” una chiamata alla funzione base collegata ad un evento.
KeyDown
L’evento KeyDown si verifica alla pressione di un tasto e la funzione riceve le informazioni che ci interessano attraverso il parametro di tipo KeyEventArgs.
Nelle proprietà di questo oggetto troviamo:
- KeyCode: il codice del tasto premuto, a sua volta del tipo Key
- Alt: un boolean per sapere se il tasto alt è premuto nella combinazione di tasti
- Control: come il precedente ma per il tasto ctrl
Conoscendo queste informazioni possiamo interpretare i messaggi che ci arrivano dalla tastiera e quindi invocare la funzione inviaComando passando il corretto valore dell’enum.
L’evento KeyUp si verifica quando, i tasti vengono rilasciati. In questo caso, molto semplicemente, viene inviato lo stop.
inviaComando
Questa funzione effettua l’invio del comando sulla porta seriale previa verifica dell’effettiva apertura della stessa. Dopo questo controllo ho remmato l’istruzione per confrontare il comando attuale con l’ultimo inviato.
Successivamente, con la switch, il comando codificato viene tradotto in qualcosa di più leggibile e mostrato attraverso due label.
cmdConnetti_Click
E’ l’evento scatenato dalla pressione del pulsante connetti della form.
Per prima cosa il controllo browser va all’indirizzo indicato nel campo di testo relativo, poi, in base alla presenza o meno della connessione il programma prova a collegarsi o scollegarsi dalla porta indicata.
Prima di aprire la porta è necessario impostare i parametri: nel mio caso uso quelli di default del socket bluetooth quindi 9600 baud, nessuna parità, 8 bit e uno di stop.
tmrControlla_Tick
Evento scatenato dal “tick” del timer in cui controllo se la porta è ancora aperta ed eventualmente, se era presente una connessione, provo a riaprirla.
Arduino
Il codice per Arduino serve solo per verificare l’effettiva comunicazione tra i 2 sistemi.
Nella setup vengono aperte le 2 seriali disponibili sulla Leonardo: Serial si occupa della USB e Serial1 del bluetooth.
int val; void setup() { Serial.begin(9600); Serial1.begin(9600); } void loop() { val=Serial1.read(); if(-1!=val) { switch(val) { case 'S': Serial.println("STOP"); break; case 'F': Serial.println("Avanti"); break; case 'f': Serial.println("Avanti piano"); break; case 'B': Serial.println("Indietro"); break; case 'b': Serial.println("Indietro piano"); break; case 'L': Serial.println("Sinistra"); break; case 'l': Serial.println("Sinistra piano"); break; case 'R': Serial.println("Destra"); break; case 'r': Serial.println("Destra piano"); break; case 'U': Serial.println("Camera Su"); break; case 'D': Serial.println("Camera Giu"); break; default: Serial.println("STOP"); break; } } }
Nel loop viene letta Serial1 e, se è presente qualcosa, viene interpretato scrivendo sulla Serial in modo da poter controllare quello che arriva tramite il monitor della IDE.
A questo punto il grosso è fatto, il prossimo passo è completare l’assemblaggio e comandare motori e servo ma (grattatona) non penso ci saranno sorprese 🙂
1 ping
[…] post precedenti vi ho presentato il primo assemblaggio e il programma di controllo C# del Rover 5 Bluetooth e oggi finalmente vedremo lo sketch Arduino e il test […]