Home
Accesso / Registrazione
 di 

Pilotare diversi dispositivi con il movimento della testa

Progetto IR decode

Come utilizzare Arduino per comandare diversi elettrodomestici col movimento della testa

L'idea di questo progetto nasce per dare una mano alle persone con gravi disfunzioni motorie, utilizzando Arduino (per comandare alcuni sistemi come televisore, condizionatore, lampade e altri dispositivi) e un pc con webcam, per tradurre piccoli movimenti della testa in istruzioni da impartire ad Arduino. Il sistema è un prototipo che non è stato mai provato realmente, ma solo in ambiente simulato, pertanto non mi ritengo responsabile di malfunzionamenti e/o danni causati dal sistema; questo articolo vuole essere un'idea per poter realizzare qualcosa di più serio e sicuro, e spiegare come ho realizzato il prototipo utilizzando diverse tecnologie. Lo schema di funzionamento rappresentato in figura è il frutto dell'unione di elementi già esistenti che permettono di formare il sistema completo.

questo l'elenco dell'hardware e del software impiegato per il prototipo

  • Arduino UNO
  • Classe IRremote
  • PC o Netbook
  • Webcam
  • Software basato su .Net Framework 4.0
  • Software per spostare il mouse con il tracking facciale tramite webcam
  • eventuali circuiti esterni per pilotare carichi

il funzionamento del sistema si divide in due fasi denominate SETUP e OPERATIV. Nella fase di setup (quando il pin4 di Arduino si trova a livello logico alto) è possibile ricevere e decodificare il codice del telecomando e tramite il software sul pc, associarlo ad un pulsante dell'interfaccia grafica. Nella fase operativ (quando il pin4 di Arduino si trova a livello logico basso) il software sul pc permette di inviare ad Arduino il codice, associato ad un pulsante, e di riprodurre il relativo segnale ir.

Lo schema del circuito elettrico è il seguente:

 

La sezione composta da un fototransistor (IR RX) si occupa di acquisire il segnale di un telecomando, mentre il diodo IR TX permette di trasmettere un codice precedentemente memorizzato.
La sezione attuatori è composta da tre diodi led, che permettono di simulare le uscite verso relè o altri circuiti digitali. La sezione scelta modalità permette di eseguire la memorizzazione dei codici dei telecomandi piuttosto che la loro riproduzione.

il codice che gira sull'Arduino è il seguente, i diversi commenti nel codice ne spiegano il funzionamento


#include <IRremote.h>
//pin dove è collegato il fototransistor
int RECV_PIN = 2;

//oggetti per ricevere e trasmettere il segnale IR
IRrecv irrecv(RECV_PIN);
IRsend irsend;

decode_results results;

String DataIR = "";

char dataRX = ' ';
byte buffer = 0;

String codNome = "";
String codCodifica = "";
String codNumBit = "";

void setup()
{
  //pin scelta modalita SETUP-OPERATIV
  pinMode(4, INPUT);

  //inizializzazione seriale e classe ir
  Serial.begin(9600);
  irrecv.enableIRIn();
}

//Funzione per decodificare il segnale ir
void dump(decode_results *results) {

  //se non ci sono bit da decodificare esci
  if(results->bits == 0)
  {
    return;
  }

  //inizio struttura stringa da spedire al pc
  Serial.print("@");

  //restituisci il tipo di codifica
  if (results->decode_type == UNKNOWN) {
    Serial.print("???");
  }
  else
  {
    if (results->decode_type == NEC)
    {
      Serial.print("NEC");
    }
    else if (results->decode_type == SONY)
    {
      Serial.print("SON");
    }
    else if (results->decode_type == RC5)
    {
      Serial.print("RC5");
    }
    else if (results->decode_type == RC6)
    {
      Serial.print("RC6");
    }

    Serial.print("$");
    //invio il codice del telecomando
    Serial.print(results->value, HEX);

    Serial.print("$");
    //invio il numero dei bit
    Serial.print(results->bits, DEC);
  }

  //fine buffer
  Serial.println("#");

}

void loop()
{
  if(digitalRead(4) == HIGH)
  {
    //modalità registrazione segnale ir
    if (irrecv.decode(&results))
    {
      //invia al software tutti i dati
      //sul segnale ir
      dump(&results);
      // Receive the next value
      irrecv.resume();
    }
  }
  else if(digitalRead(4) == LOW)
  {
    //modalità generazione segnale ir in base a comando da pc
    //via porta seriale
    while(Serial.available())
    {
      //leggi dalla seriale il codice
      //e trasmetilo via IR
      dataRX = Serial.read();
      //scarto lil carattere @
      if(dataRX == '@')
        buffer = 0;
      else if (dataRX == '$')
      {
        buffer++;
      }
      else if (dataRX == '#')
      {
        //fine pacchetto trasmetti i dati via ir
        //Serial.println(codNome);
        //Serial.println(codCodifica);
        //Serial.println(codNumBit);

        //converte da stringa a int
        char buf_codCodifica[codCodifica.length() + 1];
        codCodifica.toCharArray(buf_codCodifica, codCodifica.length() + 1);

        char buf_codNumBit[codNumBit.length() + 1];
        codNumBit.toCharArray(buf_codNumBit, codNumBit.length() + 1);

        long lng_codCodifica = atol(buf_codCodifica);
        long lng_codNumBit = atol(buf_codNumBit);

        //Serial.println(lng_codCodifica);
        //Serial.println(lng_codNumBit);

        //trasmette il segnale
        if(codNome == "NEC")
          irsend.sendNEC(lng_codCodifica, lng_codNumBit);
        if(codNome == "SON")
          irsend.sendSony(lng_codCodifica, lng_codNumBit);
        if(codNome == "RC5")
          irsend.sendRC5(lng_codCodifica, lng_codNumBit);
        if(codNome == "RC6")
          irsend.sendRC6(lng_codCodifica, lng_codNumBit);

        //pulisci le variabili per un nuovo comando
        codNome = "";
        codCodifica = "";
        codNumBit = "";
        buffer = 0;
      }
      else
      {
        //accumula i caratteri provenienti dal pc e li dispone
        //nelle relative variabili
        if(buffer == 0)
          codNome += dataRX;

        if(buffer == 1)
          codCodifica += dataRX;

        if(buffer == 2)
          codNumBit += dataRX;
      }
    }
  }
}

L'interfaccia del software che gira sul pc è mostrata in figura

Il pulsante Avvia registrazione permette di ricevere la stringa inviata da Arduino contenente Il nome della codifica, il valore e il numero di bit che la compongono. Una volta acquisito il codice è possibile assegnarlo ad uno dei dodici pulsanti dei comandi, semplicemente cliccando sul numero di pulsante nella lista dei codici assegnati ai pulsanti e cliccando sul pulsante Assegna.
Una volta terminata la fase di registrazione e dopo aver settato il circuito nella modalità Operativ, è possibile inviare il codice del telecomando alla scheda cliccando semplicemente il pulsante relativo.

La fase successiva è quella di impiegare un software per il tracking facciale. Per la prova ho utilizzato Camera Mouse 2012 disponibile gratuitamente per il download. Avviato il software, viene rilevata automaticamente la webcam, tramite il mouse dobbiamo cliccare su un punto del viso da tracciare, ad esempio la punta del naso. Per avviare lo spostamento del mouse tramite movimenti della testa è necessario premere il tasto Ctrl della tastiera. Nella sezione settings del programma è possibile settare molti parametri tra cui la simulazione del click che viene effettuata quando il puntatore del mouse rimane, per un tempo stabilito, fermo sopra un'icona o pulsante. Quindi ritornando alla nostra interfaccia grafica, il click verrà effettuato quando il puntatore del mouse rimarrà fermo sopra un pulsante Comando.

Attualmente il progetto è in fase embrionale, bisogna ancora migliorare le funzionalità del software su pc che deve permettere anche la gestione diretta dei pin digitali della board Arduino.
Anche la gestione dei segnali ir, che attualmente vengono gestiti dalla libreria IRremote, può essere migliorata creando un sistema di acquisizione diretta dei segnali in modo da permettere la gestione di ogni tipo di telecomando, visto che nel prototipo vengono gestite solo le codifiche NEC, SONY RC5 e RC6

Aggiornamenti futuri sul prototipo su www.logicaprogrammabile.it

 

 

Scrivi un commento all'articolo esprimendo la tua opinione sul tema, chiedendo eventuali spiegazioni e/o approfondimenti e contribuendo allo sviluppo dell'argomento proposto. Verranno accettati solo commenti a tema con l'argomento dell'articolo stesso. Commenti NON a tema dovranno essere necessariamente inseriti nel Forum creando un "nuovo argomento di discussione". Per commentare devi accedere al Blog
ritratto di Emanuele

Lodevole iniziartiva

Anche se in fase embrionale (piuttosto avanzato comunque) questo progetto pone le basi a qualcosa di grandioso!
Complimenti per l'idea, ma anche per lo sviluppo tecnico. Molto semplice nei punti principali ma sicuramente complesso nei vari algoritmi di rilevazione che penso dovranno essere adattabili ai vari utilizzatori con settaggi preimpostabili e successiva autocalibrazione.

ritratto di MarcoLai

Ciao Emanuele grazie del

Ciao Emanuele
grazie del commento. Penso che il progetto ha buoni margini di miglioramento, bisogna eseguire diversi test e migliorie per renderlo più efficace e semplice da utilizzare anche da persone che non hanno nozioni tecniche, come gli utilizzatori a cui è destinato.

Grazie ancora
Marco

ritratto di LoryD

Di fonte a certi progetti

Di fonte a certi progetti molte cose sembrano inutili, mi vene in mente la twitter-toilet letta su questo blog, mi sembra utilizzasse sempre la scheda Arduino. Forse anche un pò di ironia ogni tanto ci vuole.

Ho intenzione anche io di partecipare al concorso, spero di terminare in tempo una idea. Nel frattempo voto per te.

ritratto di MarcoLai

Grazie LoryD sia del commento

Grazie LoryD
sia del commento che del voto!
Questo contest è molto interessante, a prescindere dal premio in palio, perchè credo che anche in italia nel nostro piccolo ci sono persone che hanno voglia di fare, di costruire e cercare di dare un segno dimostrando con questi progetti idee e prototipi che anche in questo paese si possono fare, ancora, grandi cose

a presto
Marco

ritratto di alexxandro.p

Alessandro

Veramente molto interessante. Sarei veramente curioso di vederlo in funzione.

ritratto di Piero Boccadoro

Beh, il bello di Arduino è

Beh, il bello di Arduino è che "fare" le cose non è poi così complicato :)
Inoltre questo Review4U propone proprio un Arduino in omaggio quindi io ti propongo: perchè non pensi ad una soluzione per completare o espandere o migliorare il progetto e la proponi?
Trovi l'articolo qui:
http://it.emcelettronica.com/arduino-nuovamente-lospite-donore-del-review4u
In bocca al lupo :)

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Chi è online

Ultimi Commenti