Llibreria WiiC

De Wikijoan
Dreceres ràpides: navegació, cerca

Contingut

Introducció

The Wii Remote, informally known as Wiimote, is a Human-Interface Device (HID) that communicates through Bluetooth protocol. The controller consists of the following sensors and features:

Reconeixement de la Wiimote

Necessitem:

Per comprovar que el sistema detecta el WIIMOTE (el comandament de la Wii), pitgem els botons 1 i 2 del comandament simultàniament i executem en el terminal:

$ hcitool scan
Scanning ...
	00:1F:C5:67:4A:84	Nintendo RVL-CNT-01

Instal.lació de la llibreria Wiic

WiiC is a C/C++ library to control Wii devices, such as: Wiimote, Nunchuck, Classic controller, Guitar Hero 3, Motion Plus and Balance Board. WiiC is supported on Linux and Mac platforms, and it is composed of two layers:

  1. WiiC is the C layer, which extends the well known Wiiuse library, fixing some minor bugs, porting it on Mac platforms, and adding some novel functionality, such as the Motion Plus and Balance Board support.
  2. WiiCpp is the C++ layer, which is an extension of the well known library WiiuseCpp, and it is embedded in WiiC. The main advantage is that every novel functionality in the C layer is applied to WiiCpp as well.
Em descarrego la última versió de http://sourceforge.net/projects/wiic/files/: wiic_1.1.tar.gz

Platforms and dependencies for Linux:

Comprovo amb el Synaptic que Bluez ja està instal.lat.

$ sudo apt-get install cmake

Compilació:

Nota: la compilació ha fallat perquè tot i que funciona el bluetooth, no tinc les llibreries dev:

$ cmake ../src
...
CMake Error at cmake_modules/FindBluetooth.cmake:20 (MESSAGE):
Could not find Bluetooth.  Please install Bluetooth package
...
$ sudo apt-get install libbluetooth-dev
$ cd ~/WiiC/
$ mkdir build
$ cd build
$ cmake ../src
$ make

I és tan fàcil com mirar algun dels exemples que hi ha a la carpeta bin/: (he d'apretat alhora el botó 1 i 2 per detectar el comandament):

$ ./wiic-example

INFO] Found 1 bluetooth device(s).
[INFO] Found wiimote (00:1F:C5:67:4A:84) [id 1].
[INFO] Connected to wiimote [id 1].
Connected to 1 wiimotes (of 1 found).

Press PLUS (MINUS) to enable (disable) Motion Sensing Report (only accelerometers)
Press RIGHT (LEFT) to enable (disable) Motion Plus (requires Motion Sensing enabled)
Press UP (DOWN) to enable (disable) IR camera (requires some IR led)


--- CONTROLLER STATUS [wiimote id 1] ---
attachment:      0
speaker:         0
ir:              0
leds:            1 0 0 0
battery:         0.755000 %

Programar el sensor IR de la Wiimote

Es pot treballar amb C o amb C++. Tota la documentació de l'API està a:

Significat de la informació que ens dóna el sensor IR. Hi ha quatre classes a la API relacionades amb IR: CIR, CIR_DOT, ir_t, ir_dot_t. Sembla ser que dot duu voler dir punt de llum.


No queda molt clar el funcionament de la càmera IP de la Wiimote. Per fer un theremin necessito dos punts de llum IR independents, i la wiimote sí que ho pot detectar, tot i que no sé si la llibreria Wiic em deixarà fer-ho (almenys els exemples wiic-example i wiicpp-example no em donen aquesta informació). Queda clar que es pot fer en aquest article:

The Wii IR camera is a beautiful thing. It has an integrated processor which outputs the X and Y positions and size of the 4 brightest IR points that is sees. This can be very useful for tracking in robotics or human interfaces. 

El sensor bar que utilitza la wii també es basen en aquest principi: hi ha dos fonts de llum separades una distància de 30cm.

Clar que el problema podria estar en què s'ha d'habilitar la IR camera 2:

El codi font de l'exemple wiic-example està a ~/WiiC/src/bin/example.c (i el codi font de l'exemple wiicpp-example està a ~/WiiC/src/bin/example.cpp). Com es pot veure en el codi, en principi es busca en qualsevol de les quatre fonts IR que hi pot haver:

	/*
	 *	If IR tracking is enabled then print the coordinates
	 *	on the virtual screen that the wiimote is pointing to.
	 *
	 *	Also make sure that we see at least 1 dot.
	 */
	if (WIIC_USING_IR(wm)) {
		int i = 0;

		/* go through each of the 4 possible IR sources */
		for (; i < 4; ++i) {
			/* check if the source is visible */
			if (wm->ir.dot[i].visible)
				printf("IR source %i: (%u, %u)\n", i, wm->ir.dot[i].x, wm->ir.dot[i].y);
		}

		printf("IR cursor: (%u, %u)\n", wm->ir.x, wm->ir.y);
		printf("IR z distance: %f\n", wm->ir.z);
	}

Ara bé, amb les proves que estic fent només detecta la IR source 0, encara que tingui dues espelmes de igual intensitat. Això vol dir que els altres IR Sensors estan deshabilitats, i suposo que es podran habilitar programàticament amb la funció SetMode de la classe CIR:

void SetMode 	( 	CIR::OnOffSelection  	State 	 )  

El primer que hauria de fer és com compilar un projecte que utilitzi la llibreria WiiC:

SOLUCIÓ per treballar amb dos sensors IR. Doncs ja és la configuració per defecte, no hi ha problema. Ara bé, molt de compte amb les bombetes incandescents que interfereixen molt el senyal, i que el camp de visió és una mica limitat: és bo ficar la wiimote sobre un trípode. Veiem que quan tinc dos fonts IR es detecta els dos senyals:

--- EVENT [id 1] ---
IR source 0: (476, 489)
IR source 1: (610, 506)
IR cursor: (311, 213)
IR z distance: 887.925964

i això és el que es necessita per fer un theremin. Amb la combinació de la informació dels dos sensors, i per triangulació, es pot fer un cursor i es pot calcular la distància z.

compilació d'un projecte fet amb WiiC

He compilat el projecte, però de fet no l'he instal.lat. L'instal.lo:

$ cd /build
$ sudo make install

Install the project...
-- Install configuration: ""
-- Installing: /usr/local/lib/libwiic.so
-- Installing: /usr/local/include/wiic/wiic.h
-- Installing: /usr/local/include/wiic/wiic_functions.h
-- Installing: /usr/local/include/wiic/wiic_macros.h
-- Installing: /usr/local/include/wiic/wiic_structs.h
-- Installing: /usr/local/lib/libwiicpp.so
-- Removed runtime path from "/usr/local/lib/libwiicpp.so"
-- Installing: /usr/local/include/wiic/wiicpp.h
-- Installing: /usr/local/include/wiic/training.h
-- Installing: /usr/local/include/wiic/dataset.h
-- Installing: /usr/local/include/wiic/sample.h
-- Installing: /usr/local/include/wiic/accsample.h
-- Installing: /usr/local/bin/wiic-example
-- Removed runtime path from "/usr/local/bin/wiic-example"
-- Installing: /usr/local/bin/wiicpp-example
-- Removed runtime path from "/usr/local/bin/wiicpp-example"
-- Installing: /usr/local/bin/wiic-logger
-- Removed runtime path from "/usr/local/bin/wiic-logger"

Fixem-nos que no s'instal.la a /usr/local/include/ sinó que s'instal.la a /usr/local/include/wiic/, i per tant, si copio l'example.c a la $HOME, el puc compilar fent:

$ gcc -Wall -I/usr/local/include/wiic/ -o wiic-example -lwiic example.c

$ ./wiic-example 
./wiic-example: error while loading shared libraries: libwiic.so: cannot open shared object file: No such file or directory

La manera més fàcil de solucionar-ho és:

$ LD_LIBRARY_PATH=/usr/local/lib
$ export LD_LIBRARY_PATH
$ ./wiic-example 

creat per Joan Quintana Compte, febrer 2012

Eines de l'usuari
Espais de noms
Variants
Accions
Navegació
IES Jaume Balmes
Màquines recreatives
CNC
Informàtica musical
joanillo.org Planet
Eines