miliamperios.com

Bootstrap Framework 3.3.6

Más de una docena de componentes reutilizables construidos para proporcionar iconografía, menús desplegables, grupos de entrada, navegación, alertas, y mucho más ...

Todo lo relacionado con el estudio, diseño y funcionamiento de circuitos y componentes electrónicos relacionados con el radio control. Fundado el 4 de Octubre del 2006.

Moderador: Moderadores

#627960
Arduino es una plataforma de desarrollo hipersimple para cacharrear con microcontroladores de la manera mas fácil y económica. Podéis ver mas info en mi blog donde también están los enlaces externos para meterse en éste mundillo: http://arocholl.blogspot.com/2008/02/pr ... duino.html

Animaros, se pueden hacer muchas cosas con muy poco esfuerzo y dinero, sin necesidad de las complicaciones habituales del trabajo con micros para el aficionado. Por ejemplo, muchos de los ejemplos que se han presentado en este foro para hacer parpadear leds a distintas frecuencias y con distintas configuraciones se puede configurar en 20 minutos en una placa arduino, y sin mas que la plaquita y un cable USB.

Para ir abriendo boca, os presento un pequeño programa que testea un servo en todo su recorrido, simplemente conectandolo a la plaquita de Arduino (por supuesto sin necesidad de emisora ni receptor). El servo irá a un extremo, al centro y al otro extremo, y así indefinidamente.
Código: Seleccionar todo
/*

 RC_Test  - Basic R/C Servo tester
 (C) Ariel Rocholl - 2008, Madrid Spain
 Feel free to share this source code, but include explicit mention to the author.
 Licensed under creative commons - see http://creativecommons.org/licenses/by-sa/3.0/
 
 */

int ledPin = 13;                // LED connected to digital pin 13
int PinPPM1 = 12;               // PPM signal that goes 1000us-1500us-2000us


void setup()                    // run once, when the sketch starts
{
  pinMode(ledPin, OUTPUT);      // sets the digital pin as output
  pinMode(PinPPM1, OUTPUT);
}

void loop()                     // run over and over again
{
  digitalWrite(ledPin, HIGH);   // sets the LED on
  delay(1000);                  // waits for a second
  digitalWrite(ledPin, LOW);    // sets the LED off
  delay(1000);                  // waits for a second

  while(1)
  {
    //Produce the 1-1.5-2ms standard servo travel
    for (int nInd=0; nInd<30; nInd++)
    {
      digitalWrite(PinPPM1,HIGH);
      delayMicroseconds(1000);   //1ms pulse
      digitalWrite(PinPPM1,LOW);
      delay(18);                 //17ms low till next pulse
    }
    for (int nInd=0; nInd<30; nInd++)
    {
      digitalWrite(PinPPM1,HIGH);
      delayMicroseconds(1500);   //1.5ms pulse
      digitalWrite(PinPPM1,LOW);
      delay(18);                 //17ms low till next pulse
    }
    for (int nInd=0; nInd<30; nInd++)
    {
      digitalWrite(PinPPM1,HIGH);
      delayMicroseconds(2000);   //2ms pulse
      digitalWrite(PinPPM1,LOW);
      delay(18);                 //17ms low till next pulse
    }
  }
}
Avatar de Usuario
Por arocholl
#628485
ah, por cierto, la idea es conectar Arduino al PC y rapidamente cambiar de una función a otra. Es decir, no es practico (ni rentable) tener una plaquita Arduino para cada uso, mas bien la idea es tener una y reprogramarla cada vez que queremos usarla de una manera distinta. Cuesta aproximadamente 15segundos cargar el programa de arriba, asi que ya vais cogiendo la idea. Asi con la misma plaquita puedes tener un testeador de servos, un generador de señal PPM, un chequeador de señal PPM, un circuito para parpadeo de leds, etc, etc

En los proximos dias complico el RC_Tester de arriba para añadirle dos nuevas funcionalidades interesantes, una de las cuales no lo tienen ni los testeadores de servos comerciales.
Avatar de Usuario
Por sukoi
#628612
cual es el limite de salidas tipo servo/entradas de señal que permite ( o pwm) :?:
me vendria bien para hacer inventillos :roll:



saludos
Avatar de Usuario
Por arocholl
#630628
sukoi escribió:cual es el limite de salidas tipo servo/entradas de señal que permite ( o pwm) :?:
me vendria bien para hacer inventillos :roll:
saludos
Pues hombre, depende de la configuracion. Por ejemplo si usas dos pines para RS232 pues ya pierdes dos pines, etc.

Para manipular servos no necesitas PWM, que ademas en Arduino tiene un control mas bien limitado. Lo mas sencillo es usar bit-banging, yo diria que gestionandolo bien tienes hasta 16 pines que pueden controlar 16 servos distintos.

Echale un vistazo a las referencias que he puesto para hacerte una idea mas detallada.
Avatar de Usuario
Por arocholl
#635212
Aqui va la segunda entrega del testeador de servos. Ahora le añadimos un modo manual: con un simple potenciómetro de cualquier valor, podemos ver el recorrido del servo que variará suavemente al mover el potenciometro.

Cambios respecto a la version anterior: ahora usamos una entrada analógica que, al variar entre 0-1023 segun el valor del potenciómetro (estratégicamente colocado para variar entre 0 y 5V) pues conseguimos aproximadamente los 1000us que necesitamos para el recorrido del servo.

Con un switch o cablecillo conectado al pin 11 de arduino conseguimos que el testeador de servo cambie entre modo manual y automatico.
Código: Seleccionar todo
/*

 RC_Test  - Basic R/C Servo tester - v0.2
 (C) Ariel Rocholl - 2008, Madrid Spain
 Feel free to share this source code, but include explicit mention to the author.
 Licensed under creative commons - see http://creativecommons.org/licenses/by-sa/3.0/
 
 */

int ledPin = 13;                // LED connected to digital pin 13
int PinPPM1 = 12;               // PPM signal that goes 1000us-1500us-2000us
int PinSW1 = 11;                // Switch 1 - ON (5V) indicates auto mode,
                                        //OFF (0V) indicates manual pot mode
int nValue = 0;                 // Analog value representing servo position


void setup()                    // run once, when the sketch starts
{
  pinMode(ledPin, OUTPUT);      // sets the digital pin as output
  pinMode(PinPPM1, OUTPUT);
  pinMode(PinSW1, INPUT);        // set pin to input
  digitalWrite(PinSW1, HIGH);    // turn on pullup resistors
}

void loop()                     // run over and over again
{
  digitalWrite(ledPin, HIGH);   // sets the LED on
  delay(1000);                  // waits for a second
  digitalWrite(ledPin, LOW);    // sets the LED off
  delay(1000);                  // waits for a second

  while (1)
  {
    //Manual mode
    while(digitalRead(PinSW1)==LOW)
    {
      nValue=analogRead(0);      //nValue will be 0-1023
      digitalWrite(PinPPM1,HIGH);
      delayMicroseconds(1000-12+nValue);
      digitalWrite(PinPPM1,LOW);
      delay(17);                 //17ms low till next pulse

    }

    //Auto mode
    while(digitalRead(PinSW1)==HIGH)
    {
      //Produce the 1-1.5-2ms standard servo travel
      for (int nInd=0; nInd<30; nInd++)
      {
        digitalWrite(PinPPM1,HIGH);
        delayMicroseconds(1000);   //1ms pulse
        digitalWrite(PinPPM1,LOW);
        delay(18);                 //18ms low till next pulse
      }

      for (int nInd=0; nInd<30; nInd++)
      {
        digitalWrite(PinPPM1,HIGH);
        delayMicroseconds(1500);   //1.5ms pulse
        digitalWrite(PinPPM1,LOW);
        delay(18);                 //18ms low till next pulse
      }
      for (int nInd=0; nInd<30; nInd++)
      {
        digitalWrite(PinPPM1,HIGH);
        delayMicroseconds(2000);   //2ms pulse
        digitalWrite(PinPPM1,LOW);
        delay(18);                 //18ms low till next pulse
      }
    }
  }
}
Última edición por arocholl el Mié, 02 Abr 2008 0:42, editado 2 veces en total.
Avatar de Usuario
Por arocholl
#647658
Bueno, seguimos complicando el diseño: Ahora le vamos a añadir un medidor completo de consumo (en mA) del servo en funcionamiento.

Esto lo hacemos fácilmente usando el ADC de uno de los 6 canales analógicos que tiene Arduino.

Vamos a medir lo siguiente:

* Corriente máxima (de pico) consumida por el servo.
* Corriente promedio durante todo el recorrido del servo.
* Captura de datos en formato CSV para representar la curva de respuesta en Excel de nuestro servo. Esto último nos va a permitir encontrar fácilmente otra característica del servo... su velocidad de recorrido y su velocidad de centrado. Mas sobre esto en siguientes entregas...

¿Como lo hacemos?

Lo primero es cómo medir la corriente que consume el servo. El método mas sencillo es con una resistencia shunt, de bajo valor óhmico, para que midiendo la tensión en sus extremos nos permita calcular la corriente.

Para que influya lo menos posible en la respuesta del servo, la resistencia tiene que crear muy poco potencial en sus extremos pero, por otra, tiene que crear el suficiente como para que el ADC de Arduino lo pueda detectar y el ruido eléctrico no sea un factor preponderante. La elección correcta nos evitará tener que añadir un Opamp, que de por sí ya añadiría sus propios problemas de tensión offset y precisión de ganancia.

Dado que un servo medio consume maximo entre 0.5A - 2A, y que no quisiéramos que la tensión de la resistencia superase los 0.5V idealmente (representa un 10% de los 5V que debieran llegar al servo) el valor que encontramos es 0.5v/2A=0.25ohms. La potencia de la resistencia será de 0.5v * 2A= 1W.

Este tipo de resistencias no son fáciles de encontrar en las tiendas, así que lo mas fácil es comprar 4 resistencias de 1ohm y 1/4W, ponerlas en paralelo y ya tenemos una resistencia de 1W y 0.25ohms.

No obstante, una tensión de 0.5V es medible por Arduino pero bastante baja para darnos buena precisión. ¿Como podríamos incrementar la precisión de Arduino? Pues muy fácil, usando el pin adRef. Esto hará que los 1024 pasos (10 bits) de resolución se apliquen sobre una tensión inferior a los 5V por defecto y, así, podamos medir los 0.5V con precisión. En mi caso he usado un LM385-1.2 que es una referencia de precisión de 1.2V, con lo cual la resolución de Arduino para tensiones bajas se cuadruplica con respecto a los 5V. Así la precisión teórica será de 1.2V/1024=1.17mV mientras que si usara como adRef los 5V/1024=4.88mV. Por otra parte, los 5V de alimentación no tienen mucha precisión (fluctúa bastante, incluso con el consumo del servo) y si lo alimentamos con baterías será bastante menor de 5V. Asi que el uso de una tensión de referencia de precisión es normalmente imprescindible en medición ADC.

Así que ya tenemos el circuito, en cuanto pueda os pongo el esquema para el que se haya perdido, y el código para el que tenga interés en montarlo. Ya se complica un poco respecto al código básico anterior, pero no demasiado.
Avatar de Usuario
Por arocholl
#648663
HS81

Esta es la primera gráfica, de nuestro buen amigo el HS-81.

Fijaros como tiene un pico de corriente de casi 1A, una velocidad de unos 160ms para el recorrido completo, y luego varios ciclos que le llevan casi otros tantos para centrarse, cesando toda actividad después de unos 300ms.

Es muy interesante ver como el mayor consumo en un servo como éste se va en el centrado. Además, fijaros que los ciclos de centrado coinciden con los pulsos que le llegan: se mueve apenas le llega el pulso y, hasta que no le llega el siguiente, no intenta moverse mas. Esto es esperado en un servo analógico, y demuestra lo poco eficiente de la circuitería del servito de marras.

Imagen

Ya veremos como en servos mas sofisticados esto casi no ocurre.

HobbyCity's HG-D250MG

Nos lo muestra la siguiente gráfica. El servo digital HG-D250MG tiene una respuesta mucho mas suave, dado que como sabéis a un servo digital la circuitería interna le "manda" muchos mas pulsos que se "inventa" a partir de los que recibe de fuera. La ventaja de hacerlo es que el servo responde mucho mas rápido, fijaros en que curva de recorrido tan abrupta.

No obstante, en éste servo digital vemos dos pequeños problemas: El primero es que si bien el servo llega muy rápido a su posición, luego tarda muuuucho en centrarse. Está realmente "casi" centrado, como demuestra su bajo consumo en esta etapa, pero no deja de dar pequeños titubeos hasta que llega a la posición definitiva. Este comportamiento es bastante habitual en los servos digitales (se pasan la vida centrándose, como todos sabemos, y así chupan de baterías y de paso se calientan).

El segundo problema es que el microcontrolador interno del servo tarda un tiempo inicial en entender la señal y empezar a mandar, de forma que los primeros 45ms se queda fofo. Probablemente en un digital de gama alta esto no ocurra, y éstas curvas de consumo son una buena herramienta para conocer cómo de buenos son nuestros servos (y como de rápidos).

D47 y SG50

Ahora comparemos dos servos de características muy similares en cuanto a torque y peso, pero de calidades muy diferentes. El primero, un chinito azul de 5g (llamémosle TowerPro SG50 si queréis, pero se le pueden llamar de muchas otras formas, estos servos tienen muchos padres). Fijaros en que curva de respuesta tan lamentable.

No hace mas que responder brevemente a cada impulso, y quedarse quieto parao a esperar al siguiente, consumiendo un buen pico de unos 300mA en cada ciclo. Es decir, este servo va claramente a "saltos". (El HS81 daba pequeños saltitos al final para centrarse, pero es que el SG50 se pasa todo el recorrido dando saltos). Esta es la respuesta de un servo analógico a la antigua usanza: circuitería inexistente, no hay ayuda ninguna para suavizar el comportamiento ni acelerar la respuesta.

Sin embargo, fijaros el equivalente (si bien cuesta 4 veces mas en euros, eso si) en el D47. Una curva muy suave, de consumo medio muy bajo, y de velocidad extra-rápida (a los 60mS ya ha llegado prácticamente a su posición, a falta de centrado, mientras que el SG50 tarda 200mS en llegar al mismo sitio).

Imagen

Obviamente estas gráficas se han sacado con los servos en vacío. Sin embargo, en pruebas muy manuales haciendo el bruto, he visto que el consumo no es muy diferente usando rangos razonables de oposición.

En cuanto pueda os explico un poco el código Arduino que hace todo esto.
Por ferrervicent
#667418
yo use arduino hara cosa de medio año para controlar unos servos

http://youtube.com/watch?v=YvmU0jcs8kg

en principio queria montarlos en una especie de grua-brazo y desarrollar el software de control pero por falta de tiempo esta parado el tema ;)


con arduino se abre un mundo de posibilidades para esta aficion ;)
Por josepnog
#693135
te acabo de leerte, me pongo en ebay y lo tengo pedido desde EEUU. todo con portes 19 euros aproximadamente en quince dias lo tendre. por favor continua con este hilo.
tambien me a gustado tu blog
Avatar de Usuario
Por arocholl
#696656
josepnog escribió:te acabo de leerte, me pongo en ebay y lo tengo pedido desde EEUU. todo con portes 19 euros aproximadamente en quince dias lo tendre. por favor continua con este hilo.
tambien me a gustado tu blog
Estupendo.

Esto sigue en mi blog. En cuanto tenga tiempo lo completo.
Por jashugun
#744877
Hola, hemos recibido hace poco el arduino dieciemila. Lo de mover servos lo hemos hecho con la libreria especifica por lo que apenas hay que escribir codigo, pero parece que con esa libreria solo se pueden usar dos pines.
Tambien pienso que sería interesante hacer lo contrario, que el arduino detectara la posición del canal para poder accionar cosas en el avion.

¡Elija que Addons deben funcionar, utilice sólo lo que realmente necesita!