lunes, 22 de abril de 2013

Mover un tren con Arduino | Move a train with Arduino

Uno de mis hobbies es el modelismo ferroviario. Un día, buscando algún tipo de placa que me proporcionase entradas y salidas mediante una conexión USB a un PC, di con Arduino. Pronto descubrí que podía utilizarse para cualquier cosa que pudiese imaginar, así que decidí comprar un Arduino Mega para probar. Hoy en día tengo varios tipos diferentes de Arduino que uso para diferentes proyectos.

Hoy voy a explicar la forma más sencilla de controlar el movimiento de un tren de escala Z (1/220) mediante Arduino UNO.

Velocidad:

Esta forma de control consiste en utilizar una salida PWM (Modulación por Ancho de Pulso) para controlar la velocidad del motor. El PWM es un tipo de señal digital de una duración determinada que se repite indefinidamente. Cada uno de estos ciclos consta de un estado a nivel alto (Tensión máxima) y uno a nivel bajo (Tensión mínima). La suma del tiempo que dura el estado alto y el bajo es la duración total del ciclo. En Arduino UNO concretamente la tensión de los estados es de 5V y 0V respectivamente. Al utilizar una señal PWM estamos utilizando señales del voltaje máximo aceptado por el motor, así aprovechamos toda su potencia.
One of my hobbies is model railroading. One day, looking for some kind of pc board that can provide inputs and outputs through an USB connection to a PC, I found Arduino. I soon discovered that it could be used for anything I could imagine, so I decided to buy an Arduino Mega to try. Today I have several different types of Arduino to use for different projects.

Today I will explain the easiest way to control the movement of a Z scale (1/220) train using Arduino UNO.

Speed:

This way of control is to use a PWM (Pulse Width Modulation) to control motor speed. The PWM is a digital signal type of fixed duration that repeats indefinitely. Each of these cycles consists of a high-level state (high voltage) and one low (low voltage). The sum of the duration of the high and the low is the total cycle. In Arduino UNO specifically states voltage are 5V and 0V respectively. By using a PWM signal we are using maximum voltage accepted by motor and we get full power.
Diferentes ejemplos de pulsos PWM.
Different examples of PWM pulses.


En la imagen anterior vemos varios ejemplos de pulsos PWM (rojo) y su equivalente en tensión (verde). La diferencia entre usar pulsos de 9V y de usar tensiones de 0V a 9V es que usando PWM siempre alimentamos el motor con su máxima tensión.

Arduino UNO puede proporcionar 5V y 40ma por pin, esto no es suficiente para mover un motor de 9V y aproximadamente 300mA. Para ello necesitamos usar un transistor. Yo he utilizado para hacer la prueba un transistor darlington que me permite trabajar hasta con 80V y 4A. Se trata del transistor BD679.

Cuando trabajamos con motores y PWM debemos tener en cuenta la frecuencia de ciclo de la fuente de PWM. Si utilizamos frecuencias bajas, de entre 20Hz y 20KHz, entraremos dentro del espectro audible del ser humano y el motor producirá un zumbido desagradable. Con Arduino UNO no hay problema ya que los pins que proporcionan PWM trabajan con el Timer 0 (62500Hz) o con los Timers 1 y 2 (31250Hz).
In the picture above we can see several examples of PWM pulses (red) and the equivalent voltage (green). The difference between using 9V pulses and using voltages from 0V to 9V is that we always feed the engine with maximum voltage.  


Arduino UNO can provide 5V and 40mA per pin, this is not enough to move a 9V and approximately 300mA motor. For this reason we need to use a transistor. I've used for the test a darlington transistor that allows me to work up to 80V and 4A. This transistor is a BD679.

When we are working with motors we must consider PWM cycle frequency. If we use low frequencies, from 20Hz to 20KHz, we are entering in human hearing range and it causes an unpleasant humming. With Arduino UNO there is no problem because the pins that can provide PWM are working with the Timer 0 (62500Hz) or with Timers 1 and 2 (31250Hz).



Ejemplo de conexiones.
Example of connections.


Esquema
Schematic.


En la imagen anterior podemos ver el esquema necesario para mover un tren por una vía usando el pin 6 de Arduino que nos proporciona 62.5KHz. He utilizado el transistor BD679 y un diodo 1N4007 (1000V 1A) para eliminar los picos de tensión provocados por la bobina del motor.

El siguiente bloque de código muestra la lectura de un byte del puerto serie y la asignación del byte a la salida PWM:
In the picture above we can see the schematic required to move a train by the track using the Arduino's pin 6 that gives us 62.5KHz. I used a BD679 (80V 4A) transistor and a 1N4007 diode (1000V 1A) to eliminate voltage spikes caused by the motor coil.

The next piece of code shows reading an incoming byte from the serial port and then output this byte to the PWM pin:


 
...
 
// Velocity
byte vel = Serial.read();
analogWrite(pwmPin, vel);
 
...
 

Para hacer la prueba he creado un pequeño ejecutable en Visual Basic (.NET 4.0) que se puede descargar junto con todo el material de este post.
To test I created a small executable in Visual Basic (. NET 4.0) which can be downloaded along with all the material in this post.

Ejecutale VB.
VB Executable.






Descargas:
Downloads:


ArduinoBD679.zip



Enlaces:
Links:


Arduino UNO (EN): http://arduino.cc/en/Main/arduinoBoardUno
PWM Wikipedia (ES): http://es.wikipedia.org/wiki/Modulación_por_ancho_de_pulsos
PWM Wikipedia (EN): http://en.wikipedia.org/wiki/Pulse-width_modulation
PWM Arduino (ES): http://arduino.cc/es/Tutorial/PWM
PWM Arduino(EN): http://arduino.cc/en/Tutorial/PWM
Espectro audible (ES): http://es.wikipedia.org/wiki/Espectro_audible
Hearing range (EN): http://en.wikipedia.org/wiki/Hearing_range
BD679 (EN): http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00000939.pdf
1N4007 (EN): http://www.diodes.com/datasheets/ds28002.pdf




No hay comentarios:

Publicar un comentario