Month: December 2013

uPLibrary : driver managed per un controllo motori

Questo controllo della Toshiba permette di pilotare due motori DC (in corrente continua) con un’alimentazione massima di 15 V con quattro modalità di funzionamento : CW (ClockWise, senso orario), CCW (CounterClockWise, senso antiorario), short brake e stop. Inoltre, la velocità di ciascun motore può essere variata attraverso un segnale PWM (Pulse Width Modulation) modificandone il duty cycle.

5556.09457-01b_thumb_0011B330

Sul sito della Sparkfun è disponibile un’utilissima breakout board che monta il controllo motori e ne rende facilmente accessibili i pin.

Il driver managed

Il driver managed che ne permette l’utilizzo è rappresentato dalla classe TB6612FNG che mette a disposizione due costruttori attraverso i quali poter decidere se utilizzare solo uno oppure entrambi i motori. Per ciascun motore è definito un canale (A e B) caratterizzato da :

  • 2 segnali di ingresso attraverso i quali poter impostare le quattro modalità di funzionamento suddette (vedere tabella datasheet);
  • 1 segnale PWM per la variazione della velocità;

I primi due segnali sono rappresentati da due istanze della classe OutputPort per ciascun canale mentre l’ultimo segnale è rappresentato da un’istanza della classe PWM.

Il costruttore più semplice permette di utilizzare solo il canale A mentre quello più complesso prepara l’oggetto all’utilizzo di entrambi i motori (richiamando anche il costruttore più semplice).

public TB6612FNG(Cpu.Pin aIn1, Cpu.Pin aIn2, Cpu.PWMChannel aPwmChannel,
                 Cpu.Pin bIn1, Cpu.Pin bIn2, Cpu.PWMChannel bPwmChannel,
                 Cpu.Pin standby = Cpu.Pin.GPIO_NONE)
    : this(aIn1, aIn2, aPwmChannel, standby)
{
    this.bIn1Port = new OutputPort(bIn1, false);
    this.bIn2Port = new OutputPort(bIn2, false);

    this.bPwm = new PWM(bPwmChannel, DEFAULT_PWM_FREQUENCY, 0, false);

    this.IsMotorEnabledB = true;
    this.MotorModeB = MotorMode.Stop;

    this.bPwm.Start();
}

L’applicativo che utilizza il driver può interagire con il controllo motori attraverso delle proprietà (e non dei metodi) per abilitarli, impostare la modalità di funzionamento e la velocità. Se facciamo riferimento al canale A abbiamo a disposizione la proprietàIsMotorEnabledAMotorModeA e MotorSpeedA rispettivamente. Ciascuno di queste proprietà agisce sui pin dedicati alle OutputPort di cui sopra (per la modalità di funzionamento) e sul pin PWM (per la velocità, con un valore da 0 a 100).

/// <summary>
/// Mode for Motor A
/// </summary>
public MotorMode MotorModeA
{
    get
    {
        if (this.IsMotorEnabledA)
            return this.motorModeA;
        else
            throw new ApplicationException("Motor A is disabled !!");
    }
    set
    {
        switch (value)
        {
            case MotorMode.CCW:
                this.motorModeA = MotorMode.CCW;
                this.aIn1Port.Write(false);
                this.aIn2Port.Write(true);
                break;
            case MotorMode.CW:
                this.motorModeA = MotorMode.CW;
                this.aIn1Port.Write(true);
                this.aIn2Port.Write(false);
                break;
            case MotorMode.ShortBrake:
                this.motorModeA = MotorMode.ShortBrake;
                this.aIn1Port.Write(true);
                this.aIn2Port.Write(true);
                break;
            case MotorMode.Stop:
                this.motorModeA = MotorMode.Stop;
                this.aIn1Port.Write(false);
                this.aIn2Port.Write(false);
                break;
            default:
                break;
        }
    }
}

/// <summary>
/// Speed for Motor A
/// </summary>
public int MotorSpeedA
{
    get
    {
        if (this.IsMotorEnabledA)
            return this.motorSpeedA;
        else
            throw new ApplicationException("Motor A is disabled !!");
    }
    set
    {
        if ((value >= 0) && (value <= 100))
            this.motorSpeedA = value;
        this.aPwm.DutyCycle = (double)this.motorSpeedA / 100;
    }
}

Ad esempio, nel caso di un robot con due ruote e quindi due motori pilotati da questo controllo, potremmo realizzare un metodo che li attivi entrambi nello stesso senso per far avanzare o arretrare il robot oppure un metodo che li attivi in versi opposti per farlo girare.

// both motors in counter clockwise mode
this.tb6612fng.MotorModeA = MotorMode.CCW;
this.tb6612fng.MotorModeB = MotorMode.CCW;

//...

this.tb6612fng.MotorModeA = MotorMode.CW;
this.tb6612fng.MotorModeB = MotorMode.CCW;

La libreria passa così alla versione 2.2 e come sempre è disponibile su Nuget e su CodePlex. Purtroppo il supporto è garantito dal .Net Micro Framework 4.2 in poi e viene esclusa la versione 4.1, poichè non è disponibile la classe PWM.

Advertisements

Netduino boards ed AGENT smartwatch : da Secret Labs gli SDK sperimentali per Visual Studio 2013

La Secret Labs, produttrice della famosa serie di board Netduino e dell’AGENT smartwatch basato su .Net Micro Framework, non ha saputo aspettare un rilascio ufficiale da parte di Microsoft ed ha deciso di rendere disponibile un SDK sperimentale per Visual Studio 2013 !

Chris Walker ha divulgato la notizia sul forum ufficiale ed ha spiegato di aver utilizzato i sorgenti open source del .Net Micro Framework per poter generare questo SDK che non sarà più supportato dalla Secret Labs nel momento in cui la Microsoft rilascerà quello ufficiale.

Ovviamente, io non ho saputo aspettare e dopo aver installato Visual Studio 2013, ho scaricato l’SDK per poterlo provare con una semplicissima applicazione sulla mia board Netduino Plus. Oltre all’SDK del .Net Micro Framework è necessario scaricare ed installare anche l’SDK della Secret Labs, anch’esso sperimentale per Visual Studio 2013.

SDK .Net Micro Framework 4.3 (RTM) ed SDK Netduino boards

L’installer dell’SDK è relativo al .Net Micro Framework 4.3 (RTM) ed è perfettamente identico a quello ufficiale così come tutto il processo di installazione.

01

Al termine dell’installazione di entrambi gli SDK, troveremo i template generici per i progetti .Net Micro Framework in C# e quelli relativi alle board della famiglia Netduino.

02

La più banale delle applicazioni “Hello World” nel mondo embedded, cioè il blink di un led (in questo caso il led onboard alla Netduino Plus), funziona perfettamente così come anche tutte le funzionalità di debug.

public class Program
{
    public static void Main()
    {
        // write your code here
        OutputPort led = new OutputPort(Pins.ONBOARD_LED, false);

        while (true)
        {
            Thread.Sleep(1000);
            led.Write(!led.Read());
        }
    }
}

SDK AGENT Smartwatch

La Secret Labs ha voluto fare di più e puntare anche sul prodotto del 2014 : l’AGENT smartwatch. Infatti, è stato rilasciato anche un SDK sperimentale per il futuro smartwatch basato sul .Net Micro Framework, così come annunciato sul relativo forum.

Al termine dell’installazione, troviamo i template per sviluppare applicazioni e watch face.

03

Anche in questo caso, la semplice applicazione “Hello World” e la watch face di esempio funzionano senza alcun problema sull’emulatore dell’AGENT.

0405

SQLite : supporto per il .Net Compact Framework 3.9 e Windows Embedded Compact 2013

E’ ormai noto che la Microsoft ha fatto una scelta ben precisa per quanto riguarda l’utilizzo di un DBMS all’interno dei propri prodotti embedded, dagli smartphone (Windows Phone) ai tablet (Surface WinRT) passando per i dispositivi basati su Windows Embedded Compact 2013; questa scelta ha un nome ben preciso ed è SQLite !

Passaggio da WEC7 a WEC2013 : SQL Server Compact rimosso !

Per quanto riguarda Windows Embedded Compact, il passo è stato effettuato dalla versione 7 alla 2013, rimuovendo addirittura la feature “SQL Server Compact” dal Catalog Items del Platform Builder (tra le features “Core” associata alla variabile SYSGEN_SQLCOMPACT) attraverso la quale era semplicissimo aggiungere il supporto per questo DBMS all’immagine del sistema operativo.

01

Inoltre, nella documentazione ufficiale MSDN del .Net Compact Framework 3.9 è descritta la rimozione del supporto per SQL Server Compact all’interno del framework stesso e proprio l’uso di SQLite è riportato come possibile “workaround”.

02

A questo punto, non ci resta che accettare la scelta fatta da Microsoft ed esplorare in che modo sia possibile utilizzare SQLite sui nostri sistemi embedded.

SQLite : supporto nativo e managed con ADO.NET

SQLite è un DBMS standalone alla pari di SQL Server Compact e caratterizzato da una singola DLL attraverso la quale è possibile gestire i propri database. Sul sito ufficiale sono disponibili i sorgenti che per Windows Embedded Compact 2013 vanno necessariamente ricompilati. Per fortuna, esiste un utilissimo progetto su CodePlex, SQLite for Windows Embedded Compact 2013, di David Jones (insieme a me uno dei membri della “board of director” della Embedded101 community) attraverso il quale è possibile avere a disposizione il binario in codice nativo della libreria SQLite in modo da poterla anche includere nell’immagine del sistema operativo attraverso il Catalog Items del Platform Builder con un semplice click.

03

Per quanto riguarda il supporto managed, è disponibile da poco tempo un wrapper ADO.NET sul sito ufficiale nella sezione “Precompiled Binaries for Windows CE (.Net Compact Framework)” per il .Net Compact Framework 3.9 (sia per architettura ARM che x86). Esso si aggiunge a quello già disponibile per il .Net Compact Framework 3.5.

04

In questo modo si completa il supporto di SQLite per Windows Embedded Compact 7 e 2013 sia in codice nativo che managed.

SQLite ADO.NET : una panoramica

Una volta scaricato il file zip relativo all’architettura che ci interessa (ARM o x86) per il .Net Compact Framework 3.9, al suo interno troveremo la libreria nativa precompilata (SQLite.Interop.090.dll) ed il wrapper ADO.NET in codice managed (System.Data.SQLite.dll); entrambi i file vanno distribuiti sul nostro target : la libreria nativa potrebbe essere inclusa direttamente nell’immagine del sistema operativo attraverso un subproject ed un relativo file BIB mentre l’assembly ADO.NET può essere incluso nella cartella dell’applicazione stessa.

Per chi già conosce l’accesso ai dati attraverso ADO.NET (con SQL Server Compact o meno) l’utilizzo del namespace System.Data.SQLite con tutte le relative classi risulterà assolutamente familiare.

La connessione ad un database è creata attraverso la classe SQLiteConnection alla quale è necessario fornire la connection string che deve contenere il path assoluto del database; successivamente l’apertura viene eseguita attraverso il metodo Open() che provvede a creare il database qualora esso non esista.

string databasefile = "test.db";
SQLiteConnection conn = new SQLiteConnection(string.Format("Data Source={0};Version=3;",
    Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase), databasefile)));
conn.Open();

Una volta stabilita la connessione, è possibile effettuare tutte le operazioni CRUD sul database.

Ciascun comando per interagire con il database è rappresentato dalla classe SQLiteCommand che può essere istanziata utilizzando il costruttore relativo oppure il metodo CreateCommand() della classe SQLiteConnection. L’esecuzione di un comando viene effettuata attraverso la classe SQLiteDataReader utilizzando i metodi ExecuteReader(), ExecuteScalar() e ExecuteNonQuery().

string cmdText = "SELECT * FROM MyTable";
SQLiteCommand cmd = new SQLiteCommand(cmdText);
cmd.Connection = conn;
SQLiteDataReader reader = cmd.ExecuteReader();

while (reader.Read())
{
    Console.WriteLine(reader.GetInt32(0) + " " + reader.GetString(1) + " " + reader.GetString(2));
}
reader.Close();

//...

SQLiteCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT * FROM MyTable";
SQLiteDataReader reader = cmd.ExecuteReader();

while (reader.Read())
{
    Console.WriteLine(reader.GetInt32(0) + " " + reader.GetString(1) + " " + reader.GetString(2));
}
reader.Close();

Inoltre, è disponibile il supporto alle transazioni utilizzando la classe SQLiteTransaction che va istanziata mediante il metodo BeginTransaction() della classe SQLiteConnection e che può essere committata o annullata attraverso i metodi di Commit() e Rollback().

using (SQLiteTransaction trans = conn.BeginTransaction())
{
    try
    {
        using (SQLiteCommand cmd = new SQLiteCommand())
        {
            //...
        }
        trans.Commit();
    }
    catch
    {
        trans.Rollback();
    }
}

L’ultima modalità di interazione è attraverso i DataSet per un accesso disconnesso ai dati, utilizzando la classe SQLiteDataAdapter ed il relativo metodo Fill(), per caricare i dati, ed il metodo Update() per aggiornarli sul database.

DataSet ds = new DataSet("MyDataSet");

SQLiteDataAdapter adapter = new SQLiteDataAdapter(cmd);
adapter.Fill(ds, "MyTable");

Conclusioni

La scelta di Microsoft di adottare un nuovo database per le applicazioni embedded e di non puntare su un prodotto fatto in casa può essere condivisa o meno. Il passaggio da SQL Server Compact a SQLite può essere considerato indolore grazie all’utilizzo dell’interfaccia ADO.NET. Inoltre, può essere un vantaggio l’ampio utilizzo di SQLite anche su altri sistemi operativi ed in ambito mobile oltre al fatto che sia completamente open source. Sicuramente c’è da attendersi in futuro sempre una maggiore integrazione tra gli strumenti di sviluppo di casa Microsoft e questo DBMS, diventato il punto di riferimento nell’ambito dei device.

Errore di deploy sull’emulatore Windows Phone 8 con codice 0x80131500 ma è colpa di Hyper-V !

Da poco ho comprato un portatile nuovo con l’obiettivo di poter passare dallo sviluppo per Windows Phone 7 a Windows Phone 8, tenendo conto di tutte le caratteristiche di cui necessita quest’ultimo dalla virtualizzazione hardware all’attivazione di Hyper-V.

Installo tutto il necessario, da Visual Studio 2012 Update 4 a Windows Phone 8 SDK ed attivo Hyper-V ma sul più bello, al momento del deploy di una banalissima app “vuota” giusto per verificare che tutto funzioni, ecco che … non funziona nulla !!!

L’errore si presenta in fase di deploy e senza alcun tipo di descrizione ma con il codice 0x80131500 !

Inizia il mio girovagare in rete e pare che l’errore sia legato alla versione Windows 8.1 Preview ma io ho una favolosa Windows 8.1 Professional !

Parlando del problema con Clement Giorio, un altro membro del DotNetCampania, mi rendo conto che l’emulatore WP8 non parte ed allora pensiamo di creare una macchina virtuale per capire se è Hyper-V che non sta facendo il suo dovere.

L’esito è che non riesco nemmeno a creare una semplice macchina virtuale in Hyper-V !

Continuando ad approfondire il problema, ecco che si giunge alla sequenza di operazioni che mi permette di risolvere il problema :

  • Disinstallazione Hyper-V
  • Riavvio
  • Esecuzione di : dism.exe /Online /Cleanup-image /Scanhealth
  • Esecuzione di : dism.exe /Online /Cleanup-image /Restorehealth
  • Riavvio
  • Installazione di Hyper-V

Forse grazie a questo blog post, molte persone eviteranno di perdere le stesse ore che ho perso io !

🙂

M2Mqtt : il client MQTT passa alla versione 2.4.0.0

Nuovo rilascio per la mia libreria M2Mqtt, client MQTT utilizzabile su qualsiasi piattaforma basata su .Net Framework (dal desktop al micro passando per il compact), giunta alla versione 2.4.0.0 e come sempre disponibile sia su CodePlex che su Nuget.

Bug Fix : message identifier non più cross-broker

Questa volta l’aggiornamento contiene, tra l’altro, un importante bug fix relativo alla generazione del message identifier per i messaggi di PUBLISH, SUBSCRIBE ed UNSUBSCRIBE previsti dal protocollo MQTT. Nelle versioni precedenti, la generazione di questo identificativo era incapsulata nella classe base della gerarchia di messaggi, la MqttMsgBase, evidenziando l’anomalia di un message identifier sempre crescente e cross-broker, ossia era utilizzata la medesima variabile (statica) per la generazione anche se il client veniva istanziato più volte nel nostro applicativo per connettersi a più broker differenti. Ovviamente, il protocollo prevede che l’identificativo sia legato alla coppia client-broker, ossia che risulti univoco nell’ambito di ciascuna connessione al broker.

Supporto per il .Net Compact Framework 3.5

Un ulteriore interessante aggiornamento riguarda il supporto per il .Net Compact Framework 3.5 per i client eseguiti su Windows Embedded Compact 7 ma soprattutto la compatibilità con le versioni del .Net Framework inferiori alla 4.0 (sono stati eliminati i default parameter values nei costruttori e nei metodi, sostituendoli con degli overload).

Preparazione per il supporto a Windows Phone 8

Infine, in vista del rilascio del supporto per Windows Phone 8, è stata aggiunta l’interfaccia IMqttNetworkChannel per l’astrazione del canale sottostante di comunicazione e permetterne la relativa implementazione.

M2Mqtt : il mio client MQTT su Channel9 con le ultime novità !!

7271.m2mqtt_channel9_thumb_70263A9A

Anche questa volta con estremo piacere, la mia libreria M2Mqtt (client MQTT per tutte le versioni del .Net Framework) è menzionata nel “hardware friday post” sul blog di Coding4Fun su Channel9 al seguente link !!

Il post mette in evidenza le principali ultime novità aggiunte, ossia il supporto per la sicurezza attraverso il protocollo SSL/TLS e la gestione degli eventi in maniera asincrona. E’ stata messa in evidenza anche la mia demo relativa all’utilizzo dello stesso client MQTT con la piattaforma 2lemetry.

La soddisfazione è doppia nel sapere che il mio operato sta suscitando un grande interesse e che la libreria è sempre più utilizzata. Ovviamente, tutto ciò mi spinge nel migliorarla ed infatti si avvicinano numerose sorprese e migliorie !!

🙂

Hai una Raspberry Pi ? Ti serve assolutamente questo libro !

raspberrypi

Questo post è ben diverso da quelli che generalmente scrivo sul mio blog, soprattutto in relazione al fatto che si tratta di una mini recensione al primo libro (spero di una lunga serie) appena pubblicato da un mio carissimo amico, quale è Valter Minute (MVP Microsoft per Windows Embedded).

Qualche mese fa, il caro Valter mi propone di fare da “cavia” per un suo progetto in corso d’opera; io ovviamente accetto senza pensarci su due volte, ritrovandomi a leggere in anteprima i capitoli del libro “Raspberry Pi – Guida all’uso” (Edizioni FAG Milano), per poter proporre ulteriori spunti e carpire eventuali errori (di testo, non di certo di contenuto ben conoscendo l’autore).

I libro è per i neofiti che si avvicinano al mondo dei makers o che vogliono realizzare in casa un proprio centro multimediale ma anche per utenti più avanzati che vogliono ottenere il massimo dalla loro Raspberry Pi. Sono affrontati tutti gli argomenti necessari per poter prendere a pieno il controllo dell’oggetto, dall’installazione del sistema operativo alla relativa configurazione, dalla programmazione in Python alla connessione del dispositivo al Cloud per assaggiare l’Internet Of Things.

Voglio solo aggiungere che per la Raspberry Pi sono disponibili anche una BSP Windows CEin versione alpha ed in corso di sviluppo da parte di Douglas Boling, così come un supporto per il .Net Micro Framework, che purtroppo non ho avuto ancora modo di sperimentare.

L’autore è sicuramente una garanzia, considerando la sua enorme esperienza nel mondo embedded sotto tutti i punti di vista e relativamente a tutti i prodotti da Windows CE a Linux ed Android.

Ieri ho ricevuto ne ho ricevuto una copia in omaggio (che rileggerò ovviamente), scoprendo anche che Valter ha riservato qualche preziosa parola nei miei confronti per l’aiuto dato; ovviamente ho fatto tutto con estremo piacere per un professionista che ho sempre considerato un punto di riferimento nel mondo dello sviluppo embedded. Dai forum su MSDN al corso su Windows CE 6.0 che ho seguito (di cui lui era ovviamente il “docente”), ne ho apprezzato l’elevatissimo livello di compentene … bisogna farne di strada per essere come lui !

Per me è quasi un idolo !!

Ovviamente, non mi resta che dire … accattatevillo !!! (parafrasando una famosa pubblicità)

Tradotto dal mio dialetto … correte subito ad acquistarlo oppure fatelo comodamente da casa, eccovi il link al sito ufficiale !!