Arduino Forum

International => Español => Topic started by: adrib on Aug 30, 2011, 02:55 pm

Title: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: adrib on Aug 30, 2011, 02:55 pm
Hola a todos,
estoy construyendo un cuadricoptero UAV para ello quiero poner el Arduino UNO entre el receptor de la emisora RC y los ESC con los motores. El problema que tengo es que los pines analogicos de entrada del Arduino no me detectan las señales del receptor de RC. Se que no las detecta ya que hice un sketch que mostraba en por el serial los valores del pin analogico y no variaban a medida que movia el interruptor de la emisora sino que marca siempre 0 y de vez encuando un valor aleatorio. La transmisión entre emisora y receptor RC se que es correcta por que con un tester media el señal del receptor y los valores si que varian a la vez que muevo el interruptor, el voltaje del señal varia entre 0.17V y 0.33V

PD: mi emisora de RC es la HK6DF.

Saludops y gracias de antemano.
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: LuisAntonio on Aug 30, 2011, 03:01 pm
Si que varia la señal pero con el arduino por el puerto serie no lo puedes ver?  pon el código del arduino así igual es mas fácil ayudarte!


Un saludo.


Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: aero_yo on Aug 30, 2011, 03:34 pm
La salida de la emisora es analógica o es PWM??
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: chiva on Aug 30, 2011, 05:58 pm
Los receptores suelen sacar PPM
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: Cheyenne on Aug 30, 2011, 06:20 pm
Las emisoras suelen transmitir en PPM (creo que es analógico) y el receptor transforma la señal PPM en las salidas PWM de cada uno de los canales.

Para leer la emisora están las dos posibilidades, leer la señal PPM o las PWM de cada canal. Para leer las PPM hay que acceder al interior del receptor y buscar en el circuito dónde se intercepta esta señal. Por la red hay explicaciones de cómo hacerlo en los modelos más comunes de emisoras.

Si no se quiere tener que acceder al interior del receptor se puede leer la señal PWM de cada canal.

Para leer PPM creo que hay que utilizar una entrada analógica y para PWM una entrada digital para cada canal que quiere ser leído.

adrib, no he mirado detenidamente tu emisora pero yo diría que es PPM. ¿Qué señal es la que estás interceptando, la PPM o las PWM? ¿Dónde las estás tomando?
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: SrDonGato on Aug 30, 2011, 11:18 pm
Ambas se leen en digital. en PPM se utiliza solo un pin , en PWM un pin por cada canal.

buscate el proyecto de multiwii copter, es el que hice yo. el código te permite leer los datos del receptor en ambos casos. echale un vistazo al codigo y puedes hacerte una idea de como hacerlo .

Un saludo ¡
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: adrib on Aug 31, 2011, 01:19 am
Por lo que he leido en vuestras respuestas diria que estoy leyendo PWM ya que tengo un cable de señal por cada canal y ya que segun decis se leen en pin digital he probado con el codigo:
Code: [Select]

void setup() {
  Serial.begin(9600);
  pinMode(9,INPUT);
}
void loop() {
  int sensorValue =analogRead(9); // He probado tanto analogRead como digitalRead;
  Serial.println(sensorValue);
  delay(1000);
}


Pero lo único que me muestra por el serial son valores aleatorio =(
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: SrDonGato on Aug 31, 2011, 01:28 am
no te has mirado lo que te he dicho ....

mírate el código para ver de que manera obtiene los valores de cada uno de los canales.

Os lo tenemos que dar todo mascao...

el codigo viene comentado, vienen las dos formas de obtener los datos

un saludo

pd: hay una version 7 de este codigo pero actualiza otras cosas, buscala de todas formas y le echas un vistazo
tambien tiene un software con el cual puedes ver el valor de los sensores , acelerometros, posicion de los sticks etc .

un saludo


Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: SrDonGato on Aug 31, 2011, 01:57 am
una pista ...



// ******************
// rc functions
// ******************
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: adrib on Aug 31, 2011, 05:01 pm
Si, he estado mirando el codigo SrDonGato pero nose que tengo que sacar de ahi ya que si  el arduino me diera valores proporcionales al potenciometro de la emisora ya sabria que codigo ponerle, el problema es que el arduino ni se inmuta a los cambios de la emisora simplemente me devuelve 0.
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: SrDonGato on Aug 31, 2011, 08:44 pm
La forma que tienes de ver el estado del pin es si está a 0 o 1 en un determinado momento.

Te has fijado como son las señales PWM y PPM ?, debes fijarte primero que es lo que queires leer por esa patilla.

aqui tienes un codigo que saque de no me acuerdo donde para leer una señal PPM, normalmente tienes que abrir el receptor para obtener la señal del pin de un chip que tiene interno, que es el que decodifica de PPM a PWM a cada canal. la ventaja del PPM es que con 1 entrada digital obtienes los valores de todos los canales. con PWM obtienes el valor de 1 solo canal por lo que necesitas tantas entradas digitales como canales tenga tu radio .

Code: [Select]
#define channumber 6 //Cuantos canales tiene tu radio???????/How many channels have your radio???
#define filter 10 // Filtro anti salto/ Glitch Filter
int channel[channumber]; //Valores de canales leidos/ readed Channel values
int lastReadChannel[channumber]; //Ultima lectura obtenida/ Last  values readed
int conta=0; //Contador/couter


void setup()
{
  Serial.begin(9600); //Iniciamos com serial/ Serial Begin
  pinMode(4, INPUT); //Patita 4 como entrada / Pin 4 as input
  pinMode(13, OUTPUT); // Led pin 13
}

void loop()
{

  if(pulseIn(4, HIGH) > 3000) //Si el pulso del pin 4 es > 3000 usegundos continua /If pulse > 3000 useconds, continues
  {
    for(int i = 0; i <= channumber-1; i++) //lee los pulsos de los canales / Read the pulses of the channels
    {
channel[i]=pulseIn(4, HIGH);
    }
    for(int i = 0; i <= channumber-1; i++) //Promedia los pulsos/Average the pulses
    {
if((channel[i] > 2000) || (channel[i] <100))//Si se pasa del rango envia ultimo pulso/ If channel > max range, chage the value to the last pulse
{
channel[i]= lastReadChannel[i];
}
else
{
channel[i]=(lastReadChannel[i]+channel[i])/2; //Promedio el pulso pasado con el nuevo pulso/Average the last pulse eith the current pulse
conta++; //Incrementa el contador/ increment counter
}
    }

    }
    if(conta > filter)//Si el contador es mayor al filtro imprime valores/ If counter is > than filter, then prints values
    {
for(int i = 0; i <= channumber-1; i++) //Ciclo para imprimir valores/Cycle to print values
{
  Serial.print("CH"); //Canal/Channel
  Serial.print(i+1); // Numero del canal / Channel number
  Serial.print(": "); // que te importa
  Serial.println(channel[i]);
  lastReadChannel[i]=channel[i];
}
if(channel[4] > 1000) //si el canal 5 tiene un rango mayor a 500 enciende el LED/ If channel 5 is > than 500 turn on the led
{
  digitalWrite(13, HIGH);
}
else
{
  digitalWrite(13, LOW);//Si no lo apaga/If not turn it off
}
delay(400); //Delay
conta=0;//Reinicia el contador/ Restart couter.
    }
  }


a ver si te encuentro lo otro ...
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: SrDonGato on Aug 31, 2011, 08:52 pm
Code: [Select]

// ******************
// rc functions
// ******************
#define MINCHECK 1100
#define MAXCHECK 1900

static uint8_t pinRcChannel[8] = {ROLLPIN, PITCHPIN, YAWPIN, THROTTLEPIN, AUX1PIN,AUX2PIN,CAM1PIN,CAM2PIN};
volatile uint16_t rcPinValue[8] = {1500,1500,1500,1500,1500,1500,1500,1500}; // interval [1000;2000]
static int16_t rcData[8] ; // interval [1000;2000]
static int16_t rcCommand[4] ; // interval [1000;2000] for THROTTLE and [-500;+500] for ROLL/PITCH/YAW
static int16_t rcHysteresis[8] ;
static int16_t rcData4Values[8][4];

static uint8_t rcRate8;
static uint8_t rcExpo8;
static float rcFactor1;
static float rcFactor2;

// ***PPM SUM SIGNAL***
#ifdef SERIAL_SUM_PPM
static uint8_t rcChannel[8] = {SERIAL_SUM_PPM};
#endif
volatile uint16_t rcValue[8] = {1500,1500,1500,1500,1500,1500,1500,1500}; // interval [1000;2000]

// Configure each rc pin for PCINT
void configureReceiver() {
  #ifndef SERIAL_SUM_PPM
    for (uint8_t chan = 0; chan < 8; chan++)
      for (uint8_t a = 0; a < 4; a++)
        rcData4Values[chan][a] = 1500; //we initiate the default value of each channel. If there is no RC receiver connected, we will see those values
    #if defined(PROMINI)
      // PCINT activated only for specific pin inside [D0-D7]  , [D2 D4 D5 D6 D7] for this multicopter
      PORTD   = (1<<2) | (1<<4) | (1<<5) | (1<<6) | (1<<7); //enable internal pull ups on the PINs of PORTD (no high impedence PINs)
      PCMSK2 |= (1<<2) | (1<<4) | (1<<5) | (1<<6) | (1<<7);
      PCICR   = 1<<2; // PCINT activated only for the port dealing with [D0-D7] PINs
    #endif
    #if defined(MEGA)
      // PCINT activated only for specific pin inside [A8-A15]
      DDRK = 0;  // defined PORTK as a digital port ([A8-A15] are consired as digital PINs and not analogical)
      PORTK   = (1<<0) | (1<<1) | (1<<2) | (1<<3) | (1<<4) | (1<<5) | (1<<6) | (1<<7); //enable internal pull ups on the PINs of PORTK
      PCMSK2 |= (1<<0) | (1<<1) | (1<<2) | (1<<3) | (1<<4) | (1<<5) | (1<<6) | (1<<7);
      PCICR   = 1<<2; // PCINT activated only for PORTK dealing with [A8-A15] PINs
    #endif
  #else
    PPM_PIN_INTERRUPT
  #endif
}

#ifndef SERIAL_SUM_PPM
ISR(PCINT2_vect) { //this ISR is common to every receiver channel, it is call everytime a change state occurs on a digital pin [D2-D7]
  uint8_t mask;
  uint8_t pin;
  uint16_t cTime,dTime;
  static uint16_t edgeTime[8];
  static uint8_t PCintLast;

  #if defined(PROMINI)
    pin = PIND;             // PIND indicates the state of each PIN for the arduino port dealing with [D0-D7] digital pins (8 bits variable)
  #endif
  #if defined(MEGA)
    pin = PINK;             // PINK indicates the state of each PIN for the arduino port dealing with [A8-A15] digital pins (8 bits variable)
  #endif
  mask = pin ^ PCintLast;   // doing a ^ between the current interruption and the last one indicates wich pin changed
  sei();                    // re enable other interrupts at this point, the rest of this interrupt is not so time critical and can be interrupted safely
  PCintLast = pin;          // we memorize the current state of all PINs [D0-D7]

  cTime = micros();         // micros() return a uint32_t, but it is not usefull to keep the whole bits => we keep only 16 bits
 
  // mask is pins [D0-D7] that have changed // the principle is the same on the MEGA for PORTK and [A8-A15] PINs
  // chan = pin sequence of the port. chan begins at D2 and ends at D7
  if (mask & 1<<2)           //indicates the bit 2 of the arduino port [D0-D7], that is to say digital pin 2, if 1 => this pin has just changed
    if (!(pin & 1<<2)) {     //indicates if the bit 2 of the arduino port [D0-D7] is not at a high state (so that we match here only descending PPM pulse)
      dTime = cTime-edgeTime[2]; if (900<dTime && dTime<2200) rcPinValue[2] = dTime; // just a verification: the value must be in the range [1000;2000] + some margin
    } else edgeTime[2] = cTime;    // if the bit 2 of the arduino port [D0-D7] is at a high state (ascending PPM pulse), we memorize the time
  if (mask & 1<<4)   //same principle for other channels   // avoiding a for() is more than twice faster, and it's important to minimize execution time in ISR
    if (!(pin & 1<<4)) {
      dTime = cTime-edgeTime[4]; if (900<dTime && dTime<2200) rcPinValue[4] = dTime;
    } else edgeTime[4] = cTime;
  if (mask & 1<<5)
    if (!(pin & 1<<5)) {
      dTime = cTime-edgeTime[5]; if (900<dTime && dTime<2200) rcPinValue[5] = dTime;
    } else edgeTime[5] = cTime;
  if (mask & 1<<6)
    if (!(pin & 1<<6)) {
      dTime = cTime-edgeTime[6]; if (900<dTime && dTime<2200) rcPinValue[6] = dTime;
    } else edgeTime[6] = cTime;
  if (mask & 1<<7)
    if (!(pin & 1<<7)) {
      dTime = cTime-edgeTime[7]; if (900<dTime && dTime<2200) rcPinValue[7] = dTime;
    } else edgeTime[7] = cTime;
  #if defined(MEGA)
    if (mask & 1<<0)   
      if (!(pin & 1<<0)) {
        dTime = cTime-edgeTime[0]; if (900<dTime && dTime<2200) rcPinValue[0] = dTime;
      } else edgeTime[0] = cTime;
    if (mask & 1<<1)     
      if (!(pin & 1<<1)) {
        dTime = cTime-edgeTime[1]; if (900<dTime && dTime<2200) rcPinValue[1] = dTime;
      } else edgeTime[1] = cTime;
    if (mask & 1<<3)
      if (!(pin & 1<<3)) {
        dTime = cTime-edgeTime[3]; if (900<dTime && dTime<2200) rcPinValue[3] = dTime;
      } else edgeTime[3] = cTime;
  #endif
}

#else
void rxInt() {
  uint16_t now,diff;
  static uint16_t last = 0;
  static uint8_t chan = 0;

  now = micros();
  diff = now - last;
  last = now;
  if(diff>5000) chan = 0;
  else {
    if(900<diff && diff<2200 && chan<8 ) rcValue[chan] = diff;
    chan++;
  }
}
#endif

uint16_t readRawRC(uint8_t chan) {
  uint16_t data;
  uint8_t oldSREG;
  oldSREG = SREG;
  cli(); // Let's disable interrupts
  #ifndef SERIAL_SUM_PPM
    data = rcPinValue[pinRcChannel[chan]]; // Let's copy the data Atomically
  #else
    data = rcValue[rcChannel[chan]];
  #endif
  SREG = oldSREG;
  sei();// Let's enable the interrupts
  return data; // We return the value correctly copied when the IRQ's where disabled
}
 
void computeRC() {
  static uint8_t rc4ValuesIndex = 0;
  uint8_t chan,a;

  rc4ValuesIndex++;
  for (chan = 0; chan < 8; chan++) {
    rcData4Values[chan][rc4ValuesIndex%4] = readRawRC(chan);
    rcData[chan] = 0;
    for (a = 0; a < 4; a++)
      rcData[chan] += rcData4Values[chan][a];
    rcData[chan]= (rcData[chan]+2)/4;
    if ( rcData[chan] < rcHysteresis[chan] -4)  rcHysteresis[chan] = rcData[chan]+2;
    if ( rcData[chan] > rcHysteresis[chan] +4)  rcHysteresis[chan] = rcData[chan]-2;
  }
  #if defined(FORCE_LEVEL)
    rcData[AUX1] = 2000;
  #endif
}



los valores de los canales los guarda en rcData[chan] siendo chan el número de canal .


Si quieres hacer el quadcopter y no tienes mucha idea de programacion lo vas a tener complicado. mirate el wiicopter , funcina muy bien , los sensores son baratos ( los de la wii) y ya tienes el codigo hecho, ademas un software para ver el estado de los sensores y motores, posicion del aparato etc.

un saludo
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: adrib on Aug 31, 2011, 10:00 pm
Ya he conseguido leer un dato proporcional a la acción sobre la emisora, gracias por todo y disculpa las molestias SrDonGato la inforamación que me has dado me ha sido muy útil para solucionar el problema.

PD: Gracias también a los demás por vuestras aportaciones.
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: Cheyenne on Sep 01, 2011, 10:04 am
SrDonGato, te veo puesto en el tema, cuando menos lo has usado y practicado. Aprovecho para hacerte unas consultas. Decirte que ahora estoy escribiendo desde un móvil y no veo las ventanas de código enteras (no me aparecen las barras de desplazamiento).

Entiendo que el primer código que has puesto lee PPM y el segundo no tengo claro si es el del proyecto wiicopter y por tanto está preparado para leer tanto PPM como PWM tal como decías más arriba.

Además de la diferencia de necesitar un sólo pin para PPM (ventaja para este método) pero no tener que acceder al interior del receptor y localizar la señal PPM en el caso de las PWM (ventaja para este otro método), ¿sabes o has notado si uno u otro método tiene más precisión, fiabilidad, o menor exigencia del arduino?

Sobre el proyecto del wiicopter comentas que lo hiciste. Una duda. ¿Todos los cálculos se realizan sobre una sóla tarjeta arduino? Entiendo que en este proyecto hacen todo, el IMU con los acelerómetros y gyros aplicando no sé si filtro Kalman o sistema de cosenos directores, lectura de canales RC y cálculos PID. No sé si me dejo algún otro cálculo que exija en gran medida a arduino.
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: SrDonGato on Sep 01, 2011, 03:10 pm

disculpa las molestias SrDonGato



No son mmolestias atrib ¡¡ mas que ponemos soluciones y no las miráis, estamos para ayudar :) para cuando querais

Cheyenne, la placa de arduino hace todo, lee la radio, lee los sensores a traves de I2C, los acelerometros, giroscopos, sensores barométricos etc etc.

el codigo tiene la particularidad de que es configurable para cualquier modelo, activas y desactivas opciones al principio del codigo segun lo tengas construido, tiene en cuenta las tensiones de las celdas de las lipos, un pequeño zumbador etc.

solo la placa de aruino hace todo, todos los calculos y demas. hay muchos videos en youtube y puedes ver los resultados de como vuelan. yo aun no he conseguido poner bien los parametros pid bien, ademas lo tengo parado desde que se me rompieron las helices, estoy esperando un nuevo pedido porque solas me salen por un ojo la cara.

Sin saber mucho de programacion ( yo tampoco soy un gurú)  es fácil el montaje y la configuracion del mismo a traves el programa que hn hecho a tal efecto, y puedes ver los valores de las configuraciones, los valores de los sticks y los valores comandados a los motores.

se han currado mucho el codigo .

un saludo ¡
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: josemanu on Sep 03, 2011, 01:43 pm
Veo mucha confusión con el tema del PWM y el radio control, a ver si arrojo un poco de luz sobre esto hasta llegar al capítulo de mi curso en el que lo explicaré con todo lujo de detalles.

En un sistema de RC (Radio Control) las PWM se utilizan SOLO entre el variador y el motor, para NADA más.

Tampoco se utiliza PPM (http://es.wikipedia.org/wiki/Modulaci%C3%B3n_por_posici%C3%B3n_de_pulso). Esto es algo parecido, pero no es igual.

Toda la comunicación física entre elementos de RC (receptor, servos, variadores, giróscopos, mezcladores, inversores de servos, etc) se hace por un particular tren de pulsos: un pulso de entre 1 y 2 milisegundos, una pausa de 20 milisegundos. Ya está, no tiene ninguna otra complicación.

Para leer las señales que emite un receptor hacia sus periféricos basta con programar un control de tiempos con las entradas digitales o utilizar el comando pulseIn(), aunque este último puede dar problemas a la hora de leer varios canales a la vez.

Por favor, no me volvais a mezclar PWMs con servos o receptores, que hace que me duela la vista.

Un saludo.

Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: SrDonGato on Sep 03, 2011, 05:37 pm

Veo mucha confusión con el tema del PWM y el radio control, a ver si arrojo un poco de luz sobre esto hasta llegar al capítulo de mi curso en el que lo explicaré con todo lujo de detalles.

En un sistema de RC (Radio Control) las PWM se utilizan SOLO entre el variador y el motor, para NADA más.

Tampoco se utiliza PPM (http://es.wikipedia.org/wiki/Modulaci%C3%B3n_por_posici%C3%B3n_de_pulso). Esto es algo parecido, pero no es igual.

Toda la comunicación física entre elementos de RC (receptor, servos, variadores, giróscopos, mezcladores, inversores de servos, etc) se hace por un particular tren de pulsos: un pulso de entre 1 y 2 milisegundos, una pausa de 20 milisegundos. Ya está, no tiene ninguna otra complicación.



Si parece que hay un error de conceptos ....

al variador como a los servos hay que entregarle una señal PWM par hacerlos funcionar, el variador entregará al motor una fuerza-velocidad proporcional al ancho del pulso que se le entrega, en el caso de los servos la posicion del servo es proporcional al ancho del pulso que se le entrega.
La señal PWM en RC tiene una frecuencia de 50 hz, aunque esta frecuencia puede ser variable, es decir tiene un periodo de 20 milisegundos., y no una pausa como dice josemanu, en esos 20 milisegundos en PPM tiene que haber un pulso por cada canal que tengamos en la emisora.
Las emisoras emiten en PPM, es el receptor el que se ocupa de convertir las señales PPM en PWM, una por cada canal.

Quote
En un sistema de RC (Radio Control) las PWM se utilizan SOLO entre el variador y el motor, para NADA más.

No es cierto del todo, la señal que se entrega al motor varia en frecuencia y tensión, en algunos casos se utiliza una señal PWM interna para generar una onda senoidal, pero son técnicas de paso de D/A.
puedes ver un articulo de tecnicas para el control de los mismos en http://www.ingenia-cat.com/reference/learn/TEC.PAP.0422232450.pdf (http://www.ingenia-cat.com/reference/learn/TEC.PAP.0422232450.pdf) y http://www.ingenia-cat.com/reference/learn/TEC.PAP.5240009519.pdf (http://www.ingenia-cat.com/reference/learn/TEC.PAP.5240009519.pdf)


Os dejo un ejemplo de como obtener la señal PPM de un receptor RC. En algunos casos en necesaria amplificarla para utilizarla.

http://forum.mikrokopter.de/topic-2747.html (http://forum.mikrokopter.de/topic-2747.html)

y una gráfica para entender como pasa el chip del receptor de señal PPM a PWM y como se generan, como se puede ver las señales PWM de todos los canales no empiezan a la misma vez, sino que se concatenan, cuando hay un flanco de bajada del canal anterior empieza el canal siguiente, aun así mantienen todas la misma frecuencia.

Espero que todo se haya aclarado. Un saludo


Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: Cheyenne on Sep 03, 2011, 07:25 pm
Coincido con lo explicado por SrDonGato, funcionamiento de emisión PPM, conversión a PWM a cada canal a frecuencia 50 Hz.
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: josemanu on Sep 03, 2011, 07:27 pm
Muy interesantes los PDFs sobre generación de señales PWM para motores brushless... pero esas señales las genera el variador y se las manda al motor.

Quote
al variador como a los servos hay que entregarle una señal PWM par hacerlos funcionar

No, no y no. Es lo que intentaba aclarar: una señal modulada por ancho de pulso (PWM) sirve para "simular" una señal analógica mediante una digital... y eso no funciona ni con servos ni con receptores.

Una señal de Modulación por Posición de Pulso (PPM) es un tipo de modulación en la cual una palabra de R bits es codificada por la transmisión de un único pulso que puede encontrarse en alguna de las 2M posiciones posibles.... se parece mucho, pero no es lo mismo. Por mucho que en el foro de mikrocopter lo llamen PPM no es PPM.

Cometí un error en mi explicación: no es pulso, pausa, pulso, pausa, etc.....
Es cada 20 milisegundos un flanco de subida, un pulso que dura entre 1 y 2 milisegundos, y se repite. No es PWM por que no se simula una salida analógica y no es PPM por que el pulso emitido está siempre en la misma posición, varía su anchura no su posición. Para ser PPM el pulso siempre tiene la misma anchura pero varía su posición.

Gráfico:
(http://www.joliebrisemodels.co.uk/tenth/images/squarewave.jpg)

Puede ser confundido con una señal PWM por que modula en ancho del pulso dentro de sus intervalos de 20ms, pero no es lo mismo ni se le parece a la señal PWM que generan los pines 3, 5, 6, 9, 10 y 11. De hecho para controlar un servo o un variador no se necesita utilizar esos pines, se puede utilizar cualquiera.

Buscando en la Wikipedia resulta que también llaman PWM a la señal de control de RC, aunque especifican que es una señal PWM de 50hz. Vale, quizá sea correcto, no quiero entrar en tanto detalle.

La cuestión es que la señal de control de RC si la llamamos PWM se confunde directamente con la señal que generan los pines PWM de Arduino al dar una orden analogWrite().

Por eso (no por nada más) insisto e insistiré siempre en no llamar PWM a la señal de control en RC. Ateniendonos a definiciones en mucho más correcto decir que la señal de RC es un "Tren de Pulsos".

Uf..... a ver si ahora queda claro.
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: igorreal on Sep 03, 2011, 11:57 pm
http://www.endurance-rc.com/ppmtut.php


http://www.youtube.com/watch?v=8r9N6QXwKKY



;)
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: SrDonGato on Sep 04, 2011, 01:33 am
Quote
No es PWM por que no se simula una salida analógica


Vamos a ver .. que un tipo de señal tenga determinados usos no quiere decir que si se utiliza para otra cosa no sea PWM,
Es un tipo de codificación digital y su característica es que es de FRECUENCIA FIJA y que lo que varía es el dutty-cicle, esto es, el tiempo que permanece en nivel alto y nvel bajo.
Cierto que esta señal se aplica mucho en control de potencia... que si ... pero no quiere decir que no se utilice para otras cosas, en etapas de potencia se utiliza para atacar los triacks o IGBTs , la salida de estos se aplica a un filtro y se obtiene así una onda senoidal.
en RC la señal que se aplican a servos y variados son PWM, es una aplicacion más.

Quote
y no es PPM por que el pulso emitido está siempre en la misma posición, varía su anchura no su posición. Para ser PPM el pulso siempre tiene la misma anchura pero varía su posición.

Puede ser confundido con una señal PWM por que modula en ancho del pulso dentro de sus intervalos de 20ms, pero no es lo mismo ni se le parece a la señal PWM que generan los pines 3, 5, 6, 9, 10 y 11. De hecho para controlar un servo o un variador no se necesita utilizar esos pines, se puede utilizar cualquiera.


El utilizar los pines de arduino con salida PWM es por simplificar el código, el atmega lo genera por hardware, de esa manera nos despreocupamos en el código de calcular tiempos y poner a 0 o 1 los pines, pero claro está que lo puedes hacer con cualquier salida digital.

Las distintas codificaciones digitales no tienen un uso específico, cada una tiene una característica pero se puede utilizar para la aplicación que queramos. nombrar  por ejemplo FSK, PSK, QAM que no tienen una única aplicación .

Un saludo
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: josemanu on Sep 04, 2011, 03:55 am
De acuerdo en que la señal de control de RC, si nos ceñimos a las definiciones establecidas, es una señal PWM de 50Hz.

Quote
El utilizar los pines de arduino con salida PWM es por simplificar el código, el atmega lo genera por hardware, de esa manera nos despreocupamos en el código de calcular tiempos y poner a 0 o 1 los pines, pero claro está que lo puedes hacer con cualquier salida digital.


Utilizar los pines PWM no tiene ningún sentido para manejar servos por que no les puedes mandar un analogWrite(), por que la señal PWM que Arduino les va a mandar no va a ser a 50Hz, va a ser a 16MHz. Haz la prueba, conecta la entrada de señal de un servo al pin 10 (que está marcado como PWM) y mandale un "analogWrite(255); " a ver si se pone en la posición de 180º. Te digo yo que no.

Para controlar elementos de RC con Arduino hay que utilizar la librería servo.h (http://arduino.cc/es/Reference/Servo) que sirve, precisamente, para generar una señal PWM de 50Hz en cualquier pin digital de la placa. Esta librería permite utilizar hasta 12 servos (no hay tantas salidas PWM) y deshabilita la función PWM de los pines 9 y 10, haya o no un servo conectado a ellos.

Relacionar los pines marcados con la serigrafía PWM en la placa con control de mecanismos para RC solo crea confusión entre los novatos. O entre los que no han conectado nunca un servo a una placa Arduino.

De la misma forma, no se puede leer la señal que un receptor de RC le manda a un servo o a un variador mediante una entrada analógica. Prueba a medir tensión entre el pin de señal de un receptor y GND, el multímetro te marcará 0v hagas lo que hagas con la emisora. La forma de leer la señal que un receptor manda a un servo o a un variador se lee con el comando pulseIn() (http://arduino.cc/es/Reference/PulseIn).

Una vez más os recomiendo hacer pruebas y lo vereis por vosotros mismos. Toda la información erronea que circula por el foro acerca de este tema solo contribuye a que de tanto en tanto aparezca un disparate: hace unos meses un chaval quería convertir un coche RC en un robot y quería mandarle las señales desde el mando, pues hubo un iluminado que le recomendó que conectara la antena de la emisora a un pin PWM.

En electrónica todo el tema de modulación, pulsos, frecuencia y todo lo que tiene que ver con señales es complejo y la mayoría de gente que lee este foro no tiene conocimientos de electrónica suficientes, precisamente vienen aquí para aprender. Vamos a simplificar las cosas para no marear: los pines PWM de Arduino simulan señales analógicas, el que luego quiera profundizar en este tipo de señal y modificar su frecuencia (que se puede) investigará por su cuenta.

El que quiera controlar mecanismos de RC sin complicarse la vida puede generar las señales de control con la librería servo.h en cualquier pin digital y puede leer estas mismas señales con el comando pulseIn().

El que quiera profundizar en el control de tiempos y generar una señal cuadrada de amplitud variable y una frecuencia de 50Hz puede hacerlo por software y comprobar si lo hace bien o mal con un simple servo.

...por lo menos nadie a dicho que sea PPM, algo hemos avanzado.
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: SrDonGato on Sep 04, 2011, 11:48 am
Quote
Utilizar los pines PWM no tiene ningún sentido para manejar servos por que no les puedes mandar un analogWrite(), por que la señal PWM que Arduino les va a mandar no va a ser a 50Hz, va a ser a 16MHz. Haz la prueba, conecta la entrada de señal de un servo al pin 10 (que está marcado como PWM) y mandale un "analogWrite(255); " a ver si se pone en la posición de 180º. Te digo yo que no.



Cierto que no son de 50 hz, pero por defecto son son de 16 Mhz. hay que configurarlo a posta para obtener esa frecuencia.

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1227085157 (http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1227085157)

y explicacion del pwm del atmega.

http://arduino.cc/es/Tutorial/SecretsOfArduinoPWM (http://arduino.cc/es/Tutorial/SecretsOfArduinoPWM)





Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: igorreal on Sep 04, 2011, 11:54 am
josemanu, la señal PWM que genera el analogWrite es a 490 Hz (no 16 MHz). Que Arduino en su core configure a dicha frecuencia la función analogWrite, no significa que no tenga sentido usar PWM.
Estoy de acuerdo que para un novato es mejor usar la librería preparada para servos, pero como ha dicho SrDonGato, no dejan de ser PWM... ;)
Como también ha dicho SrDonGato, si usas el módulo de PWM del micro, puedes estar haciendo otras tareas, ya que los timer harán el trabajo por tí.
La librería servo usa timers para ir generando en los pines los PWM adecuados. Lo hace por soft, para poder controlar mayor número de salidas utilizando el menor número de timers del micro (creo que manejan 12 salidas por cada timer).

Yo creo, que lo que hay que dejar claro es que analogWrite() del lenguaje Arduino genera un PWM de 490 Hz, que no es apto para el control de servos.

Copio del link que puse más arriba...


The following are lists of common devices that use PPM and PWM.

R/C Devices that use PWM Pulses:

   Servos
   Electronic Speed Controllers
   R/C switches
   R/C lights
   R/C receivers
   Data loggers
   Failsafe's
   Autopilot/Stabilization systems
   Servo Controller

R/C Devices that use PPM Pulses:

   R/C transmitters
   R/C receivers
   Autopilot/Stabilization systems
   PCTx


Salu2



Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: Cheyenne on Sep 04, 2011, 12:56 pm


Relacionar los pines marcados con la serigrafía PWM en la placa con control de mecanismos para RC solo crea confusión entre los novatos. O entre los que no han conectado nunca un servo a una placa Arduino.

[...]

Una vez más os recomiendo hacer pruebas y lo vereis por vosotros mismos. Toda la información erronea que circula por el foro acerca de este tema solo contribuye a que de tanto en tanto aparezca un disparate: hace unos meses un chaval quería convertir un coche RC en un robot y quería mandarle las señales desde el mando, pues hubo un iluminado que le recomendó que conectara la antena de la emisora a un pin PWM.


Yo creo que es al revés, hay que explicar las cosas tal cual son indicando sus particularidades: la señal de control de un servo es PWM pero no se pueden controlar directamente mediante la función analogWrite() con los pines serigrafiados como PWM en la placa Arduino porque esa función saca una señal PWM a 490 Hz y el control de servos es a 50 Hz.

Nombras lo de información errónea como si lo explicado por SrDonGato fuera erróneo (en cuanto a las argumentaciones en este hilo) cuando es lo contrario, tu simplificación como para aclararlo a los novatos es lo que ha entrado en conceptos técnicos erróneos.
Podemos simplificar las cosas todo lo que quieras (queramos) o puedas (podamos) que siempre aparecerán como dices "iluminados" (yo prefiero nombrarlos como "aventurados") que dirán unos disparates impresionantes.
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: igorreal on Sep 04, 2011, 01:13 pm
Yo dejaría lo de "iluminados", "aventurados" y demás fuera del hilo... Cada uno intenta exponer sus ideas, aunque no sean correctas. Es función de cada lector filtrar y contrastar dicha información. Este tipos de comentarios están un poco fuera de lugar...
Precisamente es la utilidad de un foro... "debatir abiertamente" diferentes temas entre personas con aficiones comunes.

Salu2

;)

Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: josemanu on Sep 04, 2011, 01:54 pm
Quote
Yo creo, que lo que hay que dejar claro es que analogWrite() del lenguaje Arduino genera un PWM de 490 Hz, que no es apto para el control de servos.

Quote
que no es apto para el control de servos


Aleluya!!!!!

Reconozco mi error con la frecuencia de la señal PWM de Arduino, no he estudiado a fondo el tema y daba por sentado que sería la misma que la del reloj.

Por cierto SrDongato gracias al enlace de un hilo abierto por Complubot: repásatelo bien y veras que se puede configurar a frecuencias más altas pero para 50Hz no, un motivo más para dejar de relacionar de una vez las salidas PWM de la placa con señales de control de RC.

Quote
Estoy de acuerdo que para un novato es mejor usar la librería preparada para servos


Es la forma más sencilla, como he dicho se puede hacer programando a mano y es un buen ejercicio para profundizar en el control de tiempos, pero personalmente lo considero un engorro.

Quote
pero como ha dicho SrDonGato, no dejan de ser PWM... smiley-wink


Si, PWM de 50Hz, que Arduino SOLO puede generar por SoftWare. Bueno solo seguro que no, seguro que se puede acceder a la configuración de los Timers para que el PWM que genera Arduino con el comando analogWrite() sea de 50Hz.... ¿alguien sabe hacerlo? ¿si? escribid un tutorial y subidlo al Playground.

¿Ventajas de usas los pines 3, 5, 6, 9, 10 y 11 que son los serigrafiados como PWM? si no nos van a dar una señal PWM de 50Hz NINGUNA. ¿Como hacemos que por esos pines salga una señal PWM de 50Hz? reconfigurando los Timers (ops, procedimiento avanzado) o utilizando la librería servo.h o programando a mano.

¿Relación directa de los pines PWM con el control de elementos RC? ninguna.

¿Problema de insistir en relacionar dos tipos de señal PWM totalmente distintos en frecuencia? Causa confusión.

Volvamos al principio del hilo:

Quote
Hola a todos,
estoy construyendo un cuadricoptero UAV para ello quiero poner el Arduino UNO entre el receptor de la emisora RC y los ESC con los motores. El problema que tengo es que los pines analogicos de entrada del Arduino no me detectan las señales del receptor de RC.


Claro que los pines analógicos no detectan las señales del receptor. El receptor está enviando una señal PWM a 50Hz, esto hay que leerlo con el comando pulseIn() desde un pin digital.

Ahora empieza el lio, un montón de gente bienintencionada da un montón de información erronea o confusa:
Quote
Los receptores suelen sacar PPM
falso.
Quote
Las emisoras suelen transmitir en PPM (creo que es analógico) y el receptor transforma la señal PPM en las salidas PWM de cada uno de los canales.
dejo a otros la interpretación de esta frase ¿alguien de acuerdo conmigo en que es confuso?
Quote
Ambas se leen en digital. en PPM se utiliza solo un pin , en PWM un pin por cada canal.
SrDongato, para ayudar así mejor no ayudes, por que de esa frase no se saca nada en claro, lo único que consigues es marear. No das ni el como ni el por que, no le dices al chaval ni que tiene que buscar ni donde. Recordemos: quiere insertar un Arduino Uno entre un receptor y varios ESC, ¿PPM por un solo pin? ¿por cual? "PWM un pin por cada canal" es lo único que tiene un poco de sentido en esa frase, pero el PWM que tendrá que leer es de 50Hz ¿adrib lo sabe? yo creo que no, de hecho, ya ha intentado leer ese PWM de 50Hz desde una entrada analógica de su Arduino UNO y no ha sacado nada en claro, evidentemente, por que así no se hace.

Siguiente respuesta de adrib:
Quote
Por lo que he leido en vuestras respuestas diria que estoy leyendo PWM ya que tengo un cable de señal por cada canal y ya que segun decis se leen en pin digital he probado con el codigo:

Ya está, adrib está confundiendo una señal PWM de 50Hz con otra de 490Hz ¿por que? por la cabezona insistencia de llamar PWM a ambos tipos de señales dando por sentado que todo el mundo conoce la diferencia de frecuencia, por que si no no me lo explico. Es por este motivo que yo INSISTO en NO llamar PWM a la señal de control de RC por que induce a esta confusión. ES una señal PWM pero de 50Hz y como esta puntualización no la hace nadie se confunde con el PWM de los pines PWM.
Mirad una línea del código con el que adrib ha intentado leer la señal de control de RC:
Quote
int sensorValue =analogRead(9); // He probado tanto analogRead como digitalRead;

Confundido a tope va el pobre adrib (que debe estar flipando con este hilo y la discusión que está generando).
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: josemanu on Sep 04, 2011, 01:55 pm
(continuo, que me paso de longitud)


Respuesta de SrDongato:
Quote
no te has mirado lo que te he dicho ....
mírate el código para ver de que manera obtiene los valores de cada uno de los canales.

Y hay un enlace a un .pde que para adrib debe resultar totalmente incomprensible por sus 2001 líneas de código y por la masiva utilización de recursos de programación de nivel avanzado.
Luego se postea un trozo de código más sencillo y más comprensible... y mirad lo que aparece en una de las líneas:
Quote
if(pulseIn(4, HIGH) > 3000) //Si el pulso del pin 4 es > 3000 usegundos continua
Anda, leemos con el comando pulseIn.
Ahora el que está confundido soy yo ¿no es lo que vengo diciendo desde el principio?
Luego aparece Cheyenne, que es de los que no tiene clara la diferencia entre los tipos de señales ni de donde se sacan, pregunta para que se lo aclaren y la respuesta de SrDongato es muy reveladora... pero en otro sentido:
Quote
Sin saber mucho de programacion ( yo tampoco soy un gurú)  es fácil el montaje y la configuracion del mismo a traves el programa que hn hecho a tal efecto, y puedes ver los valores de las configuraciones, los valores de los sticks y los valores comandados a los motores.
se han currado mucho el codigo .

Ah, has hecho un copy/paste... perdona, pero eso no implica que sepas lo que estás haciendo ni de que estás hablando. Activar o desactivar opciones según la configuración al principio del código no es programar, el programa como bien dices, se lo han currado mucho... otros.

Luego vengo yo, intento poner un poco de claridad explicando las diferencias entre un tipo de señal y otro con términos simples y fáciles de entender, tratando de no inducir a confusión llamando PWM a una señal (que aunque si lo es) tiene una particularidad en su baja frecuencia que la aleja totalmente de la PWM de la que se habla en toda la documentación de la web de Arduino y que no puede ser  utilizada de la misma forma ni en su generación ni en su lectura.

Y aquí no liamos entre unos y otros. Vamos a ver si arrojamos luz sobre la cuestión:

La señal que genera un receptor de RC y que envía a servos o variadores en una PWM de 50Hz. La señal que envía un variador al motor es una PWM de alta frecuencia.

Quote
Yo creo que es al revés, hay que explicar las cosas tal cual son indicando sus particularidades: la señal de control de un servo es PWM pero no se pueden controlar directamente mediante la función analogWrite() con los pines serigrafiados como PWM en la placa Arduino porque esa función saca una señal PWM a 490 Hz y el control de servos es a 50 Hz.


De acuerdo si respetamos siempre el mencionar las particularidades de cada una... pero va a ser que no, se seguirá diciendo que la señal de control para servos es PWM sin especificar su frecuencia y se seguirá confundiendo con la que generan los pines PWM y habrá quien seguirá intentando leer esa señal con los pines analógicos y quien intentará controlar un servo con un analogWrite() por que no se va a mencionar el tema de la  frecuencia.

Quote
Nombras lo de información errónea como si lo explicado por SrDonGato fuera erróneo


No es erróneo, pero al no explicar la diferencia de frecuencia induce a error a quien lo lea tal cual.... y si, hay que darlo todo muy masticadito, por eso esta respuesta se está haciendo tan larga.

Quote
Yo dejaría lo de "iluminados", "aventurados" y demás fuera del hilo... Cada uno intenta exponer sus ideas, aunque no sean correctas. Es función de cada lector filtrar y contrastar dicha información. Este tipos de comentarios están un poco fuera de lugar...
Precisamente es la utilidad de un foro... "debatir abiertamente" diferentes temas entre personas con aficiones comunes.


Quien expone sus ideas sin saber de que está hablando, por muy buena voluntad que tenga, confunde. Un neofito no puede filtrar la información, acude al foro para que le ayuden y si la información que le proporcionamos es incorrecta, incompleta o induce a error no se le ayuda.

A mi este post me ha ayudado, algunas cosas las tenía confundidas como la frecuencia de salida de los pines PWM de Arduino, pero el resto lo tengo muy claro por que he trabajado con receptores, servos y variadores programando yo mi propio código, con la librería servo.h y a pelo.
Seguiré llamando en mis manuales "señal de control RC" a la señal PWM de 50Hz por que no induce a confusión, las separa, luego quien profundice en la anatomía de cada tipo de señal ya dirá "anda, si es lo mismo, solo cambia la frecuencia", pero tendrá muy claro que se trabaja de forma muy diferente con cada una de ellas precisamente por esa diferencia en la frecuencia.

Y con esto ya me despido. Perdón si me he puesto un poco agresivo en alguna frase, en ningún momento mi intención ha sido ofender a nadie, solo hacer que aprender sea sencillo para la gente que no tiene conocimientos de electrónica ni de programación, por que no debemos olvidar nunca que Arduino es, sobre todo, una plataforma para que personas sin conocimientos de electrónica ni programación puedan acercarse al mundo de la electrónica digital.
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: igorreal on Sep 04, 2011, 02:02 pm
Confirmo que tu post es muy agresivo.
Si que os lo tomais personal...

;)
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: Cheyenne on Sep 04, 2011, 03:34 pm

Luego aparece Cheyenne, que es de los que no tiene clara la diferencia entre los tipos de señales ni de donde se sacan, pregunta para que se lo aclaren y la respuesta de SrDongato es muy reveladora... pero en otro sentido:

Sí, yo también confirmo que tu post es muy agresivo.
En todo lo que he escrito en este post sólo encontrarás una incorrección mía:
Quote
Las emisoras suelen transmitir en PPM (creo que es analógico)

Como bien puedes leer no afirmaba y menos con la rotundidad que tú afirmas las cosas para luego decir que no es como tú has dicho pero que lo dices así para que lo entiendan los novatos. Como bien indicó SrDonGato la señal PPM se lee con un pin digital.
Quote
Veo mucha confusión con el tema del PWM y el radio control, a ver si arrojo un poco de luz sobre esto hasta llegar al capítulo de mi curso en el que lo explicaré con todo lujo de detalles.

Me parece bien pero en el camino de arrojar luz has puesto alguna que otra incorrección.
Quote
En un sistema de RC (Radio Control) las PWM se utilizan SOLO entre el variador y el motor, para NADA más.

Incorrecto, como ya ha quedado claro cada uno de los canales de salida del receptor RC saca una señal PWM a 50 Hz.
Quote
Tampoco se utiliza PPM. Esto es algo parecido, pero no es igual.

Aquí no puedo asegurar si hay o no algo incorrecto, pero si te refirieras a que en un sistema de RC tampoco se utiliza PPM no es cierto. La señal PPM es un modo de transmisión de las emisoras RC y que en muchas páginas muestran en qué parte de la electrónica del receptor de RC se puede interceptar esta señal.
Quote
Toda la comunicación física entre elementos de RC (receptor, servos, variadores, giróscopos, mezcladores, inversores de servos, etc) se hace por un particular tren de pulsos: un pulso de entre 1 y 2 milisegundos, una pausa de 20 milisegundos. Ya está, no tiene ninguna otra complicación.

Incorrecto, no es una pausa de 20 milisegundos. Como ya se ha dicho el periodo de la señal PWM (ese particular tren de pulsos) es el que tiene los 20 milisegundos.
Quote
No, no y no. Es lo que intentaba aclarar: una señal modulada por ancho de pulso (PWM) sirve para "simular" una señal analógica mediante una digital... y eso no funciona ni con servos ni con receptores.

Vaya, y era yo el que no tenía clara la diferencia entre los tipos de señales. Uno de los usos de la modulación PWM es poder "simular" una señal analógica pero no la única. Una señal PWM a 50 Hz con las especificaciones concretas del ancho de pulso es justamente lo que funciona con servos.
Quote
Una señal de Modulación por Posición de Pulso (PPM) es un tipo de modulación en la cual una palabra de R bits es codificada por la transmisión de un único pulso que puede encontrarse en alguna de las 2M posiciones posibles.... se parece mucho, pero no es lo mismo. Por mucho que en el foro de mikrocopter lo llamen PPM no es PPM

Aquí creo que estás confundiendo las señales a las que se refieren en el foro de mikrocopter. No he leído esos hilos pero aseguraría que lo que están llamando PPM es PPM puesto que me imagino que no se estarán refiriendo a las señales de salida de los canales del receptor RC. Se estarán refiriendo a la señal que se puede interceptar en el interior del receptor de RC.
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: SrDonGato on Sep 04, 2011, 05:50 pm
Vaya...
Quote
Ahora el que está confundido soy yo ¿no es lo que vengo diciendo desde el principio?
Luego aparece Cheyenne, que es de los que no tiene clara la diferencia entre los tipos de señales ni de donde se sacan, pregunta para que se lo aclaren y la respuesta de SrDongato es muy reveladora... pero en otro sentido:

Quote
Sin saber mucho de programacion ( yo tampoco soy un gurú)  es fácil el montaje y la configuracion del mismo a traves el programa que hn hecho a tal efecto, y puedes ver los valores de las configuraciones, los valores de los sticks y los valores comandados a los motores.
se han currado mucho el codigo .


Revelador si ... muchos preferimos buscar código hecho, no veo el por qué esta mal. leyendo código se cogen ideas y se aprende como atacar con programación a un problema, que en definitiva es lo que piden muchos. es por lo que le puse el código , para que hiciera lo mismo, es como muchos hemos aprendido.

Quote
Respuesta de SrDongato:
Quote
no te has mirado lo que te he dicho ....

Como otros muchos a los que se responde ni siquiera mira lo que se le propone, y si no lo entiende tampoco lo dice.

Quote
Y hay un enlace a un .pde que para adrib debe resultar totalmente incomprensible por sus 2001 líneas de código

Ademas VIENE COMENTADO Y TOTALMENTE ESTRUCTURADO, y gracias a esto tanto yo como otros muchos sabemos como obtener estos datos, que por cierto hemos podido importar la idea a otros proyectos ...

Quote
Ah, has hecho un copy/paste... perdona, pero eso no implica que sepas lo que estás haciendo ni de que estás hablando.


En algún momento he dicho que el código fuera mio ??
Quote
buscate el proyecto de multiwii copter,


en algún momento he dicho que no sepa lo que hace ? 
y si ... en tus continuos errores si parece que sepas de lo que estas hablando también....

Quote
Ambas se leen en digital. en PPM se utiliza solo un pin , en PWM un pin por cada canal.
SrDongato, para ayudar así mejor no ayudes, por que de esa frase no se saca nada en claro,


Qué no entiendes en la frase ? El comentario aclara un comentario anterior que dice
Quote
Para leer PPM creo que hay que utilizar una entrada analógica y para PWM una entrada digital para cada canal que quiere ser leído.

Y si creo que ayuda al lector a saber como debe hacerlo.

Quote
repásatelo bien y veras que se puede configurar a frecuencias más altas pero para 50Hz

Parece que debas repasarlo tú pues decías que las señales PWM eran a 16 MHZ cuando por defecto son a la frecuencia mas baja, anda échales un vistacico

Quote
La forma que tienes de ver el estado del pin es si está a 0 o 1 en un determinado momento.

Te has fijado como son las señales PWM y PPM ?, debes fijarte primero que es lo que queires leer por esa patilla.

aqui tienes un codigo que saque de no me acuerdo donde para leer una señal PPM, normalmente tienes que abrir el receptor para obtener la señal del pin de un chip que tiene interno, que es el que decodifica de PPM a PWM a cada canal. la ventaja del PPM es que con 1 entrada digital obtienes los valores de todos los canales. con PWM obtienes el valor de 1 solo canal por lo que necesitas tantas entradas digitales como canales tenga tu radio .


Creo que es una explicación clara y concisa de como tiene que leer ambas señales, no me atribuyo el código, el cual ademas viene comentado....

Después de explicar a ambos lo que preguntan en el hilo apareces con tu magistral arrojo de luz
Quote
con términos simples y fáciles de entender,
...
sin responder a lo que se pregunta, cosa que criticas mas adelante.

Quote
En un sistema de RC (Radio Control) las PWM se utilizan SOLO entre el variador y el motor, para NADA más.


se utiliza entre receptores y variadores y servos, si a 50hz pero no deja de ser PWM

Quote
Tampoco se utiliza PPM. Esto es algo parecido, pero no es igual.

Las emisoras emiten muchas de ellas en PPM, incluso en PCM y luego se encarga el receptor de convertirlas a PWM
Quote
se hace por un particular tren de pulsos: un pulso de entre 1 y 2 milisegundos, una pausa de 20 milisegundos

puff
Quote
(PWM) sirve para "simular" una señal analógica mediante una digital...

es uno de los usos y siempre y cuando se aplique un filtro a la salida que derive la señal digital y la convierta a analógica.
Y como puedes ver no he sido el único en darme cuenta.

No tendré mucha destreza programando pero mis 10 años de estudios en electrónica y automática y otros 8 años trabajando creo saber de lo que estoy hablando.

Quote
Perdón si me he puesto un poco agresivo en alguna frase, en ningún momento mi intención ha sido ofender a nadie

Lo mismo digo

Un saludo


Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: josemanu on Sep 05, 2011, 12:14 am
No iba a contestar tras la primera lectura de tu respuesta, pero a la segunda el PUFF me ha llegado al alma

Code: [Select]
int lectura;  // variable que almacenara el valor leido del potenciometro.
int salida = 9;  // pin por el que mandaremos un tren de pulsos
int pulso;  // contendra la anchura del pulso

void setup()
  {
    pinMode(salida, OUTPUT);
  }
 
void loop()
   {
    lectura = analogRead (A0); // leemos el pontenciometro
    pulso = map(lectura, 0, 1023, 1000, 2000); // calculamos el ancho del pulso
    digitalWrite(salida, HIGH); // activamos el pin de salida
    delayMicroseconds(pulso);   // esperamos el tiemp que dura el puslo
    digitalWrite(salida, LOW);  // desactivamos el pin de salida
    delay(20); // PAUSA de 20 milisegundos
   }


Como sabes leer programas veras que este sencillo sketch lee un potenciometro, mapea su valor para dejarlo en un rango de entre 1000 y 2000, activa un pin digital, espera ese valor mapeado en microsegundos y desactiva el pin,  luego hace una pausa de 20 milisegundos.

Copialo y pegalo, y luego lo pruebas con un servo y veras que .... funciona, anda.... pulso, pausa, pulso, pausa... funciona ¿puff?.

Tus 18 años entre aprender y ejercitar parece que te han nublado algo el juicio, hablas de PWM, PPM y PCM como si todo el mundo estuviera a la altura de tus conocimientos... y no es así. La gente que acude a este foro en busca de consejo no sabe lo que es un PWM ni un PPM ni un PCM... ni falta que les hace, vienen a aprender por que nadie nace sabiendo.

Un ejemplo simple como pulso, pausa, pulso, pausa es facil de entender Y FUNCIONA, no puff no. Es la forma más sencilla de explicar la forma en que recibe las señales de control un servo o un variador... decirles que es una señal PWM solo sirve para llevarles a intentar pilotar el servo con un digitalWrite().

Por cierto, el código de ejemplo es mio.

No tratas de rebatir mis argumentos sobre que utilizar el termino PWM lleva a confusión, por lo que entiendo que estás de acuerdo... y te doy la razón, es un PWM de 50Hz, pero si no vamos a poner la coletilla de los 50Hz mejor no decir solo "es una señal PWM" por que confunde a los que no tienen muy claro lo que es.

Mira, yo no lo se todo, hoy he aprendido que la frecuencia por defecto en la señal PWM que generan los pines digitales es de 490Hz, si comento incorrecciones es por que aun me queda mucho por aprender. Al menos tengo la humildad de reconocerlo y disculparme por mis errores, si entro en este foro para ayudar a los que saben menos intento hacerlo en un lenguaje que comprendan.

Soltar una frase como "Las emisoras emiten muchas de ellas en PPM, incluso en PCM" no disipa ninguna duda, no ayuda, no aclara nada. Puede que tu tengas muy claro lo que es cada una de ellas, enhorabuena tio sabes mucho de electrónica, pero no tienes ni idea de como transmitir ese conocimiento.

Todo el mundo parece tener muy claro que las emisora utilizan PPM, PCM y PWM. Os ha faltado entrar en que unas modulan la frecuencia y otras modulan la amplitud, por eso las hay FM y AM. No habéis dicho nada de las de 2.4GHz (que no hay que confundir con wifi)   y ahí tenéis un montón de siglas más para presumir de lo mucho que sabéis de electrónica FSSS, FHSS, FASST y muchos más.

Recomendarle a alguien que abra un receptor, que busque un chip que da salida PPM y que la lea por un pin analógico ¿de verdad te parece que es aclararle algo?, para los que llevan 18 años dedicados a la electrónica debe ser lo más sencillo del mundo, pero para los demás no.

¿Agresivo? si, por que estoy tratando de que las cosas se expongan de una forma sencilla y que funcione (pulso, pausa, pulso, pausa ---> funciona, no puff, funciona, no puff) sin complicarle la vida a nadie por omitir puntualizaciones acerca de una frecuencia, ¿agresivo? tal vez por que empecinarse en llamar las cosas de una forma que, aunque sea correcto, confunde me parece estúpido.

Releo la respuesta de Cheyenne, perdón por mis incorrecciones, aprendo sobre la marcha.

Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: coleoptero on Sep 05, 2011, 01:40 am
Chicos la temperatura y subida de tono de los post hay que frenarla ya.

Como bien ha indicado 'Igor R' estamos en un foro y en él se discuten las cosas aportando cada uno nuestro conocimiento para esclarecer dudas. Pero teniendo en cuenta unas normas mínimas de conducta y un mutuo respeto. Saliéndonos de la temática y entrando en rivalidades no es la mejor forma de ayudar si es como decís lo que pretendéis.

De seguir en esta línea me veré obligado a hacer algo que no deseo.

Saludos.

coLe.
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: josemanu on Sep 05, 2011, 03:51 pm
Correcto y diplomático como es su costumbre el señor moderador tiene toda la razón, pero en mi opinión llega un poquito tarde, mi último post ya estaba muy calmado.

Y como también se me ha echado en cara que no he aportado nada positivo, solo incorrecciones, voy a subsanar este hecho... y sin acalorarme.

Code: [Select]
int entrada = 7;  // pin en el que metermos la señal que viene del receptor
unsigned long pulso;  // variable en la que almacenaremos la lectura

void setup()
{
  pinMode(entrada, INPUT);  // configuramo el pin como entrada
  Serial.begin(9600);   // habilitamos puerto serie
}

void loop()
{
  pulso = pulseIn(entrada, HIGH); // leemos el pulso
  Serial.println(pulso);  // mandamos el dato al monitor serie
  delay(500);   // pausa para no volver loco al monitor serie
}


Este sencillo Sketch recien programado por mi lee los pulsos procedentes de un receptor y los muestra por el puerto serie.

Como lo que Adrib quería hacer era leer la información que viene del receptor para jugar con ella en ese Sketch tiene todo lo necesario para entenderlo y comentado en castellano, aun así, si algo no le queda claro que pregunte y trataré de explicarlo de la forma más sencilla que pueda.

Acerca del Sketch comentar solo que, como básicament lo que queremos leer es un pulso de una duración de entre 1000 y 2000 microsegundos, tras el cual va una pausa cuya duración no nos importa, con el comando pulseIn() lo podemos hacer de forma sencilla. Lo he probado con uno de mis receptores y tal cual está ha funcionado perfectamente. También he comprobado una cosa muy curiosa, que no sabía y que paso a compartir para que sea de dominio público, por que a alguien le puede ser de interes: cuando he apagado el conjunto receptor-variador y he retirado la batería  me seguían llegando pulsos, así que con sorpresa me he enterado de que Arduino puede alimentar al receptor.

Otra cosa, para leer los pulsos haría falta un comando pulseIn() para cada canal. Yo he utilizado un receptor Team Losi 2.4GHz DSM de 3 canales para la prueba, abrirlo para buscar una señal interna que lleve la información de todos los canales codificada en ella me parece, a título puramente personal, innecesario. Pero si algún valiente se atreve yo le paso fotografías de 8MP del circuito, me señala donde buscar y me ofrezco para hacer mas pruebas.

Esta mañana, mientras iba en bici al trabajo no he podido dejar de pensar en el tipo de señal tan particular que sirve para comunicar los distintos elementos de un sistema de radio control. Hemos quedado que es una señal PWM de 50Hz y que su pulso tiene una duración comprendida entre 1 y 2ms ¿y si el pulso fuese de 10ms? seguiría siendo PWM, pero no funcionaría ¿y si el pulso fuese de 0.25ms? también sería PWM y tampoco funcionaría.

Si tenemos que especificar que se trata de una señal PWM de 50Hz con el pulso comprendido entre 1 y 2ms resulta que tenemos que puntualizar tanto para referirnos a este tipo de señal que decir sólo que es PWM resulta incompleto, tanto como decir que se trata de una señal digital. Realmente ofrece la misma información en este caso decir que es digital y decir que es PWM. En este caso simplificar hasta el punto de que trata de una señal pulso-pausa-pulso-pausa, diciento que los pulsos son de entre 1 y 2 ms y que las pausas son de 20ms ofrece mucha más información y es más comprensible que decir solo que se trata de una señal PWM. Y aunque la simplificación no sea técnicamente correcta resulta que es cierta y que si le enviamos esa señal a un servo funciona.

La temperatura no habría subido si el lugar de saltarme al cuello por un par de incorrecciones en ningún momento intencionadas (vuelvo a pedir disculpas por haberme equivocado con la frecuencia de salida de la señal PWM de los pines de Arduino) nos hubiesemos centrado en lo que importa: despejar dudas con información útil.

Espero con esto haber aportado mi conocimiento para esclarecer dudas y no para generarlas, aunque si ha sido este el caso, siempre estoy dispuesto a disiparlas en base a mis conocimientos y a mi experiencia.
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: javier_david on Oct 06, 2011, 09:08 am
Chicos gracías por la discusión, porque me habeis aclarado un montón de cosas con ella, aunque se haya puesto un poco tensa la cosa. Voy a empezar con arduino para controlar dispositivos en un avión rc y tenía algunas dudas al respecto.

En cuanto me llegue mi arduino nano, seguró que me saldrán mil mas :-)


Lo mejor que estos puntos de vista diferentes es que siempre se saca algo bueno de los dos lados :-)
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: ionhs on Oct 06, 2011, 11:02 am
Jaja ando tan liado que me he perdido todo el follón. No me he leido todo porque tras leer un rato me he dado cuenta que estabais discutiendo sobre semántica. Pero has sido interesante. Salu2
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: Cheyenne on Oct 06, 2011, 09:47 pm
La discusión semántica ya se produjo hace dos años aquí: http://arduino.cc/forum/index.php/topic,14146.0.html (http://arduino.cc/forum/index.php/topic,14146.0.html)

Resumiendo viene a decir que lo que puede dar lugar a equívoco si no se conoce Arduino es el hecho de que para dar una salida PWM el comando sea analogWrite. El personal poco entendido puede interpretar que se está dando una salida analógica cuando no lo es. El comando correcto tal vez debiera haber sido PWMWrite. Pero a estas alturas no sería nada práctico intentar cambiarlo. Siguiendo el hilo con el tema de radio control (RC) se explica lo de la transmisión de las emisoras RC mayoritariamente en PPM (también pueden hacerlo en PCM) para a continuación demultiplexar y sacar la señal PWM de cada canal. Esta señal PWM es la que directamente controla por ejemplo un servo. Sin embargo, la salida PWM de un Arduino escrita con el comando analogWrite no puede controlar un servo porque ese comando saca una PWM a frecuencia 490 Hz cuando un servo la requiere a 50 Hz (flancos ascendentes cada 20 milisegundos). Por esta razón hay quien propone no decir que la señal de un servo es PWM cuando realmente lo es.

Claro que entonces a mi modo de ver tendríamos que rebautizar el nombre de la señal de un servo como "señal servo", "tren de pulsos especial para servo" o cualquier otra cosa. Yo soy de la opinión de llamarla PWM puesto que lo es. Después si es necesario habrá que especificar sus características particulares. De lo contrario habría que cambiarle el nombre a muchas otras cosas. No digamos que una batería de coche puede suministrar electricidad puesto que alguien no entendido podría enchufar la plancha a la batería de coche y no le funcionaría aunque también funcione con electricidad.
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: AlexRodriguez on Jan 16, 2012, 12:56 am
buenas, estoy construyendo un wii-cuadricoptero, pero me preguntaba s existe algun sof, que me permita controlarlo con la pc,
lo que pasa que no tengo una radio rc.
O alguen a modificado el sof de la pagina multiwii, para poder controlarlo con la pc.
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: SrDonGato on Jan 16, 2012, 07:49 am
No sé si existe ... pero lo desaconsejo totalmente, y más si las hélices tienen un tamaño considerable.

Parece un juguete pero es bastante peligroso en casos de fallos

aun así tienes que establecer un lazo inalambrico entre ambos, tienes que usar radio igualmente
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: Cheyenne on Jan 16, 2012, 02:12 pm
Pues yo, aunque lento, aquí sigo con mi proyecto de cuadricóptero. Ya leo los 8 canales de la emisora, leo los ángulos que me proporciona el 9 DOF Razor, ejecuto el PID y envío los pulsos a los motores. Ahora estoy con un balancín con dos motores haciendo pruebas de estabilización y por el momento no estoy teniendo buenos resultados  :( la buena noticia es que sólo llevo dos días con esta prueba  :)

¿Hay alguien en el foro que esté desarrollando su propio código sobre Arduino para estabilizar un cuadricóptero?
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: SrDonGato on Jan 16, 2012, 02:17 pm
yo acabando el quadcopter tras varias remodelaciones, aun así tengo que reforzar el esqueleto, de las vibraciones se afloja todo :D

hice el del multiwii, y tras varios vuelos fallidos por disintas causas lo tengo aparcado, ya me ha dado un par de sustos las jodidas hélices, cuando se me pase el susto  sigo con ello :D

Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: AlexRodriguez on Jan 16, 2012, 07:03 pm
:smiley-roll-blue: s, como dice el colega tambien lo tengo haciendole pruebas en un balacin,
pero no puedo avanzar por los motivos mencionados.
estaba pensado en ponerle un rooter linsys para interactuar con la pc, y abaratar costos.
Title: Re: Proyecto Cuadricoptero UAV: Problema con receptor de emisora RC
Post by: Cheyenne on Jan 16, 2012, 07:21 pm
Yo no estoy usando ningún código ya hecho así que no puedo decirte. Si quieres controlar el balancín desde el PC entiendo que lo quieres hacer por cable sólo para hacer pruebas. En ese caso puedes pillar algún joystick, hacer el código (o buscarlo en San Google) para leerlo en Arduino y pasar los datos a las correspondientes variables del código del multiwii.