Mi è arrivato il Sensore 3D della Microchip [1]
Dopo aver testato il software in dotazione mi sono reso conto che il sensore può essere un buon dispositivo per varie applicazioni, risponde abbastanza bene e velocemente.
Per cui ho voluto approfondirne il funzionamento.
Purtroppo il protocollo di comunicazione tra il pc ed il chip non è documentato e c'è una dll che si può utilizzare solamente sotto windows, cosa alquanto fastidiosa.
Dopo un pò di sniffing del flusso dati ho trovato come eseguire l'inizializzazione del dispositivo e come capire le coordinate della posizione della mano. Non sono riuscito a trovare nel flusso dati delle indicazioni sulle gesture dell'utente, temo che sia la DLL a "dedurre" le gesture elaborando la sequenza di posizioni che arrivano dal dispositivo.
Rinviamo il problema ad un altro articolo, lo scopo di questo è di controllare l'RGB di una lampada a LED collegata in DALI ad un gateway ethernet attraverso un RaspBerry con il sensore 3D.
Ecco una breve descrizione di quanto riscontrato. Senza sapere a cosa servono ecco le sequenze di byte che è necessario inviare al chip per impostarlo
new byte[]{ 0xFE, 0xFF, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00},
new byte[]{ 0xFE, 0xFF, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00},
new byte[]{ 0xFE, 0xFF, 0x10, 0x00, 0x00, 0xA2, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00} ,
new byte[]{ 0xFE, 0xFF, 0x10, 0x00, 0x00, 0xA2, 0x81, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} ,
new byte[]{ 0xFE, 0xFF, 0x08, 0x00, 0x00, 0x06, 0x83, 0x00, 0x00, 0x00} ,new byte[]{ 0xFE, 0xFF, 0x0C, 0x00, 0x00, 0x06, 0xA2, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00} ,
new byte[]{ 0xFE, 0xFF, 0x0C, 0x00, 0x00, 0x06, 0xA2, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00} ,
new byte[]{ 0xFE, 0xFF, 0x0C, 0x00, 0x00, 0x06, 0xA2, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00} ,
new byte[]{ 0xFE, 0xFF, 0x0C, 0x00, 0x00, 0x06, 0xA2, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00} ,
new byte[]{ 0xFE, 0xFF, 0x0C, 0x00, 0x00, 0x06, 0xA2, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00} ,
new byte[]{ 0xFE, 0xFF, 0x0C, 0x00, 0x00, 0x06, 0xA2, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00} ,
new byte[]{ 0xFE, 0xFF, 0x0C, 0x00, 0x00, 0x06, 0xA2, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00} ,
new byte[]{ 0xFE, 0xFF, 0x06, 0x00, 0x00, 0x33, 0x00, 0x00} ,
new byte[]{ 0xFE, 0xFF, 0x10, 0x00, 0x00, 0xA2, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x07, 0x00, 0x00 },
new byte[]{ 0xFE, 0xFF, 0x10, 0x00, 0x00, 0xA2, 0x82, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x10, 0x32, 0x04, 0x00} ,
new byte[]{ 0xFE, 0xFF, 0x10, 0x00, 0x00, 0xA2, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00 },
new byte[]{ 0xFE, 0xFF, 0x10, 0x00, 0x00, 0xA2, 0x81, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
Dopo aver inviato questi messaggi il dispositivo inizia a mandare un flusso di dati continuo molto consistente. I gruppi di byte che arrivano iniziano con 0xFF seguito dal numero di byte del messaggio. Prendiamo in considerazione solamente i gruppi che iniziano con 0xFF 0x10 e chiamiamo DATA l'array che contiene tutti i byte del messaggio. DATA[6] passa da 0x00 a 0x02 quando si passa la mano sul sensore, grazie a questo possiamo distinguere quando considerare validi i byte che indicano la posizione X,Y,Z che troviamo nelle posizioni 10,12,14 dello stesso array, i valori vanno da 0 a 255.
Con queste informazioni ho fatto un plugin per RaspLogic rende disponibile un nuovo componente che ha come uscita X*256*256+Y*256+Z come se trattassimo X,Y e Z come si usano di solito le componenti RGB del colore.
Nel sistema ho aggiunto un gateway ETHERNET->DALI, il DALCNET Server Gateway DGM01-1248.
Molto semplice da utilizzare, basta mandare una richiesta HTTP con i dati in post dell'indirizzo iniziale da cambiare e la sequenza di dati.
Per cui inviando 000 come indirizzo e AABBCC come valori, il gateway si occuperà di cambiare gli indirizzi DALI 00 01 e 02 mettendo come valori rispettivamente AA BB e CC.
RaspLogic ha la possibilità di definire dei "parametri" che possono essere associati ai componenti.
Ad esempio una temperatura letta da un sensore può essere usato per fa cambiare colore ad una lampada.
Nel nostro caso ho creato un parametro che identifica la mia lampada RGB all'indirizzo DALI 0x00.
Ecco il sorgente che permette di mandare messaggi al gateway.
HttpWebRequest httpWReq =(HttpWebRequest)WebRequest.Create("http://192.168.0.4/dmx.xml");
ASCIIEncoding encoding = new ASCIIEncoding();
string postData = "<data addr='0000' size='0003'>"+dest.ToString()+"</data>";
byte[] data = encoding.GetBytes (postData);
httpWReq.Method = "POST";
httpWReq.ContentType = "application/x-www-form-urlencoded";
httpWReq.ContentLength = data.Length;
Stream newStream = httpWReq.GetRequestStream ();
newStream.Write (data, 0, data.Length);
WebResponse response = httpWReq.GetResponse ();
// Display the status.
Console.WriteLine (((HttpWebResponse)response).StatusDescription);
// Get the stream containing content returned by the server.
newStream = response.GetResponseStream ();
// Open the stream using a StreamReader for easy access.
StreamReader reader = new StreamReader (newStream);
// Read the content.
string responseFromServer = reader.ReadToEnd ();
// Display the content.Console.WriteLine (responseFromServer);
// Clean up the streams.reader.Close ();
newStream.Close ();
response.Close ();
Una volta fatto questo si può associare direttamente il componente che rappresenta il sensore al parametro che rappresenta la mia lampada all'indirizzo DALI 0x00. In questo modo quando si muove la mano sopra il sensore la lampada RGB cambia colore usando come valori R=X,G=Y,B=Z.

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)