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:
En la entrada de hoy:
Los esquemáticos
El código
Qué hay detrás de todo esto
PWM
Transistores
Cómo seleccionar un transistor
Algunos ejemplos
¿Qué es ese zumbido en el video?
Los esquemáticos
El código
Qué hay detrás de todo esto
PWM
Transistores
Cómo seleccionar un transistor
Algunos ejemplos
¿Qué es ese zumbido en el video?
/* 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.
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.
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í.
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.
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?
La otra
opción es un filtro (condensador y resistencia) a la entrada de las vias...
igual le dedico otra entrada al respecto.