El proyecto consiste en la programación de un prototipo de sistema de frenado para vehículos utilizando Arduino UNO y otros componentes descritos más adelante.
El prototipo se basa en un servo que adoptará diferentes posiciones definidas en el código dependiendo de la distancia a la que esté el obstáculo, este dato lo proporcionará un sensor de ultrasonidos. Además se han incorporado estímulos lumínicos (LEDs de colores que brillarán en función de la distancia siguiendo el código de color estandarizado) y auditivos (mediante un zumbador que sonará con mayor frecuencia cuando la distancia al obstáculo sea crítica).
CONTEXTO
4º de ESO tanto en la rama de académicas como de aplicadas.
Asignatura: Innovación Docente en la Especialidad de Tecnología
Máster Universitario en Profesor de Educación Secundaria Obligatoria, Bachillerato, Formación Profesional y Enseñanza de Idiomas (Universidad de Salamanca)
Consiste en diseñar y montar un puente levadizo, controlado con Arduino. El proyecto consta de modo automático y modo manual. En el primer caso el puente se elevará automáticamente cuando detecte al barco, y descenderá cuando haya pasado. En el segundo caso el puente será manejado a través de dos interruptores.
Este proyecto es adecuado para realizarlo con alumnos de 3º o 4º de la E.S.O. dentro de la asignatura de Tecnología.
REALIZADO POR:
Daniel Gil Fuentes.
Raquel Sastre Velasco.
Dentro de la asignatura: Innovación docente en la especialidad de tecnología. Incluida en el Máster
de Profesor de Educación Secundaria Obligatoria y Bachillerato,
Formación Profesional y Enseñanzas de Idiomas. Curso 2016-17.
¿QUÉ NECESITAMOS?
Materiales electrónicos:
Materiales para realizar la maqueta:
MONTANDO EL CIRCUITO EN LA PROTOBOARD:
Empezaremos montando todos los componentes electrónicos en la protoboard según se muestra en la imagen siguiente realizada con fritzing.
Puente levadizo.
Conecta el servo motor, el cable rojo a 5V, el cable negro a tierra y el cable amarillo al pin 9. Debes conectar también el condensador en paralelo al servo motor.
Modo automático.
Conecta los fotosensores a 5V y a los pin A1 y A2 respectivamente. Y conecta según la imagen las resistencias de 10 kiloohmnios.
Semáforo.
Conecta
el positivo de los led a los pin 2,3 y 4, (teniendo en cuenta que el
positivo es el conector más largo), y en el negativo conecta la
resistencia de 220 ohmnios.
Modo manual.
Por último conecta los interruptores a los pin 10 y 11 respectivamente. Y conecta según la imagen las resistencias de 10 kiloohmnios.
ESQUEMA ELÉCTRICO:
CÓDIGO:
El siguiente código debes subirlo a la placa de Arduino a través de la IDE de Arduino:
int switchstate1 = 0; int switchstate2 = 0;
//sensores de luz. // variable to hold sensor value int sensorValue1; int sensorValue2; // variable to calibrate low value int sensorLow = 1023; // variable to calibrate high value int sensorHigh = 0; // LED pin
//servomotor // include the servo library #include <Servo.h> //servomotor Servo myServo; // create a servo object
void setup() { // put your setup code here, to run once:
// declare the LED pins as outputs pinMode(2, OUTPUT); //Verde pinMode(3, OUTPUT); //Rojo pinMode(4, OUTPUT); //Amarillo
pinMode(10, INPUT); pinMode(11, INPUT);
//Sensores luz // Make the LED pin an output and turn it on pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH);
myServo.attach(9); // attaches the servo on pin 9 to the servo object Serial.begin(9600); // open a serial connection to your computer
// calibrate for the first five seconds after program runs while (millis() < 5000) { // record the maximum sensor value sensorValue1 = analogRead(A1); sensorValue2 = analogRead(A2); if (sensorValue1 > sensorHigh) { sensorHigh = sensorValue1; } if (sensorValue2 > sensorHigh) { sensorHigh = sensorValue2; } // record the minimum sensor value if (sensorValue1 < sensorLow) { sensorLow = sensorValue1; } if (sensorValue2 < sensorLow) { sensorLow = sensorValue2; } Serial.print("sensorHigh: "); Serial.println(sensorHigh); Serial.print("sensorLow: "); Serial.println(sensorLow); } // turn the LED off, signaling the end of the calibration period digitalWrite(LED_BUILTIN, LOW); delay(1000); }
void loop() { // put your main code here, to run repeatedly:
{ //Sensores. //read the input from A0 and store it in a variable sensorValue1 = analogRead(A1); //read the input from A0 and store it in a variable sensorValue2 = analogRead(A2); } switchstate1 = digitalRead(11); switchstate2 = digitalRead(10);
if (switchstate1==LOW) {
if (sensorValue1<700) { // set the servo position digitalWrite(4, HIGH); // turn the yellow LED on pin 4 on digitalWrite(2, LOW); // turn the green LED on pin 2 off delay(3000); myServo.write(60); digitalWrite(3, HIGH); // turn the red LED on pin 3 on } if (sensorValue2<700) { // set the servo position delay(3000); myServo.write(0); digitalWrite(4, HIGH); // turn the yellow LED on pin 4 on digitalWrite(3, LOW); // turn the red LED on pin 3 off
delay(3000); digitalWrite(4, LOW); // turn the yellow LED on pin 4 off digitalWrite(2, HIGH); // turn the green LED on pin 2 on delay(15); } } else { if (switchstate2==HIGH){ myServo.write(60); digitalWrite(3, HIGH); // turn the red LED on pin 3 on digitalWrite(2, LOW); // turn the green LED on pin 2 off delay(15); } else { myServo.write(0); digitalWrite(4, HIGH); // turn the yellow LED on pin 4 on digitalWrite(3, LOW); // turn the red LED on pin 3 off delay(3000); digitalWrite(4, LOW); // turn the yellow LED on pin 4 off digitalWrite(2, HIGH); // turn the green LED on pin 2 on delay(15); } } }
FUNCIONAMIENTO:
El siguiente vídeo muestra como funciona el puente en modo automático y en modo manual.
Modo automático:
Cuando el arduino detecta al barco a través del foto sensor 1, envía una señal al semáforo y este cambia primero a ámbar y después a rojo. A continuación se eleva el puente. Porteriormente el barco atraviesa el canal y sólo cuando el barco llega al foto sensor 2, se envía la orden al semáforo y este cambia primero a ámbar y después a verde. A continuación el puente desciende para que puedan circular los vehículos.
Modo manual:
En este modo el puente se eleva mediante dos interruptores; al pulsar el primero se acciona el modo manual, y el segundo levanta y baja el puente.
El presente proyecto tiene por objeto la realización de una
vivienda inteligente utilizando Arduino. El proyecto consiste en una vivienda
con sensor de luz y de temperatura además de un display que va indicando la
situación de la vivienda cada cierto tiempo.
Este proyecto está pensado para realizarlo en clase en
grupos de alumnos de 3º de E.S.O.
FUNCIONAMIENTO
La vivienda que creamos detecta, mediante sensores la luz y
la temperatura a la que se encuentra, a través de la placa colocada en el
tejado. Si tapamos el foto sensor (como si fuera de noche) las luces de la
vivienda se encienden. La luz de la calefacción aparece encendida, pero si
apretamos el sensor de temperatura para aumentar la misma (como si hiciera
calor en el exterior) esta se apagaría.
El display nos marca en todo momento la temperatura a la que
se encuentra, alternando con la información acerca de las luces (si están
apagadas o encendidas).
MARCO LEGISLATIVO
Según el Real Decreto 52/2007, de 17 de mayo, por el que se
estable el currículo de Educación Secundaria Obligatoria en la Comunidad de
Castilla y León, con este proyecto se cumplen los siguientes objetivos,
contenidos y criterios de evaluación:
Objetivos:
1. Valorar y utilizar el proyecto técnico como instrumento
de resolución ordenada de necesidades.
2. Elaborar un plan de trabajo y realizar las operaciones
técnicas previstas con criterios de seguridad y valorando las condiciones del
entorno.
5. Emplear el ordenador como herramienta de trabajo con el
objeto de comunicar, localizar y manejar información de diversas fuentes. Conocer
y aplicar la terminología y procedimientos básicos de los programas de edición
de texto y presentaciones.
13. Utilizar adecuadamente las magnitudes básicas
eléctricas.
14. Valorar los efectos de la energía eléctrica y su
capacidad de conversión en otras manifestaciones energéticas.
15. Identificar y utilizar correctamente los elementos
fundamentales de un circuito eléctrico de corriente continua y comprender su
función dentro de él.
20. Valorar de forma critica el impacto del uso de la
energía eléctrica sobre el medio ambiente.
Contenidos:
Bloque 5. Electricidad y electrónica.
–Circuito
eléctrico de corriente continua: magnitudes eléctricas básicas. Simbología. Ley
de Ohm. Circuito en serie, paralelo, mixto.
– Corriente
continua y corriente alterna.
– Montajes
eléctricos sencillos: circuitos mixtos. Inversor del sentido de giro.
– Maquinas
eléctricas básicas: dinamos, motores y alternadores. Generación y
transformación de la corriente eléctrica.
– Introducción
a la electrónica básica. Componentes pasivos: condensadores y resistencias.
Componentes activos: diodos y transistores. Descripción de componentes y
montajes básicos.
– Análisis de
circuitos eléctricos y electrónicos característicos mediante programas de
simulación.
Criterios de evaluación:
1. Realizar un proyecto técnico, analizando el contexto,
proponiendo soluciones alternativas y desarrollando la más adecuada.
3. Realizar las operaciones técnicas previstas en el
proyecto técnico incorporando criterios de economía, sostenibilidad y
seguridad, valorando las condiciones del entorno de trabajo.
4. Utilizar las tecnologías de la información y la
comunicación para elaborar, desarrollar, publicar y difundir un proyecto
técnico.
5. Instalar programas y realizar tareas básicas de
mantenimiento informático. Utilizar y compartir recursos en redes locales.
12. Diseñar, simular y realizar montajes de circuitos
eléctricos sencillos en corriente continua, empleando pilas, interruptores,
resistencias, bombillas, motores y electroimanes, como respuesta a un fin
predeterminado.
13. Describir las partes y el funcionamiento de las maquinas
eléctricas básicas.
14. Describir y utilizar el electromagnetismo en
aplicaciones tecnológicas sencillas.
15. Utilizar correctamente las magnitudes eléctricas
básicas, sus instrumentos de medida y su simbología.
17. Emplear Internet como medio activo de comunicación
intergrupal y publicación de información.
24. Identificar automatismos en sistemas técnicos cotidianos
y describir la función que realizan.
26. Identificar los elementos básicos de un sistema de
control.
ELEMENTOS UTILIZADOS
Arduino Uno
Arduino es una plataforma de electrónica abierta para la
creación de prototipos basada en software y hardware flexibles y fáciles de
usar. Se creó para artistas, diseñadores, aficionados y cualquiera interesado
en crear entornos u objetos interactivos.
Protoboard
Resistencias
LEDs
Foto resistor
Sensor temperatura
Display
FOTOGRAFÍAS DE LA CASA INTELIGENTE
CÓDIGO UTILIZADO
/*Proyecto Arduino Casa
Inteligente
Laura Lavandera Mayo
Elena Vega Rodríguez
Paula Salicio Geanini
Elementos que vamos a
utilizar:
1 TMP36 sensor de temperatura
3 LEDs amarillos
1 LED rojo
1 fotorresistor (sensor
de luz)
1 Display
4 resistencias de 220
ohmios
1 resistencia de 10000
ohmios
1 resistencia variable de
10000 ohmios
*/
#include<LiquidCrystal.h>
//incluimos libreria LiquidCrystal para poder usar el display
LiquidCrystal
lcd(12,11,9,8,7,6); /*iniciamos la libreria con los numeros de los pines que va
utilizar el display*/
const int
sensorTemperatura=A0; /*establecemos una constante entera, el sensor de
temperatura va a la entrada analogica A0*/
const int sensorLuz=A1;
/*establecemos una constante entera, el sensor de luz va a la entrada analogica
A1*/
const int pin1=2; //los
led van a la salida digitales 2,3,4 y 5
const int pin2=3;
const int pin3=4;
const int pinChimenea=5;
float valorTemperatura=0;
//establecemos varialbes de tipo float para hacer calculos
float voltaje=0;
float temperatura=0;
float valorSensorLuz=0;
float valorLuz=0;
float sensorLow=1023;
float sensorHigh=0;
void setup() //funcion
setup, establecemos las condiciones iniciales
{
Serial.begin(9600); //Establecemos conexion
con el puerto Serial
while(millis()<5000) //hacemos una calibración del sensor de la
luz para su correcto funcionamiento
valorSensorLuz=analogRead(sensorLuz); //la
variable valorSensorLuz recibe el valor leido por el sensor de la luz
if(valorSensorLuz>sensorHigh) //si el
valor obtenido es mayor que 0
{
sensorHigh=valorSensorLuz; //establecemos el
valor de la variable sensorHigh como el valor leido por el sensor
}
if(valorSensorLuz<sensorLow) //si el
valor leido es menor que 1023
{
sensorLow=valorSensorLuz; //establecemos
el valor de la variable sensorLow como el valor leido por el sensor
}
}
lcd.begin(16,2); //establecemos que el display va a tener 16
caracteres y 2 filas para escribir
lcd.clear();
//limpiamos el contenido que pueda tener el display
lcd.setCursor(0,0); //establecemos la primera linea donde
empezariamos a escribir
lcd.print("Proyecto "); //escribimos en la primera linea la cadena de
texto Proyecto
lcd.setCursor(0,1); //establecemos la segundo linea donde
empezariamos a escribir
lcd.print("Casa inteligente"); //escribimos en la segunda linea una cadena
de texto
delay(3000); /*Establecemos un retraso de 3
segundos para que se pueda leer bien el texto
del display*/
}
void loop() //funcion
loop, que corresponde con un bucle infinito
{
int
valorTemperatura=analogRead(sensorTemperatura); //la variable entera
valorTemperatura lee el valor del sensor de tempeatura
float voltaje=(valorTemperatura/1024.0)*5.0;
//hacemos una conversion para convertir el valor leido a grados celsius
float temperatura=(voltaje-0.5)*100;
lcd.clear();//limpiamos el contenido que
pueda tener el display
lcd.setCursor(0,0);//establecemos la primera
linea donde empezariamos a escribir
lcd.print("La
temperatura");//escribimos en la primera linea
lcd.setCursor(0,1);//establecemos la segunda
linea donde empezariamos a escribir
lcd.print("es ");//escribimos en la
segunda linea una cadena de texto
int tempeInt=(int)temperatura; //hacemos un
casting para convertir un float a entero, para facilitar la lectura de la
temperatura
lcd.print(tempeInt,DEC); //escribimos en la
la temperatura en base decimal
lcd.print(" C"); //escribimos una C
que representa los grados celsius
delay(5000); //establecemos un retraso de 5
segundos para que se pueda leer bien el display
Serial.print("Temperatura: ");
//Tambien escribimos en el puerto serial la tempeatura
Serial.print(temperatura);
Serial.println();
valorSensorLuz=analogRead(sensorLuz); //la
variable valorSensorLuz recoge el valor leido por el sensor de la luz
Serial.print("valor luz: ");
//Escribimos en el puerto serial el valor leido
Serial.print(valorSensorLuz);
Serial.println();
if(valorSensorLuz<800.0) //si el valor
obtenido por el sensor de la luz es menor a 800, es decir hay poca luz
{
for(int i=2;i<=4;i++)
{
digitalWrite(i,HIGH); //encedemos los
leds del techo
}
lcd.clear();//limpiamos el contenido que
pueda tener el display
lcd.setCursor(0,0);//establecemos la
primera linea donde empezariamos a escribir
lcd.print("Luces de
casa");//Escribimos en el display que se han encendido las luces de la
casa
lcd.setCursor(0,1);
lcd.print("encendidas ");
delay(1000); //Establecemos un retraso de 1
segundo para que podamos leer el display
}
else //si el valor de la luz es mayor o igual
a 800
{
for(int i=2;i<=4;i++)
{
digitalWrite(i,LOW); //los leds del
techo permaneceran apagados
}
lcd.clear();//limpiamos el contenido que
pueda tener el display
lcd.setCursor(0,0);//establecemos la
primera linea donde empezariamos a escribir
lcd.print("Luces de
casa");//Escribimos en el display que se han apagado las luces de la casa
lcd.setCursor(0,1);
lcd.print("apagadas ");
delay(1000); //Establecemos un retraso de 1
segundo para que podamos leer el display
}
if(temperatura<=24.0) //Si la temperatura
es menor a 24
{
digitalWrite(5, HIGH); //encedemos el led
de la chimenea
Serial.println("Temperatura menor a
24"); //imprimimos por el puerto serial que la temperatura es menor a 24
delay(1000);
lcd.clear(); //limpiamos el contenido que
pueda tener el display
lcd.setCursor(0,0);//establecemos la
primera linea donde empezariamos a escribir
lcd.print("La
temperatura");//Escribimos en el display la temperatura que hay ahora
lcd.setCursor(0,1);
lcd.print("ahora es ");
int tempeInt=(int)temperatura; //hacemos
un casting para convertir un float a entero, para facilitar la lectura de la
temperatura
lcd.print(tempeInt,DEC); //escribimos en
la la temperatura en base decimal
//lcd.print(temperatura,DEC);
lcd.print(" C"); //escribimos
una C que representa los grados celsius
delay(5000); //retraso de 5 segundos para
leer bien el display
}
else //si la temperatura es mayor a 24ºC
{
digitalWrite(5, LOW); //apagamos el
led de la chimenea y mostramos la temperatura actual