Innovactive Multi Sensor per Windows 7 Sensor API

February 16, 2010 13:33 by L.Maiorfi

Sulla scia del fermento intorno alla nuova runtime per l’interfacciamento con dispositivi a sensore introdotta in Windows 7, abbiamo realizzato un dispositivo “end-to-end” che permette al sistema operativo di utilizzare un accelerometro a 3 assi (l’ADXL-330, reso famoso dai controller della Wii, che ne hanno accelerato, senza giochi di parole, la diffusione) come periferica di tipo “sensore”, come illustrato nell’immagine che segue, in cui è mostrato il dispositivo all’interno del Device Manager di Windows:

image

Chi ha già dato un’occhiata alle Sensor API, avrà notato che Microsoft ha già classificato in categorie i sensori previsti (di movimento, biometrici, elettrici, ecc.) e per molti di essi è stato già fatto un tentativo di standardizzazione in termini di struttura dei dati esposti. Nel realizzare il nostro dispositivo ci siamo pertanto attenuti a tale categorizzazione, con l’intento di far funzionare il tutto senza toccare neanche una riga del client realizzato per l’hardware “ufficiale” che ha accompagnato già dalle prime dimostrazioni la SensorAPI di Windows 7, ossia la scheda della Freescale, con l’indubbio valore aggiunto però di funzionare in maniera completamente wireless!

Tale compatibilità “binaria”, oltre a richiedere che il dispositivo sia “decorato” dagli appositi metadati, ha imposto anche uno “shaping” dei dati ben preciso, attraverso l’inclusione all’interno di un contenitore (denominato “report”) in verità di per se’ molto poco tipizzato. Nel caso del nostro dispositivo, ad esempio, un sensore di movimento a tre assi ha richiesto che il report fosse costituito da un Dictionary contenente una coppia chiave-valore in cui la chiave fosse rappresentata da un ben preciso guid ed il valore da una lista di tre valori decimali (relativi alle componenti dell’accelerazione misurata in ciascuno dei tre assi).

Oltre alla realizzazione “fisica” della scheda, il dispositivo ha richiesto ovviamente la realizzazione di un apposito driver, in questo caso rappresentato da una dll (il driver in questione è infatti un UMDF e non un driver kernel, appoggiandosi in gran parte ad un’infrastruttura basata su architettura COM) compilata tramite il compilatore C++ contenuto nel WinDDK, l’SDK che Microsoft mette a disposizione per lo sviluppo di device driver. Il driver in questione (la scrittura del quale ha rappresentato effettivamente la parte più “rognosa” dello sviluppo del prototipo) viene installato in Windows 7 mediante un tool (devcon.exe) che, per tramite di un altro componente di supporto (il cosiddetto “CoInstaller”) ed un file .inf (analogo a quello di una qualsiasi altro device driver), registra effettivamente il nuovo dispositivo nel sistema.

Una volta registrato, il dispositivo diventa quindi disponibile per tutte le applicazioni, indipendentemente dal fatto che questo ad esempio utilizzi “risorse” tipicamente ad uso esclusivo da parte di un solo processo (come una porta seriale, ad esempio). Nel Pannello di Controllo il dispositivo viene reso effettivamente visibile attraverso la spunta del checkbox di attivazione, come illustrato nell’immagine seguente:

image

Lo screenshot sottostante mostra più istanze dello stesso client (puramente diagnostico, in questo caso) collegate alla medesima fonte dati costituita dal dispositivo in questione. L’interfaccia del client mostra sinteticamente l’accelerazione misurata su ciascuno degli assi (come riferimento, ogni “tick” rappresenta circa 0.5 G di accelerazione):

IAEMultiSensor

Il dispositivo (prototipale) ospiterà presto altri sensori (il che spiega il nome, dopo tutto), ma per il momento si presenta così:

IAEMultiSensor2_small

A questo punto non ci rimane che trovare un utilizzo plausibile per un dispositivo potenzialmente in grado di comunicare ad esempio la propria inclinazione al nostro PC a 1.6 km di distanza…un cucchiaione da paiolo remotizzato che dall’interno dell’auto ci permette di girare la polenta sui fornelli durante tutto il tragitto tra ufficio e casa?


Currently rated 4.5 by 2 people

  • Currently 4.5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Applicazioni .NET MicroFramework? il MicroGardener!

February 2, 2010 13:06 by g.ruta

Chi ha partecipato all’evento DotNetUmbria che Innovactive ha organizzato lo scorso 15 Gennaio ricorda che una delle applicazioni più complete che abbiamo presentato (.NET MicroFramework ‘onboard’) consiste in una serra domestica il cui microclima può essere impostato a distanza, controllando parametri quali la temperatura, la luminosità e l’umidità del terreno.
In questi giorni abbiamo continuato a lavorare sul nostro prototipo portandolo a rappresentare, a nostro avviso, un sistema completo di monitoraggio remoto della serra; con questo post pertanto, a vantaggio di tutti, presentiamo schematicamente e illustriamo la soluzione completa, lo stato dell’arte del nostro MicroGardener.

MicroGardenerSchema

Come potete osservare nello schema sopra riportato la serra è dotata di sensori per rilevare costantemente il grado di umidità del terreno, la temperatura in prossimità delle piante e la luminosità ambientale. Tali dati vengono trasmessi wireless ad un modulo Tahoe (una scheda di sviluppo, tra le prime sul mercato che ci ha consentito di programmare e sperimentare con il MicroFramework) grazie ad una coppia di moduli XBee. Molto ci sarebbe da dire su questi dispositivi, ma allo scopo del nostro post basta dire che utilizziamo la ‘API Mode’ per configurare il modulo posto presso la serra come dispositivo che autonomamente trasmette i dati letti dai sensori e occasionalmente riceve un comando di attivazione/disattivazione di un attuatore, mentre il modulo posto presso la scheda di sviluppo Tahoe è in grado, grazie alla libreria Micro Framework Toolkit (http://mftoolkit.codeplex.com/) di interpretare lo stack XBee per le due situazioni di ricezione dei dati dei sensori e di invio dei comandi di attuazione.
Il dispositivo che abbiamo presentato nell’ambito del citato evento si fermava appunto al modulo Tahoe, che è dotato di un display LCD e di una serie di tasti per l’interazione con l’utente; il programma MicroFramework realizzato consente di leggere i valori che giungono dai sensori, visualizzarne graficamente l’andamento nel tempo e agire con i comandi sui singoli attuatori (una lampada per la luminosità, una lampada ad infrarossi per la temperatura e la pompa per l’irrigazione del terreno) oppure selezionando una modalità automatica, nella quale il software provvede al mantenimento dei parametri entro i range impostati per il microclima voluto, azionando in totale autonomia gli attuatori.
Un sistema come quello fin qui presentato, ovviamente, si limita a remotizzare il controllo della serra su distanze compatibili con la portata dei moduli XBee e può essere pensato comunque per l’applicazione domestica (o di vivaio) comunque locale. Come rendere il tutto veramente delocalizzato? Utilizzando il web, ovviamente!
Ecco in quale direzione abbiamo esteso il sistema: utilizzando come server web un modulo aggiuntivo ethernet per il Tahoe (prodotto, come il Tahoe, da Device Solutions; oggi nel loro catalogo si trova il modulo Tahoe-II, che già implementa funzionalità ethernet) abbiamo implementato una API REST che espone quanto ci serve per interagire con la serra in termini di lettura dati e impartizione dei comandi; un servizio WCF si occupa di interrogare periodicamente (polling) il server web per tenersi in memoria i dati dei sensori aggiornati; a questo punto sul web abbiamo pensato la possibilità per l’utente di poter controllare la serra con un semplice browser e, per rendere il tutto un po’ più accattivante, un client Silverlight.
I vantaggi di questa architettura sono molteplici in termini di scalabilità e di prestazioni: infatti pensando al servizio in rete locale con il modulo Tahoe l’attività di polling non viene effettuata su web; poi il tutto può essere implementato per più serre, ovvero per molti sistemi serra + XBee + Modulo MicroFramework; in fase di configurazione del servizio WCF impostiamo quali serre gestire (essenzialmente quali indirizzi interrogare con chiamate REST) e, all’atto di chiamata del servizio da parte di un client, il servizio fornirà all’utente la lista delle serre controllate per operare una scelta.
Completa il tutto un sottosistema che renderà felici gli scettici da una parte (se non vedo non credo!) e coloro che comunque vogliono gustarsi anche ‘a vista’ le loro piante o fiori: abbiamo munito la serra di webcam e instradato il segnale proveniente da essa tramite Microsoft Expression Encoder, esponendolo in streaming su server apposito; il client silverlight è stato munito dell’apposito controllo per la fruizione del flusso video in streaming e…
…eccovi il risultato finale!

MicroGardenerClient

Per vedere il sistema funzionante (con la sola avvertenza che attualmente la pompa per l’irrigazione è sostituita da una semplice lampadina per motivi di sicurezza) e provare ‘live’ a controllare la nostra piccola serra collegatevi alla dashboard di test, quindi selezionate ‘Innovactive Garden’ e cliccate su ‘Connect’…
…solo per utenti con il ‘pollice verde’!


Currently rated 5.0 by 2 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Develop Reality 2010 – Feedback dei partecipanti

January 18, 2010 12:14 by L.Maiorfi

Dopo una ‘onerosa’ elaborazione statistica eccovi tre grafici che sintetizzano i pareri che i partecipanti hanno dato in merito a vari aspetti dell’evento.
Ogni parere richiesto doveva essere espresso su una scala da 0 a 5; per ogni aspetto abbiamo riportato il valore medio su tutti i questionari compilati e il valore della deviazione standard dal valore medio. Noi stiamo già facendo le nostre considerazioni, e voi?

 GraficoEvento

GraficoEsperimenti

GraficoApplications


Currently rated 5.0 by 2 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Develop Reality 2010 – Debriefing e qualche foto…

January 17, 2010 12:44 by L.Maiorfi

Iniziando con un doveroso ringraziamento a tutti i partecipanti e a tutti coloro che hanno reso possibile questo evento, pubblico qualche foto a beneficio di chi non c'era (perdonato solo se impossibilitato a venire da cause di forza molto maggiore) e con l'occasione cerco di sintetizzare quelle che secondo la mia personale percezione sono le impressioni emerse intorno a questa iniziativa:

  • I nostri timori di essere i soli sulla terra cui interessi l'argomento dello sviluppo di software .NET che interagisca con il mondo reale sono svaniti
  • Il fermento dei partecipanti si è effettivamente diviso tra chi è più affascinato dalla possibilità di realizzare software per PC che interagisca con il mondo esterno e chi invece è più attratto dallo sviluppo di software .NET finalizzato ad essere eseguito direttamente su dispositivi embedded (tramite .NET MicroFramework)
  • Il feedback che abbiamo ricevuto ci ha dimostrato che in molti pensano come noi che studiare le metodologie e le tecnologie relative allo sviluppo di un'applicazione embedded (pura o ibrida che sia) aiuti ad essere degli sviluppatori migliori e dei professionisti più completi
  • La robotica piace più della domotica (anche se probabilmente in assoluto la prima fatturerà un milionesimo della seconda)
  • Il cruscottone WPF che mostrava in real-time i dati provenienti dai sensori è piaciuto probabilmente più della mini-serra automatica remotizzata programmabile con .NET, nonostante quest'ultima abbia richiesto almeno il decuplo in termini di ore/uomo
  • La maggioranza dei partecipanti avrebbe voluto vedere probabilmente più codice ed è per questo che spero che i nostri prossimi post tecnici di "dissecting" di quanto visto all'evento siano letti, commentati e, perché no, diventino lo spunto per proporre soluzioni, progetti ed iniziative che alimentino la passione dei membri della community su questi temi

Basta chiacchiere, ecco alcune foto:

Una sala immensa per dei dispositivi piccolissimi Lorenzo e Gianluca farfugliano insidiati dal trombettista alle loro spalle

 Hello LED in action! No, non è il tavolo del coffee break...è quello delle demo!


Currently rated 5.0 by 2 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Develop Reality 2010, prende forma la realtà

January 7, 2010 12:21 by L.Maiorfi

Come già anticipato con qualche immagine da Fabrizio qualche giorno fa, i preparativi per i "giocattoli hardware" da mostrare al Develop Reality 2010 in programma la settimana prossima.

Ecco qualche altro scatto di quello che (tempo permettendo) vedremo venerdì 15 come esempi di possibili realizzazioni:

camera_car2 001 camera_car 005

livorno 005 linefollowing 007

IMG_0201 IMG_0202

Non resta che venire per vedere tutto il resto :D

Ecco il link diretto alla pagina per la registrazione!


Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Sviluppare software per microcontrollori: da dove iniziare?

February 22, 2009 11:14 by L.Maiorfi

Per chi come noi si è affacciato relativamente di recente a qualche timida sperimentazione nel campo dell’embedded computing, le maggiori difficoltà sono state, come accade spesso, quelle relative al reperimento di ciò che serve per muovere i primi passi. Anche se ovviamente non c’è mai semplicemente il modo “giusto” di iniziare, quella che segue è una sorta di checklist che ci ha permesso di diventare operativi, partendo veramente da zero, in un paio d’ore.

Prima di tutto, però, cerchiamo di fissare qualche concetto utile a chi proviene come noi dallo sviluppo software per PC:

  • i microcontrollori sono microprocessori con spiccate funzionalità I/O built-in
  • il software per microcontrollori viene spesso chiamato firmware, ad indicare che si tratta tipicamente di programmi che accompagnano il dispositivo per tutta la vita già da quando lascia l’azienda che lo ha prodotto
  • i microcontrollori non hanno un sistema operativo all’interno del quale girano diversi task: ogni programma che viene “installato” è l’unico programma in funzione all’interno del processore
  • i programmi per microcontrollore vengono comunemente realizzati attraverso un compilatore che tipicamente permette l’utilizzo di linguaggi a basso livello, quale l’assembly o il C (anche se non mancano esempi di compilatori di linguaggi ad alto livello, quali il BASIC o, come nel caso dei microcontrollori presenti nei moduli compatibili con il .NET Microframework, anche C# o VB.NET)
  • esistono molti, molti diversi modelli di microcontrollore, ciascuno caratterizzato da un costruttore, da una famiglia di appartenenza, da una serie di parametri “quantitativi” (architettura, quantità di memoria, numero di I/O, frequenza di funzionamento, ecc.) e, ovviamente, da un costo: quello che è importante sapere per chi sviluppa software è che ogni modello è incompatibile con i programmi scritti per un altro (!), anche se ragionevolmente i microcontrollori di famiglie “vicine” sono programmabili in maniera piuttosto simile, pur mantenendo una incompatibilità binaria

Ciò premesso, vediamo come realizzare una prima applicazioncina dimostrativa che, seppur nella sua allarmante semplicità, ci permetterà di familiarizzare con alcuni degli elementi tipici del mondo embedded, ed in particolare con la più diffusa ed economica famiglia di microcontrollori esistente sul mercato: i PIC, e più in particolare con la serie 16F, adottata nella stragrande maggioranza degli elettrodomestici grazie al giusto compromesso tra potenza di calcolo, facilità di programmazione e costo.

Prima di iniziare a scrivere codice, procuriamoci:

  1. Un PIC 16F886, disponibile in diversi tipi di “involucro” (detto package), ciascuno caratterizzato da uno specifico numero di “piedini” (detti PIN) e da un diverso layout
  2. Una scheda di sviluppo, a 28 o a 44 pin, che contenga al suo interno, oltre all’ovvio alloggiamento per il PIC, un po’ di elettronica di contorno, tipicamente dedicata alla comunicazione con il mondo esterno (ad esempio per poter essere collegati ad un dispositivo esterno con cui verranno “programmati”, ossia che permetterà di “scrivere” il programma sviluppato nella memoria non volatile interna al PIC stesso), alla alimentazione (3 batterie da 1,5V andranno più che bene per far girare la vostra applicazione per settimane, se non per mesi) e che contenga qualche componente utile alla sperimentazione, quali led, potenziometri, pulsanti e connettori. La scheda più diffusa in questo senso è sicuramente questa qui, che integra al suo interno già un PIC 16F886, un connettore ICSP per poter programmare il PIC senza toglierlo dallo zoccolo, 4 led, un potenziometro, un pulsante, un connettore da 14 pin per una delle 2 file di piedini del PIC e molte “piazzole” forate alle quali poter saldare altri connettori se necessario.
  3. Un programmer, ossia un dispositivo tipicamente collegato da un lato al PC e dall’altro al PIC (o alla scheda di sviluppo, utilizzando il connettore ICSP). Quello che utilizziamo noi è il PIC Kit 2, economico, funzionale e soprattutto dotato di drivers USB/HID che lo rendono utilizzabile senza problemi anche sui PC con Windows Vista (sia 32 che 64 bit). Tra l’altro è disponibile in una confezione che contiene al suo interno già la scheda di sviluppo di cui sopra.
  4. Un compilatore C a scelta tra quello della HI-TECH (disponibile anche in una versione lite gratuita qui e caratterizzato da un IDE molto ben fatto basato su Eclipse) o quello della CCS (indubbiamente superiore ma disponibile, demo a parte, solo a pagamento), che trovate qui
  5. Il software (per PC) di controllo del programmer. Nel caso del PIC Kit 2 il programma (attualmente alla versione 2.55) è contenuto nella confezione e comunque scaricabile nella sezione contenente tutte le informazioni sul prodotto, disponibile a questo link.

Una volta collegato il PIC Kit 2 al PC, installato il programma di controllo e collegata la scheda di sviluppo alla porta ICSP dello stesso PIC Kit 2 la situazione che avrete sarà pressappoco questa (tester a parte):

IMAGE_055

 

Lanciate il programma di controllo del PIC Kit 2 e, se tutto è a posto, questo dovrebbe rilevare la presenza del microcontrollore, come indicato dalla scritta in alto a sinistra (accanto all’etichetta “Device”):

PICKit2

Lanciate il compilatore (utilizzeremo quello della HI-TECH), create un nuovo progetto e nel wizard scegliete il processore 16F886 con package a 28 pin. Appena creato il progetto lanciate il wizard di configurazione (C-Wiz editor) e lasciate che questo crei i file con il codice di inizializzazione del dispositivo.

L’ambiente si presenterà a questo punto più o meno così:

Hi-Tech

Senza addentrarci nei particolari, almeno per questo post, scriviamo nel nostro sorgente main.c il codice seguente:

#include "init.h"    // included by C-Wiz
 
#include <htc.h>
 
void delay_s(float s);
void init_a2d(void);
unsigned int read_a2d(unsigned int channel);
 
void main(void)
{
    init();    // Function call inserted by C-Wiz
    
    init_a2d();
 
    int i=1;
    char dir='R';
    
    unsigned int adcval=0;
    
    while (1)
    {
        // Demo Supercar...
        
        PORTB=i;
        
        if(dir=='R')
        {
            i=i<<1;
            
            if(i==0b00001000) dir='L';
        }
        else
        {
            i=i>>1;
            
            if(i==0b00000001) dir='R';
        }
        
        adcval=read_a2d(1);    // 0-255
        
        delay_s(1.0 - adcval/255.0);
    }
}
 
void delay_s(float s)
{
    for(int t=0;t<s*10;t++)
    {
        __delay_ms(100);        // delay for 100 milliseconds
    }
}
 
/* Sample code to set up the A2D module */
void init_a2d(void)
{
    ADCON0=0;    // select Fosc/2
    ADCON1=0;    // select left justify result. A/D port configuration 0
    ADON=1;        // turn on the A2D conversion module
}
 
/* Return an 8 bit result */
unsigned int read_a2d(unsigned int channel)
{
    channel&=0x07;    // truncate channel to 3 bits
    ADCON0&=0xC5;    // clear current channel select
    ADCON0|=(channel<<3);    // apply the new channel select
    GODONE=1;    // initiate conversion on the selected channel
    
    while(GODONE) continue;
    
    return(ADRESH);    // return 8 MSB of the result
}

Mentre il file init.c sarà configurato come segue:

#include <htc.h>
 
/* Program device configuration word
 * Oscillator = External RC Clockout
 * Watchdog Timer = On
 * Power Up Timer = Off
 * Master Clear Enable = RE3 is digital input
 * Code Protect = Off
 * Data EE Read Protect = Off
 * Brown Out Detect = BOD and SBOREN disabled
 * Internal External Switch Over Mode = Enabled
 * Monitor Clock Fail-safe = Enabled
 * Low Voltage Program = Enabled
 * Background Debug = Disabled
 */
__CONFIG(0x3FFF & WDTDIS & PWRTEN & MCLREN & UNPROTECT & DUNPROTECT &
         INTIO & IESODIS & FCMDIS & LVPDIS & DEBUGDIS & BORV21);
 
// Peripheral initialization function
void init(void){
    /***** Common Code ****
     *  Global interrupt disabled during initialization
     */
    INTCON    = 0b00000000;
    
    /***** 16F886 Code ****
     *  Internal oscillator set to 4MHz
     */
    OSCCON    = 0b01100000;
    
    TRISB=0x00;
    
    ei();    // Global interrupts enabled
    
}

 

 

 

A questo punto compilate il progetto. Se non ci sono errori questo produrrà un file con suffisso “.hex” che potrete “dare in pasto” al programma di controllo del Pic Kit 2, utilizzando la funzione “Import…”.

Cliccate sul tasto “Write”, attendete qualche secondo e spuntate il checkbox “On” nel riquadro “VDD PICKit 2” (che in pratica alimenterà la scheda di sviluppo). Se sulla scheda non succede nulla, provate a resettarla mediante il pulsante presente sulla scheda stessa o attivando e disattivando il checkbox “/MCLR” presente nella stessa sezione dell’altro checkbox.

Se tutto va come sperato, i 4 led della scheda dovrebbero iniziare ad accendersi a turno da 1 a 4 e viceversa (riproducendo una sorta di effetto “Supercar”). Inoltre, agendo sul potenziometro presente sulla scheda, potrà essere modificata la velocità di “scorrimento” dell’accensione dei led.

Questo è l’effetto complessivo (anche se qui è ovviamente statico) che dovreste ottenere:

IMAGE_056

Che soddisfazione! Vero?

 

del.icio.us Tags: ,,

Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5