Autor : Jose Manuel Parafita Lamas alumno del curso Montaje y Reparación de Sistemas Microinformaticos IFCT0309
Todos sabemos
lo que es el software libre, pero ¿qué hay del hardware libre? Para eso tenemos
la plataforma Arduino, demostrándonos que con una pequeña placa base y una
libertad total para añadir componentes (además de saber programar) se puede
conseguir cualquier función que quieras. Además, se pueden conseguir fácilmente
kits de iniciación a un precio no demasiado caro.
Es el
dispositivo perfecto para los curiosos que quieren cacharrear: en internet podemos
ver videos y tutoriales de cómo se ha
usado para emular sistemas Apple II, para dibujar con precisión de robot, crear
una impresora 3D y multitud más.
En este caso
se nos presentó el siguiente ejercicio, simular el contador de un parking con
la placa Arduino.
Este es un
ejercicio en el que veremos cómo obtener lecturas de varios interruptores y darles salida por el
display de 7 segmentos controlado por el integrado 74HC595. Este integrado se
define como un "registro de desplazamiento de 8 bits con entrada serie,
salida serie o paralelo con latch ("Registro guardado") de 3 estados".
Entonces puede usarse para controlar 8 salidas simultáneas usando unos pocos
pines del Arduino.
Para empezar
vamos utilizar una web gratuita donde podemos montar nuestro proyecto, el cual
será virtualizado y podremos jugar con él. En la “Fig. 1” podemos ver la
pantalla de inicio, en ella tendremos que crear una cuenta sino disponemos de
una para poder entrar, también podremos utilizar nuestra cuenta de Facebook, Google,
Yahoo o Microsoft.
Su dirección es la siguiente: https://123d.circuits.io
Fig. 1
Una vez
logeado, cliqueamos en el botón de open electronics lab hub “Fig. 2a”.
Fig.
2a
Y
luego pinchamos en new electronics lab “Fig. 2b”.
Fig.
2b
Una
vez creado nos aparecerá la siguiente pantalla “Fig. 3” en donde
seleccionaremos componentes, al pulsar se desplegara en la parte inferior una
pantalla con los componentes que hay “Fig4”.
Fig. 3
Fig. 4
Necesitaremos
una placa Arduino UNO, nueve resistencias de 5kΩ, tres resistencias de 220Ω,
una resistencia de 100Ω, un led rojo, un led amarillo, un led verde, un displayde 7 segmentos, nueve interruptores, dos placa board y el circuito integrado.
Empezamos con el montaje, seleccionamos la paca de
Arduino y las dos placas board “Fig. 5”
Fig. 5
Colocamos
el C.I. 74HC595 y el display led “Fig. 6”
Fig. 6
En
nuestro caso conectamos el C.I. al Arduino de la siguiente manera: el pin 13 de
nuestro Arduino al pin 11 del C.I., el pin 12 del Arduino al 12 del C.I. y
finalmente del pin 11 del Arduino al pin 14 de nuestro C.I. “Fig. 7a”. En la
figura “Fig. 7b” tenemos la configuración de los pines del C.I. 74HC595.
Fig.
7a Fig. 7b
El
siguiente paso será conectar el circuito integrado al display led, en nuestro
caso lo conectaremos de la siguiente forma: del pin 15 del C.I. al A del
display led, del pin 1 al B, del pin 2 al C, del pin 3 al D. del pin 4 al E, el
pin 5 al F el pin 6 al G y el pin 7 al DP, también colocamos la resistencia de
100Ω del pin GND al negativo de la placa board “Fig. 8a”. En la figura “Fig. 8b” encontramos a que segmentos
pertenece cada pin del display.
Fig.
8a Fig. 8b
Ahora
también conectamos los pines 10 y 16 del 74HC595 al positivo y los pines 8 y 13 al negativo “Fig. 9”.
Fig. 9
Por
ahora el resultado se puede ver en la siguiente figura “Fig. 10”.Donde también
conectamos la salida de 5 V y GND del Arduino a el positivo y negativo de
la board respetivamente.
Fig.
10
Ponemos
los interruptores, nosotros hemos optado por la siguiente configuración “Fig.
11”.
Fig.
11
Le
colocamos a cada interruptor una resistencia de 5KΩ para el efecto pull up en
el pin del interruptor fijándonos que quede en el pin de apagado “Fig. 12”.
Fig.
12
A
continuación en la figura “Fig.13” se ve como conectamos el terminal libre de
la resistencia al negativo y el pin central del interruptor o común al positivo.
Fig.
13
Ahora
unimos el pin de los interruptores donde está la resistencia al pin del
Arduino, hemos utilizado los pines del 1 al 9 “Fig. 14”.
Fig.
14
Ponemos
los leds rojo, amarillo y verde “Fig. 15”.
Fig.
15
Le
colocamos a cada led su correspondiente resistencia de 220Ω “Fig. 16”.
Fig.
16
Unimos
los cátodos de los leds al negativo, el terminal libre de la resistencia del
led verde al pin 10 del Arduino, el del amarillo al A0 y el rojo al A1 “Fig.
17”.
Fig.
17
Ahora
que tenemos todo listo nos ponemos con el código, cliqueamos en editor de
código “Fig. 18” e igual que en componentes no aparece en la parte inferior un
desplegable “Fig. 19” donde ya nos muestra el código para un led intermitente,
el cual borraremos y lo sustituiremos por el siguiente.
Fig.
18
Fig.
19
Código:
int latchPin = 12; // en estos tres primeros declaramos
los pines que utilizaremos con el integrado //
int clockPin = 13;
int dataPin = 11;
int verde =10; // en estos tres declaramos los pines
de cada led //
int amarillo = A0;
int rojo =A1;
const int c9 = 9; // ahora declaramos los interruptores//
const int c8 = 8;
const int c7 = 7;
const int c6 = 6;
const int c5 = 5;
const int c4 = 4;
const int c3 = 3;
const int c2 = 2;
const int c1 = 1;
int numero = 0; // variable contador //
int valorc9 = 0; // variables de valor //
int valorc8 = 0;
int valorc7 = 0;
int valorc6 = 0;
int valorc5 = 0;
int valorc4 = 0;
int valorc3 = 0;
int valorc2 = 0;
int valorc1 = 0;
int ec9 = 0; // variables de estado //
int ec8 = 0;
int ec7 = 0;
int ec6 = 0;
int ec5 = 0;
int ec4 = 0;
int ec3 = 0;
int ec2 = 0;
int ec1 = 0;
void setup() { // aquí establecemos
los pines como entradas y salidas//
pinMode(c9, INPUT);
pinMode(c8, INPUT);
pinMode(c7, INPUT);
pinMode(c6, INPUT);
pinMode(c5, INPUT);
pinMode(c4, INPUT);
pinMode(c3, INPUT);
pinMode(c2, INPUT);
pinMode(c1, INPUT);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(rojo, OUTPUT);
pinMode(amarillo, OUTPUT);
pinMode(verde, OUTPUT);
}
void loop()
{
valorc9 = digitalRead(c9); // le estamos
mandando leer el valor en los pines //
valorc8 = digitalRead(c8);
valorc7 = digitalRead(c7);
valorc6 = digitalRead(c6);
valorc5 = digitalRead(c5);
valorc4 = digitalRead(c4);
valorc3 = digitalRead(c3);
valorc2 = digitalRead(c2);
valorc1 = digitalRead(c1);
if (valorc9 != ec9 and numero < 9) { // le estamos diciendo
que si el valor es distinto al estado y el número es menor que 9 //
if (valorc9==1){ // y el interruptor
esta encendido //
numero ++ ;
// sume 1 al número //
}
}
if (valorc9 != ec9 and numero > 0) { // le estamos diciendo
que si el valor es distinto al estado y el número es mayor que 0 //
if (valorc9 == 0){ // y el interruptor está
apagado //
numero --;
// reste 1 al número //
}
}
if (valorc8 != ec8 and numero < 9) {
if (valorc8==1){
numero ++ ;
}
}
if (valorc8 != ec8 and numero > 0) {
if (valorc8== 0){
numero --;
}
}
if (valorc7 != ec7 and numero < 9) {
if (valorc7==1){
numero ++ ;
}
}
if (valorc7 != ec7 and numero > 0) {
if (valorc7 == 0){
numero --;
}
}
if (valorc6 != ec6 and numero < 9) {
if (valorc6==1){
numero ++ ;
}
}
if (valorc6 != ec6 and numero > 0) {
if (valorc6 == 0){
numero --;
}
}
if (valorc5 != ec5 and numero < 9) {
if (valorc5==1){
numero ++ ;
}
}
if (valorc5 != ec5 and numero > 0) {
if (valorc5 == 0){
numero --;
}
}
if (valorc4 != ec4 and numero < 9) {
if (valorc4==1){
numero ++ ;
}
}
if (valorc4 != ec4 and numero > 0) {
if (valorc4 == 0){
numero --;
}
}
if (valorc3 != ec3 and numero < 9) {
if (valorc3==1){
numero ++ ;
}
}
if (valorc3 != ec3 and numero > 0) {
if (valorc3 == 0){
numero --;
}
}
if (valorc2 != ec2 and numero < 9) {
if (valorc2==1){
numero ++ ;
}
}
if (valorc2 != ec2 and numero > 0) {
if (valorc2 == 0){
numero --;
}
}
if (valorc1 != ec1 and numero < 9) {
if (valorc1==1){
numero ++ ;
}
}
if (valorc1 != ec1 and numero > 0) {
if (valorc1 == 0){
numero --;
}
}
ec9 = valorc9;
ec8 = valorc8;
ec7 = valorc7;
ec6 = valorc6;
ec5 = valorc5;
ec4 = valorc4;
ec3 = valorc3;
ec2 = valorc2;
ec1 = valorc1;
// aquí le decimos como es la variable
numero //a
switch (numero) {
case 9:
cero();
break;
case 8:
uno();
break;
case 7:
dos();
break;
case 6:
tres();
break;
case 5:
cuatro();
break;
case 4:
cinco();
break;
case 3:
seis();
break;
case 2:
siete();
break;
case 1:
ocho();
break;
case 0:
nueve();
break;
}
delay(200);
}
// aqui declaramos
los casos y como se enciende el display y los led //
void cero(){
digitalWrite(latchPin, LOW); // decimal 63
binario 01111111
Display 0 //
shiftOut(dataPin, clockPin, MSBFIRST, 63);
digitalWrite(latchPin, HIGH);
}
void uno(){
digitalWrite(latchPin, LOW); // decimal 6
binario 00000110
Display 1 //
shiftOut(dataPin, clockPin, MSBFIRST, 6);
digitalWrite(latchPin, HIGH);
}
void dos(){
digitalWrite(latchPin, LOW); // decimal 91
binario 01011011
Display 2 //
shiftOut(dataPin, clockPin, MSBFIRST, 91);
digitalWrite(latchPin, HIGH);
digitalWrite(rojo, HIGH); // enciende led rojo //
digitalWrite(amarillo, LOW); // apaga led
amarillo //
}
void tres(){
digitalWrite(latchPin, LOW); // decimal 79
binario 01001111
Display 3 //
shiftOut(dataPin, clockPin, MSBFIRST, 79);
digitalWrite(latchPin, HIGH);
digitalWrite(rojo, LOW); // apaga led rojo //
digitalWrite(amarillo, HIGH);// enciende led
amarillo //
}
void cuatro(){
digitalWrite(latchPin, LOW); // decimal 102
binario 01100110
Display 4 //
shiftOut(dataPin, clockPin, MSBFIRST, 102);
digitalWrite(latchPin, HIGH);
}
void cinco(){
digitalWrite(latchPin, LOW); // decimal 109
binario 01101101
Display 5 //
shiftOut(dataPin, clockPin, MSBFIRST, 109);
digitalWrite(latchPin, HIGH);
}
void seis(){
digitalWrite(latchPin, LOW); // decimal 125
binario 01111101
Display 6 //
shiftOut(dataPin, clockPin, MSBFIRST, 125);
digitalWrite(latchPin, HIGH);
digitalWrite(verde, LOW); //apaga led verde //
digitalWrite(amarillo, HIGH);//enciende led
amarillo //
}
void siete(){
digitalWrite(latchPin, LOW); // decimal 7
binario 00000111
Display 7 //
shiftOut(dataPin, clockPin, MSBFIRST, 7);
digitalWrite(latchPin, HIGH);
digitalWrite(amarillo, LOW); // apaga led
amarillo//
digitalWrite(verde, HIGH); // enciende led verde //
}
void ocho(){
digitalWrite(latchPin, LOW); // decimal 127
binario 01111111
Display 8 //
shiftOut(dataPin, clockPin, MSBFIRST, 127);
digitalWrite(latchPin, HIGH);
}
void nueve(){
digitalWrite(latchPin, LOW); // decimal
binario 01101111
Display 9 //
shiftOut(dataPin, clockPin, MSBFIRST, 111);
digitalWrite(latchPin, HIGH);
digitalWrite(verde, HIGH); // enciende led verde //
}
|
En la
siguiente imagen se muestra las equivalencias binario decimal “Fig. 20”.
Fig.
20
El funcionamiento es el siguiente
cada interruptor sería una la plaza de un coche, al entrar un coche presionaría
una placa la cual activará el interruptor y al salir lo desactivara mandando la
información al display que reducirá y aumentara el número de plazas libres
respetivamente, aparte tenemos los leds que nos indica en colores la saturación
del parking. Verde muchas plazas libre, amarillo medio lleno y rojo lleno o
casi lleno.
En
el video de a continuación vemos perfectamente su funcionamiento, empezamos con
nueve plazas libres y al activar los
interruptores disminuye el número a la vez que también cambian los led hasta
llegar a cero sin importar el orden de ocupación de las plazas y al
desactivarse aumentan el número de plazas libres hasta llegar otra vez a nueve.
No hay comentarios:
Publicar un comentario