Sistema de control por puerto trainer

Tema en 'R/C ELECTRÓNICA' iniciado por jjsueldo, 7 Sep 2010.

  1. jjsueldo Miembro

    jjsueldo
    Registrado:
    6 Abr 2008
    Mensajes:
    489
    Me Gusta recibidos:
    0
    Ya a varios se nos ha ocurrido montar todo tipo de aparatos para manejar desde nuestra emisora, ya sea inyectando señales PPM desde afuera por puerto trainer o Intentando hacer proporcionales canales todo-nada.

    La idea de este hilo es acumular informacion sobre circuiteria comercial y casera para hacer modificaciones a nuestro TX y darle mas flexibilidad a la hora de pedir mas funciones.
     
    #1 jjsueldo, 7 Sep 2010
    Última edición: 31 Mar 2011
  2. jjsueldo Miembro

    jjsueldo
    Registrado:
    6 Abr 2008
    Mensajes:
    489
    Me Gusta recibidos:
    0
  3. jjsueldo Miembro

    jjsueldo
    Registrado:
    6 Abr 2008
    Mensajes:
    489
    Me Gusta recibidos:
    0
    #3 jjsueldo, 7 Sep 2010
    Última edición: 31 Mar 2011
  4. humbertegui Nuevo Miembro

    humbertegui
    Registrado:
    29 Jul 2008
    Mensajes:
    91
    Me Gusta recibidos:
    0
    Hola jjsueldo, me parece que es una buena idea.
    Creo que puedo hacer un pequeño aporte al respecto. De hecho encontré hace un tiempo la manera la manera de conectar un joystick a través de un arduino con un código que encontré por la red (No recuerdo ahora donde, pero seguro que lo tengo guardado por ahí). Lo puse a través del puerto trainer de la futaba FF7.
    Lo probé y no tenía mala pinta.
    En este video estàn las pruebas que hice sobre el tema.

    http://www.youtube.com/watch?v=nQpDu6E-5r0
     
  5. JuanTrillo Gurú FPV

    JuanTrillo
    Registrado:
    21 Sep 2007
    Mensajes:
    5.285
    Me Gusta recibidos:
    0
  6. jjsueldo Miembro

    jjsueldo
    Registrado:
    6 Abr 2008
    Mensajes:
    489
    Me Gusta recibidos:
    0
    Gracias humbertegui por tu aporte . aver si consigues el codigo para tener mas data de esa aplicacion Arduino

    Juan Trillo en que parte del TX conectas ese circuito?
     
  7. humbertegui Nuevo Miembro

    humbertegui
    Registrado:
    29 Jul 2008
    Mensajes:
    91
    Me Gusta recibidos:
    0
    Hola a todos. Ya encontré el código, pero mejor os paso el enlace de la página donde está alojado. Ahí encontrareis toda la info para su realización. Yo utilizé el arduino mega por que no dispongo del mini. "Derroche de recursos" pero bueno, era sólo para hacer la prueba.
    Tengo in mente fabricarme una cabina virtual transportable con todos los recursos de una estación base, telemetría inclusive.

    Este es el enlace:
    http://www.ianjohnston.com/content/index.php?option=com_content&view=article&id=30:project-rc-ppm-trainer-port-joystick&catid=3:hobbies&Itemid=8
     
  8. triff Nuevo Miembro

    triff
    Registrado:
    16 May 2010
    Mensajes:
    33
    Me Gusta recibidos:
    0
    No consigo que se me abra la pagina.:sad:

    Yo tambien estoy intentando conectar el joystick a un microprocesador, y para ello necesito el protocolo de comunicacion que utiliza. Me he puesto con el servicio tecnico de Thrustmaster (mi joystick), pero despues del tercer correo todavía siguen sin querer entender lo que quiero.

    En cuanto consiga un adaptador puerto USB-MiniUSB me pongo con ello. A ver si leyendo lo que me dice el joystick soy capaz de descifrarlo...
     
  9. JuanTrillo Gurú FPV

    JuanTrillo
    Registrado:
    21 Sep 2007
    Mensajes:
    5.285
    Me Gusta recibidos:
    0
    En ninguna parte. La documentacion del codigo es muy completa y sólo es necesario generar la cadena ppm por el puerto trainer.

    Este codigo puede resultar muy util para manipular los servos pan & tilt de la antena, por ejemplo.

    Lo propongo por su claridad y modularidad.

    Salu2
    JT
     
  10. triff Nuevo Miembro

    triff
    Registrado:
    16 May 2010
    Mensajes:
    33
    Me Gusta recibidos:
    0
    ya me funciona la pagina. Ha utilizado el camino bestia, utilizando las entradas analogicas y los digitalin puedes leer todo. Ese es mi plan b, pero para hacerlo
    tendria que quedarme sin el unico joystick que tengo para mis juegos de aviones...

    Mi plan a es conectarlo a esta placa que tengo:
    http://www.sparkfun.com/commerce/product_info.php?products_id=8772

    y luego via serial al microprocesador, y asi poder leer el joystick sin tener que desmontarlo. No se si funcionara,porque ahora que estoy pensando se tendria que alimentar a 5V y no se como se los voy a dar sin meterle mano, pero lo intentare.
     
  11. humbertegui Nuevo Miembro

    humbertegui
    Registrado:
    29 Jul 2008
    Mensajes:
    91
    Me Gusta recibidos:
    0
    ¿Piensas leer a traves del FTDI? Si no me equivoco el FTDI es un adaptador de niveles, parecido al Max232. ¿Donde lo piensas conectar?

    Yo ya me he quedado sin joystick. Pero bueno, todo sea por la ciencia. Si mal no recuerdo, me costó muy barato, sobre los 25 eruros.
     
  12. jjsueldo Miembro

    jjsueldo
    Registrado:
    6 Abr 2008
    Mensajes:
    489
    Me Gusta recibidos:
    0
    Barbaro, ese es un muy buen aporte Amigo.
    Que ha pasado con tu Joistick ?? has volado algun circuito?
     
  13. humbertegui Nuevo Miembro

    humbertegui
    Registrado:
    29 Jul 2008
    Mensajes:
    91
    Me Gusta recibidos:
    0
    Bueno, lo probé una vez en una ocasión pero terminé descartándolo debido a la mala calidad de los potenciómetros que incorpora el joystick.
    Me di cuenta que los reguladores de los brushless no funcionaban de manera progresiva, así que decidí esperar a conseguir unos buenos potenciómetros. El proyecto consiste en hacer una cabina con palanca de gobierno central, acelerador de palanca deslizante y pedales para la dirección, además de los interruptores para mexclas, activación OSD " el programa permite la programación de los interruptores ", etc...
    El panel de la aviónica llevaría pantalla para el video y posiblemente otra para monitorizar la telemetría procedente del LINCE "google eart" y por supuesto un conector para las fat shark. Ah, se me olvidaba, no pueden faltar unos pequeños altavoces para el audio.
     
  14. humbertegui Nuevo Miembro

    humbertegui
    Registrado:
    29 Jul 2008
    Mensajes:
    91
    Me Gusta recibidos:
    0
    Os paso una captura de la señal PPM generada por el arduino.
     

    Adjuntos:

    • PPM.JPG
      PPM.JPG
      Tamaño de archivo:
      52,6 KB
      Visitas:
      120
  15. acristóbal Gurú FPV

    acristóbal
    Registrado:
    9 Oct 2006
    Mensajes:
    3.710
    Me Gusta recibidos:
    0
    Cual es el programa que has metido para que te genere esa señal?
    Lo tienes conectado a un Joystick ?
     
  16. humbertegui Nuevo Miembro

    humbertegui
    Registrado:
    29 Jul 2008
    Mensajes:
    91
    Me Gusta recibidos:
    0

    Hola acristóbal, el código del arduino es este y está conectado directamente a los potenciómetros de 100K de un joystick desguazado.
    Y como el arduino mega tiene su propio regulador de 5V la alimentación la cojo del puerto trainer de la emisora.

    Insertar CODE, HTML o PHP:
    // PPM Encoder Joystick to Futaba Trainer Port 
    // For use with Arduino Nano V3.0 
    // Ian Johnston 29/04/2010 
    // Version 1.1 
     
     
    int AI_Pin_AEL = 6;    // Ana In - Aeleron potentiometer (Ana In Ch.0 playing up?) 
    int AI_Pin_ELE = 1;    // Ana In - Elevator potentiometer 
    int AI_Pin_THR = 2;    // Ana In - Throttle potentiometer 
    int AI_Pin_RUD = 3;    // Ana In - Rudder potentiometer 
    int AI_Pin_TIpot = 4;    // Ana In - TI potentiometer 
    int AI_Raw_AEL;        // Ana In raw var - 0->1023 
    int AI_Raw_ELE;        // Ana In raw var - 0->1023 
    int AI_Raw_THR;        // Ana In raw var - 0->1023 
    int AI_Raw_RUD;        // Ana In raw var - 0->1023 
    int AI_Raw_TIpot;        // Ana In raw var - 0->1023 
    int AI_AEL;           // Ana In var - 0->1023 compensated 
    int AI_ELE;           // Ana In var - 0->1023 compensated 
    int AI_THR;           // Ana In var - 0->1023 compensated 
    int AI_RUD;           // Ana In var - 0->1023 compensated 
    int AI_TIpot;           // Ana In var - 0->1023 compensated 
    int Aeleron_uS = 750;     // Ana In Ch.0 uS var - Aeleron 
    int Elevator_uS = 750;    // Ana In Ch.1 uS var - Elevator 
    int Throttle_uS = 750;    // Ana In Ch.2 uS var - Throttle 
    int Rudder_uS = 750;      // Ana In Ch.3 uS var - Rudder 
    int TI_uS = 750;          // Ana In Ch.4 uS var - TI 
    int TIsw_uS = 750;        // Ana In Ch.4 uS var - TI Switch  
     
    int Fixed_uS = 300;       // PPM frame fixed LOW phase 
    int pulseMin = 750;          // pulse minimum width minus start in uS 
    int pulseMax = 1700;      // pulse maximum width in uS 
     
     
    float DualrateMultAel = 0.9; // Dual rate mult 
    float DualrateMultEle = 0.9; // Dual rate mult 
    float DualrateMultThr = 0.9; // Dual rate mult 
    float DualrateMultRud = 0.9; // Dual rate mult 
    float DualrateMultTI = 0.9; // Dual rate mult 
    int DualrateAdjAel = 0;   // Dual rate mid adjustment 
    int DualrateAdjEle = 0;      // Dual rate mid adjustment 
    int DualrateAdjThr = 0;      // Dual rate mid adjustment     
    int DualrateAdjRud = 0;      // Dual rate mid adjustment 
    int DualrateAdjTI = 0;      // Dual rate mid adjustment 
     
     
    int outPinPPM = 10;       // digital pin 10 
    int outPinTEST = 8;       // digital pin 8 
    int inPinD6 = 6;          // digital pin 6 
    int inPinD11 = 11;        // digital pin 11 
     
     
    ISR(TIMER1_COMPA_vect) { 
        
    ppmoutput(); // Jump to ppmoutput subroutine 
    } 
     
     
    void setup() { 
     
      
    // Serial.begin(9600) ; // Test 
     
     
      
    pinMode(outPinPPM, OUTPUT);   // sets the digital pin as output 
      
    pinMode(inPinD6, INPUT);      // sets the digital pin as input 
      
    digitalWrite(inPinD6, HIGH);  // turn on pull-up resistor 
      
    pinMode(inPinD11, INPUT);     // sets the digital pin as input 
      
    digitalWrite(inPinD11, HIGH); // turn on pull-up resistor 
     
     
       
    // Setup timer 
      
    TCCR1A = B00110001; // Compare register B used in mode '3' 
      
    TCCR1B = B00010010; // WGM13 and CS11 set to 1 
      
    TCCR1C = B00000000; // All set to 0 
      
    TIMSK1 = B00000010; // Interrupt on compare B 
      
    TIFR1  = B00000010; // Interrupt on compare B 
      
    OCR1A = 22000; // 22mS PPM output refresh 
      
    OCR1B = 1000; 
       
     
    } 
     
     
     
     
    void ppmoutput() { // PPM output sub 
     
     
     
    // test pulse - used to trigger scope 
     
    // digitalWrite(outPinTEST, LOW); 
     
    // delayMicroseconds(100);    // Hold 
     
    // digitalWrite(outPinTEST, HIGH); 
     
     
     
    // Channel 1 - Aeleron 
      
    digitalWrite(outPinPPM, LOW); 
      
    delayMicroseconds(Fixed_uS);    // Hold 
      
    digitalWrite(outPinPPM, HIGH); 
      
    delayMicroseconds(Aeleron_uS);  // Hold for Aeleron_uS microseconds       
     
     
     
    // Channel 2 - Elevator  
      
    digitalWrite(outPinPPM, LOW); 
      
    delayMicroseconds(Fixed_uS);    // Hold 
      
    digitalWrite(outPinPPM, HIGH); 
      
    delayMicroseconds(Elevator_uS); // Hold for Elevator_uS microseconds       
     
     
     
    // Channel 3 - Throttle 
      
    digitalWrite(outPinPPM, LOW); 
      
    delayMicroseconds(Fixed_uS);    // Hold 
      
    digitalWrite(outPinPPM, HIGH); 
      
    delayMicroseconds(Throttle_uS); // Hold for Throttle_uS microseconds       
     
     
     
    // Channel 4 - Rudder 
      
    digitalWrite(outPinPPM, LOW); 
      
    delayMicroseconds(Fixed_uS);    // Hold 
      
    digitalWrite(outPinPPM, HIGH); 
      
    delayMicroseconds(Rudder_uS);   // Hold for Rudder_uS microseconds 
     
     
     
    // Channel 5 - TI Switch 
      
    digitalWrite(outPinPPM, LOW); 
      
    delayMicroseconds(Fixed_uS);    // Hold 
      
    digitalWrite(outPinPPM, HIGH); 
      
    delayMicroseconds(TIsw_uS);     // Hold for TIsw_uS microseconds         
     
     
     
    // Channel 6 - TI pot 
      
    digitalWrite(outPinPPM, LOW); 
      
    delayMicroseconds(Fixed_uS);    // Hold 
      
    digitalWrite(outPinPPM, HIGH); 
      
    delayMicroseconds(TI_uS);       // Hold for TI_uS microseconds   
     
     
     
    // Synchro pulse 
      
    digitalWrite(outPinPPM, LOW); 
      
    delayMicroseconds(Fixed_uS);    // Hold 
      
    digitalWrite(outPinPPM, HIGH);  // Start Synchro pulse 
     
     
    } 
     
    
     
     
    void loop() { // Main loop 
     
     
     
    // Read analogue ports 
       
    AI_Raw_AEL = analogRead(AI_Pin_AEL); 
       
    AI_Raw_ELE = analogRead(AI_Pin_ELE); 
       
    AI_Raw_THR = analogRead(AI_Pin_THR); 
       
    AI_Raw_RUD = analogRead(AI_Pin_RUD); 
       
    AI_Raw_TIpot = analogRead(AI_Pin_TIpot); 
     
     
     
    // Compensate for discrepancy in pot inputs including centering offset. 
     
    // Also use this to invert inputs if necessary (swap x1 & y1) 
     
    // y=mx+c, x to y scales to x1 to y1 
       
    AI_AEL = map(AI_Raw_AEL, 0, 1023, 1200, 0) - 100; // Invert Aeleron pot and slight centre offset 
       
    AI_ELE = map(AI_Raw_ELE, 0, 1023, 1200, 0) - 120; // Invert Elevator pot and slight centre offset 
       
    AI_THR = map(AI_Raw_THR, 0, 1023, 0, 1023) + 0;  // Throttle 
       
    AI_RUD = map(AI_Raw_RUD, 0, 1023, 0, 1023) + 0;  // Rudder 
       
    AI_TIpot = map(AI_Raw_TIpot, 0, 1023, 1023, 0) + 0;  // Thermal Intelligence pot (TI) 
        
     
     
    // Map analogue inputs to PPM rates for each of the channels 
       
    Aeleron_uS = (AI_AEL * DualrateMultAel) + pulseMin + DualrateAdjAel; 
       
    Elevator_uS = (AI_ELE * DualrateMultEle) + pulseMin + DualrateAdjEle; 
       
    Throttle_uS = (AI_THR * DualrateMultThr) + pulseMin + DualrateAdjThr; 
       
    Rudder_uS = (AI_RUD * DualrateMultRud) + pulseMin + DualrateAdjRud; 
       
    TI_uS = (AI_TIpot * DualrateMultTI) + pulseMin + DualrateAdjTI; 
     
     
     
    // Check limits 
      
    if (Aeleron_uS <= 750) Aeleron_uS = 750;     // Min 
      
    if (Aeleron_uS >= 1700) Aeleron_uS = 1700;   // Max    
      
    if (Elevator_uS <= 750) Elevator_uS = 750;   // Min 
      
    if (Elevator_uS >= 1700) Elevator_uS = 1700; // Max  
      
    if (Throttle_uS <= 750) Throttle_uS = 750;   // Min 
      
    if (Throttle_uS >= 1700) Throttle_uS = 1700; // Max  
      
    if (Rudder_uS <= 750) Rudder_uS = 750;       // Min 
      
    if (Rudder_uS >= 1700) Rudder_uS = 1700;     // Max    
      
    if (TI_uS <= 750) TI_uS = 750;               // Min 
      
    if (TI_uS >= 1700) TI_uS = 1700;             // Max  
        
     
      
    if (digitalRead(inPinD6) == 0) { // Low rate 
             
    DualrateMultAel = 0.5; 
            
    DualrateMultEle = 0.5; 
            
    DualrateMultThr = 0.9; 
            
    DualrateMultRud = 0.7; 
            
    DualrateMultTI = 0.9; 
            
    DualrateAdjAel = 200; 
            
    DualrateAdjEle = 200; 
            
    DualrateAdjThr = 0; 
            
    DualrateAdjRud = 100; 
            
    DualrateAdjTI = 0; 
      
    } 
       
     
      
    if (digitalRead(inPinD6) == 1) { // Normal/high rate 
            
    DualrateMultAel = 0.9; 
            
    DualrateMultEle = 0.9; 
            
    DualrateMultThr = 0.9; 
            
    DualrateMultRud = 0.9; 
            
    DualrateMultTI = 0.9; 
            
    DualrateAdjAel = 0; 
            
    DualrateAdjEle = 0; 
            
    DualrateAdjThr = 0; 
            
    DualrateAdjRud = 0; 
            
    DualrateAdjTI = 0; 
      
    } 
       
     
      
    if (digitalRead(inPinD11) == 1) { // TI Switch     
           
    TIsw_uS = 1700; 
      
    } else { 
            
    TIsw_uS = 750; 
      
    } 
     
     
    }
     
  17. acristóbal Gurú FPV

    acristóbal
    Registrado:
    9 Oct 2006
    Mensajes:
    3.710
    Me Gusta recibidos:
    0
    Muchas gracias,


    Cuantos Pots puedes llegar a conectar?
    Se podría hacer una trama PPM de 9 canales??

    Si conectamos la trama a un módulo, ¿podríamos dejar la emisora sin usar verdad??

    Saludos
    Alberto
     
  18. humbertegui Nuevo Miembro

    humbertegui
    Registrado:
    29 Jul 2008
    Mensajes:
    91
    Me Gusta recibidos:
    0
    He estado probando de añadir unas lineas de programa y parece que se pueden meter mas canales a la trama. Si te fijas en la captura del osciloscopio verás que hay un canal mas. Seis canales antes y siete después de la modificación. Así que no creo haya problema.
    Cuando pueda lo probaré en el transmisor.

    Y en principio si se debería poder conectar la señal a un módulo, pero no lo he probado.
     

    Adjuntos:

    • PPM_7c.JPG
      PPM_7c.JPG
      Tamaño de archivo:
      45,3 KB
      Visitas:
      124
  19. humbertegui Nuevo Miembro

    humbertegui
    Registrado:
    29 Jul 2008
    Mensajes:
    91
    Me Gusta recibidos:
    0
    Hola a todos.
    Me he tomado un poco de tiempo para hacer unas pruebas con el arduino y un módulo de una futaba FF7 desguazada.

    Como una imagen vale mas que mil palabras. Ahí va eso.


     
  20. guismo Miembro

    guismo
    Registrado:
    18 Oct 2007
    Mensajes:
    730
    Me Gusta recibidos:
    0
    no habia visto este post hasta ahora....esta genial lo que estais hacendo.

    Yo habia pensado en algo bastante mas simple que he comprobado que funciona (no se si será tan efectivo...)

    Mi idea ha sido conectar una hembra de cable de servo a las clavijas donde van los potenciometros de la emisora y sacar machos de cable de servo de los potenciometros del joystick. He hecho unas primeras pruebas y funciona bastante bien....
     
  21. acristóbal Gurú FPV

    acristóbal
    Registrado:
    9 Oct 2006
    Mensajes:
    3.710
    Me Gusta recibidos:
    0
    Hola humbertegui:
    Me gusta mucho, mucho.
    ¿Vas a publicar el código? :tongue2: me gustaría hacer alguna prueba

    ¿Has conectado directamente los potenciometros al Arduino?
    ¿Se podría llegar a realizar una trama PPM de 9 ó 10 canales?

    Gracias
    Alberto
     
  22. humbertegui Nuevo Miembro

    humbertegui
    Registrado:
    29 Jul 2008
    Mensajes:
    91
    Me Gusta recibidos:
    0
    Hola Gismo. En cierto modo esto es lo mismo. Cada pot. del joystick va a una entrada del arduino. Y de este al puerto trainer de la emisora.

    O si no, modificando un poco el código. Podemos conectarlo a un módulo, como el ejemplo del video y nos olvidamos de la emisora.
     
  23. humbertegui Nuevo Miembro

    humbertegui
    Registrado:
    29 Jul 2008
    Mensajes:
    91
    Me Gusta recibidos:
    0
    Hola Alberto.
    Pues sí, tanto potenciómetros como interruptores están conectados directamente al arduino.
    En cuanto a la trama PPM, hasta el momento me funciona con siete canales. A poco que pueda probaré de ir ampliando.

    En cuanto al código, es el mismo que está colgado el post 16, con salida PPM negativo y seis canales.

    Si tengo un momento postearé el de siete canales y PPM positivo para módulo.

    Saludos
     
  24. acristóbal Gurú FPV

    acristóbal
    Registrado:
    9 Oct 2006
    Mensajes:
    3.710
    Me Gusta recibidos:
    0
    Muchas gracias humbertegui:
    Lo probaré con el código de 6 canales. ¿Crees que funcionara en un Arduino mini Pro 5V?
    Cuantas entradas de pots puede tener el Arduino?
    ¿Con que Arduino lo has hecho? ¿Con el Duemilenova? ¿o con el nuevo UNO?
     
  25. humbertegui Nuevo Miembro

    humbertegui
    Registrado:
    29 Jul 2008
    Mensajes:
    91
    Me Gusta recibidos:
    0
  26. acristóbal Gurú FPV

    acristóbal
    Registrado:
    9 Oct 2006
    Mensajes:
    3.710
    Me Gusta recibidos:
    0
    Voy a usarlo con un módulo para evitar la emisora

    El Nano tiene 8 entradas analógicas
    El Pro Mini tiene 6
    El UNO (duemilanove) tiene solo 6 también
     
  27. humbertegui Nuevo Miembro

    humbertegui
    Registrado:
    29 Jul 2008
    Mensajes:
    91
    Me Gusta recibidos:
    0
    Ok, aquí tienes el código para seis canales y PPM positivo.

    Insertar CODE, HTML o PHP:
    // PPM Encoder Joystick to Futaba Trainer Port 
    // For use with Arduino Nano V3.0 
    // Ian Johnston 29/04/2010 
    // Version 1.1 
     
     
    int AI_Pin_AEL = 6;    // Ana In - Aeleron potentiometer (Ana In Ch.0 playing up?) 
    int AI_Pin_ELE = 1;    // Ana In - Elevator potentiometer 
    int AI_Pin_THR = 2;    // Ana In - Throttle potentiometer 
    int AI_Pin_RUD = 3;    // Ana In - Rudder potentiometer 
    int AI_Pin_TIpot = 4;    // Ana In - TI potentiometer 
    int AI_Raw_AEL;        // Ana In raw var - 0->1023 
    int AI_Raw_ELE;        // Ana In raw var - 0->1023 
    int AI_Raw_THR;        // Ana In raw var - 0->1023 
    int AI_Raw_RUD;        // Ana In raw var - 0->1023 
    int AI_Raw_TIpot;        // Ana In raw var - 0->1023 
    int AI_AEL;           // Ana In var - 0->1023 compensated 
    int AI_ELE;           // Ana In var - 0->1023 compensated 
    int AI_THR;           // Ana In var - 0->1023 compensated 
    int AI_RUD;           // Ana In var - 0->1023 compensated 
    int AI_TIpot;           // Ana In var - 0->1023 compensated 
    int Aeleron_uS = 750;     // Ana In Ch.0 uS var - Aeleron 
    int Elevator_uS = 750;    // Ana In Ch.1 uS var - Elevator 
    int Throttle_uS = 750;    // Ana In Ch.2 uS var - Throttle 
    int Rudder_uS = 750;      // Ana In Ch.3 uS var - Rudder 
    int TI_uS = 750;          // Ana In Ch.4 uS var - TI 
    int TIsw_uS = 750;        // Ana In Ch.4 uS var - TI Switch  
     
    int Fixed_uS = 300;       // PPM frame fixed LOW phase 
    int pulseMin = 750;          // pulse minimum width minus start in uS 
    int pulseMax = 1700;      // pulse maximum width in uS 
     
     
    float DualrateMultAel = 0.9; // Dual rate mult 
    float DualrateMultEle = 0.9; // Dual rate mult 
    float DualrateMultThr = 0.9; // Dual rate mult 
    float DualrateMultRud = 0.9; // Dual rate mult 
    float DualrateMultTI = 0.9; // Dual rate mult 
    int DualrateAdjAel = 0;   // Dual rate mid adjustment 
    int DualrateAdjEle = 0;      // Dual rate mid adjustment 
    int DualrateAdjThr = 0;      // Dual rate mid adjustment     
    int DualrateAdjRud = 0;      // Dual rate mid adjustment 
    int DualrateAdjTI = 0;      // Dual rate mid adjustment 
     
     
    int outPinPPM = 10;       // digital pin 10 
    int outPinTEST = 8;       // digital pin 8 
    int inPinD6 = 6;          // digital pin 6 
    int inPinD11 = 11;        // digital pin 11 
     
     
    ISR(TIMER1_COMPA_vect) { 
        
    ppmoutput(); // Jump to ppmoutput subroutine 
    } 
     
     
    void setup() { 
     
      
    // Serial.begin(9600) ; // Test 
     
     
      
    pinMode(outPinPPM, OUTPUT);   // sets the digital pin as output 
      
    pinMode(inPinD6, INPUT);      // sets the digital pin as input 
      
    digitalWrite(inPinD6, HIGH);  // turn on pull-up resistor 
      
    pinMode(inPinD11, INPUT);     // sets the digital pin as input 
      
    digitalWrite(inPinD11, HIGH); // turn on pull-up resistor 
     
     
       
    // Setup timer 
      
    TCCR1A = B00110001; // Compare register B used in mode '3' 
      
    TCCR1B = B00010010; // WGM13 and CS11 set to 1 
      
    TCCR1C = B00000000; // All set to 0 
      
    TIMSK1 = B00000010; // Interrupt on compare B 
      
    TIFR1  = B00000010; // Interrupt on compare B 
      
    OCR1A = 22000; // 22mS PPM output refresh 
      
    OCR1B = 1000; 
       
     
    } 
     
     
     
     
    void ppmoutput() { // PPM output sub 
     
     
     
    // test pulse - used to trigger scope 
     
    // digitalWrite(outPinTEST, LOW); 
     
    // delayMicroseconds(100);    // Hold 
     
    // digitalWrite(outPinTEST, HIGH); 
     
     
     
    // Channel 1 - Aeleron 
      
    digitalWrite(outPinPPM, HIGH); 
      
    delayMicroseconds(Fixed_uS);    // Hold 
      
    digitalWrite(outPinPPM, LOW); 
      
    delayMicroseconds(Aeleron_uS);  // Hold for Aeleron_uS microseconds       
     
     
     
    // Channel 2 - Elevator  
      
    digitalWrite(outPinPPM, HIGH); 
      
    delayMicroseconds(Fixed_uS);    // Hold 
      
    digitalWrite(outPinPPM, LOW); 
      
    delayMicroseconds(Elevator_uS); // Hold for Elevator_uS microseconds       
     
     
     
    // Channel 3 - Throttle 
      
    digitalWrite(outPinPPM, HIGH); 
      
    delayMicroseconds(Fixed_uS);    // Hold 
      
    digitalWrite(outPinPPM, LOW); 
      
    delayMicroseconds(Throttle_uS); // Hold for Throttle_uS microseconds       
     
     
     
    // Channel 4 - Rudder 
      
    digitalWrite(outPinPPM, HIGH); 
      
    delayMicroseconds(Fixed_uS);    // Hold 
      
    digitalWrite(outPinPPM, LOW); 
      
    delayMicroseconds(Rudder_uS);   // Hold for Rudder_uS microseconds 
     
     
     
    // Channel 5 - TI Switch 
      
    digitalWrite(outPinPPM, HIGH); 
      
    delayMicroseconds(Fixed_uS);    // Hold 
      
    digitalWrite(outPinPPM, LOW); 
      
    delayMicroseconds(TIsw_uS);     // Hold for TIsw_uS microseconds         
     
     
     
    // Channel 6 - TI pot 
      
    digitalWrite(outPinPPM, HIGH); 
      
    delayMicroseconds(Fixed_uS);    // Hold 
      
    digitalWrite(outPinPPM, LOW); 
      
    delayMicroseconds(TI_uS);       // Hold for TI_uS microseconds   
     
     
     
    // Synchro pulse 
      
    digitalWrite(outPinPPM, HIGH); 
      
    delayMicroseconds(Fixed_uS);    // Hold 
      
    digitalWrite(outPinPPM, LOW);  // Start Synchro pulse 
     
     
    } 
     
    
     
     
    void loop() { // Main loop 
     
     
     
    // Read analogue ports 
       
    AI_Raw_AEL = analogRead(AI_Pin_AEL); 
       
    AI_Raw_ELE = analogRead(AI_Pin_ELE); 
       
    AI_Raw_THR = analogRead(AI_Pin_THR); 
       
    AI_Raw_RUD = analogRead(AI_Pin_RUD); 
       
    AI_Raw_TIpot = analogRead(AI_Pin_TIpot); 
     
     
     
    // Compensate for discrepancy in pot inputs including centering offset. 
     
    // Also use this to invert inputs if necessary (swap x1 & y1) 
     
    // y=mx+c, x to y scales to x1 to y1 
       
    AI_AEL = map(AI_Raw_AEL, 0, 1023, 1200, 0) - 100; // Invert Aeleron pot and slight centre offset 
       
    AI_ELE = map(AI_Raw_ELE, 0, 1023, 1200, 0) - 120; // Invert Elevator pot and slight centre offset 
       
    AI_THR = map(AI_Raw_THR, 0, 1023, 0, 1023) + 0;  // Throttle 
       
    AI_RUD = map(AI_Raw_RUD, 0, 1023, 0, 1023) + 0;  // Rudder 
       
    AI_TIpot = map(AI_Raw_TIpot, 0, 1023, 1023, 0) + 0;  // Thermal Intelligence pot (TI) 
        
     
     
    // Map analogue inputs to PPM rates for each of the channels 
       
    Aeleron_uS = (AI_AEL * DualrateMultAel) + pulseMin + DualrateAdjAel; 
       
    Elevator_uS = (AI_ELE * DualrateMultEle) + pulseMin + DualrateAdjEle; 
       
    Throttle_uS = (AI_THR * DualrateMultThr) + pulseMin + DualrateAdjThr; 
       
    Rudder_uS = (AI_RUD * DualrateMultRud) + pulseMin + DualrateAdjRud; 
       
    TI_uS = (AI_TIpot * DualrateMultTI) + pulseMin + DualrateAdjTI; 
     
     
     
    // Check limits 
      
    if (Aeleron_uS <= 750) Aeleron_uS = 750;     // Min 
      
    if (Aeleron_uS >= 1700) Aeleron_uS = 1700;   // Max    
      
    if (Elevator_uS <= 750) Elevator_uS = 750;   // Min 
      
    if (Elevator_uS >= 1700) Elevator_uS = 1700; // Max  
      
    if (Throttle_uS <= 750) Throttle_uS = 750;   // Min 
      
    if (Throttle_uS >= 1700) Throttle_uS = 1700; // Max  
      
    if (Rudder_uS <= 750) Rudder_uS = 750;       // Min 
      
    if (Rudder_uS >= 1700) Rudder_uS = 1700;     // Max    
      
    if (TI_uS <= 750) TI_uS = 750;               // Min 
      
    if (TI_uS >= 1700) TI_uS = 1700;             // Max  
        
     
      
    if (digitalRead(inPinD6) == 0) { // Low rate 
             
    DualrateMultAel = 0.5; 
            
    DualrateMultEle = 0.5; 
            
    DualrateMultThr = 0.9; 
            
    DualrateMultRud = 0.7; 
            
    DualrateMultTI = 0.9; 
            
    DualrateAdjAel = 200; 
            
    DualrateAdjEle = 200; 
            
    DualrateAdjThr = 0; 
            
    DualrateAdjRud = 100; 
            
    DualrateAdjTI = 0; 
      
    } 
       
     
      
    if (digitalRead(inPinD6) == 1) { // Normal/high rate 
            
    DualrateMultAel = 0.9; 
            
    DualrateMultEle = 0.9; 
            
    DualrateMultThr = 0.9; 
            
    DualrateMultRud = 0.9; 
            
    DualrateMultTI = 0.9; 
            
    DualrateAdjAel = 0; 
            
    DualrateAdjEle = 0; 
            
    DualrateAdjThr = 0; 
            
    DualrateAdjRud = 0; 
            
    DualrateAdjTI = 0; 
      
    } 
       
     
      
    if (digitalRead(inPinD11) == 1) { // TI Switch     
           
    TIsw_uS = 1700; 
      
    } else { 
            
    TIsw_uS = 750; 
      
    } 
     
     
    }
     
  28. acristóbal Gurú FPV

    acristóbal
    Registrado:
    9 Oct 2006
    Mensajes:
    3.710
    Me Gusta recibidos:
    0
    Me voy a comprar el Nano y así tener 8 entradas analógicas.
    Gracias.
     
  29. pedro lope Nuevo Miembro

    pedro lope
    Registrado:
    10 Feb 2007
    Mensajes:
    60
    Me Gusta recibidos:
    0
    128 o 328 ?

    Hola:
    Me parece un buen proyecto, pero tengo una duda, que arduino nano es el adecuado, el de memoria 128 o el de 328?.
    Saludos
    Andres
     
  30. humbertegui Nuevo Miembro

    humbertegui
    Registrado:
    29 Jul 2008
    Mensajes:
    91
    Me Gusta recibidos:
    0
    Si lo tienes que comprar, me parece mas lógico que adquieras la V3.0, o sea con el Atmega 328. Tiene el doble de memoria que el 168.

    Saludos.
     
  31. humbertegui Nuevo Miembro

    humbertegui
    Registrado:
    29 Jul 2008
    Mensajes:
    91
    Me Gusta recibidos:
    0
    ¡Comprobado!
    Módulo FF7 desguazado + Arduino + Receptor corona RP8D1 = Trama PPM de 8 canales.

    A base de repetir rutinas he implementado 7 canales proporcionales y uno todo/nada. Lástima que no tenga un receptor de 12 para probar de añadirle mas.

    Cuando pueda lo probaré en un avión barato por si las moscas.
     
  32. bomber01 Miembro

    bomber01
    Registrado:
    28 Jul 2007
    Mensajes:
    618
    Me Gusta recibidos:
    0
    Que fieras estais hechos como me gusta...la pena es que yo de electronica ni papa...pero tengo Arduino duemilanove y una emisora hitec de seis canales,si supiera meterle mano lo aria,pero de verad alavo vuestro trabajo....precioso de verdad.
     
  33. humbertegui Nuevo Miembro

    humbertegui
    Registrado:
    29 Jul 2008
    Mensajes:
    91
    Me Gusta recibidos:
    0
    Hola bomber01.
    La verdad es que tampoco tiene tanto mérito, puesto que el código no es mío. Yo solo lo modifico a conveniencia y lo posteo para que todos podamos disfrutar de este estupendo hobby en sus diferentes variantes.

    Por lo demás, con poco de paciencia y perseverancia todo se puede conseguir. Asi que ...

    Animo y a cacharrear.
     
  34. acristóbal Gurú FPV

    acristóbal
    Registrado:
    9 Oct 2006
    Mensajes:
    3.710
    Me Gusta recibidos:
    0
    Alguien me podría decir como puedo implementar conmutadores de 3 posiciones en Arduino.
    He estado leyendo y entiendo que las entrada digitales solo "entienden" dos posiciones (High y Low) así que creo que lo tendría que hacer asignando un canal digital para cada posición del interruptor, es decir, necesitaría dos entradas digitales para conseguir las tres posiciones y si quisiera usar tres interruptores necesitaría 6 entradas digitales.

    Con estos 3 conmutadores de 3 posiciones quiero formar la trama de un solo canal.
     
  35. tts Miembro

    tts
    Registrado:
    22 Sep 2009
    Mensajes:
    337
    Me Gusta recibidos:
    0
    Buenas,

    Antes de nada me ha encantado el proyecto, asi que voy a intentarlo; tengo pensado comprar un arduino mega (mas vale que sobre, por si acaso), un modulo Wfly, y lo unico que no tengo decidio es el yoistick que voy a utilizar ya que no se cual sera el mas adecuado, ¿alguna sugerencia?¿cual habeis probado vosotros?, tambien pensaba ponerle unos pedales para mas realismo; muchas gracias por adelantado.

    En cuanto a lo del canal de 3 posiciones a mi tambien me interesa, intentare hacer algo aunque no creo que vaya a tener mucho exito, ya me daria con un canto en los dientes con acerla funcionar tal cual esta.

    Saludos.
     
  36. acristóbal Gurú FPV

    acristóbal
    Registrado:
    9 Oct 2006
    Mensajes:
    3.710
    Me Gusta recibidos:
    0
    En otro código de Ian tiene puesto un interruptor (supongo que de tres posiciones) con el que maneja los dual rates en High-mid-low alguien me puede explicar como lo hace?

    Insertar CODE, HTML o PHP:
    void switchesRates() {
        if (digitalRead(inPinD5) == 0) {      // HI/MID/LO setting
            backlightOn(0);
            digitalWrite(outPinBuzz, HIGH);   // Turn on buzzer    
            delay(25);
            RatesHIMIDLO = RatesHIMIDLO + 1;
            if (RatesHIMIDLO == 4) { RatesHIMIDLO = 1; }
            digitalWrite(outPinBuzz, LOW);   // Turn off buzzer
        }
    
        if (RatesHIMIDLO == 3) {  // High rate
            TrimSetting = 0;
            DualrateMultAel = 1.0;
            DualrateMultEle = 1.0;
            DualrateMultThr = 1.0;
            DualrateMultRud = 1.0;
            DualrateMultTI = 1.0;
            DualrateAdjAel = 0;
            DualrateAdjEle = 0;
            DualrateAdjThr = 0;
            DualrateAdjRud = 0;
            DualrateAdjTI = 0;
            cursorSet(1,2);
            Serial.println("Rates=HI");
        }
        if (RatesHIMIDLO == 2) {  // Mid rate
            TrimSetting = 0;
            DualrateMultAel = 0.7;
            DualrateMultEle = 0.7;
            DualrateMultThr = 1.0;
            DualrateMultRud = 0.7;
            DualrateMultTI = 1.0;
            DualrateAdjAel = 187;
            DualrateAdjEle = 120;
            DualrateAdjThr = 0;
            DualrateAdjRud = 120;
            DualrateAdjTI = 0;
            cursorSet(1,2);
            Serial.println("Rates=MI");
        }
        
        if (RatesHIMIDLO == 1) {  // LO rate
            TrimSetting = 0;
            DualrateMultAel = 0.5;
            DualrateMultEle = 0.5;
            DualrateMultThr = 1.0;
            DualrateMultRud = 0.5;
            DualrateMultTI = 1.0;
            DualrateAdjAel = 270;
            DualrateAdjEle = 220;
            DualrateAdjThr = 0;
            DualrateAdjRud = 215;
            DualrateAdjTI = 0;
            cursorSet(1,2);
            Serial.println("Rates=LO");
        }    
    
     
  37. humbertegui Nuevo Miembro

    humbertegui
    Registrado:
    29 Jul 2008
    Mensajes:
    91
    Me Gusta recibidos:
    0

    Hola tts.
    El joystick que uso es este, de Airis. Está sobre los 15 euros, pero supongo que cualquiera te puede ir bien.
     

    Adjuntos:

  38. humbertegui Nuevo Miembro

    humbertegui
    Registrado:
    29 Jul 2008
    Mensajes:
    91
    Me Gusta recibidos:
    0
    Hola Acristóbal.
    Creo que este código lee a través de la entrada 5 con incrementos de uno por pulso. No estoy muy ducho en C, pero es la impresión que me da.
    O sea, un pulso = 1. Otro pulso = 2. Pulso de nuevo = 3. Hasta que if (RatesHIMIDLO == 4) { RatesHIMIDLO = 1; } Volvería a ser 1.

    Que me corrijan si me equivoco. Gracias.

    Saludos.
     
  39. acristóbal Gurú FPV

    acristóbal
    Registrado:
    9 Oct 2006
    Mensajes:
    3.710
    Me Gusta recibidos:
    0
    Ahora entiendo, y entonces, lo que hay conectado al pin digital 5 es un pulsador

    Gracias.

    Respecto a la pregunta de como hacer funcionar un conmutador de 3 posiciones. ¿Como sería?

    posición 0 usamos una de las dos posiciones de un digital in
    posición 1 usamos la otra de las dos posiciones del mismo digital in
    posición 2 usamos una de las dos posiciones de otro digital in

    Así de esta forma usaríamos dos entradas digitales por cada conmutador de 3 posiciones. ¿Es correcto?
     
  40. humbertegui Nuevo Miembro

    humbertegui
    Registrado:
    29 Jul 2008
    Mensajes:
    91
    Me Gusta recibidos:
    0
    Pues si, supongo que puede hacerse a traves de una combinación binaria aprovechando varias entradas. Pero lo que veo complicado es la salida PWM, que me parece que la quieres dividir en tres, ¿Es así?.
    ¿De cuantos canales quieres disponer en total, incluyendo los proporcionales?
     
  41. acristóbal Gurú FPV

    acristóbal
    Registrado:
    9 Oct 2006
    Mensajes:
    3.710
    Me Gusta recibidos:
    0
    Inicialmente quiero probar con una trama de 8 canales pero si funciona bien quiero probar con 9 o incluso con 10.

    Con los tres interruptores de 3 posiciones quiero formar los 27 valores diferentes del pulso para poder hacer las 27 diferentes combinaciones de los 3 interruptores de 3 posiciones.

    Esto pretendo hacerlo con condicionales tipo:

    if entrada digital x = High y entrada digital y = High y entrada digital z = High
    entonces ancho de pulso canal 8 = 1000

    y así 27 condicionales
     
    #41 acristóbal, 14 Oct 2010
    Última edición: 14 Oct 2010
  42. jjsueldo Miembro

    jjsueldo
    Registrado:
    6 Abr 2008
    Mensajes:
    489
    Me Gusta recibidos:
    0
    Excelente Acristobal

    ¿Se podría llegar a realizar una trama PPM de mas de 7 canales?
     
  43. acristóbal Gurú FPV

    acristóbal
    Registrado:
    9 Oct 2006
    Mensajes:
    3.710
    Me Gusta recibidos:
    0
    Como puedes ver en el post de Humbertegui, él ya lo ha hecho con 8 y creo que es posible hasta 9 al menos.

    Yo por otro lado ya he conseguido hacer el desmultiplexador de canales, consiguiendo sacar 3 canales de 3 posiciones de uno proporcional. :party:

    Ya colgaré más información.
     
  44. humbertegui Nuevo Miembro

    humbertegui
    Registrado:
    29 Jul 2008
    Mensajes:
    91
    Me Gusta recibidos:
    0
    Mañana si el tiempo lo permite, voy a volar con ... Esto:
    Momentáneamente es una chapuza, pero ya lo mejoraré.
     

    Adjuntos:

  45. acristóbal Gurú FPV

    acristóbal
    Registrado:
    9 Oct 2006
    Mensajes:
    3.710
    Me Gusta recibidos:
    0
    Enhorabuena.
    Con un monitor de esos baratos pero fantásticos por 80-90€ estará fantástico.
     
  46. acristóbal Gurú FPV

    acristóbal
    Registrado:
    9 Oct 2006
    Mensajes:
    3.710
    Me Gusta recibidos:
    0
    Ya he recibido los conmutadores de tres posiciones, y el código de Arduino l tengo bastante avanzado. Haré pruebas esta semana.


    Conmutadores 3 posiciones ON ON ON

    [​IMG]

    Parecen normales pero no lo son.:wink2:

    Ya contaré.
     
    #46 acristóbal, 18 Oct 2010
    Última edición: 18 Oct 2010
  47. acristóbal Gurú FPV

    acristóbal
    Registrado:
    9 Oct 2006
    Mensajes:
    3.710
    Me Gusta recibidos:
    0
    Hoy he tenido tiempo para montar un Arduino Pro Mini y hacerle las conexiones para probar el código de Ian Johnston, lo he conectado al osciloscopio y parece que funciona correctamente.

    He modificado el código para meter un canal más y así tener 7 canales, siendo uno de ellos activado por tres Interruptores de 3 posiciones, con esto realmente tendríamos 9 canales.
    Esto está en pruebas y no lo puedo confirmar ya que el ancho de los sectores de pulso es muy estrecho y no sé si será muy crítico. Podríamos hacerlo más fácil con 2 interruptores de 3 posiciones y uno de 2 posiciones. O incluso si fuera muy crítico cambiaría para poner 2 interruptores de 3 posiciones (muchísimo menos crítico). En la peor de las soluciones obtenemos un canal más.

    Esta noche me pondré a ver si le puedo sacar 9 canales que sumando la posibilidad de lo comentado anteriormente , como poco podrían ser 10 canales (dos de ellos de 3 posiciones).

    Estoy investigando para poder hacer que reconozca la trama PPM de una emisora cualquiera y la sustituya por la generada pudiendo generar hasta 12 canales en PPM. Actualmente hay 2 equipos en el mercado que leen estas tramas, el Dragon Link y el de Thomas, los dos en 433MHZ
     
  48. bomber01 Miembro

    bomber01
    Registrado:
    28 Jul 2007
    Mensajes:
    618
    Me Gusta recibidos:
    0
    Como me gusta esto acristobal te devo de decir que lo que tocas los transformas campeon, no tienes limite....me dejas fascinado y yo sin saber soldar un componente ...jajajaja
     
  49. acristóbal Gurú FPV

    acristóbal
    Registrado:
    9 Oct 2006
    Mensajes:
    3.710
    Me Gusta recibidos:
    0
    No es para tanto Bomber, yo hace un par de años no tenía ni pajualera idea de soldar y me he picado con esto y aquí estoy, haciendo (digo modificando) código
    para hacer mis inventos.
     
  50. bomber01 Miembro

    bomber01
    Registrado:
    28 Jul 2007
    Mensajes:
    618
    Me Gusta recibidos:
    0
    Madre mia a mi me encanta acristobal, pero no se por donde empezar.....
     
    #50 bomber01, 21 Oct 2010
    Última edición: 22 Oct 2010

Compartir esta página