lucadentella.it http://www.lucadentella.it ... my two cents... Tue, 18 Mar 2014 22:04:38 +0000 it-IT hourly 1 http://wordpress.org/?v=3.4.2 Android e Bluetooth (2) http://www.lucadentella.it/2014/03/18/android-e-bluetooth-2/?utm_source=rss&utm_medium=rss&utm_campaign=android-e-bluetooth-2 http://www.lucadentella.it/2014/03/18/android-e-bluetooth-2/#comments Tue, 18 Mar 2014 22:04:38 +0000 luca http://www.lucadentella.it/?p=2751 Nel precedente tutorial, ho introdotto gli oggetti principali per interagire con il modulo bluetooth di uno smartphone Android e vi ho mostrato come elencare i dispositivi associati al telefono. Oggi vedremo invece come chiedere ad Android di cercare nuovi dispositivi…

Discovery e permessi

Per poter utilizzare la funzionalità di discovery di nuovi dispositivi bluetooth, è necessario dichiarare un nuovo permesso per la nostra app: BLUETOOTH_ADMIN

Per eseguire una nuova discovery è sufficiente invocare il metodo startDiscovery dell’oggetto BluetoothAdapter:

mBluetoothAdapter.startDiscovery();

Questo metodo è asincrono: sottomette la richiesta di iniziare una nuova scansione al S.O. Android e ritorna. Perché la nostra app sia informata di quando un dispositivo viene rilevato e di quando il processo di discovery termina, è necessario utilizzare i BroadcastReceiver.

Receivers e Intent filters

Una app può chiedere ad Android di essere informata di particolari eventi; ad esempio della ricezione di un SMS o del fatto che la carica della batteria sia in esaurimento. Questo tipo di eventi sono notificati alle app tramite dei messaggi broadcast: le app possono ricevere i messaggi creando degli oggetti di tipo BroadcastReceiver.

Una volta creato l’oggetto, è necessario indicare ad Android di quali eventi l’app deve essere informata. Per ogni evento è necessario creare il relativo filtro (IntentFilter); infine tramite il metodo registerReceiver() è possibile chiedere al SO di chiamare, per l’evento indicato nell’IntentFilter, il BroadcastReceiver specificato:

Nel nostro caso, dobbiamo ricevere due eventi:

  • BluetoothDevice.ACTION_FOUND quando un nuovo dispositivo è rilevato
  • BluetoothAdapter.ACTION_DISCOVERY_FINISHED quando il processo di discovery termina

Creiamo i relativi IntentFilter e registriamo il Receiver:

IntentFilter deviceFoundFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
IntentFilter discoveryFinishedfilter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(mReceiver, deviceFoundFilter);
registerReceiver(mReceiver, discoveryFinishedfilter);

Il BroadcastReceiver deve implementare il metodo onReceive(), chiamato da Android per notificare l’evento:

mReceiver = new BroadcastReceiver() {
  public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();

La stringa action consente di identificare l’evento che viene notificato e agire di conseguenza:

if (BluetoothDevice.ACTION_FOUND.equals(action)) {
  // visualizzo il nuovo dispositivo
}
if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
  // abilito nuovamente il pulsante che attiva la scansione
}

App

Anche l’app di questo esempio è molto semplice: attiva la scansione e visualizza l’elenco dei dispositivi trovati.

I suoi sorgenti sono disponibili su Github.

]]>
http://www.lucadentella.it/2014/03/18/android-e-bluetooth-2/feed/ 1
Android e Bluetooth (1) http://www.lucadentella.it/2014/03/11/android-e-bluetooth-1/?utm_source=rss&utm_medium=rss&utm_campaign=android-e-bluetooth-1 http://www.lucadentella.it/2014/03/11/android-e-bluetooth-1/#comments Tue, 11 Mar 2014 16:35:12 +0000 luca http://www.lucadentella.it/?p=2725 Un progetto a cui sto lavorando prevede il controllo tramite Android; ho quindi pensato che fosse l’occasione giusta per scrivere un tutorial su come utilizzare la connettività bluetooth in applicazioni Android…

Prerequisiti

Questo tutorial prevede che abbiate una minima conoscenza di come sviluppare una applicazione Android: in rete si possono trovare delle ottime guide, iniziando da quella ufficiale di Google. Potete scegliere l’IDE che più preferite: personalmente mi trovo bene con EclipseADT plugin.

Sorgenti

Tutte le applicazioni di esempio verranno pubblicate in un repository su Github.

Application permissions

Perché la nostra applicazione possa utilizzare la connettività bluetooth del telefono, è necessario dichiarare di utilizzare tale funzionalità. Avrete infatti notato che quando si installa una nuova applicazione, Android chiede se si accetta di concedere a tale applicazione i permessi necessari al suo funzionamento.

Apriamo il file AndroidManifest.xml

Spostiamoci sul tab Permissions, quindi clicchiamo Add…

Selezioniamo Uses Permission

Infine selezioniamo android.permission.BLUETOOTH e salviamo il file

BluetoothAdapter

L’oggetto che consente di interfacciarsi con il modulo bluetooth del telefono è BluetoothAdapter.

Possiamo ottenere l’instanza di default tramite il metodo statico getDefaultAdapter():

mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

Se il telefono non ha il modulo bluetooth, il metodo restituisce null; in questo caso possiamo visualizzare un messaggio di errore (Toast) e chiudere l’applicazione:

Toast.makeText(this, "This app requires a bluetooth capable phone", Toast.LENGTH_SHORT).show();
finish();

Dobbiamo quindi verificare che il modulo bluetooth sia abilitato, tramite il metodo isEnabled():

mBluetoothAdapter.isEnabled()

In caso non sia abilitato, possiamo richiederne l’abilitazione tramite una Intent. Definiamo una costante per identificare la nostra richiesta; quindi creiamo una Intent e sottomettiamola al sistema Android:

private final int REQUEST_ENABLE_BT = 1;
[...]
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);

La nostra applicazione viene messa in secondo piano e all’utente appare un popup con la richiesta di abilitare il bluetooth:

Una volta che l’utente ha confermato (o negato) la richiesta di attivazione, viene chiamato il metodo onActivityResult, dove possiamo verificare se la richiesta ha avuto o meno esito positivo:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 if(requestCode == REQUEST_ENABLE_BT)
 if(resultCode == RESULT_OK) listPairedDevices();

Paired devices

In questo primo esempio, andremo ad elencare i dispositivi già accoppiati (paired) al telefono. Un dispositivo bluetooth deve essere infatti accoppiato (eventualmente inserendo una password numerica) prima di poter stabilire la connessione.

Il metodo getBondedDevices() restituisce un Set di oggetti di tipo BluetoothDevice:

Set pairedDevices = mBluetoothAdapter.getBondedDevices();

Ogni dispositivo bluetooth ha un nome e un indirizzo (univoco); possiamo visualizzare in una TextArea i dati dei dispositivi accoppiati con un loop:

for(BluetoothDevice pairedDevice : pairedDevices) {
 textView2.append(Html.fromHtml("<strong>" + pairedDevice.getName() + "</strong>"));
 textView2.append(" (" + pairedDevice.getAddress() + ")\n");
}

Ecco l’applicazione in esecuzione:

Next

Nella prossima parte di questo tutorial vedremo come effettuare lo scan e il pairing di nuovi dispositivi…

]]>
http://www.lucadentella.it/2014/03/11/android-e-bluetooth-1/feed/ 1
Yún – Sketch Uploader http://www.lucadentella.it/2014/02/10/yun-sketch-uploader/?utm_source=rss&utm_medium=rss&utm_campaign=yun-sketch-uploader http://www.lucadentella.it/2014/02/10/yun-sketch-uploader/#comments Mon, 10 Feb 2014 20:52:43 +0000 luca http://www.lucadentella.it/?p=2672 Una delle caratteristiche più comode di Arduino Yun è la possibilità di caricare sketch via rete, direttamente dall’IDE (come vi ho mostrato in un precedente tutorial). L’IDE di Arduino utilizza il protocollo Bonjour (porta UDP 5353) per cercare le schede Yun presenti in rete: questa modalità di auto-discovery funziona bene in rete locale ma non su Internet.

Il progetto di oggi vi consente di fare l’upload di un nuovo sketch tramite una pagina web protetta, facilmente accessibile anche via Internet.

Descrizione

Il processo di upload di un nuovo sketch effettuato dall’IDE è il seguente (grazie alle spiegazioni di Federico Fissore sul forum):

  • copia (via SCP) la versione compilata (.hex) dello sketch su Arduino Yun
  • aggiunge il bootloader (comando merge-sketch-with-bootloader.lua)
  • programma il microcontrollore ATMega32u4 (comando run-avrdude)

Ho sviluppato una applicazione in PHP che effettua le operazioni sopra elencate; per questioni di sicurezza l’applicazione è protetta da password (la stessa utilizzata per accedere a Yun via SSH o per l’upload via IDE).

Ringraziamenti

Per prima cosa mi fa piacere ringraziare:

Prerequisiti

La parte server di Yun Sketch Uploader è sviluppata in PHP: perché possa essere eseguita da Linino è necessaria l’installazione di alcuni pacchetti; installazione che può essere fatta tramite la WebGUI o via terminale.

Per prima cosa ricordatevi di aggiornare l’elenco dei pacchetti disponibili:

opkg update

quindi installiamo php5 e il modulo CGI per l’utilizzo dal webserver uHttpd:

opkg install php5 php5-cgi

sono necessari anche alcuni moduli aggiuntivi:

opkg install php5-mod-json php5-mod-hash php5-mod-session

Infine configuriamo uHttpd come spiegato qui.

Installazione

I files che compongono il progetto sono disponibili nel mio repository Github.

Utilizziamo il pulsante Download ZIP per scaricarli in un unico archivio:

Estraiamo l’archivio in una cartella sul nostro disco fisso (es. sul disco C). Spostiamo quindi la cartella sulla scheda SD, nel percorso arduino\www e rinominiamola in sketchUploader:

Inseriamo la scheda SD nel nostro Yun e proviamo a collegarci all’indirizzo http://yun_ip/sd/sketchUploader/

Se l’installazione ha avuto successo, dovrebbe apparire la maschera di login di sketchUploader:

Nella prossima pagina vedremo come utilizzarlo…

]]>
http://www.lucadentella.it/2014/02/10/yun-sketch-uploader/feed/ 2
Yún – Factory reset per Linino http://www.lucadentella.it/2014/02/03/yun-factory-reset-per-linino/?utm_source=rss&utm_medium=rss&utm_campaign=yun-factory-reset-per-linino http://www.lucadentella.it/2014/02/03/yun-factory-reset-per-linino/#comments Mon, 03 Feb 2014 21:50:10 +0000 luca http://www.lucadentella.it/?p=2685 Come ormai sapete, Arduino Yun esegue una distribuzione Linux chiamata Linino. A volte può essere necessario eseguire un factory reset di tale distribuzione, ovvero tornare all’immagine base di una scheda appena acquistata.

La procedura illustrata può servire anche per aggiornare Linino ad una versione più recente anche se al momento in cui scrivo questo post l’unica versione disponibile è la 1.0

Procedura

Scarichiamo l’immagine di Linino dal sito web di Arduino:

L’immagine è in formato ZIP, estraiamo il contenuto (un file binario .BIN) sul disco fisso del nostro computer:

Copiamo il file .BIN nella root di una scheda SD, quindi inseriamo la scheda nel nostro Yun.

Accediamo al pannello web di Arduino e inseriamo la password (quella di default è arduino). Scorrendo la pagina principale, ci verrà indicato che l’immagine è stata rilevata e che è possibile operare un reset:

Confermiamo quindi di voler procedere al reset:

Il LED WLAN di Yun (colore blu) lampeggerà durante il processo…

Al termine, la nostra scheda Yun sarà come appena tolta dalla scatola!

]]>
http://www.lucadentella.it/2014/02/03/yun-factory-reset-per-linino/feed/ 0
My3dP: eppur si muove! http://www.lucadentella.it/2014/01/27/my3dp-eppur-si-muove/?utm_source=rss&utm_medium=rss&utm_campaign=my3dp-eppur-si-muove http://www.lucadentella.it/2014/01/27/my3dp-eppur-si-muove/#comments Mon, 27 Jan 2014 20:57:17 +0000 luca http://www.lucadentella.it/?p=2667 Questo weekend ho avuto finalmente tempo di completare il setup della mia stampante 3d.

Per prima cosa ho sostituito l’estrusore – rotto durante il montaggio – con un nuovo arrivato da MakerFarm:

Dopo aver regolato i microswitch che fanno da fine corsa, ho potuto far muovere la stampante!

]]>
http://www.lucadentella.it/2014/01/27/my3dp-eppur-si-muove/feed/ 0
App Inventor v2 http://www.lucadentella.it/2013/12/23/app-inventor-v2/?utm_source=rss&utm_medium=rss&utm_campaign=app-inventor-v2 http://www.lucadentella.it/2013/12/23/app-inventor-v2/#comments Mon, 23 Dec 2013 07:34:46 +0000 luca http://www.lucadentella.it/?p=2655 L’M.I.T. (Massachusetts Institute of Technology) ha da poco reso disponibile la versione 2 di App Inventor, strumento per la realizzazione di applicazioni Android.

Il sito ufficiale dell’applicazione è http://appinventor.mit.edu/

App Inventor consente, in maniera grafica, di realizzare sia l’interfaccia dell’applicazione, sia la sua logica. In particolare ho molto apprezzato la facilità con cui – utilizzando blocchi logici – è possibile sviluppare applicazioni anche complesse:

La novità più importante della versione 2 è che App Inventor ora è completamente browser-based, ovvero viene eseguito all’interno del browser, senza richiedere alcuna installazione:

]]>
http://www.lucadentella.it/2013/12/23/app-inventor-v2/feed/ 0
enc28J60 e Arduino (17) http://www.lucadentella.it/2013/12/19/enc28j60-e-arduino-17/?utm_source=rss&utm_medium=rss&utm_campaign=enc28j60-e-arduino-17 http://www.lucadentella.it/2013/12/19/enc28j60-e-arduino-17/#comments Thu, 19 Dec 2013 09:35:31 +0000 luca http://www.lucadentella.it/?p=2630 In alcuni tutorial precedenti, avete già imparato a realizzare semplici pagine web per comandare a distanza led, relay… oggi vi mostrerò come rendere queste pagine sicure grazie ad una password.

Form web

La pagina web pubblicata da Arduino contiene una semplice form, composta da due pulsanti e da un campo di input per la password:

Alla pressione del pulsante, viene inviato ad Arduino un comando POST contenente – oltre ad informazioni del browser – i dati della form:

Dallo screenshot si può notare come i dati siano concatenati dal carattere & e il valore del campo password sia specificato dopo l’etichetta pwd=.

Sketch

Il codice in esecuzione su Arduino (lo trovate nel repository Github), alla ricezione di una nuova richiesta, esegue le seguenti operazioni:

  • verifica se la richiesta è di tipo POST
  • in questo caso, estrae dalla richiesta il valore della password e la confronta con quella memorizzata
  • se la password è corretta, estrae dalla richiesta il pulsante (ON|OFF) premuto
  • modifica lo stato dell’uscita
  • restituisce la pagina HTML

Vediamolo nel dettaglio:

char* led_password = "SesamE";

la password è inserita hardcoded nello sketch, di default sarà SesamE

pinMode(led_pin, OUTPUT);
digitalWrite(led_pin, LOW);
led_status = false;

all’interno del setup() avviene l’inizializzazione del PIN e dello stato dell’uscita (di default spenta)

if(strstr((char *)Ethernet::buffer + pos, "POST /") != 0) {

lo sketch verifica – tramite la funzione strstr() – se il pacchetto ricevuto contiene il comando POST /

char* password_position = strstr((char *)Ethernet::buffer + pos, "&amp;pwd=");
if(password_position != 0) {
  strcpy(password, password_position + 5);
  if(strcmp(password, led_password) == 0) Serial.println("Valid password :)");

lo sketch cerca la stringa &pwd= nel pacchetto; se la trova estrae la password e la memorizza nella variabile password. Le due password sono quindi confrontate

if(strstr((char *)Ethernet::buffer + pos, "OFF=") != 0) {
digitalWrite(led_pin, LOW);
led_status = false;

se la password è corretta e il pacchetto contiene il comando OFF=, l’uscita viene spenta. Lo stesso controllo avviene per il comando ON=

if(led_status == true) bfill.emit_p(PSTR(
[...]

infine viene generata la pagina HTML, resa dinamica da due if:

  • in base allo stato dell’uscita, uno dei due pulsanti viene disabilitato (aggiungendo l’attributo disabled)
  • se la password non è corretta, viene visualizzato un messaggio di errore

Funzionamento

Ecco due screenshot relativi all’inserimento di una password valida e una sbagliata:

]]>
http://www.lucadentella.it/2013/12/19/enc28j60-e-arduino-17/feed/ 8
Eagle – Nomi dei pins http://www.lucadentella.it/2013/12/16/eagle-nomi-dei-pins/?utm_source=rss&utm_medium=rss&utm_campaign=eagle-nomi-dei-pins http://www.lucadentella.it/2013/12/16/eagle-nomi-dei-pins/#comments Mon, 16 Dec 2013 12:58:27 +0000 luca http://www.lucadentella.it/?p=2643 Nel realizzare un nuovo componente in Eagle, mi sono accorto che venivano visualizzati sia i nomi dei pin (configurati nel simbolo del componente), sia quelli dei pad (configurati nel package):

Quando si aggiunge un pin nel symbol editor, è possibile scegliere quale nome sarà visualizzato (nessuno, nome del pad, nome del pin, entrambi) tramite la barra dei pulsanti:

Se il pin è già stato aggiunto, si può modificare questo parametro tramite il pulsante Change:

]]>
http://www.lucadentella.it/2013/12/16/eagle-nomi-dei-pins/feed/ 0
Giochiamo con una striscia di led… (2) http://www.lucadentella.it/2013/12/13/giochiamo-con-una-striscia-di-led-2/?utm_source=rss&utm_medium=rss&utm_campaign=giochiamo-con-una-striscia-di-led-2 http://www.lucadentella.it/2013/12/13/giochiamo-con-una-striscia-di-led-2/#comments Fri, 13 Dec 2013 11:23:37 +0000 luca http://www.lucadentella.it/?p=2595 Dopo aver introdotto, in un precedente articolo, le strisce di led e avervi illustrato come controllare una striscia digitale, vediamo oggi un semplice progetto che nasce da una richiesta di un amico: far lampeggiare una striscia di led ad una frequenza variabile.

Cosa mi serve

Vista la semplicità del progetto, ho deciso di realizzarlo su una breadboard, usando i seguenti componenti:

  • un Arduino Mini Pro
  • un potenziometro da 4.7Kohm
  • un transistor MOSFET STP16NF06 (datasheet)
  • una striscia di led a 12V e il relativo alimentatore

Collegamenti

I vari elementi del progetto vanno collegati secondo questo schema:

Arduino

Lo sketch Arduino è disponibile nel mio repository su Github.

Vediamo il suo funzionamento:

#define ledPin        13
#define stripPin      2
#define analogInPin   A0

Per prima cosa definiamo alcune costanti: i PIN a cui sono collegati il led (on board), la striscia di led e il potenziometro (usiamo un PIN analogico per leggere il suo valore).

int outState = LOW;
long previousMillis = 0;
long interval = 1000;

Quindi inizializziamo le variabili che mantengono lo stato dell’uscita, il tempo trascorso e la frequenza di lampeggio (inizialmente di 1 secondo).

pinMode(ledPin, OUTPUT);
pinMode(stripPin, OUTPUT);

All’interno del setup(), configuriamo come OUTPUT i PIN a cui sono collegati led e striscia.

int potValue = analogRead(analogInPin);
interval = map(potValue, 0, 1023, 50, 2000);

Nel loop principale leggiamo il valore del potenziometro (tra 0 e 1023) e scaliamo tale valore, attraverso la funzione map, nell’intervallo 50-2000. Questo consente di regolare il periodo di lampeggio tra 50 e 2000ms.

if(currentMillis - previousMillis &gt; interval) {

Se è trascorso un intervallo di tempo…

if (outState == LOW) outState = HIGH;
else outState = LOW;

… invertiamo lo stato dell’uscita…

digitalWrite(ledPin, outState);
digitalWrite(stripPin, outState);

… e accendiamo/spegnamo led e striscia.

Demo

Breve filmato che illustra il funzionamento dello sketch:

]]>
http://www.lucadentella.it/2013/12/13/giochiamo-con-una-striscia-di-led-2/feed/ 2
Olimex userà KiCad per le nuove schede OSHW http://www.lucadentella.it/2013/12/12/olimex-usera-kicad-per-le-nuove-schede-oshw/?utm_source=rss&utm_medium=rss&utm_campaign=olimex-usera-kicad-per-le-nuove-schede-oshw http://www.lucadentella.it/2013/12/12/olimex-usera-kicad-per-le-nuove-schede-oshw/#comments Thu, 12 Dec 2013 09:43:00 +0000 luca http://www.lucadentella.it/?p=2620 In un post di qualche giorno fa, Olimex ha annunciato l’intenzione di passare a KiCad per realizzare le nuove board secondo i principi OSHW (OpenSource HardWare).

Come molti produttori e hobbisti, Olimex attualmente utilizza Eagle come strumento EDA. Il post riassume le principali limitazioni nel licensing di tale software e i criteri di scelta che hanno portato alla decisione di usare KiCad.

Sicuramente una scelta importante e che potrà dare maggiore visibilità a questo strumento open-source per la realizzazione di schemi e circuiti stampati… voi che ne pensate? Avete già provato ad utilizzare KiCad per i vostri progetti?

]]>
http://www.lucadentella.it/2013/12/12/olimex-usera-kicad-per-le-nuove-schede-oshw/feed/ 3