Il progetto del Cannone laser di Stefano Maiocchi si conclude con la realizzazione di un App Android.
In questo articolo Stefano ti racconta come ha realizzato al sua App Android con Processing e condivide il codice in modo che anche tu possa avere una base di codice da cui partire per realizzare il tuo progetto di Cannone laser giocattolo controllato da smartphone.
Lascio la descrizione a Stefano:
Codice Processing della APP per Android
Guardando le linee del codice vedi che per prima cosa consiste nel caricare le librerie necessarie e creare le variabili successivamente usate.
Poi abiliti il bluetooth all’avvio del’App.
Nel Setup inizializzi alcune variabili e avvii la connessione bluetooth, osserva i vari commenti nelle linee del codice per comprendere meglio come eseguire questi passaggi.
Nella funzione draw, equivalente alla funzione loop negli sketch di arduino e genuino, il codice è diviso in quattro fasi:
- status=0: esegui la ricerca di tutti i dispositivi e se trovi il modulo bluetooth, nel mio caso un “HC-05”, utilizzato dal cannone laser giocattolo ti connetti passando alla fase status=2, altrimenti ti fermi alla fase status=1: non connesso.
- status=1: non connesso ( vedi sopra );
- status=2: verifichi se la connessione bluetooth ad arduino è riuscita e passi alla fase operativa: status=3;
- status=3: disegni il joystick e verifichi se rilevi una tap al suo interno, segno che qualcuno ha toccato lo schermo interno all’area joystick. Calcoli le coordinate di sparo convertendole in gradi da 0 a 180, per i servomotori, e crei la stringa di tre byte da inviare tramite bluetooth. Quest’ultima è composta dalla lettera D seguita dalle due coordinate. Infine si disegna il cerchietto nel joystick nel punto in cui hai rilevato il tap ( tocco ) ingrandendolo quando Arduino comunica l’inizio dello sparo e riportandolo alle dimensioni normali quando arduino comunica la fine dello sparo.
Nella parte alta dello schermo vengono anche scritti i valori delle coordinate convertite.
L’App Android per il controllo del cannone laser giocattolo è volutamente semplice nell’aspetto grafico per non appesantirne la comprensione.
E’ stata scritta in modo da adattarsi alla risoluzione dello schermo di qualunque smartphone, e usandolo obbligatoriamente in modalità portrait (verticale).
Il codice dell’App Andriod in Processing
/* Controllo bluetooth via Android di un Cannone Laser collegato ad Arduino modulo bluetooth HC-05 configurato a 9600 Baud */ import android.content.Intent; import android.os.Bundle; import ketai.net.bluetooth.*; // libreria ketai per gestione import ketai.ui.*; // periferiche smartphone, qui import ketai.net.*; // usata per il bluetooth PFont fontMy; KetaiBluetooth bt; int status = 0; byte received = 'L'; int dataX, dataY; // definizione joystick int joyCenterX, joyCenterY, joyX, joyY; // Il codice seguente abilita il bluetooth all'avvio void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); bt = new KetaiBluetooth(this); } void onActivityResult(int requestCode, int resultCode, Intent data) { bt.onActivityResult(requestCode, resultCode, data); } void setup() { frameRate(5); // velocita' invio dati orientation(PORTRAIT); // uso smartphone in verticale background(0); // colore sfondo display nero joyCenterX = width/2; // centro joystick asse X joyCenterY = 6*height/10; // centro joystick asse Y joyX=0; joyY=0; dataX=90; dataY=90; fontMy = createFont("SansSerif",int(height/20)); // dimensione font adeguata a risoluzione schermo textFont(fontMy); // scelta del font da usare bt.start(); // avvio connessione bluetooth bt.discoverDevices(); // avvio scoperta dispositivi (discover devices) } void draw() { fill(80,90,100); // riempimento rettangolo stroke(255); // colore del bordo bianco rect(0, 0, width, height/10); // disegna rettangolo fill(200); // colore del testo if (status==0) // ricerca del bluetooth di Arduino { text("Ricerca dispositivi...", 5, (height/10)*2/3); ArrayList<String> names; names = bt.getDiscoveredDeviceNames(); // elenco dispositi trovati for (int i=0; i < names.size(); i++) { String device=names.get(i); println("["+i+"] " + device); if (device.equals("HC-05")) // in elenco c'e' modulo bluetooth di Arduino { bt.connectToDeviceByName("HC-05"); // si connette al dispositivo selezionato status=2; // smartphone connesso ad Arduino } } if (!bt.isDiscovering()) // ho cercato ma non ho trovato { status=1; // smartphone non collegato ad Arduino } } if (status==1) { text("Arduino non trovato", 5, (height/10)*2/3); } if (status==2) { text("Mi connetto a Arduino...", 5, (height/10)*2/3); if (bt.connectToDeviceByName("HC-05")) { status=3; // connessione riuscita } } if (status==3) // se lo smartphone e' connesso ad Arduino ... { background(0); //uso display nero text("Connesso ad Arduino", 5, (height/10)*2/3); // Visualizza coordinate Cannone Laser text("Coordinate: "+dataX+" "+dataY, 0, (height/10)*5/3); // disegna il joystick fill(50); // colore sfondo grigio scuro stroke(128); // colore bordo grigio chiaro strokeWeight(3); // spessore bordo rect(width/10, 3*height/10, 8*width/10, 6*height/10); if (mousePressed) { if (mouseX > width/10 && mouseX < 9*width/10 && mouseY > 3*height/10 && mouseY < 9*height/10) { // il dito e' dentro il joystick! joyX=mouseX-joyCenterX; // calcolo pixel asse X joyY=mouseY-joyCenterY; // calcolo pixel asse Y // calcolo e trasmissione coordinate dataX = int(map(joyX, -4*width/10, 4*width/10, 0, 180)); // conversione da pixel dataY = int(map(joyY, -3*height/10, 3*height/10, 0, 180)); // a gradi 0-180 servomotore if (joyY < 0) dataX = 180 - dataX; // correzione quadrante byte[] data = {'D',byte(dataX),byte(dataY)}; // composizione dati, 3 byte bt.broadcast(data); // invio coordinate ad Arduino tramite bluetooth } } noStroke(); // nessun bordo fill(250,50,50); // colore cerchietto dito if (received == 'L') // fine sparo Laser da Arduino { ellipse(joyCenterX+joyX, joyCenterY+joyY, width/10, width/10); // disegna cerchietto } if (received == 'H') // inizio sparo Laser da Arduino { ellipse(joyCenterX+joyX, joyCenterY+joyY, width/5, width/5); // disegna cerchio } } } // funzione richiamata quando arrivano dati da Arduino tramite bluetooth void onBluetoothDataEvent(String who, byte[] data) { if (status==3) // se lo smartphone e' connesso ad Arduino ... { received = data[0]; // prendo il primo byte del array } }
Stefano fa notare che l’App sarà compilata in modo debug cioè con firma generica, pertanto non può essere posta su un app-store perché dovrebbe essere firmata in modo univoco per riconoscerne il proprietario.
Quando la installi lo smartphone ti chiederà il permesso dei diritti di accesso che dovrai accettare:
la richiesta riguarda solo l’uso del bluetooth, puoi stare tranquillo in quanto la App non accederà ai vostri dati personali o altre informazioni.
Download
Puoi scaricare tutto il software, sorgenti e file apk, dal github di Stefano Maiocchi
Bibliografia
Se vuoi approfondire l’argomento dello sviluppo di App Android con Processing puoi leggere:
Rapid Android Development – Build Rich, Sensor-Based Applications with Processing by Daniel Sauter Editor: the Pragmatic Bookshelf ( link ) disponibile sia in versione cartacea tradizionale sia in formato eBook.
Se hai difficoltà con l’inglese puoi leggere il corso “Sviluppare APP Android con Processing” pubblicato sulla rivista Elettronica In nei numeri 199-204 e scritto dall’ing. Mirco Segatello a cui facciamo i complimenti.