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.


Il blog mauroalfieri.it ed i suoi contenuti sono distribuiti con Licenza