Artículo WII HT Libre - Headtrackin con inclinometro

Tema en 'R/C ELECTRÓNICA' iniciado por cacer, 28 Oct 2009.

  1. cacer Miembro Activo

    cacer
    Registrado:
    3 Ene 2008
    Mensajes:
    1.136
    Me Gusta recibidos:
    0
    [FONT=&quot]Por peticion popular modifico este primer hilo para poner las ultimas actualizaciones aportadas por los compis y sobre todo por NONO y FBFOROS:


    ULTIMAS VERSIONES DE ESQUEMAS Y CODIGO.

    Los ultimos esquemas del post 451

    [/FONT]
    Tener cuidado ya que una conexión erronea puede acabar con la emisora en el servicio técnico
    [​IMG] [​IMG]
    Imágenes Adjuntas [​IMG] [​IMG]


    [FONT=&quot]

    El código ultima versión que procede del post: 452
    [/FONT]
    El código

    Bueno pues por último os coloco el código que sirve para los dos esquemas.

    Solo teneis que comentar o descomentar NOTRAINER.

    El código creo que esta bastante comentado

    Insertar CODE, HTML o PHP:
    /*#####################################################################################
    ## Wii HeadTracker    Version:  beta 3.20                         Enero 2010         ##
    ##                                                                                   ##
    ## Autor: El Nono, Cacer, Fbforos y el foro                                          ##
    ## Colaboracion:  www.aeromodelismovirtual.com                                       ##
    ##                www.fpv-bsas.com.ar                                                ##
    ## Documentacion:                                                                    ##
    ##                                                                                   ##
    ## http://www.aeromodelismovirtual.com/showthread.php?t=4300                         ##
    ## http://randomhacksofboredom.blogspot.com/2009/06/wii-motion-plus-arduino-love.html##
    ## http://www.windmeadow.com/node/42                                                 ##
    ## http://ingenegros.com.ar/Microcontroladores/leer-un-wii-nunchuck-con-arduino.html ##
    ## http://wiibrew.org/wiki/Wiimote/Extension_Controllers#Wii_Motion_Plus             ##
    #####################################################################################*/
    
    //see http://wiibrew.org/wiki/Wiimote/Extension_Controllers#Wii_Motion_Plus
    //for info on what each byte represents
    
    /* Yaw data[]    3 y 0 
       Pitch data[]  4 y 1
       Roll data[]   5 y 2
       Estos Pich y Roll pueden intercambiarse según se monte el sensor para hacerlo 
       Buscais las lineas donde aparece data[4]   data[1] y las sustituis por 
       data[5] y data[2] o viceversa
    */
    /*  define NOTRAINER
        Si en nuestra emisora no podemos seleccior que canales serán controlados por
        el sistema de trainner dejaremos descomentada la línea NOTRAINER si por el contrario
        en nuestra emisora podemos controlar que canales seran manejados por el trainner
        comentraremos esta linea 
    */
    
    //#define NOTRAINER  
    
    /* define FB 
        Esto sirve para poder jugar con los parámetros que hay dentro de esta definición
        en el programa. Cuando lo comentais se cogen los parámetros estandar.,
    */
    
    //#define FB    //Coge mis parámetros del servo, comentar si quereis que los servos
                 // tengan recorrido estandar.
    
    #include <Wire.h>
    
    // ************** OPCIONES DE CONFIGURACION ****************************
    int pitch_reverse = 0;  // Invierte servo TILT   0 = normal  1 = Reverse
    int yaw_reverse = 1;    // Invierte servo PAN    0 = Normal  1 = Reverse
    int pitch_gan = 200;     // Relación entre angulo girado por la cabeza y el girado por
    int yaw_gan = 200;       // el servo a mayor x_gan menor es en angulo girado
    int SwitchPin = 5;      // Ubicacion del interrupter de centrado
                            // conectar un pulsador NA a masa
                            
    int ppmOutPin = 4 ;    // Salida de datos al trainner port
    int ppmInPin = 2 ;     // Entrada de datros del trainner port futura actualizacion
                           //   otras frec. distintas de 35 y 72
    int canales = 6;       // Canal a partir del cual añadiremos el HT  / Canales que se generan                       
    
    // Variables actualización
    
    int refreshTime1= 8;    // Intervalo de generar trama 
    long lastPulse1 = 0;
    
    /*    Recorrido maximos de los servos - -2000, 2000 corresponde a un pulso de 1000 a 2000ms
          y es el estandarModificando los valores podemos ajustar el recorrido del servo no utilizar
          valores por encima de +-2500 puede no funcionar
          Si probais los valores FB vereis que el recorrido del servo esta recortado en el pitch
    */
    #if defined FB
      int pitch_min = -2200; // TILT Minimo
      int pitch_max = 900;  //      maximo
      int yaw_min = -2300;   // PAN  Minimo
      int yaw_max = 2400;    //      Maximo
    #else
      int pitch_min = -2000; // TILT Minimo
      int pitch_max = 2000;  //      maximo
      int yaw_min = -2000;   // PAN  Minimo
      int yaw_max = 2000;    //      Maximo
    #endif
    
    //**********************************************************************
    
    volatile int estado = 1 ;
    volatile int numPulsos= 0;
    volatile int reposo=0;
    volatile unsigned long time=0;
    
    byte data[6]; //six data bytes
    int yaw, pitch;
    int yaw0, pitch0; //calibration zeroes
    long pitch_bak1, yaw_bak1; //acumula el movimiento
    int pitch_bak2, pitch_bak3; // variables auxiliares
    int yaw_bak2, yaw_bak3 ;
    int ledPin = 13;
    
    int pulseWidthP = 0, pulseWidthY = 0;
    int minPulseP = 1500;
    int minPulseY = 1500;
    //int dtime = 10;
    //int t = 0;
    int servoPin=7, servoPin2=6; //Salida de pruebas para servos
    
    void wmpOn()  // Inicializa el Wii Motionplus
    {
      Wire.beginTransmission(0x53); //WM+ starts out deactivated at address 0x53
      Wire.send(0xfe); //send 0x04 to address 0xFE to activate WM+
      Wire.send(0x04);
      Wire.endTransmission(); //WM+ jumps to address 0x52 and is now active
    }
    
    void wmpSendZero()
    {
      Wire.beginTransmission(0x52); //now at address 0x52
      Wire.send(0x00); //send zero to signal we want info
      Wire.endTransmission();
    }
    
    void calibrateZeroes(){  // Proceso de calibracion del motionplus al inicio
    
      for (int i=0;i<300;i++)       //Vacía el buffer del WM+ de basura
      {                             // antes de calibrar el dispositivo
        wmpSendZero();
        Wire.requestFrom(0x52,6);
        for (int i=0;i<6;i++){
          data[i]=Wire.receive();
        } 
      }
      for (int i=0;i<10;i++)
      {
        wmpSendZero();
        Wire.requestFrom(0x52,6);
        for (int i=0;i<6;i++){
          data[i]=Wire.receive();
        }
        yaw0+=(((data[3]>>2)<<8)+data[0])/10; //average 10 readings
        pitch0+=(((data[5]>>2)<<8)+data[2])/10;
    
      }
    }
    
    void siguePPM ()         // Se encarga de seguir la trama de entrada
    {
        if (millis() - time < 4 )
          {
            if (numPulsos <= (canales*2))
            {
                digitalWrite(ppmOutPin, estado);
                numPulsos = numPulsos + 1;
                estado= !estado ;
                time = millis();
            }
            else
            {
              updatePPM();
              time = 0;
              estado= HIGH; 
            }
          } 
          else 
          {
           digitalWrite(ppmOutPin, estado);
           estado= !estado ;
           numPulsos = 1;
           time = millis();
          }  
    }
    
    void receiveData()  // Recibe y procesa los datos del motionplus
    {
      digitalWrite(ledPin, HIGH);  
      wmpSendZero(); //send zero before each request (same as nunchuck)
      Wire.requestFrom(0x52,6); //request the six bytes from the WM+
      for (int i=0;i<6;i++){
        data[i]=Wire.receive();
      }
      digitalWrite(ledPin, LOW);
      
      if (bitRead(data[4],1)==1){
          pitch=((data[5]>>2)<<8)+data[2]-pitch0; 
          if (abs(pitch) <50) pitch=0;     
      } 
      else
      {
          pitch=(((data[5]>>2)<<8)+data[2]-pitch0)*5;
      }  
      if (bitRead(data[3],1)==1){
          yaw=((data[3]>>2)<<8)+data[0]-yaw0;
          if (abs(yaw )<30) yaw=0;
      }
      else
      {
          yaw=(((data[3]>>2)<<8)+data[0]-yaw0)*5;      
      }
      if (pitch_reverse == 1) pitch*=-1;
      if (yaw_reverse == 1) yaw*=-1;
    }
    
    void updateServo()  // Calcula el ancho del pulsos para cada servo
    {
          // ************** pitch *******************************
         //pitch_bak2= (pitch_bak1 += pitch)/pitch_gan;
         pitch_bak3 = constrain(((pitch_bak1 += pitch)/pitch_gan),pitch_min,pitch_max);
         pulseWidthP = (pitch_bak3/4)+minPulseP;
        // ************ Control para pruebas pitch*********************
        // ** Quitar el comentario a las 2 lineas siguiente para monitorizar con el arduino *******
        // ** Recordar que hay que comentar de nuevo antes del uso definitivo
        
        //Serial.print("\t pulse: ");   Serial.print(pitch); Serial.print("\t ");Serial.print(pitch_bak1); 
        //Serial.print("\t ");  Serial.print(pitch_bak2); Serial.print("\t ");Serial.print(pitch_bak3); Serial.print("\t "); Serial.println(pulseWidthP);
        
        // ************* yaw **********************************    
         //yaw_bak2=(yaw_bak1 += yaw)/yaw_gan  ;
         yaw_bak3 = constrain(((yaw_bak1 += yaw)/yaw_gan),yaw_min,yaw_max);  
         pulseWidthY = (yaw_bak3/4)+minPulseY;
    
        // ************ Control para pruebas *********************
        // ** Quitar el comentario a las 2 lineas siguiente para monitorizar con el arduino *******
        // ** Recordar que hay que comentar de nuevo antes del uso definitivo
        
        //Serial.print("\t pulse: ");   Serial.print(yaw); Serial.print("\t ");Serial.print(yaw_bak1); 
        //Serial.print("\t ");  Serial.print(yaw_bak2); Serial.print("\t ");Serial.print(yaw_bak3); Serial.print("\t "); Serial.println(pulseWidthY);  
    }
    
    void updatePPM()  // Añade los canales del HT 
    {
      
      #ifndef NOTRAINER
         // >>>> Genera los primeros canales ficticios <<<<<<<<<
        for (int i=0; i < canales; i++)   // Envia el pulso ficticio de nº canales
        {
          digitalWrite(ppmOutPin,LOW);
          delayMicroseconds(400);
          digitalWrite(ppmOutPin, HIGH);
          delayMicroseconds(650);
        }
        digitalWrite(ppmOutPin,LOW);
        delayMicroseconds(400);
      #endif  
    
        // >>>> Canal "pan" (Canales+1)  <<<<<<<<<
        digitalWrite(ppmOutPin,HIGH);
        digitalWrite(servoPin2, HIGH);    
        delayMicroseconds(pulseWidthY-400);
      
        // Pulso de separacion de canales 
        digitalWrite(ppmOutPin,LOW);
        delayMicroseconds(400);
       digitalWrite(servoPin2, LOW);
       digitalWrite(servoPin, HIGH);
        
        // >>>> Canal "tilt" (Canales+2) <<<<<<<<<
        digitalWrite(ppmOutPin,HIGH);
        delayMicroseconds(pulseWidthP-400);
    
       // Pulso de separacion de canales 
        digitalWrite(ppmOutPin,LOW);
        delayMicroseconds(400);
        digitalWrite(ppmOutPin,HIGH);
        digitalWrite(servoPin, LOW);
      #if defined NOTRAINER   
        delayMicroseconds(500);
      #endif    
    }
    
    void setup()
    {
      Serial.begin(115200);
      pinMode(ppmOutPin, OUTPUT);  
      pinMode(ppmInPin, INPUT);   
      pinMode(ledPin, OUTPUT);  
      pinMode(servoPin, OUTPUT);   
      pinMode(servoPin2, OUTPUT);  
      pinMode(SwitchPin, INPUT);
      digitalWrite(SwitchPin,HIGH); //Pull_up entrada switch centrado
      digitalWrite(ppmOutPin,HIGH);
      Wire.begin();
      wmpOn(); //turn WM+ on
      digitalWrite(ledPin, HIGH);
      calibrateZeroes(); //calibrate zeroes
      digitalWrite(ledPin, LOW);
    #if defined NOTRAINER
      attachInterrupt(0,siguePPM, CHANGE);
    #endif
    }
    
    void loop()
    {
       
        receiveData(); 
        updateServo();
    #ifndef NOTRAINER    
        if (millis() - lastPulse1 >= refreshTime1){   // Genera la trama PPM
            updatePPM(); 
            lastPulse1 = millis();
           } 
     #endif     
     
       if (digitalRead(SwitchPin) == 0) {
        pulseWidthP = 1500;
        pitch_bak1 = 0;
        pulseWidthY = 1500;
        yaw_bak1 = 0;
      }
    }
    
    

    PCB Para emisoras sin menu de trainer NOTRAINER (NoSepo) Post:
    465

    Archivos Adjuntos [​IMG] HT_No_Trainer_Pcb_trimmer.LAY (11,3 KB, 11 visitas)

    Se actualizara este post con las ultimas modificaciones
     
    #1 cacer, 28 Oct 2009
    Última edición por un moderador: 2 Ago 2013
  2. Wavess Administrator

    Wavess
    Registrado:
    30 Ago 2006
    Mensajes:
    2.891
    Me Gusta recibidos:
    0
    Me alegra que abras un nuevo hilo ya que se estaban desviando muchos existentes.

    Si tu idea no es usar un sensor magnetico deberias cambiarle el titulo a tu hilo, a parte de todo esto con el MHT todos lo conocemos como el de Sinver y compañia, y fueron ellos los que lo llamaron asi.

    Salu2
     
  3. merss Miembro Activo

    merss
    Registrado:
    26 Dic 2006
    Mensajes:
    1.317
    Me Gusta recibidos:
    0
    cacer, ya me acaba de llegar el nunchuk chinorro. le ha costado un poquito pero al final ya está aquí. Espero tener un rato este fin de semana y probar si funciona el código que hice en el arduino pro mini que tengo. si funciona va a ser una alternativa barata... menos de 25€... :biggrin:

    Saludos
     
  4. Sr.Lobo Miembro

    Sr.Lobo
    Registrado:
    11 Ene 2009
    Mensajes:
    119
    Me Gusta recibidos:
    0
    [FONT=&quot]Hombre para que no indzca a confusión y puesto que tienes pensado usar [/FONT][FONT=&quot]Wii Motion Plus, puedes ponerle unos acróminos de este estilo:[/FONT]
    [FONT=&quot]
    WMP-HT
    WM+HT

    A ver que tal evoluciona la cosa.
    [/FONT]
     
  5. cacer Miembro Activo

    cacer
    Registrado:
    3 Ene 2008
    Mensajes:
    1.136
    Me Gusta recibidos:
    0
    Merss.

    Estoy seguro que te funcionará. Ya nos contaras. :rolleyes2:

    Sr. Lobo.

    La idea no es solo usar unos de los masndos de la WII, ya que inclinometros existen unos cuantos de facil acceso, yo usare el ADXL3xx que es pequeño y muy facil de usar. Pero si estaria bien ponerle un nombre:

    IHT
    HTDIY
    Inclina cabezas :biggrin2:
    HMHT Libre - Home Meade Head Track.
    Reclinator

    Se admiten sugerencias
     
  6. zotfidjy Miembro

    zotfidjy
    Registrado:
    19 Nov 2007
    Mensajes:
    364
    Me Gusta recibidos:
    0
    Seguire con atencion el hilo, animo. Saludos
     
  7. acristóbal Gurú FPV

    acristóbal
    Registrado:
    9 Oct 2006
    Mensajes:
    3.710
    Me Gusta recibidos:
    0
    Pero lo que pasa es que la parte más complicada de esto es lo relativo a coger el tren de pulsos de la radio y o bien aumentar con un par de canales más o bien sustituir los existetes. (la verdad es que no estaría mal aumentar incluso en la FF9 con 8 canales en PPM ¿¿¿podríamos llegar a 10??? y con el nuevo tren depulsos generado con los de la radio y con los del sensor mandarlo al módulo (el que sea 35, 72, 433, 869 MHz) y que el receptor correspondiente lo reciba bien.

    Animos en el proyecto, esto va muy bien encaminado.
     
  8. cacer Miembro Activo

    cacer
    Registrado:
    3 Ene 2008
    Mensajes:
    1.136
    Me Gusta recibidos:
    0
    YA ESTA. Primera piedra lanzada

    Acristobal.

    YA LO TIENES!!!! :party:


    ¿Sabes cual era el problema?

    Para mis pruebas con el osciloscopio, cambie a pulso positivo y no lo lee bien el receptor


    Primera versión, pendiente de afinar con un buen osciloscopio.

    Probado con una radio de 4 canales e insertados el 5 y 6 y tratados con el acelerometro.


    Decir que: El acelerometro por si solo no vale, le falta la rotación como ya se ha comentado. Añadir un magnetometro, es posible, pero................

    Para que.... si tenemos el WII Motion por 19.90 € y nos dará mucho juego...

    Agradereos el apoyo a todos. :worthy:

    Agradecer a quin no dio pistas o incluso pistas falsas. Ellos saben quienes son. Lo entiendo, pero no lo comparto. :redface2:

    Pues eso YA LO TENEMOS!!!

    :party::party::party::party::party::party::party::party::party::party::party::party::party::party:
     
  9. cacer Miembro Activo

    cacer
    Registrado:
    3 Ene 2008
    Mensajes:
    1.136
    Me Gusta recibidos:
    0
    Y este es el codigo de la primera versión. LIBRE para vuestro disfute y sobre todo aportaciones.

    Que eso de mirar y mirar sin currar lo queremos todos.

    Falta un poco para que funcione, ya tengo el WMP aqui esperando cablearlo y leero por I2C - Coser y cantar .......

    Tiene fallos, como la trama del sensor, que hace que el servo sea un poco lento. Esto con un poco de paciencia se soluciona.

    Insertar CODE, HTML o PHP:
    /*
    
    Lectura Trama PPM
    Lectura sensores acelerometro ADXL
    Generacion de trama PPM con valor de sensores
    Copyleft cacer
    
    */
    
    
    const int groundPin = 18;     // analog input pin 4 -- ground
    const int powerPin = 19;      // analog input pin 5 -- voltageo
    const int xPin = 3;           // x-axis of the accelerometer
    const int yPin = 2;           // y-axis
    const int ZPin = 1;           // Z-axis
    
    int valX = 0;                 
    int valY = 0;
    int valZ = 0;
    int tiempo = 0;
    
    
    #define numCanales 6           // Definimos una constante para el numero de canales a transmitir
    #define pinSalidaPPM  11      // Definimos cual sera el pin de salida
    #define pinEntradaPPM  12      // Definimos cual sera el pin de entrada
    
    #define pulsoSinc  500         // Definimos el tamano del pulso de sincronizacion en microsegundos
    #define pulsoMin 1000          // Fijamos el valor minimo en microsegundos para enviar
    #define pulsoMax 2000          // Fijamos el valor minimo en microsegundos para enviar
    
    int inicio = 0;
    int fin = 0;
    int restoTrama = 0;
    
    
    int valorCanal[numCanales];    // Array donde se guardaran los valores de tiempo para cada canal
    
    int i; 
    
    void setup() {
      pinMode(pinSalidaPPM, OUTPUT); // Ponemos el pin de salida en salida ;)
      pinMode(pinEntradaPPM, INPUT); // Ponemos el pin de entrada en entrada ;)
      
      // Preparamos las entradas salidas para el ADXL y que este se alimente directamente del puerto 
      pinMode(groundPin, OUTPUT);  
      pinMode(powerPin, OUTPUT);
      digitalWrite(groundPin, LOW); 
      digitalWrite(powerPin, HIGH);
      
      Serial.begin(9600);            // Definimos la conexion del puerto serie
    
     // Inicializamos el array con el valor minimo
     for ( i = 1; i <= numCanales; i = i++ ) {valorCanal[i] = pulsoMin;} 
     
     for ( i = 1; i <= numCanales; i = i++ )
     {
         Serial.print("CH");
         Serial.print(i);
         Serial.print("\t");
     }
     Serial.print(" X ");
     Serial.print("\t");
     Serial.print(" Y ");
     Serial.print("\t");
     Serial.print(" Z ");
     Serial.println();
     
     
    }
    
    void loop()  {
    
      // Estos valores, aunque estan fijos ahora, seran cambiados, para mapear los valores a partir 
      // de la sincronización segn la posición de la cabeza.
      valX = map(analogRead(xPin), 400, 600, 20, 1200);
      valY = map(analogRead(yPin), 400, 600, 20, 1200);
      valZ = map(analogRead(ZPin), 400, 600, 20, 1200);
      
      
      
     for ( i = 1; i <= numCanales; i = i++ ) {valorCanal[i]=pulseIn(pinEntradaPPM, LOW); }
     // Bucle for para el envio del pulso para cada canal
     
     
     int tiempo = 0;                              // Inicializamos para calculo de us de trama
     for ( i = 1; i <= numCanales; i = i++ ) 
     {
       
      // Cargamos los valores leidos y mapeados de los sensores en los canales asignados
      if (i == 5) { valorCanal[i] = valX; }        // Cargamos el valor X del ADX en el canal 5 
      if (i == 6) { valorCanal[i] = valY; }        // Cargamos el valor Y del ADX en el canal 6
      
      digitalWrite(pinSalidaPPM, LOW);              // Inicio del pulso
      delayMicroseconds(pulsoSinc);                  // duracion del pulso de sincronizacion
      digitalWrite(pinSalidaPPM, HIGH);               // Fin del pulso de sincronizacion
      delayMicroseconds(pulsoSinc);                  // duracion del pulso de sincronizacion
      delayMicroseconds(valorCanal[i]);         // Valor mapeado entre 0 y 1000 ms
      tiempo = (tiempo + valorCanal[i]) + (pulsoSinc *2);
      
     }
     
      
     restoTrama = 20000 - tiempo;         // Completamos el tiempo transcurrido hasta los 20 ms
     delayMicroseconds(restoTrama);
     
     // Imprimir los valores de los canales
     for ( i = 1; i <= numCanales; i = i++ ) 
     {
         Serial.print(valorCanal[i]);        // Visualizamos los valores de los canales
         Serial.print("\t");            // Lanzamos un tabulado
     }
     Serial.print(valX);
     Serial.print("\t");
     Serial.print(valY);
     Serial.print("\t");
     Serial.print(valZ);
     Serial.println();
    
    
    }
    
    
      
     
    Ni que decir tiene que:

    QUEDA PROHIBIDA LA COMERCIALIZACION DE ESTA SOLUCION SIN MPREVIA AUTORIZACION.

    Los que comercializais soluciones en este foro, que me parece bien y yo las compro, tendreis la oportunidad, cuando salga la PCB, tanto de esta como de la ampliación de radio, que serán muy similares si no la misma.

    Espero no arrepentirme de haber publicado las ideas y el código fuente.


    Espero y deseo que se respete esta decisión.
     
    #9 cacer, 28 Oct 2009
    Última edición: 29 Oct 2009
  10. merss Miembro Activo

    merss
    Registrado:
    26 Dic 2006
    Mensajes:
    1.317
    Me Gusta recibidos:
    0
    ?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿? Quien ha dado pistas falsas? :eek:hmy::eek:

    Cacer, trabajas rápido... a mi me costó bastante más realizar el código. También te digo que de programación ni papa.

    Espero que funcione bien.

    Saludos
     
  11. cacer Miembro Activo

    cacer
    Registrado:
    3 Ene 2008
    Mensajes:
    1.136
    Me Gusta recibidos:
    0
    PREPARACION - Desmontar WII MOTION PLUS

    Con objeto de poder usar el WII Motion Plus en nuestros proyectos, os presento el como desmontar y posteriormente el como prepararlo para conectarlo al Arduino.

    Pido disculpas por las fotos, pero las prisas son mala ayuda.

    Paso 1:

    Lo compramos y sacamos de su caja y plasticos.​
    Este paso parece trivial, pero es el más importante.
    [​IMG]
    Paso 2:

    Como podeis ver, es bastante pequeño, lo cual nos facilitará su uso incluso con su carcasa de platico, aunque continuamos para Bingo y lo desmontamos entero. Para eso, tenemos que qitar los dos tornillos que trae. Son de cabeza triangular, por lo que con un destornillador plano pequeño, podemos quitarlos sin problemas.

    [​IMG]

    El paso 3:

    En este punto, tenemos que librear la placa de la carcasa, con cuidado, separando estas dos pestañas.
    [​IMG]

    Aqui podeis ver el corazon de este accesorio y que lo hace tan especial.
    El senso IDG600 dual axis y el gisroscopo x3500w de EPSONTOYOCOM

    [​IMG]

    Paso 4:


    Ya tenemos liberada la placa y ahora queda tomar la decisión. Cortar el conector o buscar uno para poder usarlo en su momento. Yo opto por buscar el conector, por lo que dejo de momento este apartado aqui.
    [​IMG]

    Espero no meter la pata y aburriros con todo esto..... Parece trivial, pero creo que a mucha gente le dará impulso para hacerlo.. Eso espero.. :rolleyes2:
     
    #11 cacer, 28 Oct 2009
    Última edición: 29 Oct 2009
  12. cacer Miembro Activo

    cacer
    Registrado:
    3 Ene 2008
    Mensajes:
    1.136
    Me Gusta recibidos:
    0
    Material necesario:

    1 Wii motion plus – Fácilmente se encuentra para su compra. Dependiendo del sitio, se puede encontrar Online 19$ en tiendas, dependiendo del pais. En españa se encuentra por 19.50 €
    .

    1 Arduino – Opciones: – Probado y funcionando por Nono en Arduino mini pro. 16 Mhz. Se recomienda mirar en http:www.arduino.cc en la pagina de Buy para comprarlo, ya que depende mucho del pais, tasas, aduanas, gastos de transporte, etc... Dependiendo de si se dispone de adaptador USB a Serie, es mejor el modelo con o sin el. Va en gustos. – Aun sin pruebas, montar la placa directamente. Solo se requieren unos pocos componentes.

    1 Cable o conector de trainer -
    Si queremos usar el WIIHT con nuestro simulador de vuelo, tendremos que construir un cable Y de conexión del trainer, que comentaremos más abajo.



    Pinout de conectores:


    Conector WII:


    [​IMG]


    Conector trainer y tipo de pulso de las distintas radios:

    Futaba:

    Tipo de pulso: PPM estándar Positivo

    [​IMG]



    Multiplex:


    Tipo de pul
    so: PPM Estándar Positivo



    WFLY:


    Tipo de pulso:



    Diagrama de conexiones del sistema:

    Continuara.......................
     
    #12 cacer, 28 Oct 2009
    Última edición: 5 Nov 2009
  13. cacer Miembro Activo

    cacer
    Registrado:
    3 Ene 2008
    Mensajes:
    1.136
    Me Gusta recibidos:
    0
    Diagrama de conexiones Ardu y WM+

    Diagrama de conexiones by Nono


    [​IMG]

    [​IMG]
     
    #13 cacer, 28 Oct 2009
    Última edición: 10 Nov 2009
  14. cacer Miembro Activo

    cacer
    Registrado:
    3 Ene 2008
    Mensajes:
    1.136
    Me Gusta recibidos:
    0
    Reservado
     
  15. cacer Miembro Activo

    cacer
    Registrado:
    3 Ene 2008
    Mensajes:
    1.136
    Me Gusta recibidos:
    0
    Lo de las pistas , ellos lo saben perfectamente.... Dejemoslo

    Cuando me pican, mi cabeza no para hasta dar con ello. Es uno de los defectos que tengo. :locos:

    Tengo una duda con el nunchuck, creo que le pasará lo mismo que al ADXL, que no tiene rotación sobre el eje Z. Pero solo lo creo, no me acuerdo y mira que tengo uno desmontadito.

    Ya nos contaras.
     
  16. merss Miembro Activo

    merss
    Registrado:
    26 Dic 2006
    Mensajes:
    1.317
    Me Gusta recibidos:
    0
    cacer, el nunchuk, a través del i2c, te da bastantes datos, entre ellos las 3 aceleraciones en los 3 ejes, 2 datos sobre la posición del joystic y si los dos botones que tiene están pulsados o no. Por tanto si que tiene aceleraciones en los 3 ejes.

    Creo que dentro del nunchuk hay dos acelerometros, uno de dos ejes y el otro de uno.. pero de esto no estoy mu seguro...

    Saludos
     
  17. cacer Miembro Activo

    cacer
    Registrado:
    3 Ene 2008
    Mensajes:
    1.136
    Me Gusta recibidos:
    0
    Es correcto lo que dices, pero para poder usarlo, se neesita la rotación sobre el eje Z, para que al girar la cabeza de derecha a izquierda, se transmita este movimiento.

    En el peor de los casos, tienes el Joystick o se añade un Magnetometro.

    No estoy seguro. Lo he usado y es facil de utilizar.
     
  18. merss Miembro Activo

    merss
    Registrado:
    26 Dic 2006
    Mensajes:
    1.317
    Me Gusta recibidos:
    0
    cacer, no problemo, lo pruebo y te cuento. :biggrin:

    Saludos
     
  19. Nosepo Miembro Activo

    Nosepo
    Registrado:
    12 Jul 2009
    Mensajes:
    1.621
    Me Gusta recibidos:
    0
    Ehh animo a todos los emprendedores que quieren compartir su trabajo sin poco mas beneficio que su merecido reconocimiento por nuestra parte. Vosotros haceis grandioso este hobby y este foro. Basta ya de peloteo:wink2:, a ver si cuando tengais el proyecto os acordais de los "pobres" de la Wfly para que sea compatible con el Headtracking.
     
  20. cacer Miembro Activo

    cacer
    Registrado:
    3 Ene 2008
    Mensajes:
    1.136
    Me Gusta recibidos:
    0
    Cambaido el nombre del Hilo, Tienes toda la razon del mundo. :blink:

    Mil perdones.


    No es necesario que seas pelota. Aunque mola :party: Creo que podemos hacer que te lo hagas tu mismo. :rolleyes2:

    Por cierto, editado la primera parte para WII Motion. Estoy con vosotros de que esta es la solucion, mejor y mas economica.
     
  21. Nosepo Miembro Activo

    Nosepo
    Registrado:
    12 Jul 2009
    Mensajes:
    1.621
    Me Gusta recibidos:
    0
  22. acristóbal Gurú FPV

    acristóbal
    Registrado:
    9 Oct 2006
    Mensajes:
    3.710
    Me Gusta recibidos:
    0
    Enhorabuena Cacer, vas a toda velocidad :wink2:
    Ahora lo que deberías hacer es, poder detectar que tipo de pulso tiene cada emisora (positivo o negativo) y que el tren de pulsos que sacas sea igual que el que le entra. Esto lo puedes hacer tambien añadiendo un par de pulsadores para poder configurarlo antes de operar.
     
  23. miquel.s.m Gurú FPV

    miquel.s.m
    Registrado:
    22 Mar 2007
    Mensajes:
    3.610
    Me Gusta recibidos:
    0
    muy bueno si señor
     
  24. eb7dln Gurú FPV

    eb7dln
    Registrado:
    18 Feb 2008
    Mensajes:
    3.055
    Me Gusta recibidos:
    0
    Pues sí, felicidades por tu proyecto!
     
  25. merss Miembro Activo

    merss
    Registrado:
    26 Dic 2006
    Mensajes:
    1.317
    Me Gusta recibidos:
    0
    He estado 5 minutos jugueteando con mis herramientas preferidas, y he dejado el nunchuk en paños menores. Ya esta todo listo para meterle mano con el código y ver si funciona... :biggrin:
     

    Adjuntos:

  26. cacer Miembro Activo

    cacer
    Registrado:
    3 Ene 2008
    Mensajes:
    1.136
    Me Gusta recibidos:
    0
    Mi gozo en un pozo.

    La parte en teoria mas sencilla, que es leer los datos del WM+ no me funciona.

    He probado casi todo lo que he leido, ya que es necesario modificar la libreri wire, pero naaaa.

    Leido aqui

    El nunchuck si me funciona, aunqur para leer el giro en eje z, se tiene que realizar con lecturas de entre 450 y 560 aprox. Merrss juega primero con las posiciones del nunchuck.

    Con el joystick, está tiraooo.

    Bueno hoy queria haber plantado un video con los resultados, pero veo que tendran que esperar. Creo que este WM+, no está bien.:sad:

    Jugare un rato con el nunchuck, pero poco.
     
  27. merss Miembro Activo

    merss
    Registrado:
    26 Dic 2006
    Mensajes:
    1.317
    Me Gusta recibidos:
    0
    cacer, según he leído el giro en z da los siguientes valores: min= 74, central=126 y max=177. Yo tardaré aún en probar lo mio, pero cuando lo haga postearé resultados.

    Saludos
     
  28. javiroarak Miembro

    javiroarak
    Registrado:
    19 Nov 2007
    Mensajes:
    394
    Me Gusta recibidos:
    0
    Este hilo promete mucho!!
    Cacer enhorabuena gracias por todo y animo!!
     
  29. ramos Miembro

    ramos
    Registrado:
    4 Dic 2008
    Mensajes:
    109
    Me Gusta recibidos:
    0
    hola,
    encontrei algo de interesante en http://randomhacksofboredom.blogspot.com/2009/06/wii-motion-plus-arduino-love.html
    vos paso lo que ha lido
    talvez sea a causa do problema

    ''
    Anonymous said...
    Hi, great work here.

    I've been able to interface with the nunchuck before but I can't get it to work with the M+. Can't even get the I2C start sequence to work.

    I don't have a proper oscilloscope but it seems my clock and data lines are always low. Usually when I connect the nunchuck the lines would go high, not the case of the M+ though. And there's nothing wrong with my M+, works great in Sports Resort.

    Any ideas?

    Dan
    Anonymous said... Oh nevermind. I figured it out. It seems the M+ needs external pull-up resistors on the clock and data lines whereas the nunchuck doesn't. I tried 1K and 4K7 resistors, both worked fine (100KHz, 3.3V).
    ''
     
  30. luico Moderator

    luico
    Registrado:
    9 Mar 2007
    Mensajes:
    3.210
    Me Gusta recibidos:
    0
  31. cacer Miembro Activo

    cacer
    Registrado:
    3 Ene 2008
    Mensajes:
    1.136
    Me Gusta recibidos:
    0
    Luico,

    Lo que ramos comenta, es que se necesitan resistencias Pull up.

    He visto tambien, que se puede alimentar como el ADXL, poniendo las entradas 2 y 3 una en alto y otra en bajo.

    Por mi parte realizaré las 2 pruebas.

    Gracias a los dos.
     
  32. luico Moderator

    luico
    Registrado:
    9 Mar 2007
    Mensajes:
    3.210
    Me Gusta recibidos:
    0
    Ok´s tienes razón :redface2:
     
  33. cacer Miembro Activo

    cacer
    Registrado:
    3 Ene 2008
    Mensajes:
    1.136
    Me Gusta recibidos:
    0
    Nada.

    Con las modificaciones de la libreria y las resitencias. Nada de nada.

    He usado otro WM+ por si acaso y nada. :blink:

    Me parece que la noche sera larga
     
  34. El_Nono Miembro Activo

    El_Nono
    Registrado:
    22 Jun 2007
    Mensajes:
    1.177
    Me Gusta recibidos:
    0
    Hola Cacer

    Yo me encuentro experimentando también con el arduino y un motionplus y no he tenido problema en monitorear los valores que este entrega usando el programa que figura en:
    http://randomhacksofboredom.blogspot.com/2009/06/wii-motion-plus-arduino-love.html

    Revisa el conexionado de tu motionplus ya que seguramente el problema lo tengas ahí.

    Ahora me encuentro modificando el programa para controlar servos.
    El principal problema con que me he topado es que la información suministrada es relativa a aceleraciones y no a un grado de inclinación por ende, hasta ahora he logrado mover el servo "como si se tratara de un giroscopo", es decir que muevo el motionplus y el servo se mueve hasta una posición pero inmediatamente regresa al centro es decir que no queda en una posición proporcional a la inclinación del sensor. :sad: estoy tratando de dar con algún algoritmo que me permita solucionar esto y lograr el movimiento deseado.

    Saludos.

    El Nono
     
  35. cacer Miembro Activo

    cacer
    Registrado:
    3 Ene 2008
    Mensajes:
    1.136
    Me Gusta recibidos:
    0
    Nono,

    ¿Que Arduinos tienes?

    Lo mio es muy curioso, monitoreo bienun nunchuck y mal un wiimotion :eek:, so,o me aparecen 0.

    Lo he probado con dos WM+ y nada de nada.

    Creo que mi problema radica en los 3.3 v o en la frecuencia del Ardu.

    El programa que uso, es ese y otro muy parecido. He modificado las librerias de Wire segun comentan, he puesto las resistencias y nada de nada....
     
  36. El_Nono Miembro Activo

    El_Nono
    Registrado:
    22 Jun 2007
    Mensajes:
    1.177
    Me Gusta recibidos:
    0
    Hola Cacer

    Con el numnchuk no he probado ya que solo he comprado el motionplus para esto. :biggrin2:
    El arduino que estoy usando es el Arduino ProMini 328 5v 16mhz

    Hice pruebas modificando la libreria tal como dice la pagina web pero no me funcionaba asi que volvi a dejarla como estaba.
    En cuanto a la tension, si bien el Arduino que tengo corre bien en 3.3v también, preferí usarlo en 5v para compatibilidad del pulso TTL con los servos.

    Saludos.

    El Nono
     
  37. cacer Miembro Activo

    cacer
    Registrado:
    3 Ene 2008
    Mensajes:
    1.136
    Me Gusta recibidos:
    0
    Yo el que tengo es antiguo. Como yo jejej y trae un ATMEGA168.

    Ya he pedido uno mini y cambiaré el chip al que tengo

    De momento sigo haciendo pruebas para ver si lo hago andar.

    Ya nos contaras por donde andas.
     
  38. yapahoe Miembro

    yapahoe
    Registrado:
    18 Ago 2009
    Mensajes:
    578
    Me Gusta recibidos:
    0
    Animo chicos que esto promete!!!

    :worthy::worthy::worthy::worthy:
     
  39. jlezana Miembro Activo

    jlezana
    Registrado:
    29 Sep 2008
    Mensajes:
    1.114
    Me Gusta recibidos:
    0
    Nono con razon estas tan callado... :laugh::laugh:

    Cacer no te des por vencido...

    Saludos

    J.Lezana
     
  40. Nosepo Miembro Activo

    Nosepo
    Registrado:
    12 Jul 2009
    Mensajes:
    1.621
    Me Gusta recibidos:
    0
    Adelante monstruos... las horas k les estais echando valdran para algo.
     
  41. cacer Miembro Activo

    cacer
    Registrado:
    3 Ene 2008
    Mensajes:
    1.136
    Me Gusta recibidos:
    0
    No me doy por vencido. Tengo una cabezonada :blink:. PErdon, que esto es de otro tema.... :laugh:

    El problema es que tengo la sensación, de que el problema no es la libreria. Creo que el problema está en la frecuencia del ATMEGA.

    Estoy pensanndo en montarme uno con un cristal de 20 Mhz....

    Yo no se que palos tocar :blink:
     
  42. El_Nono Miembro Activo

    El_Nono
    Registrado:
    22 Jun 2007
    Mensajes:
    1.177
    Me Gusta recibidos:
    0
    Hola Jorge, como estas!!!

    JEJEJE!! Es que ultimamente estoy con mucho trabajo con el tema de fpv-bsas pero igual cada vez que tengo un ratito le meto manos a esto y al Ardupilot v2 (que tambien estoy programando) :biggrin:
    Encima estoy en proceso de cambiar de avion asi que tambien tengo que ponerme a trabajar con el nuevo. :locos::locos:

    Ya se vendran algunas novedades :biggrin2::biggrin2:

    Saludos.

    El Nono
     
  43. ramos Miembro

    ramos
    Registrado:
    4 Dic 2008
    Mensajes:
    109
    Me Gusta recibidos:
    0
    hola,
    podes por una foto de las conexiones del teu wii m+ conectado al arduino
    no meu wii m+ não me parece correcto las colores indicadas de SDA/SCL/+/- :blink:

    un saludo
     
  44. El_Nono Miembro Activo

    El_Nono
    Registrado:
    22 Jun 2007
    Mensajes:
    1.177
    Me Gusta recibidos:
    0
    Hola Gente, Ramos!

    Dejo un par de fotos que espero que ayude a conectar las cosas:

    DSCF3563_ch.jpg

    conexion_wii.jpg

    Saludos!!

    El Nono
     
    #44 El_Nono, 3 Nov 2009
    Última edición: 4 Nov 2009
  45. El_Nono Miembro Activo

    El_Nono
    Registrado:
    22 Jun 2007
    Mensajes:
    1.177
    Me Gusta recibidos:
    0
    Señores.....

    EL MONSTRUO ESTA VIVO!!!!!

    :party::party::party::party:

    Les dejo un vídeo de las primeras pruebas:





    Y este es el código utilizado en el video:

    Para mi, la primer etapa era interpretar correctamente los datos del motionplus y con ellos lograr mover los dos servos correspondientes al Pan&Tilt asi que esta etapa esta lista.

    Ahora, como segunda etapa del proyecto queda lograr introducir esta información correctamente en el radio control para poder enviarlo asi a nuestro modelo.

    Para ello esta parte la voy a dividir en dos sub-partes las cuales consistiran cada una en:

    1) Generar un tren de pulsos PPM con al menos los 4 primeros canales ficticios y en el 5 y 6 insertar la señal correspondiente al pan&tilt.
    De esta forma se podrá insertar esta señal en las radios que permiten mezclar una señal PPM del puerto trainner sin complicar demasiado el programa. (información solo en un sentido) (como lo hacen algunos headtrackers disponibles en el mercado)

    2) Ampliar el programa de manera que se pueda leer el tren de pulsos proveniente desde la radio (puerto trainner) modificar los canales deseados, y re-insertar el tren de pulsos nuevamente en la radio.
    Este método, si bien demandara un programa mucho mas complejo le dará al HT compatibilidad con cualquier radio.

    Por lo que veo esto es bastante posible.

    Saludos.

    El Nono
     
  46. eglo Miembro

    eglo
    Registrado:
    30 Jul 2007
    Mensajes:
    760
    Me Gusta recibidos:
    0
    Felicidades Nono, y gracias a todos los que os estáis dando la currada:smile:.
     
  47. Nosepo Miembro Activo

    Nosepo
    Registrado:
    12 Jul 2009
    Mensajes:
    1.621
    Me Gusta recibidos:
    0
    Nono eres un crack, da gusto ver algo en lo ke te has dejado los cuernos funcionando. Etre tu y Cacer lo vais a sacar. Felicidades.:worthy::worthy::worthy:
     
  48. cacer Miembro Activo

    cacer
    Registrado:
    3 Ene 2008
    Mensajes:
    1.136
    Me Gusta recibidos:
    0
    Nono. Eres un fiera si sr...

    Que envidia me da ver tu WM+ funcionando y el mio no.

    Te mando mi ultima version del prototipo, donde se lee la radio y se escribe la trama PPM.

    Tengo problemas con los canales, solo saca 5 el resto, aunque salen no los interpreta el receptor.

    Mi problema es no disponer de un Osciloscopio en condiciones.

    Pruebalo y nos cuentas.

    Insertar CODE, HTML o PHP:
    /*
    
    ***************************************************
    
    Copyleft Carlos Cervilla. CACER
    Parseador de PPM con varios objetivos:
    - Añadir canales a la trama PPM
    - Construcción de Head Trackin con Acelerometros, WII Motions, etc..
    - Conexion de Joystick a la radio
    - Conexion del PC a la radio
    
    ***************************************************
    
    */
    
    // Definiciones para el parseadro PPM
    
    #define pinPote1 0
    #define pinPote2 1
    int valorPote1 = 0;
    int valorPote2 = 0;
    
    
    // Definiciones para el parseadro PPM
    #define numChanRadio 4         // Numero de canales que tiene la radio
    #define numCanales 8           // Numero de canales a transmitir
    #define pinSalidaPPM  12       // Definimos cual sera el pin de salida PPM
    #define pinEntradaPPM  13      // Definimos cual sera el pin de entrada PPM
    
    #define pulsoSinc  400         // Definimos el tamano del pulso de sincronizacion en microsegundos
    #define pulsoMin 520          // Fijamos el valor minimo en microsegundos para enviar
    #define pulsoMax 1720          // Fijamos el valor minimo en microsegundos para enviar
    
    int inicio = 0;
    int fin = 0;
    int total = 0;
    int tiempo = 0;
    int restoTrama = 0;
    
    
    int valorCanal[numCanales];    // Array donde se guardaran los valores de tiempo para cada canal
    
    int i; 
    
    //------------------------------------------------------------------
    
    
    
    
    
    void setup(){
      Serial.begin(57600);
      
      // Setup del parseador
      inicializarCanales();
      pinMode(pinSalidaPPM, OUTPUT); // Ponemos el pin de salida en salida ;)
      pinMode(pinEntradaPPM, INPUT); // Ponemos el pin de entrada en entrada ;)
      Serial.println("CONTROLADOR RC INICIALIZADO");
      delay(1000);
    }
    
    
    
    void loop(){
      
      leerSensores();
      leerPPM();
      modificarCanales();
      escribirPPM();
      imprimirCanales();
    
    } 
    
    void imprimirCanales() {
      for ( i = 0; i <= numCanales - 1; i = i++ ) {
        Serial.print(valorCanal[i]);
        Serial.print("  ");
     } 
     Serial.print(tiempo);
     Serial.print("  ");
     Serial.print(restoTrama);
     Serial.print("  TOTAL: ");
     Serial.print(total);
     Serial.print("  ");
     Serial.println(restoTrama + tiempo);
    }
    
    
    void imprimirPotes() {
      Serial.print("valorPote1 : ");
      Serial.print(valorPote1);
      Serial.print(" - ");
      Serial.print("valorPote2 : ");
      Serial.print(valorPote2);
      Serial.println("");
    }
    
    
    
    //------------------------------------------------
    // Funciones o metodos para los sensores
    //------------------------------------------------
    
    void leerSensores() {
      valorPote1 = analogRead(pinPote1);
      valorPote2 = analogRead(pinPote2);
    }
    
    
    //------------------------------------------------
    // Funciones o metodos del Parseador PPM
    //------------------------------------------------
    
    
    void inicializarCanales() {
      // Inicializamos el array con el valor minimo
     for ( i = 0; i <= numCanales - 1; i = i++ ) {
         valorCanal[i] = pulsoMin;
     } 
      
    }
    
    void modificarCanales()  {
      
        // Esta funcion debe cambiar y recibir parametros, para cambiar un canal mapeando
        // Podria quedar: cambiarCanal(int canal, int valor, int rangoOrigen1, int rangoOrigen2)
        // Los rangos destinos, son los definidos por pulsoMin y pulsoMax
        // Cargamos los valores leidos y mapeados de los sensores en los canales asignados
        for ( i = 0; i <= numCanales - 1; i = i++ ) {
          if (i == 0) { valorCanal[i] = map(valorPote1, 0, 1000, pulsoMin, pulsoMax); }        // Cargamos el valor X del ADX en el canal 5 
          if (i == 1) { valorCanal[i] = map(valorPote1, 0, 1000, pulsoMin, pulsoMax); }       // Cargamos el valor Y del ADX en el canal 6
          if (i == 2) { valorCanal[i] = map(valorPote1, 0, 1000, pulsoMin, pulsoMax); }       // Cargamos el valor Y del ADX en el canal 6
          if (i == 3) { valorCanal[i] = map(valorPote1, 0, 1000, pulsoMin, pulsoMax); }       // Cargamos el valor Y del ADX en el canal 6
          if (i == 4) { valorCanal[i] = map(valorPote1, 0, 1000, pulsoMin, pulsoMax); }       // Cargamos el valor Y del ADX en el canal 6
          if (i == 5) { valorCanal[i] = map(valorPote1, 0, 1000, pulsoMin, pulsoMax); }       // Cargamos el valor Y del ADX en el canal 6
          if (i == 6) { valorCanal[i] = map(valorPote1, 0, 1000, pulsoMin, pulsoMax); }       // Cargamos el valor Y del ADX en el canal 6
          if (i == 7) { valorCanal[i] = map(valorPote1, 0, 1000, pulsoMin, pulsoMax); }       // Cargamos el valor Y del ADX en el canal 6
          if (i == 8) { valorCanal[i] = map(valorPote1, 0, 1000, pulsoMin, pulsoMax); }       // Cargamos el valor Y del ADX en el canal 6
        }
        
    }
    
    void leerPPM() {
      for ( i = 0; i <= numCanales  - 1; i = i++ ) {
        valorCanal[i]=(pulseIn(pinEntradaPPM, HIGH)); 
     }
    
    }
    
    void escribirPPM() {
      inicio = micros();
      tiempo = 0;    // Inicializamos para calculo de us de trama
        
         
      for ( i = 0; i <= numCanales -1; i = i++ )  {
        digitalWrite(pinSalidaPPM, LOW);           // Inicio del pulso
        delayMicroseconds(pulsoSinc);              // duracion del pulso de sincronizacion
        digitalWrite(pinSalidaPPM, HIGH);          // Fin del pulso de sincronizacion
        delayMicroseconds(valorCanal[i]);              // duracion del pulso de sincronizacion
        tiempo = (tiempo + valorCanal[i]) + pulsoSinc;
      }
        
     restoTrama = 20000 - tiempo;                  // Completamos el tiempo transcurrido hasta los 20 ms
     delayMicroseconds(restoTrama);
     fin = micros();
     total = inicio - fin;
    }
    
    
    //----------------------------------------------------------------------------------------------
    
    
    
     
    #48 cacer, 4 Nov 2009
    Última edición: 4 Nov 2009
  49. cacer Miembro Activo

    cacer
    Registrado:
    3 Ene 2008
    Mensajes:
    1.136
    Me Gusta recibidos:
    0
    La gracia del codigo, se encuentra en:

    Variable con el numero de canales numCanales.
    Array con los valores de los canales valorCanal[]

    Los metodos de:

    leerPPM()

    Lee de la radio. Dependento de tu radio, tendras que cambiar en esta función el tipo de pulso a leer HIGH o LOW Está para Futaba.

    ModificarCanales()

    Pues eso, se encarga de insertar o cambiar los canales al gusto, mapeando la lectura del sensor por la esperada.

    escribirPPM()

    Este es el punto más debil, ya que requiere que el tiempo sea correcto y los niveles tb.

    ojo, que los bucles for, se inician con 0, por lo tanto 0 es el canal 1 de la radio.

    Ya me tienes nervioso :ansioso::ansioso::ansioso::ansioso:

    Publica una foto con las conexiones del WM+ y en el ardu
     
  50. yapahoe Miembro

    yapahoe
    Registrado:
    18 Ago 2009
    Mensajes:
    578
    Me Gusta recibidos:
    0
    Si señorrr!!!!
    Eso si que son avances chicosss!!! oleee oleee y oleeee:worthy::worthy::worthy:
     

Compartir esta página