miércoles, 26 de agosto de 2015

SIMULACION DE PARKING

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: