lunedì 23 dicembre 2013

Domotica in mezzora: dimmerare un led dall'ipad via wifi (NetIO app) - parte 2

L'app NetIO su iPad non necessita praticamente di alcuna configurazione. 
E' necessario esclusivamente utilizzare lo stesso account usato sul sito http://netio.davideickhoff.de/editor per poter caricare l'interfaccia disegnata con il designer UI.
Appena lanciata l'applicazione è sufficiente "scrollare" l'iPad per aprire il menu di gestione. In alternativa è possibile fare uno swipe a 2 dita dal basso verso l'alto, tecnica sconsigliata perchè è davvero facile che l'iPad interpreti il comando mostrando il menu rapido di iPad introdotto con iOS7.



dopo aver inserito le credenziali, appariranno i layout salvati online.
Il file di configurazione in formato json può essere salvato dal web tramite il pulsante Download.
Questo il mio layout mostrato nel post precedente:

{
 "name": "test1",
 "connections": [
  {
   "host": "192.168.5.50",
   "port": 2560,
   "name": "board",
   "initialsend": "Local"
  }
 ],
 "version": 1.3,
 "device": "iPad",
 "type": "NetIOConfiguration",
 "pages": [
  {
   "sound": "active",
   "name": "Arduino",
   "items": [
    {
     "comment": "Fire light ON button",
     "sends": [
      "LED9 on"
     ],
     "top": 20,
     "height": 80,
     "width": 160,
     "shape": "rounded",
     "left": 20,
     "type": "button",
     "icon": "lamp_on",
     "interval": 2000
    },
    {
     "comment": "Fire light OFF button",
     "sends": [
      "LED9 off"
     ],
     "top": 110,
     "height": 80,
     "width": 160,
     "shape": "rounded",
     "left": 20,
     "label": "",
     "type": "button",
     "icon": "lamp_off"
    },
    {
     "comment": "Fire lights slider",
     "minValue": 0,
     "textcolor": "0,0,0",
     "sends": "set brightness {value}",
     "parseResponse": "\\d+",
     "top": 300,
     "maxValue": 255,
     "height": 450,
     "width": 30,
     "reads": "get brightness",
     "showValue": true,
     "type": "slider",
     "left": 20
    },
    {
     "offSend": "LED9 off",
     "parseResponse": "\\d+",
     "top": 200,
     "offText": "Off",
     "height": 50,
     "width": 100,
     "reads": "LED9 status",
     "onValue": "1",
     "onText": "On",
     "onSend": "LED9 on",
     "type": "switch",
     "formatResponse": "{0}",
     "left": 20
    }
   ],
   "label": "Home",
   "width": 1024,
   "connection": "board",
   "background": "NetIOTest iPadbackground.png",
   "sounds": "keyboardsetting",
   "height": 768
  }
 ],
 "orientation": "landscape",
 "navigation": "fix",
 "pagebuttonwidth": "static"
}


Dopo il caricamento i comandi saranno subito operativi, a patto che il vostro server arduino risponda correttamente via rete. In caso di comunicazione non possibile, tutti i controlli della vostra interfaccia rimarranno inesorabilmente in stato disabilitato e quindi di colore grigio.


Purtroppo non ho trovato il modo per gestire dinamicamente l'indirizzo direttamente dall'iPad, per modificare l'indirizzo del server è necessario modificare l'oggetto Connection da Designer UI e poi ricaricare il layout sull'iPad. Un'altra cosa su cui stare attenti è che non è sufficiente uscire e rientrare in NetIO per veder caricata la nuova versione dell'interfaccia, ma è necessario aprire il menu, aggiornare (tasto con le frecce) e ricliccare sull'interfaccia da caricare.

Test del sistema

Per effettuare il test del sistema agite sui bottoni:
i due pulsanti in alto permetteranno di accendere e spegnere il led. L'interruttore farà esattamente la stessa cosa. Lo slider rappresenta la funzione più interessante perchè ci permetterà di dimmerare, ovvero accendere parzialmente il led, modificandone la luminosità proporzionalmente alla posizione dello slider. Se torniamo al codice del post precedente, si può notare come semplicemente il valore dello slider viene letto come valore nel range 0-255, che viene poi inviato alla porta 9 come valore analogico, e quindi come segnale pwm.



sabato 21 dicembre 2013

Domotica in mezzora: dimmerare un led dall'ipad via wifi (NetIO app) - parte 1

Un piccolo esempio di domotica: voglio controllare l'accensione/spegnimento e luminosità di un led pilotato da Arduino, tramite iPad in rete wifi.
Potrebbe essere l'esempio per un sistema base per il controllo delle luci in un ambiente o per altre periferiche tipiche dei sistemi domotici (porte, finestre, climatizzatore, ecc).
L'esempio è molto semplice e non richiede la programmazione su iPad. Infatti la programmazione in ambiente iOS richieste conoscenze specifiche e l'ambiente XCode. Al di là della difficoltà di approcciare a un ambiente IDE diverso da quello di Arduino, anche presupponendo di saper programmare in objC in ambiente XCode, è richiesto un certificato per sviluppatori per poter installare l'app creata sul proprio device, senza questo è possibile unicamente utilizzare l'emulatore sul Mac.
Per riuscire in mezzora a creare una app utilizzabile da tutti senza scrivere mezza riga di codice, utilizzerò l'app NetIO disponibile in AppStore a questo indirizzo https://itunes.apple.com/it/app/netio/id464924297?mt=8 . Il costo è modesto, meno di 7 euro, e considerato i risultati che permette di ottenere in pochissimi minuti la consiglio caldamente.



domenica 8 dicembre 2013

Rilevatore presenze - parte 3 - il codice (client)

Il codice di controllo è molto banale, astraendoci dal funzionamento delle singole librerie.
Vediamo brevemente il controllo delle periferiche:

Buzzer

è basato su un'unico pin. Il buzzer si attiva inviando lo stato HIGH all'uscita. Per ottenerere un beep udibile è sufficiente un impulso di qualche decina di millisecondi. 

const int chipBuzzerPin =2; 

void beep()
{
   digitalWrite(2, HIGH);
   delay(120);   
   digitalWrite(2, LOW);
   delay(120);   
}

void beepLong()
{
   digitalWrite(2, HIGH);
   delay(2000);   
   digitalWrite(2, LOW);
   delay(120);   
}

void setupBuzzer()
{
  pinMode(chipBuzzerPin,OUTPUT);    
  digitalWrite(chipBuzzerPin, LOW);    
}

venerdì 6 dicembre 2013

Self Balancing Robot - parte 9 - assemblaggio del robot

Eccoci arrivati ai dettagli dell'assemblaggio del robot.
Non sono richieste abilità particolari, a parte l'uso del saldatore basta un minimo di attitudine al bricolage.

La lista completa (o quasi) delle componenti è questa, con l'indicazione del prezzo.

domenica 1 dicembre 2013

Self Balancing Robot - parte 8 - calcolare l'angolo di inclinazione

Per determinare l'angolo di inclinazione del robot è necessario disporre di una IMU (Inertial Misurement Unit). Ci sono molti tipi di imu in commercio. Quella che serve per questo tipo di progetto è una imu composta da un accelerometro e da un giroscopio. Nel mio caso ho utilizzato una imu un po' più complessa, dotata anche di una bussola, che però è rimasta inutilizzata. Tali apparati restituiscono 3 misure, una per ogni asse X,Y, Z. La MiniIMU-9 v2 della Pololu che ho utilizzato, avendo anche la bussola, restituisce quindi in tutto 9 valori. I dati provenienti dall'accelerometro e dal giroscopio in genere sono troppo grezzi per poter essere utilizzati così come sono per determinare l'angolo che misurano. Il fatto è che ne l'accelerometro ne il giroscopio misurano un angolo, bensì entità diverse quale l'accelerazione  lungo gli assi e la velocità angolare, dati che, tramite una elaborazione possono determinare l'angolo di rotazione dell'oggetto. Nel caso del mio robot, dato che si suppone che possa ruotare solo su un'unico asse, quello delle ruote, i dati necessari per la determinazione della rotazione sono in realtà solo 3: l'accelerazione su i due assi X e Z, e la velocità angolare sull'asse Y. Ottenere da questi 3 valori un angolo necessità di due passaggi: il primo è relativamente semplice, un po' di trigonometria permette di determinare l'angolo partendo dall'accelerazione su X e Z, con la stessa semplicità si calcola l'angolo restituito dal giroscopio. Il problema però è un'altro: entrambi questi strumenti di misura soffrono per così dire di alcuni difetti congeniti:
- l'accelerometro soffre di nervosismo acuto, cioè restituisce un dato che è inficiato dalla minima vibrazione, per cui oltre a misurare l'accelerazione dovuta alla rotazione del robot, "sporca" la misura con tutte le vibrazioni dovute ai motori, alle imperfezioni della superficie su cui il robot si muove, ecc.
- il giroscopio soffre di deriva. Ovvero, a forza di girare aggiunge alla misura un errore ad ogni lettura. Inoltre, non misurando un angolo ma una velocità di rotazione, il suo riferimento iniziale non necessariamente corrisponde alla posizione di equilibrio, determinando di fatto un offset della misura che va ovviamente considerato runtime e non può essere predeterminato.

Self Balancing Robot - parte 7 - altri progetti di self balancing e approfondimenti

Prima di iniziare a capire come misurare l'angolo di inclinazione, vorrei soffermarmi su alcuni link che sono stati essenziali per capire la materia, anche come ringraziamento su chi in maniera totalmente gratuita ha pubblicato la propria esperienza.