Ardunio – Capítulo 12 – Zoótropo

Zootropo

Antes de Internet, la televisión, antes incluso de que existieran las películas, algunas de las primeras imágenes en movimiento que se crearon lo fueron gracias a un artilugio llamado zoótropo. El zoótropo fue inventado por William George Horner y se basa en la idea de crear la ilusión de una imagen en movimiento a partir de un grupo de imágenes estáticas las cuales, varían levemente las unas de las otras. Esta sucesión de imágenes estáticas es lo que hoy en día llamamos fotogramas.

Imagenes para zootropoTiras de imágenes para usar en un zoótropo

Un zoótropo no es más que un cilindro que incluye una serie de ranuras en su superficie. Cuando dicho cilindro gira y miramos a través de las ranuras, nuestros ojos perciben las imágenes estáticas que hay en el interior como una única imagen en movimiento. Las ranuras impiden que las imágenes del interior se mezclen y las veamos borrosas, y el movimiento del cilindro es el que provoca la sensación de imagen animada. Normalmente estos aparatos se hacían girar con la mano, aunque otros incluían un sistema de engranajes que facilitaba dicha tarea.

A continuación podéis ver un vídeo de como funciona un zoótropo.

 

En nuestro proyecto, vamos a construir un zoótropo que de vida a una planta carnívora. Haremos girar el cilindro con un motor, pero para hacerlo más avanzado, añadiremos un pulsador para controlar la dirección de giro, otro para encenderlo o apagarlo y un potenciómetro para controlar la velocidad a la que gira. Después de casi 200 años de la invención del zoótropo creo que vale la pena hacer algo más acorde a nuestro nivel tecnológico actual, y nuestro Arduino nos va a ayudar a conseguirlo.

En nuestro proyecto del molinillo de papel motorizado, hacíamos girar el motor en una única dirección. Si cogemos e invertimos la alimentación y la tierra del motor, lograremos que el motor gire en sentido contrario. Aunque efectivo, no es muy práctico estar haciendo esto cada vez que queramos cambiar el sentido de giro del motor, aunque por suerte para nosotros existe un componente que nos va a facilitar dicha tarea: el Puente en H.

Puente en HEsquema eléctrico de un Puente en H

El Puente en H es un elemento que podemos encontrar en forma de circuito integrado (CI). Los circuitos impresos son componentes que pueden llegar a contener una gran cantidad de circuitos en una pastilla muy pequeña. Esto ayuda a simplificar circuitos mucho más complejos ya que se pueden reducir a un único componente que es fácilmente sustituible. A modo de ejemplo, el Puente en H que vamos a utilizar es nuestro proyecto contiene cierto número de transistores. Si quisiéramos montarlo a mano, necesitaríamos otra protoboard solo para él.

Circuito integrado de Puente en HCircuito integrado de un Puente en H

En un circuito integrado, podemos acceder a sus circuitos internos mediante los pines que hay a ambos lados del mismo. Diferentes CI tienen diferentes números de pines, y no todos ellos se utilizan en todos los circuitos. Normalmente se hace referencia a los pines mediante un número en lugar de hacerlo por su función. Cuando miremos un circuito integrado, debemos hacerlo posicionando hacia arriba una pequeña marca en forma de semicírculo que tiene en un extremo. Colocando el CI de esta manera, podremos identificar el número de cada pin comenzando por el que se encuentra en la parte superior izquierda y haciendo un recorrido en forma de “U”.

Circuito integrado

 

Montando el circuito

Para montar el circuito de este proyecto necesitamos los siguientes componentes:

 – 2 Pulsadores.

– 2 Resistencias de 10KΩ.

– 1 Potenciómetro.

– 1 circuito integrado L293D (esto es el Puente en H).

– 1 Batería de 9V.

– 1 Conector que nos permita enlazar la batería a la protoboard.

– 1 Motor DC.

Una vez tenemos los componentes necesarios, debemos seguir los pasos siguientes:

1 – Conectamos la alimentación y la tierra de nuestro Arduino en la protoboard.

2 – Añadimos un pulsador conectando la patilla de entrada a la alimentación. Seguidamente, una de las patillas de salida la conectamos a tierra mediante una resistencia de 10KΩ y la otra patilla al pin número 5 de nuestro Arduino. Este pulsador será el que nos permita encender o apagar el motor.

3 – Repetimos el paso anterior con el otro pulsador, pero esta vez, en lugar de conectarlo al pin 5 lo conectaremos al pin número 4. Este pulsador nos permitirá controlar el sentido de giro del motor.

4 – A continuación conectaremos el potenciómetro. Dicho componente tiene tres patillas. La de un lado la conectaremos a la alimentación de 5V proporcionada por Arduino y la del otro lado, la uniremos a tierra. La patilla central la conectaremos al pin de entrada analógica 0 de nuestro Arduino. Conectado de esta forma, este potenciómetro nos permitirá controlar la velocidad del motor.

5 – El siguiente componente que colocaremos será el Puente en H. Lo posicionaremos horizontalmente sobre la línea media de la protoboard dejando la muesca de dicho componente orientada hacia el lado izquierdo, de manera que desde nuestro punto de vista, la mitad de las patillas quedan en la mitad superior de la protoboard y la otra mitad en la inferior. La siguiente figura ilustra como debería de quedar.

Posicionamiento del Puente en H

Una vez colocado el Puente en H, conectamos el pin 1 del puente al pin digital 9 del Arduino. Este es el pin de activación del Puente en H. Cuando a través de dicho pin reciba 5V, el motor se encenderá y cuando reciba 0V, lo apagará. Este pin del Puente en H lo podemos usar con la técnica PWM y ajustar de esta forma la velocidad del motor.

6 – Seguidamente, conectamos el pin 2 del puente con el pin digital 3 del Arduino, y el pin 7 al pin digital 2. Estos pines serán los que utilicemos para comunicarnos con el Puente en H y decirle cual será el sentido de giro del motor. Si el pin 3 tiene un nivel LOW y el pin 2 un nivel HIGH, el motor girará en un sentido. Pero si el pin 3 tiene un nivel HIGH y el 2 un nivel LOW, el motor girará en sentido contrario. Por contra, si ambos pines tienen el mismo estado de forma simultánea, ya sea HIGH o LOW, el motor dejará de girar.

7 – Ahora debemos alimentar a nuestro CI. Para ello conectaremos el pin 16 a la alimentación de 5V y los pines 4 y 5 a tierra.

8 – A continuación añadiremos el motor. Dicho motor lo uniremos a los pines 3 y 6 del Puente en H, ya que estos serán los encargados de encender o apagar el motor en función de las señales recibidas a través de los pines 2 y 7.

9 – El paso siguiente será conectar el adaptador de la batería de 9V, pero no la propia batería. La tierra de la alimentación de 9V irá unida a la tierra de nuestro Arduino y el positivo, a la línea de alimentación de la protoboard que nos quede libre. Para mi gusto, las dos líneas inferiores de la protoboard las uso para el Arduino y las dos superiores para la alimentación de 9V. El pin 8 del Puente en H lo conectamos al positivo de la batería, ya que este pin será el encargado de alimentar al motor. Sobretodo debemos asegurarnos de que las líneas de alimentación tanto del Arduino (5V) como de la batería (9V) no estén unidas, solo sus tierras deben estarlo.

Terminado de montar el circuito, deberíamos de tener algo parecido al mostrado en la siguiente figura.

Zoetrope - Diseño de protoboard

El esquema eléctrico correspondiente sería:

Zoetrope - Esquema de conexiones

El código

Comencemos por comentar paso a paso el código fuente con el que vamos a programar nuestro Arduino.

Para empezar, crearemos unas constantes para los pines de entrada y salida.

const int controlPin1 = 2;
const int controlPin2 = 3;
const int enablePin = 9;
const int directionSwitchPin = 4;
const int onOffSwitchStateSwitchPin = 5;
const int potPin = A0;

A continuación, usaremos variables para almacenar el valor de las entradas. En nuestro programa, tendremos que detectar los cambios de estado que se produzcan en los pulsadores de una iteración del bucle a otra, similar a lo que hicimos en el proyecto del reloj de arena digital. Por tanto, además de tener que almacenar el estado actual de los pulsadores, también tendremos que guardar el estado anterior de cada uno de ellos.

int onOffSwitchState = 0;
int previousOnOffSwitchState = 0;
int directionSwitchState = 0;
int previousDirectionSwitchState = 0;

Seguidamente, emplearemos dos variables para el motor. motorDirection nos indicará en que dirección está girando el motor y, motorEnabled, nos dirá si el motor está girando o no.

int motorEnabled = 0;
int motorSpeed = 0;
int motorDirection = 1;

En la función setup(), nos encargaremos de indicar que pines son de entrada y cuales de salida.

void setup(){

    pinMode(directionSwitchPin, INPUT);
    pinMode(onOffSwitchStateSwitchPin, INPUT);
    pinMode(controlPin1, OUTPUT);
    pinMode(controlPin2, OUTPUT);
    pinMode(enablePin, OUTPUT);

Al pin de activación le daremos un valor LOW, de esta manera, empezaremos teniendo al motor parado.

    digitalWrite(enablePin, LOW);

}//Fin de la función setup.

A continuación, en la función loop(), leeremos el estado del pulsador de On/Off y lo guardaremos en la variable onOffSwitchState.

void loop(){

    onOffSwitchState = digitalRead(onOffSwitchStateSwitchPin);
    delay(1);
    directionSwitchState = digitalRead(directionSwitchPin);
    motorSpeed = analogRead(potPin)/4;

Si existe alguna diferencia entre el estado actual del pulsador y su estado previo y además, el pulsador esta actualmente en un nivel HIGH, le daremos a la variable motorPower el valor 1. Si el estado es LOW, le daremos el valor 0.

Leeremos los valores del pulsador de dirección y del potenciómetro y los guardaremos en sus respectivas variables.

    if (onOffSwitchState != previousOnOffSwitchState) {
        if (onOffSwitchState == HIGH) {
            motorEnabled = !motorEnabled;
        }
    }

Seguidamente, comprobaremos si el pulsador de dirección está actualmente en una posición diferente a la anterior. Si es diferente, cambiaremos el valor de la variable de dirección del motor. Solo existen dos sentidos de giro del motor, por lo que la variable tendrá que alternar entre uno u otro. Una manera de conseguir esto es utilizando el operador de inversión de forma similar a esta: motorDirection = !motorDirection.

    if (directionSwitchState != previousDirectionSwitchState) {
        if (directionSwitchState == HIGH) {
            motorDirection = !motorDirection;
        }
    }

La variable motorDirection determina el sentido de giro del motor. Para establecer la dirección, debemos marcar uno de los pines de control con valor HIGH y el otro con valor LOW. Cuando la variable motorDirection cambia, debemos invertir el estado de dichos pines.

Si el pulsador de dirección ha sido pulsado, debemos hacer girar el motor en sentido contrario invirtiendo el estado de controlPins.

    if (motorDirection == 1) {
        digitalWrite(controlPin1, HIGH);
        digitalWrite(controlPin2, LOW);
    }
    else {
        digitalWrite(controlPin1, LOW);
        digitalWrite(controlPin2, HIGH);
    }

Si el valor de la variable motorEnabled es 1, encenderemos el motor utilizando la función analogWrite() en el pin de activación. Si motorEnabled es 0, apagaremos el motor indicándole a analogWrite un valor 0.

    if (motorEnabled == 1) {
        analogWrite(enablePin, motorSpeed);
    }
    else {
        analogWrite(enablePin, 0);
    }

Antes de salir de la función loop(), guardaremos el estado actual de los pulsadores como estado anterior para poder utilizar dichos valores en la próxima iteración del programa.

    previousDirectionSwitchState = directionSwitchState;
    previousOnOffSwitchState = onOffSwitchState;


}//Fin de la función loop.

 

Puesta en marcha

Para empezar a utilizar nuestro flamante circuito, primeramente conectaremos el Arduino a nuestro ordenador y enchufamos la batería de 9V a la protoboard. Cuando presionemos el pulsador de On/Off, el motor empezará a girar. Si hacemos girar el potenciómetro, la velocidad de giro del motor aumentará o disminuirá en función del valor enviado por dicho potenciómetro. Presionando de nuevo el pulsador de On/Off, el motor se detendrá. Si probamos de activar el pulsador de dirección, podremos comprobar si el motor es capaz de girar en ambos sentidos.

Si queremos construir el zoótropo completo, podemos aprovechar el disco creado en el proyecto del molinillo de papel motorizado, para hacerlo servir de base. Tan solo nos faltaría añadir la estructura de cartulina (u otro material similar) con las ranuras y una tira de imágenes (por ejemplo, una planta carnívora que crezca) que colocaremos en su interior. Para poder hacerlo podéis buscar por la red de redes y encontraréis múltiples ejemplos muy bien ilustrados. Seguro que os sobran habilidades para construirlo.

Conclusión

En este proyecto hemos aprendido  que es un zoótropo, un Puente en H, un potenciómetro y el operador de inversión. Del mismo modo, ahora sabemos como regular la velocidad de giro de un motor utilizando un potenciómetro y, como cambiar el sentido de rotación del motor gracias al Puente en H. Pero… ¿y si añadimos leds para indicar el sentido de giro del motor? o también, una serie de leds a modo de barra de progreso para indicar el nivel de velocidad a la que gira.

 

Espero que os haya gustado.

Un saludo y muchas gracias por leer este artículo.  ^_^

 

Referencias

– Artículo basado en el capítulo “Project 10 – Zoetrope” del libro “Arduino Projects Book” distribuido por Arduino.cc junto con su “The Arduino Starter Kit“.

– Más información acerca del Puente en H: https://es.wikipedia.org/wiki/Puente_H_(electrónica)

– Más información acerca del potenciómetro: https://es.wikipedia.org/wiki/Potenciometro

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s