TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Alcaparrones en 15 de Mayo de 2010, 08:34:02

Título: Wii motion plus, Nunchuk y 16f886. Ménage á trois de lujo
Publicado por: Alcaparrones en 15 de Mayo de 2010, 08:34:02
Buenas. Hace tiempo que no posteaba (muuuucho), tanto que el correo con el que me registré ya ni existe, y olvidé mi contraseña. En fin, vamos al ajo.
Hace un tiempo me agencié un wiimote con su wii motion plus, una auténtica mina de hardware interesante y barato. Más aún, como ya sabreis el wii motion plus es un añadido que se conecta al wiimote por i2c, por lo que se podría conectar fácilmente a un pic. ¡Por fin un giroscopio de 3 ejes a un precio increible!
Esa es la teoría. Por mucho que he buscado ejemplos por internet lo único que encuentro es gente conectándola a Arduino, pero a pic's nada de nada. Usando de ejemplo códigos para arduino y documentándome un poco en la wii brew he programado un 16f886 (es un 16f876a, pero más moderno) usando ccs, pero no hay manera de hacerlo funcionar. Básicamente lo que hago es intentar leer el wiimotion y mandar el resultado por rs232 al pc. Aparentemente todo está bien, el pic funciona pero no recibo nada del wiimotion. Además, cuando intento verificar el bit ack ( es lo que devuelve el comando i2c_write() ) nunca es 0, que significaría que el comando resultó exitoso, no?

En fin, aquí os dejo el código que he escrito, a ver si veis al menos algún error de bulto, que no soy precisamente un genio programando. Por cierto, me basé en este ejemplo: Ejemplo código Arduino (http://randomhacksofboredom.blogspot.com/2009/06/wii-motion-plus-arduino-love.html)
Maldito Arduino!, guerra con él!  :5]

CÓDIGO ACTUALIZADO¡Ya funciona!

A tener en cuenta ¡:
- No se necesitan pullups en la conexión i2c, ya los llevan los accesorios (WM+, nunchuk...)
- El pic va a 5v pero los accesorios del wiimote a 3.3v. Puedes usar 5v para probar en la protoboard, pero no en un proyecto "formal".

Código: [Seleccionar]
#include <16F886.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES PUT                    //No Power Up Timer
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOCPD                    //No EE protection
#FUSES BROWNOUT               //No brownout reset
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOWRT                    //Program memory not write protected
#FUSES BORV40                   //Brownout reset at 4.0V
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#use delay(clock=20000000)
#use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use i2c(Master,sda=PIN_B5,scl=PIN_B4,fast)
//La conexión i2c en teoría solo funciona en el puerto B del pic
//El puerto C solo admite conexión TTL, los accesorios del wiimote
//funcionan a 3.3v


int16 yaw=0,yaw0=0;
int16 pitch=0,pitch0=0;
int16 roll=0,roll0=0;



void inicio_nunchuk()       //conexión desencriptada!
{
   i2c_start();
   i2c_write(0xA4);
   i2c_write(0xF0);
   i2c_write(0x55);
   i2c_stop();
   delay_ms(1);
   i2c_start();
   i2c_write(0xA4);
   i2c_write(0xFB);
   i2c_write(0x00);
   i2c_stop();
}

void inicio_wm()
{
   i2c_start();
   i2c_write(0xA6);
   i2c_write(0xFE);  
   i2c_write(0x04);
   i2c_stop();
}  

void pedir_datos()
{  
   i2c_start();
   i2c_write(0xA4);
   i2c_write(0x00); //Se manda 0 antes de cada petición de datos
}

void calibrar_ceros()
{
int i,p;
int datos[6];

for (i=0;i<10;i++){
 pedir_datos();
 delay_ms(1);
 i2c_start();
 i2c_write(0xA5);
 for (p=0;p<5;p++){
  datos[i]=i2c_read();
 }
 datos[5]=i2c_read(0);
 i2c_stop();
  
  //FALTA ORDENAR ADECUADAMENTE LOS BYTES!
  
  yaw0+=(((datos[3]>>2)<<2)+datos[0])/10;  //La media de 10 mediciones
  roll0+=(((datos[4]>>2)<<2)+datos[1])/10;
  pitch0+=(((datos[5]>>2)<<2)+datos[2])/10;
  
}
}



void main()
{
 int buffer_232,t;
 int datos[6] = {0};
 int joy_x_axis,joy_y_axis;
 int16 accel_x_axis,accel_y_axis,accel_z_axis;
 int z_button,c_button;

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard


 printf("\r\nDebug Wii Motion Plus");
 printf("\r\n l=lectura_datos nunchuk");
 printf("\r\n k=lectura datos WM+");
 printf("\r\n\n");

 while(1) {
 buffer_232=getc();

 if (buffer_232=='l') {
 inicio_nunchuk();
 delay_ms(100);
 while(1) {
  pedir_datos();
  delay_ms(1);
  i2c_start();
  i2c_write(0xA5);
  
 for (t=0;t<5;t++)  
  datos[t] = i2c_read();
 datos[5] = i2c_read(0);  //último read no devuelve bit ack

 i2c_stop();

// Ahora preparo los datos
// la lectura del acelerómetro ocupa 10 bits
// así que leo 8 bits y le añado los 2 restantes.
// Por eso voy a multiplicarlos *2*2 (10 bits = 2^10)

  joy_x_axis = datos[0];
  joy_y_axis = datos[1];
  accel_x_axis = datos[2] * 2 * 2;
  accel_y_axis = datos[3] * 2 * 2;
  accel_z_axis = datos[4] * 2 * 2;

  z_button = 0;
  c_button = 0;

 // El byte datos[5] contiene bits para los botones z y c
 // también contine los bits menos significativos del acelerómetro
 // así que comprobamos cada bit de datos[5]
  if ((datos[5] >> 0) & 1) z_button = 1;
  if ((datos[5] >> 1) & 1) c_button = 1;
  if ((datos[5] >> 2) & 1) accel_x_axis += 2;
  if ((datos[5] >> 3) & 1) accel_x_axis += 1;
  if ((datos[5] >> 4) & 1) accel_y_axis += 2;
  if ((datos[5] >> 5) & 1) accel_y_axis += 1;
  if ((datos[5] >> 6) & 1) accel_z_axis += 2;
  if ((datos[5] >> 7) & 1) accel_z_axis += 1;
    

  printf("\rJoy_x=%d",joy_x_axis);
  printf (" Joy_y=%d",joy_y_axis);
  printf(" Ace_x=%Ld",accel_x_axis);
  printf(" Ace_y=%Ld",accel_y_axis);
  printf(" Ace_z=%Ld",accel_z_axis);
  printf(" Botón_z=%d",z_button);
  printf(" Botón_zc=%d    ",c_button);
}
}
 

 if (buffer_232=='k') {
 inicio_wm();
 delay_ms(100);
// calibrar_ceros();  Puesta a cero desactivada hasta ordenar los bytes bien
 while(1) {
   pedir_datos();
  delay_ms(1);
  i2c_start();
  i2c_write(0xA5);
  
 for (t=0;t<5;t++)  
  datos[t] = i2c_read();
 datos[5] = i2c_read(0);

 i2c_stop();
 

  //FALTA ORDENAR ADECUADAMENTE LOS BYTES!
  
  yaw=((datos[3]>>2)<<2)+datos[0]-yaw0;
  roll=((datos[4]>>2)<<2)+datos[1]-roll0;
  pitch=((datos[5]>>2)<<2)+datos[2]-pitch0;
  printf("\r%Ld %Ld %Ld  ",yaw,roll,pitch);

  }
}
 }
 }
Título: Re: Wii motion plus y 16f886
Publicado por: alcubo01 en 15 de Mayo de 2010, 09:29:33

 He echado un vistazo al codigo, a ver si es útil esto...

 - ¿Has probado i2c a 100Khz como recomiendan usar?

 - En el código para leer pones

Código: [Seleccionar]
while(1) {
  pedir_datos();
  i2c_start();
  i2c_write(0x52);
  delay_us(100);
for (t=0;t<6;t++)
   datos[t]=i2c_read();

 El último i2c_write(0x52) creo que debería ser i2c_write(0x53) es decir con el bit de lectura/escritura a 1 porque ahora quieres leer.


 Un saludo y ya nos cuentas...
Título: Re: Wii motion plus y 16f886
Publicado por: Alcaparrones en 16 de Mayo de 2010, 05:57:00
Buenas, gracias por responder.
Ya probé a 100khz y nada. Aunque varias fuentes afirman que es mejor primero probar a 100khz por si acaso, en el wiibrew (http://wiibrew.org/wiki/Wiimote/Extension_Controllers) afirman que la conexión va en fast, o sea, 400Khz.
Sobre el tema de las direcciones del esclavo (pic maestro, WM+ esclavo), según tengo entendido el tema va así: al conectar el WM+ éste está desactivado, permitiendo que cualquier otro dispositivo, un nunchuk por ejemplo (recordad que el WM+ tiene otra ranura que es por donde se conectan las cosas, ya que el WM+ ocupa la del wiimote), sea el que ocupe la dirección 0x52 que es la dirección del esclavo i2c en ese momento activo. Pues bien, el WM+ permanece inactivo en la dirección 0x53 hasta que se le manda el dato 0x04 a la posición de memoria 0xFE, momento en el que el WM+ se activa pasando a ocupar la posición 0x52. Ahora el WM+ está preparado para dejar 6 bytes de informacion ( formato de los bytes (http://wiibrew.org/wiki/Wiimote/Extension_Controllers#Data_Format_.28Wii_Motion_Plus.29) ), pero primero hay que pedirle que se prepare para mandarlos, enviando 0x00 a 0x52. Después sólo queda leer los 6 bytes. Yo además los mando por rs232 para ver los cambios.
Por cierto, pongo de pullup en las lineas datos y clock del i2c dos resistencias de 10k, esto va bien no?.  La verdad es que mi experiencia con el i2c es más bien escasa. He intentado monitorizar con un osciloscopio el bus i2c, pero lo cierto es que no sé ni qué es lo que tengo que observar, ni si va bien o mal.
En fin, perdón por el rollo. La verdad es que no entiendo como nadie en este foro ha intentado esto antes. ¿Tan ocupados estais? ¿o soy yo el ocioso sin remedio  :-/?

Un saludo.
Título: Re: Wii motion plus y 16f886
Publicado por: migsantiago en 16 de Mayo de 2010, 10:28:07
En fin, perdón por el rollo. La verdad es que no entiendo como nadie en este foro ha intentado esto antes. ¿Tan ocupados estais? ¿o soy yo el ocioso sin remedio  :-/?

Un saludo.

Yo tengo el wiimote con el motion plus pero sólo los he probado a nivel bluetooth y no I2C.

Si logras hacerlo funcionar serás el primero en publicar el código en Todopic.
Título: Re: Wii motion plus y 16f886
Publicado por: Alcaparrones en 20 de Mayo de 2010, 18:12:05
Buenassss  :-/
Se me ve contento, ¿no? ¿me ha tocado una cena con Scarlet Johanson? ¡qúe más quisiera ella! ¡ya leo el WM+, y como extra el Nunchuk!!!
Pues sí amigos, de no saber que en una conexión i2c la dirección para leer es la siguiente a la de escritura (ya me vale...) a leer los accesorios del wiimote. Ha resultado ser un desafio bastante gordo para mí, pero no hay nada que no se solucione leyendo y leyendo, y usando el típico "ensayo-error" en la protoboard, claro. Me ha costado la vida averiguar la forma de activación de los accesorios, luego me entero de que los datos están encriptados (solo me salía FF por todos lados) y para finalizar algunos bytes (de 8 bits) tienen bits que completan otros bytes de diferente longitud... Una odisea, vamos.
Por cierto, la lectura para el nunchuk está correcta, pero la del WM+ no puesto que no he introducido una rutina para ordenar los bytes. Tengo dudas de como coger bits de diferentes bytes e introducirlos en otro byte diferente de diferente longitud. ¿Alguna idea? (orden de los datos en los bytes AQUÍ (http://wiibrew.org/wiki/Wiimote/Extension_Controllers#Data_Format_.28Wii_Motion_Plus.29)). Y ya que nos ponemos, sería interesante introducir rutinas que tengan en cuenta cuando se desenchufa y se vuelve a enchufar un accesorio, que el pic busque, identifique e inicie el dispositivo de forma automática (esto creo que es fácil, a lo mejor me animo  ;-)) o el poder usar el Nuchuk a través del WM+ (quizás esto no es tan interesante para nosotros).

He actualizado el primer post para no confundir a la gente con el primer código que publiqué, introduciendo el nuevo y mejorado. Un saludo.
Título: Re: Wii motion plus, Nunchuk y 16f886. Ménage á trois de lujo
Publicado por: migsantiago en 20 de Mayo de 2010, 21:45:28
Enhorabuena por el logro  :mrgreen:
Título: Re: Wii motion plus, Nunchuk y 16f886. Ménage á trois de lujo
Publicado por: alcubo01 en 11 de Junio de 2010, 05:48:13

 Enhorabuena por el gran avance, como tu dices puede ser una manera muy buena de obtener un giroscopo a bajo coste!!
Título: Re: Wii motion plus, Nunchuk y 16f886. Ménage á trois de lujo
Publicado por: Nocturno en 11 de Junio de 2010, 06:04:56
¡Qué interesante!, muchas gracias por la aportación.
A ver si nos enseñas algunas imágenes del invento.
Título: Re: Wii motion plus, Nunchuk y 16f886. Ménage á trois de lujo
Publicado por: sokoloko en 06 de Junio de 2011, 19:05:32
Hola!!!!

Aunq el post es de hace tiempo, no veo nada igual publicado en ningun otro.

En primer lugar Alcaparrones, felicidades por el proyecto, yo llevo un par de semanas intentando hacer lo mismo que tu y por casualidad di con tu codigo, menuda suerte!!!! :-/ Yo lo quiero para el control autoestable de un quadricoptero.

El problema es que tras adaptarlo al PIC que tengo, un 16f88 (y sin NUNCHUK pues aun no me ha llegado), no me funciona. En vez de sacar los datos por el PC, los saco directamente a un LCD.

Si no hago llamadas a traves del I2C, el programa y el LCD funcionan, pero en cuanto llamo alguna funcion del WMP, se queda el display superior todo en negro.

No pongo resistencias pull-up pues ya las trae y lo alimento a 5V pues trae un conversor el propio WMP a 3,3V. No que cuadra mucho que si lees en otros programas para arduino, dicen que la direccion del WMP para I2C es 0x52, y tu esa direccion no la usas.

Este es el codigo por si alguno puede ayudarme y ve algun fallo:

Código: [Seleccionar]
#include <16F88.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES PUT //No Power Up Timer
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#FUSES BROWNOUT //No brownout reset
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOWRT //Program memory not write protected
#FUSES RESERVED //Used to set the reserved FUSE bits

#use delay(clock=8000000)
#use i2c(Master,sda=PIN_B1,scl=PIN_B4,fast)
#include <LCD_PORT_A.c>                   //libreria manejo lcd

int t;
int datos[6] = {0};

void inicio_wm() {
   i2c_start();
   i2c_write(0xA6);
   i2c_write(0xFE);  
   i2c_write(0x04);
   i2c_stop();
}  

void pedir_datos() {  
   i2c_start();
   i2c_write(0xA4);
   i2c_write(0x00); //Se manda 0 antes de cada petición de datos
}

void LCD(){
lcd_gotoxy(1,1);
printf(lcd_putc,"Yaw- Roll -Pitch");
//lcd_gotoxy(1,2);
//printf(lcd_putc,"03%u - 03%u - 03%u",datos[1],datos[2],datos[3]);  //Yaw,Roll,Pitch);
delay_ms(30);
}

void main() {

lcd_init();

setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard

inicio_wm();
delay_ms(10);

while(1) {
pedir_datos();
delay_ms(1);
i2c_start();
i2c_write(0xA5);
 
for (t=0;t<5;t++)  
datos[t] = i2c_read();

datos[5] = i2c_read(0);
i2c_stop();

LCD();
}
}

Título: Re: Wii motion plus, Nunchuk y 16f886. Ménage á trois de lujo
Publicado por: Alcaparrones en 07 de Junio de 2011, 13:05:43
Buenas Sokoloko

La verdad es que este proyecto lo dejé hace un tiempo precisamente por tener problemas con la conexión con el WMP. Sin embargo y para felicidad mia hace unos dias lo retomé y conseguí finalmente la conexión, qué casualidad no?  :-/

Para empezar un pequeño error mio que mejor que soluciones:
Código: [Seleccionar]
void pedir_datos()

   i2c_start();
   i2c_write(0xA4);
   i2c_write(0x00); //Se manda 0 antes de cada petición de datos
}
Aquí se me olvidó cerrar la conexión con i2c_stop(). De todas formas, en el siguiente i2c_start() la conexión se reinicia y no hay más problema, a mí me funcionó bien con el nunchuk hasta que me di cuenta pero, por si acaso, añádele este comando.

Bueno, supondré que el LCD lo tienes bien conexionado y que te has asegurado de que representa bien los datos que le mandas. También de que has conexionado bien el WMP. Preguntas por qué no uso la dirección 0x52 para comunicarme con el WMP. Bien, si usas una calculadora científica capaz de pasar de hexadecimal a decimal y etc (como la que trae win7) observarás que 52 de hexadecimal pasado a binario es 1010010. Esto son 7 bits y el compilador de CCS requiere direcciones de 8 bits siempre. Por lo tanto para rellenar añadimos un 0 al final, osea, 10100100 que en hexadecimal es A4, precisamente la dirección que uso en mi ejemplo, lo pillaste?. Lo mismo para la dirección A6 (53).

Por otro lado, la función inicio_wm() la he cambiado recientemente por otra ya que a veces me ha fallado y no ha iniciado el WMP. Esta es la que uso actualmente con buenos resultados:

Código: [Seleccionar]
void inicio_wm()
{
   i2c_start();
   i2c_write(0xA6);
   i2c_write(0xF0);
   i2c_write(0x55);
   i2c_stop();
   delay_ms(1);
   i2c_start();
   i2c_write(0xA6);
   i2c_write(0xFE); 
   i2c_write(0x04);
   i2c_stop();   
   delay_ms(1);
   i2c_start();
   i2c_write(0xA4);
   i2c_write(0xFB);
   i2c_write(0x00);
   i2c_stop();
}


También he ordenado adecuadamente los datos que obtengo con el WPM, al menos eso creo por lo que he podido observar. Te muestro dos códigos que difieren ligeramente, prueba ambos a ver cual te convence más, yo a ver si los comparo suficientemente y averiguo cuál es mejor aunque seguramente sean iguales. Estas son las variables que tienes que enviar al lcd, puedes definirlas como int. Inserta esto después de obtener los datos por i2c:

Código: [Seleccionar]
   
    roll = (((datos[4]&0xFC)<<6) + datos[1]);
    pitch = (((datos[5]&0xFC)<<6) + datos[2]);
    yaw = (((datos[3]&0xFC)<<6) + datos[0]);
 
Código: [Seleccionar]
   yaw=((datos[3]>>2)<<8)+datos[0];
   pitch=((datos[4]>>2)<<8)+datos[1];
   roll=((datos[5]>>2)<<8)+datos[2];

Después de cualquiera de los dos párrafos anteriores te invito a que insertes otro más, esta vez para mostrar los bits que el WMP envía para saber el "modo de velocidad" del giroscopio. Para saber más mira en internet. Los valores posibles son 0 o 1, así que puedes definir estas nuevas variables como int1.

Código: [Seleccionar]
    roll_fs = (datos[4]&0x02)>>1;
    pitch_fs = (datos[3]&0x01);
    yaw_fs = (datos[3]&0x02)>>1;

Con el WMP parado mostrarán 0, pero en cuanto lo agites un poco mostrarán 1.

Con respecto al nunchuk el primer código que posteé siempre me ha ido bien y está correctamente ordenado, no deberías tener problemas con él. Si después de estos cambios el pic sigue como "colgado" vuelve a revisar las conexiones, los fallos de conexiones sobretodo con protoplacas son muy puñeteros  :D


Espero que te haya servido de algo. Si tienes más dudas que humildemente pueda ayudarte a solucionar, aquí estaré  8)

Título: Re: Wii motion plus, Nunchuk y 16f886. Ménage á trois de lujo
Publicado por: sokoloko en 07 de Junio de 2011, 15:23:34
HOla.


Pues menuda buena suerte la mia, jejejjeeje!!!! :-/ :-/ :-/

Por fin funciona!!!!!!!! Ya lo tengo operativo, gracias a tus comentarios.

Ahora que se que saco valores, toca empezar a trastear un poco. Lo que si noto es que estando el WMP quieto sobre una mesa fija, las lecturas tiene muchisima variacion, pero sera tema de ajustar el filtrado de los datos.

Te aconsejo por si puede ayudarte este hilo del foro Aeromodelismo Virtual, en el hacen un proyecto similar pero implementando el I2C a pelo....todo un logro de Ariel.

Post Aeromodelismo Virtual (http://www.aeromodelismovirtual.com/showthread.php?t=5410)

Muchas gracias y ire contando los logros.

Saludos.

Título: Re: Wii motion plus, Nunchuk y 16f886. Ménage á trois de lujo
Publicado por: Alcaparrones en 08 de Junio de 2011, 14:11:12
Está muy bien el proyecto del headtracker, gracias por el link. Al código que posteé le falta el tema de calibrar cada cierto tiempo el WMP, algo simple por otra parte sacando la media de x lecturas. Sobre lo de que los valores varían aún estando quieto el WMP creo que se debe simplemente a que la precisión de los giroscopios no es perfecta.

Y nada más, un saludo y hasta el próximo proyecto  ;-)
Título: Re: Wii motion plus, Nunchuk y 16f886. Ménage á trois de lujo
Publicado por: droky en 08 de Junio de 2011, 19:47:07
El compañero villamany tiene un post hace tiempo en su blog con un nunchuck conectado por bluetooth y usa un PIC:
http://villamany.blogspot.com/2010/11/nunchuck-bluehack-r1-utilizar-el-mando.html
Salu2
Título: Re: Wii motion plus, Nunchuk y 16f886. Ménage á trois de lujo
Publicado por: sokoloko en 09 de Junio de 2011, 03:40:59
Gracias por la información Droky.

Si es que esta todo inventado, jejeee :D

Aun asi es interesante el proyecto.

Saludos!!
Título: Re: Wii motion plus, Nunchuk y 16f886. Ménage á trois de lujo
Publicado por: rabanisa en 28 de Julio de 2011, 17:50:08
Buenas noches:

No suelo postear mucho porque habitualmente mis dudas con utilizar el buscador estan resueltas. Bueno el asunto es que estoy intentando hacer funcionar el wii motion y de momento solo quiero sacar los datos por el lcd como el compañero sokoloko, pero lo unico que saco son unos datos que oscilan demasiado , tanto que no me son utiles. El codigo que utilizo es el de sokoloko que hay publicado aqui pero nada de nada. Tambien he probado las distintas formas de ordenar los bytes que devuelve el WII motion pero siempre con el mismo resultado. La unica diferencia es que utilizo un 18f2550 y configuro el i2c con rc6 y rc7.  Amigo sokoloko podrias postear el codigo que te funciona para ver donde tengo el fallo?

muchas gracias por adelantado.

pd: este sensor es parte de un bot que estoy montando pero necesito manejar bien su funcionamiento.
Título: Re: Wii motion plus, Nunchuk y 16f886. Ménage á trois de lujo
Publicado por: rabanisa en 02 de Agosto de 2011, 15:20:19
Buenas tardes :

En primer lugar pedir disculpas por entrar como un elefante en una cacharreria, pidiendo codigos y demas.  Bien solo comentar que ya consigo sacar los datos un poco mas estables y que ya voy entendiendo como se emparejan los datos obtenidos para poder tratarlos(mis conocimientos de C son muy basicos). El tema es que conecto el circuito y me devuelve una lectura, muevo el sensor y la lectura cambia, pero en seguida vuelve a dar las lecturas del principio pese a haber cambiado la posicion del sensor. No se si me explico.

Saludos
Título: Re: Wii motion plus, Nunchuk y 16f886. Ménage á trois de lujo
Publicado por: sokoloko en 03 de Agosto de 2011, 15:38:40
Hola rabanisa,

Primero, en esta web puedes ver como se leen correctamente los datos del WMP.

http://wiibrew.org/wiki/Wiimote/Extension_Controllers (http://wiibrew.org/wiki/Wiimote/Extension_Controllers)

Es facil de entender luego como ordenarlos, teniendo el codigo delante  :D.
 
Lo que comentas, es como funciona ese dispositivo, pues no mide giros respecto a una posicion inicial, sino que mide diferencias con la posicion anterior, una vez que deja de girar, este en la posicion que este, te va a dar el mismo valor.

Espero q te sirva.

Saludos!!!!
Título: Re: Wii motion plus, Nunchuk y 16f886. Ménage á trois de lujo
Publicado por: rabanisa en 04 de Agosto de 2011, 13:53:07
Buenas tardes:

Primero darte las gracias por contestar, la verdad es que ya comprendo mas o menos el codigo que sale en la fuente que citas .Acabas de confirmar lo que sospechaba (al ver yaw speed , pitch speed... me lo veia venir) que solo mide la velocidad del giro. No es lo que necesito. Pero al ver los distintos post del Head-traking veo que que los servos "siguen" al WMP y ahi es donde me pierdo. Pero seguimos en ello.

Saludios y gracias.
Título: Re: Wii motion plus, Nunchuk y 16f886. Ménage á trois de lujo
Publicado por: sokoloko en 04 de Agosto de 2011, 14:16:00
Bueno el tema para lo que quieres es "sencillo".

Primero calibras los datos del WMP en una posicion fija, y despues solo tienes q ir moviendo los servos la parte proporcional a la diferencia con el calibrado.

Ej si el WMP se mueve 100, tu mueves el servo 100, y aunque el WMP te de cero, tu ya has movido 100, no se si me explico....
Título: Re: Wii motion plus, Nunchuk y 16f886. Ménage á trois de lujo
Publicado por: Alcaparrones en 06 de Agosto de 2011, 08:28:57
Buenas Rabanisa

Lo que Sokoloko te explica es lo que nos explicaron a todos en el colegio con los movimientos rectilinios, básicamente. Si tú quieres saber cuanto se ha desplazado un objeto primero debes saber la velocidad de ese objeto y el tiempo que ha estado desplazándose a esa velocidad. El wiimotion plus te dice la velocidad a la que se desplaza el susodicho. Por lo tanto, si tu WMP se desplaza a 10 grados/segundo durante x tiempo habrá recorrido 10*x, tan fácil como esto. En wiibrew lo explican bastante bien http://wiibrew.org/wiki/Wiimote/Extension_Controllers/Wii_Motion_Plus (http://wiibrew.org/wiki/Wiimote/Extension_Controllers/Wii_Motion_Plus)

De todas formas revisa los links de los post que la gente ha ido dejando aquí para comprender cómo se manipula la información que llega tanto del WMP como del Nunchuk para conseguir lo que todos queremos, registrar desplazamientos.
Título: Re: Wii motion plus, Nunchuk y 16f886. Ménage á trois de lujo
Publicado por: rabanisa en 07 de Agosto de 2011, 18:23:11
Buenas noches:

Ante todo daros las gracias por las respuestas que me han ayudado bastante. El protocolo con el WMP lo tengo claro. Mi principal problema es el filtrado de los datos obtenidos, que son muy inestables, he probado a meterle delays, dividir los datos obtenidos para despreciar las pequeñas variaciones...pero sigo un poco atascado. Es probable que al ser un WPM "de los chinos" le falte algo por ahi o sea mas inestable (aunque se probo en una Wii...). Pero espero hacerlo funcionar como yo quiero y poder compartirlo despues.


Saludos y gracias.
Título: Re: Wii motion plus, Nunchuk y 16f886. Ménage á trois de lujo
Publicado por: rabanisa en 09 de Agosto de 2011, 18:30:44
Buenas noches:

Acabo de encontrar mi fallo  :mrgreen:, resulta que al definir mis variables las cogi como en vuestro ejemplo (int16), pero si a un int16 le restas alqo que te salga negativo se te va aun valor elevado (es decir si tienes 10 y le restas 20 se va a 65525 , no se si me explico). Defino las variables como signed y el programa ya funciona(mas o menos) ahora toca empezar a jugar con la ganancia y mover el servo en condiciones . Me imagino que es un error de principiante, pero con cambiar estos datos me ha funcionado.

Saludos y gracias por la ayuda.