Failsafe y control de temperatura de un modelo RC con motor de explosión.

Buggy 1:10Hoy voy a sacar del cajón un buggy de radio control de escala 1:10 que tiene un motor de nitro y una emisora un poco básica de 27Mhz.

El coche es muy divertido, pero tiene un par de problemas:

El más grave a mi entender es que la emisora de 27Mhz, por interferencias, falta de batería, o porque llevamos el coche demasiado lejos, a veces se corta y deja el coche totalmente sin control y casi siempre con el acelerador a fondo.

El otro «problema» no es tanto un problema como una característica de estos motores, hay que hacer un buen ajuste de las agujas del carburador para que el coche corra mucho, sin calarse y sin pasarse de temperatura. Como la refrigeración del motor es de aire es fácil sobrepasar el límite de temperatura óptimo y el motor  petardea o incluso puede llegar a romperse. Tampoco es bueno quedarse corto y empezar a correr con el motor frío.

Para mejorar el coche he utilizado un pequeño PIC de 8 pines, el 12F683, aunque vale cualquiera que tenga una entrada analógica, una de interrupción y tres salidas libres. También he utilizado una termistancia de 100K con encapsulado de cristal, dos leds (rojo y verde) y unos cuantos cables y resistencias.

La idea es supervisar continuamente la comunicación con el servo del acelerador/freno para detectar el corte de comunicaciones, y en ese caso sustituir la señal del receptor por una posición predefinida que frena el coche lo más rápidamente posible. A la vez comprobamos que la temperatura del motor esté en un rango adecuado (entorno a 100 ºC).

esquema

Para simplificar dejamos el servo de dirección como está y llevamos los tres hilos del servo de acelerador al pic. Dos de ellos, los que aparecen como rojo y negro en el cable los usaremos para alimentar el PIC, pero cuidado porque depende de la batería que usemos (en mi caso cuatro pilas AA de 1.5V) la tensión puede ser superior a la admisible de 5.5V, yo he tenido que poner un par de diodos en serie para bajarla a niveles adecualos (cuenta unos 0.7V por diodo). La masa la conectamos al pin 8 y la alimentación al 1.

El tercer cable es la señal que hay que unir a la patilla de interrupción del micro, en este caso es el pin 5 (INT).

Pines 12f683

La señal del servo del acelerador la llevamos al pin 6, mientras que los cables rojo y negro los llevamos a la alimentación (antes de los diodos para que el servo tenga más fuerza).

En los pines 2 y 3 ponemos los dos led (rojo y verde) en serie con una resistencia de 470 ohm a Vdd.

Las dos  patas de la termistancia las traemos con un par de cables desde el motor hasta Vss (8) y AN0 (7), a la vez que ponemos una resistencia de 4K7 desde Vdd(1) hasta AN0 (7). Podemos poner un condensador entre las patas de la termistancia para eliminar algo de ruido.

El esquema queda así:

Esquema eléctrico

 

Para poder minimizar el tamaño del montaje lo mejor es no usar placa de circuito impreso y soldar todo sobre un zócalo DIP de 8 pines usando termoretráctil y cola termofusible para aislar los cables, también es recomendable usar unos conectores para poder enchufar y desenchufar el servo y el receptor.

Con todo bien aislado y conectado lo metemos en la caja donde va el servo y las baterias y hacemos unos taladros para sacar los dos leds y la termistancia que fijamos al motor donde mejor podamos.

Ahora va la parte de la programación:

  • Declaramos una rutina de interrupciones que salte cada vez que llega un flanco de subida en la pata INT. Al entrar ponemos a uno la salida que va al servo (copiamos la entrada que llega del receptor) hasta que se ponga a 0 o pasen más de 2.5 ms (una señal buena debe estar entre 1000 y 2000 us). También marcamos un flag de comunicación ok y ponemos a cero el TIMER2.
#int_EXT
void  EXT_isr(void) 
{
int16 retardo;

   if (input(RC_IN)) output_high(RC_OUT);
   for (retardo=0;retardo<300;retardo++) {
      if (!input(RC_IN)) break;
   }
   output_low(RC_OUT);
   comok=1;
   comnok=0;
   set_timer2(0);
}
  • También declaramos una rutina de interrupción temporizada con el TIMER2 que salta a los 30ms. Sólo va a saltar si no llega señal del receptor, ya que cada 20ms debe llegar un flanco de al menos 1ms si todo va bien y la rutina anterior resetea el temporizador para que no salte. Está claro que si salta hay un defecto en la comunicación por lo que ponemos la salida del servo 1ms a 1 para que frene a tope (1ms = posición de frenado / 2ms =acelerador a fondo). Ponemos además una bandera de comunicación no ok.
#int_TIMER2
void  TIMER2_isr(void) 
{
   comnok=1;
   comok=0;
   output_high(RC_OUT);
   delay_us(PULSO_FS);
   output_low(RC_OUT);
}
  •  La última rutina del programa se llama gettemp() y utiliza una tabla de tensión/temperatura, sacada del proyecto reprap para obtener la temperatura del motor a partir del valor leído por AN0 en la termistancia.
unsigned int16 gettemp() 
{
   xa=(unsigned int16)read_adc();
   y1=305;
   x1=0;
   for (i=0;i < 61;i++) {
      x2=temptable[i][0];
      y2=temptable[i][1];
      if (xa>=x2) {
         y1=temptable[i][1];   
         x1=temptable[i][0];
      } else {

         ya=xa*(y1-y2);
         ya/=(x2-x1);

         b=x1*(y1-y2);
         b/=(x2-x1);
         b+=y1;

         ya=b-ya;
         return(ya);
      }
   }
   return(0);
}
  • El programa principal sólo lee la temperatura y actualiza los leds en función del estado de la comunicación y la temperatura, de forma que el led verde está fijo cuando hay comunicación ok  apagado cuando entra el failsafe y el rojo está apagado con el motor frío, parpadea en el rango de temperatura ideal y se queda fijo con exceso de temperatura.

Aquí está el programa completo:

Fichero sólo visible para usuarios registrados

Compilar, transferir al PIC y listo. Al encender la emisora y el coche, la luz verde se enciende y la roja se quedará apagada. El acelerador debe funcionar como antes, pero ahora cuando apagamos la emisora, el led verde se apaga y el servo del acelerador se va a la posición de frenado, al encender de nuevo la emisora el failsafe se quita y recuperamos el control inmediatamente (debe haber un retraso de menos de 30ms). Para probar el led rojo que indica la temperatura o arrancamos el motor y esperamos  o le acercamos a la termistancia un soldador caliente. Cuando suba la temperatura el led rojo empieza a parpadear y si nos pasamos se queda fijo.

A disfrutar del cochecito.

Deja una respuesta

Tu email nunca se publicará.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies