domingo, 2 de febrero de 2014

Tremenda Diatriba sobre Trenes y Transistores

El camino hacia una maqueta autónoma es largo. Hoy el primer paso: Un tren se mueve por el circuito siguiendo un programa almacenado en una Arduino que regula el voltaje del circuito mediante un transistor:


 
Los esquemáticos




y otra vista gracias a Fritzing

He usado el icono del motor para representar las vias y el tren


 
El Código


/* TRANSISTOR DEMO   

El tren se moverá durante siete segundos y parará durante cinco

Aceleraciones progresivas con la función voltProgresivo  

CONEXIONES: 
  - Base del Transistor a pin Arduino 11
  - Colector del transistor a una via
  - Emisor del transistor a tierra GND
  - La otra via al positivo de la fuente de alimentación
  - Arduino conectada a la fuente de alimentación mediante Vin y GND, 
  ojo a la polaridad
  
  */
  
int base=11;  // pin para conectar la base del transistor
int pasoVolt=10;  // paso del voltaje para aceleración progresiva
int maxVolt=120; //voltaje máximo = maxVolt *VoltajeFuente/255
int minVolt=60; //voltaje mínimo para que ruede la máquina
                //principio de la aceleración

void setup(){
    pinMode(base, OUTPUT);//definimos el pin hacia el transistor como salida
}

void loop(){
  voltProgresivo(minVolt, maxVolt, base, 200, pasoVolt); //aceleracion
  delay(5000); //se mantiene el voltaje máximo durante 5 segundos
  voltProgresivo(maxVolt, minVolt, base, 200, pasoVolt); //frenada
  analogWrite(base,0); //desactivamos el pin
  delay(3000);  //3 segundos de pausa
}

void voltProgresivo(int startV, int endV, int digiHigh, int timeSpacing, int VSpacing){
  
  /* modifica el PWM progresivamente, en pasos de VSpacing
  (recomendado 10) cada timeSpacing (milisegundos).digiHigh es 
   el puerto de salida de Arduino (3, 5, 6, 9, 10 u 11). 
  
  endV-startV debe ser divisible por VSpacing

  */
  
  /* ejemplo acelerando  voltProgresivo(80, 160, 7, 200, 10);
     example frendando  voltProgresivo(160, 80, 7, 200, 10);*/
  
  int steps = (endV - startV)/VSpacing;
  int direcc;
  
  if (steps > 0) {
    direcc = -1;
  }else{
    direcc=1;
  }
  
  for (int i=1; i < abs(steps+1); i++){  
    int salida=startV-VSpacing *i*direcc;
    if (salida > 200){
      salida = 200;
    } else if (salida < 0){
      salida=0;
    }
    
    analogWrite(digiHigh, salida);
    delay (timeSpacing);
  }
}

 
Qué hay detrás de todo esto

Dado que ya hay magníficos tutoriales sobre cómo programar Arduino, voy a centrarme más en su integración en la maqueta. De todos modos, no os dé reparo pedir detalles en los comentarios si queréis que entre más a fondo en algún tema. Dejadme que os cuente por encima cómo funcionan las salidas de Arduino.

Arduino tiene trece puertos digitales (i.e. trece sitios dónde enchufar cosas) que pueden funcionar como entradas o salidas: podemos conectar un interruptor como entrada, o un led como salida por ejemplo. Tienen solo dos posibles estados: HIGH (5 voltios) y LOW (0 voltios). Esto es un poco limitado, si vamos a conectar ahí nuestro tren, parecería que solo podemos poner dos valores de voltaje: corriendo a 5V o parado a 0V. ¿Qué hay de las aceleraciones progresivas? ¿No podemos mover un tren lentamente para simular maniobra? Pues sí, con el sucio truco del PWM.

 
PWM

Pulse Width Modulation (PWM) consiste en encender y apagar una salida muy rápido de manera que en promedio, el valor de voltaje medio esté entre el valor máximo de 5V y el mínimo de 0V. ¿En qué valor exactamente? Pues va a depender de si estamos más tiempo con el interruptor abajo o arriba. Si de cada cinco milisegundos, estamos mitad y mitad encendidos, tendremos un voltaje de 2,5V. Si estamos 4 milisegundos encendidos y 1 apagados, el valor de voltaje medio será de 4V.

Tres ejemplos de diferentes valores de PWM




De los trece puertos digitales, los que llevan el gusanito al lado pueden dar PWM: 3, 5, 6, 9, 10 y 11.

Usad la expresión

    analogWrite(puerto, valor);

para poner un voltaje en un cierto puerto. El valor se da en 255avos de 5V (204 son 4V, 178 son 3,5V…)
Comparad analogWrite (que puede dar un rango de valores de salida) con digitalWrite que solo dará 0 o 5V.

Si alguien se ha lanzado ya a conectar una salida digital a las vias y ha intentado hacer correr una locomotora se habrá llevado un chasco: no se mueve. Esto es porque Arduino apenas puede dar potencia en sus salidas. Es un buen cerebro, pero no tiene músculo. Arduino apenas tiene potencia para encender un led. Puede dar cinco voltios, pero muy pocos amperios. Es como si intentamos arrancar un automóvil con una pila de petaca: da 12V igual que la bateria del coche pero apenas tiene intensidad.

Vamos a necesitar a alguien que pueda tomar las señales del cerebro Arduino (lista pero sin fuerza) por un lado y la potencia de una fuente de alimentación (fuerte pero tonta) por otro y regular el voltaje hacia las vías: nuestro amigo el transistor.

 
Los Transistores

Podemos comparar el transistor a un grifo: tiene una cañería de entrada, una salida de agua y una llave para dejar pasar el agua o no. Con Arduino manejaremos la llave y regularemos el flujo, no de agua sino de corriente eléctrica.

Un transistor tipo NPN: la llave se denomina base, B, el lado conectado a la fuente es el colector C y el lado de salida del flujo es el Emisor E.

El símil del grifo no acaba de ser exacto porque el transistor funciona más bien como uno de esos pulsadores de fuente pública que ó están apagados ó están soltando un chorro de agua que te deja empapado, sin término medio. Pero esto ya nos va bien porque lo manejaremos con PWM y a base de pasar muy rápido de cerrado a totalmente abierto podremos tener estados de flujo intermedios.

Pero ojo, a todo esto sólo podemos mover el tren en una dirección. El transistor no puede funcionar a la inversa, sería como intentar meter agua en la cañería a través del grifo. Si queremos mover el tren hacia adelante y hacia atrás nos hará falta un puente H. Escribiré sobre el puente H mañana la semana que viene… como pronto o así.

 
Cómo seleccionar un transistor

La hoja de especificación de un transistor es un tremendo galimatías de datos y gráficos. Para aplicaciones caseras como las nuestras basta fijarnos en cuatro cosas:

Voltaje de saturación Vsat: El voltaje en la puerta que hará que pase a conducir corriente. Si queremos manejar el transistor con Arduino tiene que estar entre 2,5 y 4V, de manera que con uno de nuestras salidas HIGH estemos comodamente en la zona de conducción. Los componentes TTL siempre tienen esta característica.
Vsat < 4V
Vsat > 2,5V

Voltaje entre Emisor y Colector Vceo: Debe ser mayor que el voltaje de nuestra fuente de alimentación (que debería rondar los 15V)
Vceo > 15V

Voltaje Colector Emisor en saturación, Vce(sat): la caida de voltaje entre E y C cuando el transistor está conduciendo. A efectos prácticos, el voltaje disponible para el tren es el de la fuente de alimentación menos Vce(sat)

Potencia disipable Ptot: El transistor se calentará por el hecho de tener intensidad circulando por él. Dependiendo de la construcción de cada uno, podrá evacuar más o menos calor y podrá llevar más o menos intensidad sin quemarse. Al escoger un transistor nos hace falta saber cuanta intensidad consume nuestro tren y multiplicarlo por Vce(sat). El resultado debe ser menor que la potencia disipable.

Ptot < Vce(sat) * I

En mi caso me he encontrado de todo: desde los chasis motorizados de Tomix que apenas consumen 0.1 A cuando están acelerando hasta las antiguas máquinas de Ibertren que se tragan 0.6 A. Para un transistor con Vce(sat) de 2V, el chasis de Tomix disipará 0.2W y la vieja Ibertrén 1.2W.

Finalmente, hay que escoger la resistencia entre la base y la salida de Arduino. Sin ésta, la salida estaría conectada directamente a  tierra y la corriente circularía sin ningún control. Tomaremos la mayor resistencia que con los 5V del HIGH garantiza la corriente nedesaria para saturación Isat:

Rb< 5V / Isat

Otro apunte sobre instalación: se debe conectar un diodo en paralelo al transistor para no forzar corriente  de E a C cuando dejamos de alimentar el motor y éste gira por su inercia actuando como dinamo.


 

Unos pocos ejemplos

Existen dos grandes familias de transistores, los BJT y los MOSFET. Hoy me centro en los primeros e intentaré dedicar una entrada más adelante a los MOSFET, que son más caros pero con unas prestaciones muy interesantes.
De los transistores BJT, os recomiendo la variedad NPN que me resulta más fácil de conectar. Estarán abiertos con HIGH y cerrados con LOW, fácil.



TIP 12x, TIP 11x, TIP10x: Son NPN si x es un número par. Aunque voluminosos, pueden conducir muchísima corriente y además llevan el diodo incorporado en el interior: menos elementos a montar. Yo los uso para pruebas, es imposible quemarlos. Su resistencia de base adecuada es de 330 Ohm.

2N2222: Más modesto en disipación pero más barato y muy fácil de encontrar. Conectadla a la salida de Arduino con 47 Ohm.

ULN2803: Un integrado con ocho transistores en un solo empaquetado. Muy práctico si hay que controlar diversos circuitos, te ahorras cableado y espacio en la placa. En este la resistencia de base es especialmente indicada porque tiene un límite a la intensidad entre base y emisor. Cualquier resistencia de base de entre 470 Ohm y 1 kOhm funcionará.



 
¿Qué es ese zumbido en el video?

Los más observadores habrán escuchado un zumbido al arrancar la locomotora. La frecuencia del PWM de Arduino ( la velocidad con que abrimos y cerramos el interruptor) es de 400 Herz, una frecuencia audible que hace resonar el motor cuando está arrancando. En un tren eléctrico queda hasta realista, pero para locomotoras diesel o de vapor hace feo. En este enlace podeis ver cómo incrementar la frecuencia para disminuir este efecto.
La otra opción es un filtro (condensador y resistencia) a la entrada de las vias... igual le dedico otra entrada al respecto. 

3 comentarios:

  1. interesante la publicación para todo principiante en arduino y con algunos conocimientos basicos en electronica y programacion.

    ResponderEliminar
  2. Gracias por estos tutoriales.
    Tengo una duda con las conexiones a tierra de los transistores dibujadas en el esquema. En la protoboard figura como si estuviera conectada a las dos lineas de abajo de forma interrumpida.

    ResponderEliminar
    Respuestas
    1. Tienes razón Jordi, la pata de tierra del transistor apunta a la linea incorrecta. Debería ser común con la tierra de la pila y de la Arduino.

      Gracias por el aviso. Cuando retome el blog corregiré esto lo primero.

      Saludos

      Carles

      Eliminar