FireTracker_0.zip (1185Bytes)
The wiimote is a really cool controller to use with your robots. It has many buttons, accelerometers and even a camera which tells the coordinates of the four principal IR emitters that it sees.
There are many examples of applications using it, some of the most populars are from Johnny Chung Lee. But there are much more, just search for "wiimote" or "wiimote robot" on youtube or google. Here on LMR we have some examples too:
And others with just its camera:
But I wanted to use it, without having to hack it, to communicate with processing and control my robot TheBox.
On my computer I have installed WIDCOMM bluetooth software which I found here.
If you've never used processing you should take a look here.
To install the processing libraries I followed this tutorial.
I had some problems placing the folders so here is a simple scheme:
+ 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
- ...
To test if it is all working you can try these examples found here:
If they work, you can pass to the next step, the serial communication with your robot.
The application MyFirstWii is really easy to adapt. On the movie you can see my robot TheBox using it.
All you have to do is to import the serial library, create a serial object, define the COM port & the baud rate and add the serial communication where the data about the buttons is analyzed. Here is an example:
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");
}
I didn't found the IR Sensor Tesr application easy to understand and modify, so I decided to write a new one which I believe it's more practical to use:
import lll.wrj4P5.*;
import lll.Loc.*;
Wrj4P5 wii;
float x;
float y;
float w;
float h;
//Change here:
//Size of the window
int camWidth = 512;
int camHeight = 384;
//Number of IR Emmiters that you want to track
int IREmitters = 4;
void setup() {
size(camWidth,camHeight);
wii=new Wrj4P5(this).connect(Wrj4P5.IR);
}
void draw() {
//Defines Background color
background(0);
//Draws ir emitters
for (int i=0;i<IREmitters;i++) {
Loc p=wii.rimokon.irLights[i];
if (p.x>-1) {
// Reads the value sent by the wiimote and multiplicities them by the size of the window
x=((p.x)*camWidth);
y=((1.-p.y)*camHeight);
w=p.z*50;
h=p.z*100;
//Prints the values to the console
print(x);
print(" ");
print(y);
print(" ");
print(w);
print(" ");
println(h);
//Draws the circles
noStroke();
fill(255,255,0);
ellipse(x, y, w, h);
//Draws the lines
stroke(255);
line(x,0,x,camHeight);
line(0,y,camWidth, y);
delay(50);
}
}
}
I developed this code and created another application to my robot which you can download here. It seems to work well, but how the robot is having some motors problems, I didn't had chance to test it with it, but you can see the test I did on the second movie. The application uses this library.
https://www.youtube.com/watch?v=jM6HBxXWXEcComments, advices, doubts and suggestions are always welcome! :)