Feb 10, 2011

Comandament pel Televisor amb Kinect

Kinect + OpenNi + Osceleton + Processing + Arduino + Windows


1- Primer de tot hem de instal·lar els driver i el paquet SDK de OpenNI. Per fer-ho segueix el següent enllaç:
compte amb el pas 4, seria millor que seguir el pas 4 suggerit aquí:

2- Baixa i descomprimeix OSCeleton-1.0_win32.zip al següent enllaç:

3 - Per usar Osceleton a Processing segueix el següent enllaç:

4 - Per usa Arduino com a comandament infraroig del televisor segueix l'enllaç:

5 - Finalment per usar-ho, executa Osceleton, executa el codi el codi Arduino i finalment el codi Processing.
Recorda que cal posar-te en posició 'Croisant' per que Osceleton et reconegui.
Per cert et recomano que iniciis Oceleton amb els paràmetres '-w -r' que mostra la càmera infraroja en imatge no especular (-h es ajuda).

6- El codi Arduino i Processing a continuació:

Codi Arduino:
/*
* IRremote: IRsendDemo - demonstrates sending IR codes with IRsend
* An IR LED must be connected to Arduino PWM pin 3.
* Version 0.1 July, 2009
* Thans to Ken Shirriff for IR code
* http://arcfn.com
*/
// http://www.benryves.com/products/sonyir
// http://www.arcfn.com/search/label/ir
// http://lirc.sourceforge.net/remotes/sony/RM-ED035
// http://www.arcfn.com/2010/03/understanding-sony-ir-remote-codes-lirc.html

#include

IRsend irsend;
unsigned long irCommand;
byte command;

void setup() {
  Serial.begin(115200);
}


void loop() {
  if (Serial.available() >=6) {
    if(Serial.read()==0xFF && Serial.read()==0xFE && Serial.read()==0xFD && Serial.read()==0xFC){
      command = Serial.read();
      Serial.flush();

      switch(command){
        case 1:
          irCommand = 0x30; break; // Send AV1 Command
       case 2:
         irCommand = 0x250; break; // Send TV Command
      }

      for (int i = 0; i < 4; i++) {
        irsend.sendSony(irCommand, 12);
       delay(40);
      }
      delay(100);
    }
  }
}


Codi Processing:

Canvieu el mètode 'draw()' de l'exemple 'Stickmanetic' del conjunt d'exemples d'Oscelleton que podeu descarregar aquí:

import processing.serial.*;

Serial port;

void draw() {
  for (Skeleton s: skels.values()) {
    if((s.rHandCoords[1] < s.headCoords[1]) && (s.lHandCoords[1] > s.headCoords[1])){ // si la ma dreta es per sobre del cap
      port.write(0xFF); port.write(0xFE); port.write(0xFD); port.write(0xFC); port.write((byte)1);
    }else if((s.rHandCoords[1] < s.headCoords[1]) && (s.lHandCoords[1] < s.headCoords[1])){
      port.write(0xFF); port.write(0xFE); port.write(0xFD); port.write(0xFC); port.write((byte)2);
    }
  } 
}

i afageix la següent línia al mètode 'setup()':
port = new Serial(this, Serial.list()[0], 115200);