Implementare un modulo di tipo Light Sensor con .NET Gadgeteer (Italiano)

by Mike Dodaro (translated from English by Marco Minerva)

Questo esempio mostra come realizzare un modulo di .NET Gadgeteer utilizzando un fototransitor ad infrarossi e una resistenza pull-up di 10 kilo ohm. La connessione con tale hardware è effettuata attraverso il GHI Electronics Extender Module.  L’output attiva una logica binaria su un pin digitale di input/output, operante a 3.3 volt. Nello stesso modo, possono essere realizzate molto altre operazioni binarie.

Il seguente schema mostra il circuito del fototransistor: il voltaggio, V out, determina una transizione dallo stato basso a quello alto quando viene riconosciuta una sorgente luminosa.

Il circuito del fototransistor

Il circuito del fototransistor

Il seguente video dimostra il funzionamento del modulo sensore di luce in un’applicazione .NET Gadgeteer con la GHI Electronics Fez Spider Mainboard e un Multicolor LED. Quando è esposto alla luce, il sensore lancia un evento che viene gestito dall’applicazione C#, facendo lampeggiare il led. Questo evento può essere utilizzato per attivare altri moduli, come la camera oppure un alarm.

La seguente immagine mostra il sensore di luce che utilizza il fototransistor, come implementato per il nostro test.

Light Detector Module Breadboard Implementation

L’implementazione della scheda per il riconoscimento della luce

Tipo di socket e mapping dei pin per il nuovo modulo .NET Gadgeteer

La .NET Gadgeteer Builder Guides rappresenta un’importante risorsa per la creazione di nuovi moduli. In particolare, la tabella dei tipi di socket identifica la funzionalità supportata da ogni socket e pin. I moduli come il sensore di luce, che richiedono solo un pin digitale di input/output, operante a 3,3 volt, può essere implementato su un socket di tipo X o Y.  Il socket di tipo X supporta i pin digitale di input/output (GPIO) sui pin 3, 4 o 5. L’input a 3,3 volt per il modulo è sul pin 1. la terra è sul pin 10.

Il fototransistor e la resistenza pull-up sono collegati al voltaggio da 3,3 sul pin 1. L’emettitore è collegato alla terra. L’output è connesso al pin GPIO; in particolare, questo esempio usa il pin 4.

Il modulo utilizza il GHI Electronics Extender Module per collegare il fototransistor alla scheda madre, come mostrato nella seguente immagine:

GHI Extender Module

GHI Extender Module

Usare il Module Builder Template for il nuovo Modulo .NET Gadgeteer

Il driver hardware per questo nuovo modulo .NET Gadgeteer è molto facile da implementare utilizzando il .NET Gadgeteer Module Template, che può essere scaricato dal sito di CodePlex dedicato a .NET Gadgeteer.  Il download include diversi template e tutto ciò che è necessario per implementare driver per moduli e schede madri, oltre ai pacchetti di installazione per i moduli e i kit.

Scarichiamo e installiamo il template utilizzando il file GadgeteerBuilderTemplates-2.41.301.msi. Saranno così aggiunti nuovi tipi di progetti nella sezione Gadgeteer della finestra di dialogo New Project di Visual Studio. Selezioniamo .NET Gadgeteer Module.

Gadgeteer Module Project Template

Il template di progetto Gadgeteer Module

Il nuovo progetto comprende un file di nome readme.txt che descrive il processo di implementazione del driver. Per questo modulo, le uniche modifiche al codice generato dal template riguardano l’assegnamento del pin di output (GT.Socket.Pin.Four) e la modalità della resistenza (GTI.ResistorMode.PullUp).

    // Note: A constructor summary is auto-generated by the doc builder.
    ///
<summary></summary>
    ///socketNumber">The socket that this module is plugged in to.
    public LightSensor(int socketNumber)
    {
        // This finds the Socket instance from the user-specified socket number.
        // This will generate user-friendly error messages if the socket is invalid.
        // If there is more than one socket on this module, then instead of "null" for the last parameter,
        // put text that identifies the socket to the user (e.g. "S" if there is a socket type S)
        Socket socket = Socket.GetSocket(socketNumber, true, this, null);

        // This creates an GTI.InterruptInput interface. The interfaces under the
        // GTI namespace provide easy ways to build common modules.
        // This also generates user-friendly error messages automatically,
        // e.g. if the user chooses a socket incompatible with an interrupt input.
        this.input = new GTI.InterruptInput(socket, GT.Socket.Pin.Four,
            GTI.GlitchFilterMode.On, GTI.ResistorMode.PullUp,
            GTI.InterruptMode.RisingAndFallingEdge, this);

        // This registers a handler for the interrupt event of the interrupt input (which is below)
        this.input.Interrupt += new GTI.InterruptInput.InterruptEventHandler(this._input_Interrupt);
    }

Seguendo i primi tre passaggi delle istruzioni contenute nel file readme.txt, compiliamo il progretto e, al punto 4, siamo già pronti a testare il modulo. Aggiungiamo un nuovo progetto di tipo .NET Gadgeteer Application alla soluzione e inseriamo in esso una reference al nuovo modulo. Aggiungiamo un MulticolorLED attraverso il designer e colleghiamolo al socket 11. Il sensore di luce non dispone di un controllo nella ToolBox di Visual Studio, quindi dobbiamo istanziarlo in maniera esplicita nel file Program.cs.

Il nostro modulo utilizza il nome di questo blog per la proprietà ManufacterName: Gadgeteer.Modules.IntegralDesign.LightSensor.

Dichiariamo il modulo come una variabile globale nel classe Program del progetto.

// LightSensor declaration.
Gadgeteer.Modules.IntegralDesign.LightSensor lightSensor;

Quindi, istanziamo il modulo nel metodo ProgramStarted.

// LightSensor test module initialization.
lightSensor = new GTM.IntegralDesign.LightSensor(4);

Utilizzare gli eventi generati dal nuovo modulo

Dopo aver istanziato il nuovo modulo, è possibile utilizzarlo come qualunque altro modulo .NET Gadgeteer, sfruttando l’IntelliSense per creare i gestori degli eventi.

Il codice di questa applicazione di test è semplice. Il led lampeggia in rosso quando la luce attiva il sensore e si spegne quando la sorgente di luce svanisce. Nel nostro esempio, la luce è “spenta” coprendo il sensore, come mostrato nel video all’inizio di questo post. Compiliamo l’applicazione in test in modalità debug e impostiamo come progetto di avvio della soluzione.

using System;
using Microsoft.SPOT;
using Microsoft.SPOT.Presentation;
using Microsoft.SPOT.Presentation.Controls;
using Microsoft.SPOT.Presentation.Media;

using GT = Gadgeteer;
using GTM = Gadgeteer.Modules;
using Gadgeteer.Modules.GHIElectronics;

namespace TestLightSensor
{
    public partial class Program
    {
        // LightSensor declaration.
        Gadgeteer.Modules.IntegralDesign.LightSensor lightSensor;

        void ProgramStarted()
        {
            // LightSensor test module initialization.
            lightSensor = new GTM.IntegralDesign.LightSensor(4);

            lightSensor.LightSensorHigh +=
                new GTM.IntegralDesign.LightSensor.LightSensorEventHandler(lightSensor_LightSensorHigh);
            lightSensor.LightSensorLow +=
                new GTM.IntegralDesign.LightSensor.LightSensorEventHandler(lightSensor_LightSensorLow);
            Debug.Print("Program Started");
        }

        void lightSensor_LightSensorLow(GTM.IntegralDesign.LightSensor sender,
					GTM.IntegralDesign.LightSensor.LightSensorState state)
        {
            led.TurnOff();
        }

        void lightSensor_LightSensorHigh(GTM.IntegralDesign.LightSensor sender,
					GTM.IntegralDesign.LightSensor.LightSensorState state)
        {
            led.BlinkRepeatedly(GT.Color.Red);
        }
    }
}

Modificare il file GadgeteerHardware.xml del nuovo modulo

Il file GadgeteerHardware.xml specifica i dettagli dell’implementazione del nuovo modulo, tra cui il produttore, l’identificatore univoco (UUID), se il modulo fornisce alimentazione al sistema, le dimensioni del modulo in millimetri, la versione minima della libreria .NET Gadgeteer Core richiesta, l’URL contenente informazioni di supporto, l’assembly che contiene il software di gestione del modulo e le specifiche di socket e pin.

Il seguente esempio mostra il file GadgeteerHardware.xml per il modulo LightSensor dopo aver applicato alcune piccole modifiche a quello che viene fornito dal template. Il modulo utilizza il socket X o Y. Non utilizza alcuna connessione elettrica al pin 3, quindi la relativa specifica è stata commentata; allo stesso modo, non utilizza il socket di tipo S, così l’intero elemento nel file XML è stato commentato. Infine, può essere rimossa anche la sezione relative alle librerie aggiuntive, dal momento che il Light Sensor non richiede librerie per altre schede o moduli. Il seguente esempio mostra il file modificato; è possibile fare riferimento al file GadgeteerHardware.xml creato con un nuovo progetto di Visual Studio per vedere il template completo.




    <!-- This module definition should be filled in.  Mouse over any attribute name to get more help about that attribute. -->
    <!-- The Unique ID is auto-generated and does not usually need to be modified. -->


      <!-- This lists the assembly which provides the API to this module, i.e. the output assembly of this template. -->




      <!--       This is an example socket specification with two sockets on the board.       The socket positions are specified in mm from the top left corner of the board, with the orientation 90 indicating the socket notches are pointing upwards (0=right, 180=left, 270=down)       -->


<!-- This example socket is compatible with socket types <span class="hiddenSpellError" pre="types ">XY</span> which has electrical connections to pins 3 and 4 -->


            X
            Y

          
            <!--<Pin Shared="false">3</Pin>-->
            4

<!-- This example socket is compatible with socket type S, it is optional, and it has electrical connections to pins 3,4,5,7,8,9, with 7,8,9 being <span class="hiddenSpellError" pre="being ">shareable</span> (SPI bus) -->
        <!--<Socket Left="10" Top="30" Orientation="90" ConstructorOrder="2" TypesLabel="S" Optional="true">
          <Types>
            <Type>S</Type>
          </Types>
          <Pins>
            <Pin Shared="false">3</Pin>
            <Pin Shared="false">4</Pin>
            <Pin Shared="false">5</Pin>
            <Pin Shared="true">7</Pin>
            <Pin Shared="true">8</Pin>
            <Pin Shared="true">9</Pin>
          </Pins>
        </Socket> -->



<!-- Use this tag if the module requires specific libraries provided by the <span class="hiddenSpellError" pre="the ">mainboard</span> or by other modules -->
      <!--
      <ExtraLibrariesRequired>
        <Assembly MFVersion="4.1" Name="FooHelper"/>
      </ExtraLibrariesRequired>
      -->

      <!-- Use this tag if the module provides libraries that may be required by other modules-->
      <!--
      <LibrariesProvided>
        <Assembly MFVersion="4.1" Name="FooHelper"/>
      </LibrariesProvided>
      -->

<!-- Use the <span class="hiddenSpellError" pre="the ">ProvidedSocket</span> tag if this module provides a socket that another module can plug into -->
<!-- The example below is for <span class="hiddenSpellError" pre="for ">DaisyLink</span> modules which provide a socket type "*" -->
      <!--
      <ProvidedSockets>
<ProvidedSocket Label="*" Left="30" Top="10" Orientation="0" ConstructorParameter="DaisyLinkSocketNumber">
          <Types>
            <Type>*</Type>
          </Types>
        </ProvidedSocket>
      </ProvidedSockets>
      -->




Creare l’immagine del Designer per il nuovo modulo

Come descritto nel file readme.txt, è possibile sostituire il file Image.jpg nella cartella Resources del progetto LightSensor con l’immagine del modulo che sarà utilizzato dal Designer di .NET Gadgeteer. Gli utenti saranno in grado di trascinare il modulo dalla toolbox di Visual Studio sulla superficie del Designer: il modulo apparirà nel Designer, con l’immagine specificata, e sarà possibile collegarlo al giusto socket della scheda madre.

Sovrascriviamo il file Resources\Image.jpg con un un’immagine di buona qualità del modulo, con il lato del socket rivolto verso l’alto, senza margini e nello stesso orientamento specificato dai valori di larghezza e altezza nel file GadgeteerHardware.xml

Creazione di un pacchetto di installazione per il modulo

La cartella Setup nel progetto del modulo contiene tutto quello che server per creare il pacchetto di installazione relativo. Sono necessarie solo poche modifiche al file Setup\common.wxi per specificare i parametri di installazione. Non è necessario modificare nessun altro file nella cartella Setup. Il file common.wxi, come mostrato di seguito, descrive nel dettaglio le caratteristiche del setup.

<?xml version="1.0" encoding="utf-8"?>

  <!-- This file includes global constants for the module installer. Module manufacturers should        change the below to customise this template to their module. -->
  <!-- Change this whenever building a new installer.  The fourth number is ignored,      so change one of the top three. Otherwise, users will not be able to upgrade properly;      Windows Installer will exit with an error instead of upgrading. -->
  <!-- Also change the version numbers in Properties/AssemblyInfo.cs -->
ModuleSoftwareVersion = "1.0.0.0" ?>

      spaces/punctuation. -->
SafeModuleName = "LightSensor" ?>

      without any spaces/punctuation. -->
SafeManufacturer = "IntegralDesign" ?>

  manufacturer name in add/remove programs. -->
FullManufacturer = "Integral Design" ?>

  <!-- No need to change anything below this line. -->
OutputFileName = "GTM.$(var.SafeManufacturer).$(var.SafeModuleName)"?>

RegistryKeyNetMF41 = "SOFTWARE\Microsoft\.NETMicroFramework\v4.1\AssemblyFoldersEx\$(var.OutputFileName)"?>
RegistryKeyVSAddin = "SOFTWARE\Microsoft\.NETGadgeteer\v2\HardwareDefinitionFolders\$(var.OutputFileName)" ?>

  <?define guid_msm_comp_files_id = "e4ff7379-d3b4-4b08-b47c-422be1f4f059" ?>
  <?define guid_msm_comp_files_be_id = "415d472d-e6eb-4e7e-8917-db877d6f6216" ?>
  <?define guid_msm_comp_files_le_id = "64357a11-c8e1-41f7-b23f-b141e0d0a96b" ?>
  <?define guid_msm_comp_resources_id = "1ffaac90-8c23-49b7-b5cb-fd4f9acab2ff" ?>
  <?define guid_msm_comp_registry_id = "28da801f-33be-48e6-813c-b10fe53abaa0" ?>

  <?define guid_msi_upgrade_code =  "e13dfd74-732a-4eaf-9fcb-8584ababb2b8" ?>

  <?define guid_msm_package_id = "ea79c108-b31f-44d6-b612-df445a9fd776" ?>
  <?define guid_msm_comp_gadgeteerhardware_id = "ddc9d140-ba45-4cc5-bc76-bc9f4ae58a94"?>

Per creare il progetto in modalità Release, selezionare Release nel menu drop-down della barra degli strumenti, come mostrato nella seguente figura.

Set Release Mode

Impostiamo la modalità Release

Compilare il progetto in modalità release richiede più tempo rispetto alla generazione in modalità debug. L’output della compilazione comprende il file LightSensor.msi, che si trova nella cartella $LightSensor\LightSensor\bin\Release\Installer. Eseguiamo il file MSI per installare il nuovo modulo LightSensor nel designer di .NET Gadgeteer.

Testare il modulo

Creiamo una nuova applicazione .NET Gadgeteer e aggiungiamo una reference al modulo LightSensor, versione release, che si trova in $LightSensor\LightSensor\bin\Release\NETMF\GTM.IntegralDesign.LightSensor.dll. Ora dovremmo vedere il nuovo modulo nella Toolbox di Visual Studio, come mostrato di seguito.

New Module in .NET Gadgeteer Designer Toolbox

Il nuovo modulo nella Toolbox del .NET Gadgeteer Designer

Trasciniamo il modulo sulla superficie del Designer, facciamo clic sul suo socket di connessione e teniamo premuto il mouse; i socket che supportano i tipi X e Y saranno evidenziati in verde sulla scheda madre, come mostrato nella seguente immagine. La foto del modulo è abbastanza spartana. E’ possibile fare riferimento alla Module Builder’s Guide per i dettagli sulla creazione di nuovi moduli.

New Module in .NET Gadgeteer Designer

Il nuovo modulo nel Designer di .NET Gadgeteer Designer

Trasciniamo per creare una connessione con il socket 4 della scheda Fez Spider Mainboard, come mostrato di seguito.

New Module with Connection to Mainboard

Il nuovo modulo connesso con la scheda madre

Salviamo il file del Designer in Visual Studio e chiudiamo la relativa finestra.

Per eseguire l’applicazione di test, usiamo lo stesso codice mostrato in precedenza, ma senza la dichiarazione e l’istanziazione esplicita del LightSensor. La seguente applicazione si comporta come l’esempio che abbiamo illustriamo prima della creazione del pacchetto di installazione.

using System;
using Microsoft.SPOT;
using Microsoft.SPOT.Presentation;
using Microsoft.SPOT.Presentation.Controls;
using Microsoft.SPOT.Presentation.Media;

using GT = Gadgeteer;
using GTM = Gadgeteer.Modules;
using Gadgeteer.Modules.GHIElectronics;
using Gadgeteer.Modules.IntegralDesign;

namespace TestLightSensor
{
    public partial class Program
    {
        void ProgramStarted()
        {
            lightSensor.LightSensorHigh +=
                new GTM.IntegralDesign.LightSensor.LightSensorEventHandler(lightSensor_LightSensorHigh);
            lightSensor.LightSensorLow +=
                new GTM.IntegralDesign.LightSensor.LightSensorEventHandler(lightSensor_LightSensorLow);
            Debug.Print("Program Started");
        }

        void lightSensor_LightSensorLow(GTM.IntegralDesign.LightSensor sender,
                               GTM.IntegralDesign.LightSensor.LightSensorState state)
        {
            led.TurnOff();
        }

        void lightSensor_LightSensorHigh(GTM.IntegralDesign.LightSensor sender,
                               GTM.IntegralDesign.LightSensor.LightSensorState state)
        {
            led.BlinkRepeatedly(GT.Color.Red);
        }
    }
}
Advertisements

  1. Leave a comment

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: