sábado, 6 de mayo de 2017

Proyecto final: Zootropo con melodía


  1. Objetivo del proyecto

El objetivo de mi proyecto era crear un zootropo para ver imágenes en movimientos y además,
incluir un piezo que vaya cambiando la melodía contra más energía le de al motor.

2. Integrantes Jorge Juan Laiz Cabrera 2B

      3.Enlaces a los portfolios https://informaticajorge2bach.blogspot.com.es/


  1. Descripción detallada.
  • ¿Qué vais a usar?
  • ¿Qué queréis hacer?
  • ¿Cómo esperáis que funcione? Detalla la funcionalidad

  1. Cronograma.
Elabora un plan de entregas, en el que al menos haya tres hitos que la profesora deba supervisar.  Hay que especificar, que vais a entregar, en qué formato y cómo se valida (lista de cotejo)

Ten en cuenta que tendréis que cumplir el cronograma que hagáis.

  1. Evaluación del proyecto.
  • Elaborad una rúbrica con cuatro descriptores de desempeño para repartir diez puntos y que sirva para valorar vuestro proyecto.

  1. Memoria.
    • Esta hoja
    • Requerimientos técnicos
    • Descripción funcional
    • Grabación en vídeo de una demo.
    • Evaluación personal del proyecto
    • Posibles mejoras y continuidad de la propuesta


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.

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.

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.
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.
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”.

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.
–  1 Piezo
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.
10–  Por ultimo añadimos el piezo y lo conectamos como en el proyecto 6 y con el mismo código.
Terminado de montar el circuito, deberíamos de tener algo parecido al mostrado en la siguiente video.


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;
int sensorValue;
int sensorLow = 1023;
int sensorHigh = 0;
const int ledPin = 13;

Este trozo del código es para el piezo
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);
 pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH);
while (millis() < 5000) {
  sensorValue = analogRead(A0);
          if (sensorValue > sensorHigh) {
                    sensorHigh = sensorValue;
          }
          if (sensorValue < sensorLow) {
                    sensorLow = sensorValue;
          }
 }
   digitalWrite(ledPin, LOW);
  
}
Este trozo de código es del piezo
}//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;
  sensorValue = analogRead(A0);
  int pitch = map(sensorValue, sensorLow, sensorHigh, 50, 4000);
  tone(8,pitch,20);
  delay(10);  
El ultimo trozo de arriba del código corresponde al piezo


}//Fin de la función loop.

Puesta en marcha

Para empezar a utilizar el 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 y el piezo a sonar. 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 y el piezo sonará más o menos fuerte. Presionando de nuevo el pulsador de On/Off, el motor se detendrá y el piezo dejará de sonar. Si probamos de activar el pulsador de dirección, podremos comprobar si el motor es capaz de girar en ambos sentidos.
Para construir el zoótropo al 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  con las ranuras y una tira de imágenes que colocaremos en su interior. 

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 y como cambiar la intensidad del piezo. 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. 
Posibles mejoras y continuidad de la propuesta
Creo que las únicas mejoras que podría hacer sería introducir led de colores e imprimir un soporte para el zootropo

FreeCad: Fundan iPhone 7

Esta practica fue la unica que hice con FreeCad ya que me centré más en Arduino.
Estaba muy indeciso sobre que diseñar e imprimir, al final me decanté por diseñar una funda para mi iPhone 7.
Lo primero que hice fue buscar las medidas en la pagina oficial de Apple, a continuación cree automáticamente un ortoedro y lo empecé a vaciar y dejando los agujeros del cargador, altavoces, cámara y botones.
Elegí el color azul. Por un fallo en la calibración de la impresora 3D no he podido imprimir mi modelo.

Aquí esta mi modelo: https://drive.google.com/open?id=0BwcXVS1jYC_0VEJveXhrQno3Tlk

Arduino proyecto 13: Lámpara táctil

En este capítulo vamos a construir una lámpara que se enciende y se apaga en función de que toquemos con la mano una lámina de material conductor. Para realizar esto vamos a usar la librería CapacitiveSensor, creada por Paul Badger. Dicha librería nos proporcionará el código necesario para que podamos medir la capacidad eléctrica de nuestro cuerpo.
La capacidad eléctrica es la propiedad que tienen los cuerpos para mantener una carga eléctrica. La librería que vamos a utilizar en este proyecto, comprueba dos pins en nuestro Arduino (uno emisor y otro receptor), midiendo el tiempo que tardan ambos en alcanzar el mismo estado. Estos pins los conectaremos a un objeto metálico, como por ejemplo un trozo de papel de aluminio. Al tocar la lámina metálica, nuestro cuerpo absorberá parte de la carga eléctrica, provocando que ambos pines tarden más tiempo en tener el mismo estado
Para realizar este proyecto solo necesité un led, una resistencia de 220 ohmios, otra de 1 megohmios y un papel de aluminio.
La interfaz fue muy fácil de realizar ya que este proyecto no tiene apenas componentes.
El código era bastante sencillo, menos en esto nuevo : Lo primero que hay que hacer en el programa es importar la librería CapacitiveSensor y crear una instancia de la misma. Seguidamente, le decimos a dicha instancia que pines vamos a utilizar para enviar y recibir información. En nuestro caso, el pin 4 es el emisor y el número 2 es el receptor.


Código

#include <CapacitiveSensor.h>
CapacitiveSensor capSensor = CapacitiveSensor(4,2);
int threshold = 1000;
const int ledPin = 12;
void setup() {
 
    Serial.begin(9600);
    pinMode(ledPin, OUTPUT);
 
}//Fin de la funcion setup.
void loop() {
 
    long sensorValue = capSensor.capacitiveSensor(30);
    Serial.println(sensorValue);
    if(sensorValue > threshold) {
        digitalWrite(ledPin, HIGH);
    }
    else {
        digitalWrite(ledPin, LOW);
    }
    delay(10);
 
}//Fin de la funcion loop.

Arduino proyecto 12: cerrojo de puerta

Este proyecto trata de hacer tu propio cerrojo secreto para mantener visitas no deseadas lejos de tu espacio. El piezo que usé para reproducir sonidos con un theremin y en proyectos de teclado también se puede usar con un dispositivo de entrada. Cuando se le suministran 5V, el sensor puede detectar vibraciones que pueden ser leídas por las entradas analógicas del Arduino. Necesitarás enchufar una resistencia de mayor capacidad ( como 1 Mega-ohm), como referencia para la toma de tierra para que esto funcione bien.

¿Cerradura de vibración? ¿Cómo? ¿Qué es eso? Una cerradura de vibración es aquella que se abre al detectar una secuencia determinada de golpes. Dicha cerradura puede estar en una caja o en una puerta, por lo que al golpear dicha superficie, la cerradura detectará el impacto y solo se abrirá con la combinación correcta de golpes.

Para realizar este proyecto necesité un interruptor, 3 leds, una resistencia de 10 kiloohmios, otra de 220 ohmios, otro de 1 megohmios, un condensador de 100 uF, un piezo y un servomotor.
No fue difícil crear la interfaz, lo que si fue un poco raro ya que me hice un lío con los leds y el condensador.
El código fue muy largo y bastante difícil, ya que había que tener en cuenta el piezo y el servomotor, y el detector de golpe en la mesa.



Código

#include <Servo.h>

Servo myServo;
const int piezo = A0;
const int switchPin = 2;
const int yellowLed = 3;
const int greenLed = 4;
const int redLed = 5;
int knockVal;
int switchVal;
.
const int quietKnock = 10;
const int loudKnock = 100;
boolean locked = false;
int numberOfKnocks = 0;
void setup(){
 
    myServo.attach(9);
    pinMode(yellowLed, OUTPUT);
    pinMode(redLed, OUTPUT);
    pinMode(greenLed, OUTPUT);
    pinMode(switchPin, INPUT);
    Serial.begin(9600);
    digitalWrite(greenLed, HIGH);
    myServo.write(0);
    Serial.println("La caja esta desbloqueada!");
 
}//Fin de la función setup.
void loop(){
 
    if(locked == false){
        switchVal = digitalRead(switchPin);
        if(switchVal == HIGH){
            locked = true;
            digitalWrite(greenLed, LOW);
            digitalWrite(redLed, HIGH);
            myServo.write(90);
            Serial.println("La caja esta bloqueada!");
            delay(1000);
        }
    }
    if(locked == true){
        knockVal = analogRead(piezo);
        if(numberOfKnocks < 3 && knockVal > 0){
            if(checkForKnock(knockVal) == true){
                numberOfKnocks++;
            }
            Serial.print("Golpes restantes: ");
            Serial.println(3-numberOfKnocks);
        }
        if(numberOfKnocks >= 3){
            locked = false;
            myServo.write(0);
            delay(20);
            digitalWrite(greenLed, HIGH);
            digitalWrite(redLed, LOW);
            Serial.println("La caja esta desbloqueada");
        }
    }
 
}//Fin de la función loop.
boolean checkForKnock(int value){
    if(value > quietKnock && value < loudKnock){
        digitalWrite(yellowLed, HIGH);
        delay(50);
        digitalWrite(yellowLed, LOW);
        Serial.print("Valor del golpe correcto: ");
        Serial.println(value);
        return true;
    }
    else {
        Serial.print("Valor del golpe incorrecto: ");
        Serial.println(value);
        return false;
    }
 
}//Fin de la funcion checkForKnock.