quinta-feira, 16 de dezembro de 2010

FireTracker


Bibliotecas Utilizadas:

Descrição:

Esta aplicação utiliza um wiimote para encontrar chamas e segui-las.

Para conectar o wiimote basta clicar nos botões 1 e 2 ao mesmo tempo e esperar que as luzes parem de piscar.

Na imagem vêem-se várias linhas verticais, as brancas representam o centro das chamas, as azuis representam a posição mínima e máxima das linhas brancas para, caso a porta COM já tenha sido definida, que se mande o robot mover-se para a frente, esquerda ou direita.

As linhas azuis podem ser ajustadas utilizando os sliders correspondentes.

Podem ser enviados comandos por serial (w,s,a,d and g) a 4800 baud para a porta COM que se especificar na caixa de texto, basta lá escrever, por exemplo "COM5" e premir a tecla ENTER.

segunda-feira, 6 de dezembro de 2010

Utilizar o Wiimote com processing

Wii Remote ou Wiimote

O wiimote é um controlador muito bom para usar com processing e com robots. Tem vários botões, acelerómetros  e até uma câmara que dá as coordenadas das quatro maiores fontes de radiação infravermelha detectadas.

Existem vários exemplos de aplicações que o usam, sendo que umas das mais populares são do Johnny Chung Lee. Mas existem muitas mais, basta pesquisar por "wiimote" ou "wiimote robot" no youtube ou no google. No LetsMakeRobots existem várias como:
E outras apenas com a câmara:

Mas o que eu quis fazer foi utilizar o comando, sem ter de o modificar para controlar o meu robot TheBox, comunicando com o processing por bluetooth.
O software que tenho instalado no computador é o WIDCOMM bluetooth software que pode ser encontrado aqui.

Para instalar as bibliotecas no porcessing segui este tutorial (em Inglês).
Como tive alguns problemas a colocar as pastas aqui fica um esquema simples:
+ Prossessing
    + libraries
        + Loc
            + library
                - Loc.jar
            + lll
                + Loc
                     - ...
        + wrj4P5
            + library
                - bluecove-2.1.0.jar
                - bluecove-gpl-2.1.0.jar
                - WiiRemoteJ.jar
                - wrj4P5.jar
                - Loc.jar (optional)
            + lll
                + wrj4P5     
                    - ...

Para testar se tudo está a funcionar bem podem se utilizar estas aplicações encontradas aqui:
Se funcionarem bem pode-se passar para o próximo passo, a parte da comunicação serial com o robot.

A aplicação MyFirstWii é muito fácil de adaptar.  
Tudo o que se tem de fazer é importar a biblioteca serial, criar um objecto serial, definir a porta COM e o baud
e adicionar o envio da informação para o robot na zonas onde a informação dos botões é analisada. Aqui fica um exemplo. 
import processing.serial.*;
import lll.wrj4P5.*;
Wrj4P5 wii;
Serial TheBox;
void setup() {
  size(300,300,P3D);
  wii=new Wrj4P5(this);
  wii.connect();
  TheBox = new Serial(this, "COM5", 4800);
void draw() {
  background(0);
  stroke(255);
  translate(300/2,300/2,0);
  lights();
  rotateX((int) (wii.rimokon.senced.x*30+300));
  rotateY((int) (wii.rimokon.senced.y*30+300));
  rotateZ((int) (wii.rimokon.senced.z*30+300));
  box(100,100,100);
}
void buttonPressed(RimokonEvent evt, int rid) {
   if (evt.wasPressed(RimokonEvent.TWO)) println("2");
   if (evt.wasPressed(RimokonEvent.ONE)) println("1");
   if (evt.wasPressed(RimokonEvent.B)) {
     println("B");
     TheBox.write('g'); 
    }
   if (evt.wasPressed(RimokonEvent.A)) println("A");
   if (evt.wasPressed(RimokonEvent.MINUS)) println("Minus");
   if (evt.wasPressed(RimokonEvent.HOME)) println("Home");
   if (evt.wasPressed(RimokonEvent.LEFT)){
     println("Left");
     TheBox.write('a'); 
    }
   if (evt.wasPressed(RimokonEvent.RIGHT)){
     println("Right");
     TheBox.write('d');      
    }
   if (evt.wasPressed(RimokonEvent.DOWN)){
     println("Down");
     TheBox.write('s'); 
    }
   if (evt.wasPressed(RimokonEvent.UP)){
     println("Up");
     TheBox.write('w'); 
    }
   if (evt.wasPressed(RimokonEvent.PLUS)) println("Plus");
}

E aqui pode-se ver o meu robot a funcionar com o código anterior.