lunes, 24 de febrero de 2014

PROYECTO PEAJE CON ARDUINO

PRESENTACIÓN.

El trabajo consiste en diseñar un peaje programado con Arduino, para poder desarrollarlo con alumnos de 3º de E.S.O. para la asignatura de Tecnología.
Se ha realizado la maqueta de un peaje a partir de los siguientes componentes de arduino:

- Placa Arduino:
- Breadboard:


 

- Servomotor:

- Dos fotoreceptores:




- Dos resistencias:




- Condensador:
- Cables para realizar las conexiones.



            Con este proyecto somos capaces de desarollar los objetivos, contenidos y criterios de evaluación de Educación Secundaria Obligatoria  descritos en el DECRETO 52/2007, 17 de mayo, (BOCYL 23 mayo 2007). Enmarcados para 3º de la E.S.O. Bloque nº 5 "Electricidad y electrónica" de dicho decreto.


VIDEOS  Y FOTOGRAFÍAS DEL PROYECTO.

A continuación os dejamos unos videos explicativos del proyecto acabado y en funcionamiento.

VIDEO - Funcionamiento del peaje - Arduino

En este vídeo se muestra el funcionamiento del proyecto realizado con arduino de un peaje activando un servomotor con sensores fotosensibles.



VIDEO - Componentes y elementos del proyecto - Arduino

En este vídeo se muestran y explican los componentes y conexiones del proyecto realizado con arduino de un peaje activando un servomotor con sensores fotosensibles.



FOTOGRAFÍAS  DEL MONTAJE.


Esta foto es de Arduino antes de instalarlo en la maqueta de nuestro proyecto con todos los elementos que hemos utilizado: placa Arduino, placa breadboard, resistencias, sensores fotoeléctricos, condensador, servomotor, condensador y cables de conexión.


En esta foto podemos ver la placa breadboard con los elementos necesarios para realizar el proyecto y la placa Arduino.


Una vez que hemos visto lo relacionado con Arduino las siguientes fotos se centran en la maqueta
del proyecto y de la funcionalidad.


El coche entraría por la carretera y al pasar por encima del primer sensor la barrera se elevaría.


La barrera se levanta...


...y no se cerrará hasta que el coche pase por encima del segundo sensor.






CÓDIGO PARA ARDUINO.

Este es el código comentado para el funcionamiento de la barrera del peaje y que podréis utilizar en vuestro Arduino (el código fuente está a continuación del comentado):



/*
Antonio Román Gallego
Alvaro Ferrero Alvarez
Daniel Fernandez
*/


//Libreria del servo y variables del servo
#include <Servo.h>


Incluimos la librería servo.h ya que vamos a trabajar con el servo motor.

Servo myServo; // objeto servo
int angle;
//Varibles para los sensores de luz
int sensorValue;
int sensorLow = 1023;
int sensorHigh = 0;
int umbral0;
int umbral1;
int sensorValue2;
int sensorLow2 = 1023;
int sensorHigh2 = 0;
int potVal2;
int potVal;





Variable definidas: angle es el valor en grados para que se mueva el servo.  SensorValue, sensorLow y sensorHigh son para la calibración de los sensores por eso están por duplicado, low tiene un valor muy alto y high un valor muy bajo para para la efectividad de la calibración. Los potVal son para compararlos con umbral (definida su función más abajo) y en función de su comparación hacer actuar al servo de una u otra manera.

void setup() {



La función setup() se establece cuando se inicia un programa -sketch. Se emplea para iniciar variables, establecer el estado de los pins, etc. Esta función se ejecutará una única vez después de que se conecte la placa Arduino a la fuente de alimentación, o cuando se pulse el botón de reinicio de la placa.

myServo.attach(9);
Serial.begin(9600); 


Sirve para inicializar el modo monitor y así poder ver los valores que recogemos del exterior con los sensores.


// monitor
// calibracion primer sensor
 

while (millis() < 5000) {
sensorValue = analogRead(A0);
if (sensorValue > sensorHigh) {
sensorHigh = sensorValue;
}
if (sensorValue < sensorLow) {
sensorLow = sensorValue;
}
}




Estas 9 líneas de código las utilizamos para la calibración del primer sensor de luz que se llevara a cabo durante los 5 primeros segundos (5000 milisegundos) desde que arranca el programa. Leerá de A0 (entrada analógica) los datos procedentes del exterior y asignara el valor más alto de luz a sensorHigh y el valor más bajo a sensorLow.

Para la calibración del segundo sensor de luz el código será el mismo pero con variables distintas (sensorValue2, sensorHigh2 y sensorLow2) y en vez de 5 segundos 10, ya que los primeros cinco irán dedicados al primer sensor y los siguientes 5 irán al segundo.

Serial.println(sensorHigh);
Serial.println(sensorLow);
// calibracion del segundo sensor
while (millis() < 10000) {
// valor maximo
sensorValue2 = analogRead(A1);
if (sensorValue2 > sensorHigh2) {
sensorHigh2 = sensorValue2;
}
// valor minimo
if (sensorValue2 < sensorLow2) {
sensorLow2 = sensorValue2;
}
}
Serial.println(sensorHigh2);
Serial.println(sensorLow2);
umbral0 = sensorLow + ((sensorHigh - sensorLow) / 2) - 10;
umbral1 = sensorLow2 + ((sensorHigh2 - sensorLow2) / 2) - 10;




Asignamos a la variable umbral0 y a umbral2 el valor resultante de la operación de arriba que será un valor ligeramente menor a la mitad del valor más alto con el fin de que si el valor de luz que detecta del exterior es menor que este valor actuara el servomotor.

Serial.println(umbral0);
Serial.println(umbral1);
delay(10000);
}
void loop() {




La función loop(), se ejecuta consecutivamente, permitiéndole al programa variar y responder. Se usa para controlar de forma activa la placa Arduino.

//lectura in del exterior (luz)
potVal = analogRead(A0);
potVal2 = analogRead(A1);




Asignamos a las variables potVal y potVal2  lo datos recogidos por los sensores con las entradas analógicas de A0 y A1.

if(potVal < umbral0){
Serial.print("potVal: ");
Serial.print(potVal);
Serial.println(umbral0);
angle = 90;
Serial.print(", angle: ");
Serial.println(angle);
//posicion servo
myServo.write(angle);




Si potVal es menor que umbral0 le asignamos el valor 90 a la variable angle y por tanto más tarde mandamos al servomotor que se mueva de 0 a 90 grados. Hacemos lo mismo con lo que recoja el segundo sensor  pero a angle le asignamos el valor 0 para que el servo se mueva de 90 a 0 grados.

delay(300);
}
if(potVal2 < umbral1){
Serial.print("potVal2: ");
Serial.print(potVal2);
Serial.println(umbral1);
angle = 0;
Serial.print(", angle2: ");
Serial.println(angle);
// posicion servo
myServo.write(angle);
delay(300);
}
}





Código sin comentarios para incluir directamente en Arduino:

/*
Antonio Román Gallego
Alvaro Ferrero Alvarez
Daniel Fernandez
*/


//Libreria del servo y variables del servo
#include <Servo.h>


Servo myServo; // objeto servo
int angle;
//Varibles para los sensores de luz
int sensorValue;
int sensorLow = 1023;
int sensorHigh = 0;
int umbral0;
int umbral1;
int sensorValue2;
int sensorLow2 = 1023;
int sensorHigh2 = 0;
int potVal2;
int potVal;
void setup() {
myServo.attach(9);
Serial.begin(9600); // monitor
// calibracion primer sensor
while (millis() < 5000) {
sensorValue = analogRead(A0);
if (sensorValue > sensorHigh) {
sensorHigh = sensorValue;
}
if (sensorValue < sensorLow) {
sensorLow = sensorValue;
}
}
Serial.println(sensorHigh);
Serial.println(sensorLow);
// calibracion del segundo sensor
while (millis() < 10000) {
// valor maximo
sensorValue2 = analogRead(A1);
if (sensorValue2 > sensorHigh2) {
sensorHigh2 = sensorValue2;
}
// valor minimo
if (sensorValue2 < sensorLow2) {
sensorLow2 = sensorValue2;
}
}
Serial.println(sensorHigh2);
Serial.println(sensorLow2);
umbral0 = sensorLow + ((sensorHigh - sensorLow) / 2) - 10;
umbral1 = sensorLow2 + ((sensorHigh2 - sensorLow2) / 2) - 10;
Serial.println(umbral0);
Serial.println(umbral1);
delay(10000);
}
void loop() {
//lectura in del exterior (luz)
potVal = analogRead(A0);
potVal2 = analogRead(A1);
if(potVal < umbral0){
Serial.print("potVal: ");
Serial.print(potVal);
Serial.println(umbral0);
angle = 90;
Serial.print(", angle: ");
Serial.println(angle);
//posicion servo
myServo.write(angle);
delay(300);
}
if(potVal2 < umbral1){
Serial.print("potVal2: ");
Serial.print(potVal2);
Serial.println(umbral1);
angle = 0;
Serial.print(", angle2: ");
Serial.println(angle);
// posicion servo
myServo.write(angle);
delay(300);
}
}



ESQUEMAS FRITZING.

Estos son los esquemas del proyecto realizado, creemos que esto os será útil a la hora de realizar el proyecto.












Esperamos que os haya gustado nuestra propuesta y que os animéis a realizarla.


Realizado por Antonio Román Gallego, Álvaro Ferrero Álvarez y Daniel Fernández García para la asignatura de "Innovación en la especialidad de tecnología" del Master de Educación Secundaria. Universidad de Salamanca.

No hay comentarios:

Publicar un comentario