Month: October 2011

uPLibrary : un driver per i Passive Infrared Sensor (PIR)

Ho integrato nella mia libreria per il .Net Micro Framework un driver per poter gestire un sensore PIR (Passive Infrared Sensor) per la rilevazione dei movimenti. Per capirci è uno di quei sensori di cui sono dotati gli impianti di allarme casalinghi.

La nuova classe Pir è molto semplice da usare e prevede di fornire al costruttore tutte le informazioni relative al pin del nostro micro al quale intendiamo connettere l’uscita del sensore PIR. Tra di esse ovviamente c’è l’identificativo del pin, attivazione o meno dell’eventuale filtro per il disturbo, eventuale resistenza di pullup/pulldown, fronte o livello dell’interrupt sul quale vogliamo avere segnalazione di movimento o meno. Infine, va specificato lo stato iniziale del driver, se abilitato o meno.

Inoltre mette a disposizione :

  • Motion : un evento che viene sollevato quando viene rilevato un movimento o meno (dipende da come abbiamo impostato la segnalazione dell’interrupt nel costruttore). Ad esso è associata la class PirEventArgs che ha le due seguenti proprietà :
    • Motion : indica se c’è stato o meno un movimento;
    • Time : timestamp in cui si è verificato un cambiamento di stato del sensore (rilevato movimento o meno);
  • Enabled : proprietà attraverso la quale possiamo abilitare o meno le segnalazioni da parte del PIR;

Per i miei test ho usato il seguente componente abbastanza economico.

6327.d21d53a70507f8098a63971d0655347a_image_300x225_7CCA2CB2

Esso prevede banalmente tre pin di collegamento, ossia la massa, l’alimentazion ed un pin di uscita che va collegato al pin del nostro micro. Ogni qual volta il sensore rileva un movimento, esso fornisce una tensione di 3,3 V sul pin di uscita che torna a 0 V in assenza di movimento. Sfruttando i due fronti (salita e discesa) del segnale, è possibile configurare l’istanza della classe Pir in modo che sollevi l’evento solo in caso di movimento oppure in presenza di una variazione (movimento, non movimento e viceversa).

Il progetto lo trovate su Codeplex e nella Nuget gallery (sia sul sito che all’interno del plugin per Visual Studio 2010) aggiornato alla versione 1.1.0.0.

Advertisements

Swap di due variabili senza la variabile di appoggio ? Si può !

Una delle prime funzioni (escludendo il solito Main() che produce il famosissimo “Hello World”) che si scrive quando ci si avvicina al mondo della programmazione, è quella che ci permette lo swap (scambio) di valori tra due variabili. Tipicamente si è portati a scrivere del codice di questo tipo …

private void Swap(ref int a, ref int b)
{
    if (a != b)
    {
        int tmp;

        tmp = a;
        a = b;
        b = tmp;
    }
}

… ossia siamo portati ad utilizzare una terza variabile (tmp) di appoggio.

Ebbene, tale variabile si può assolutamente evitare, riscrivendo la funzione nel modo seguente …

private void Swap(ref int a, ref int b)
{
    if (a != b)
    {
        a ^= b;
        b ^= a;
        a ^= b;
    }
}

… ed utilizzando solo ed esclusivamente le proprietà dell’operatore logico XOR (commutativa, associativa identità).

Nuget Gallery … c’è anche la uPLibrary !

7215.nuget-229x64_556266e8-afb7-4f84-912b-c99a3f9bf742_68F4F598

Più o meno tutti conoscono Nuget, il tool che permette di trovare ed installare facilmente numerosi packages senza necessità di cercarli nei meandri della rete.

Perfettamente integrato con Visual Studio, possiamo visualizzare l’elenco dei packages disponibili online ed installarli con un click; saranno subito fruibili all’interno del nostra solution. Nuget gestisce anche il versioning ed eventuali dipendenze delle librerie che stiamo scaricando.

Oggi, la Nuget gallery si arricchisce anche della libreria μPLibrary per il .Net Micro Framework che sto sviluppando da qualche settimana.

5850.upLibraryNuget_6D1ECD5D

uPLibrary : display LCD provider con GPIO e Shift Register

Ho aggiunto alla mia libreria su Codeplex la possiblità di pilotare un display LCD attraverso le due seguenti tipologie di provider :

  • GpioLcdTransferProvider: utilizzando direttamente i pin di GPIO di un micro e collegarli ai pin del display;
  • Shift74HC595LcdTransferProvider : utilizzando uno shift register collegato attraverso un solo pin al micro e poi sfruttare le relative uscite per pilotare il display;

La prima soluzione si basa fondamentalmente sulla prima versione del driver che ho rilasciato nelle settimane scorse. La seconda soluzione utilizza il driver dello shift register 74HC595 e permette di risparmiare parecchi pin del micro per pilotare il display.

Entrambi implementano l’interfaccia ILcdTransferProvider che espone :

  • Send() : metodo con il quale viene inviato un comando o un dato al display. Ciascun provider usa al suo interno una propria modalità (pin GPIO, driver shift register, ….);
  • InterfaceDataMode : proprietà che definisce se il display è pilotato nella modalità a 4 oppure 8 bit;

uPLibrary : managed driver per lo shift register NXP 74HC595

La mia libreria μPLibrary su Codeplex si è ampliata con l’aggiunta di un managed driver per la gestione di uno shift register 74HC595 della NXP, il cui datasheet è possibile scaricare al seguente link.

In base alle potenzialità fornite dal componente, ho implementato i seguenti metodi per le corrispondenti funzionalità :

  • Clear() : ripulisce lo shift register e pone le uscite in alta impedenza;
  • Empty() : carica uno shift register vuoto all’interno dello storage register, in modo che gli output vadano a zero;
  • Output() : invia una sequenza di byte sulla linea seriale di ingresso al componente, che li espone l’uno dopo l’altro in parallelo sulle otto uscite;

Inoltre, la classe mette a disposizione più costruttori in base alla configurazione hardware scelta per i pin ma soprattutto fornisce due modalità di funzionamento :

  • Bit banging : il segnale di clock dello shift register viene pilotato via software  attraverso un pin di GPIO;
  • SPI (Serial Peripheral Interface) : viene utilizzata l’interfaccia SPI in cui il MOSI va connesso all’ingresso seriale del componente ed il SCKL va connesso al clock di shift;