sábado, 6 de febrero de 2016

Tutorial: Semáforo con ATMEGA328

Vamos a implementar un semáforo de peatones sin necesidad de usar toda la placa arduino, sino programando primero el microcontrolador Atmega328 y después colocarlo en una protoboard externa a la placa.

Material

1x Arduino UNO (Rev.3)
1x Pulsador N/O
1x Resistencia 1 kOhm
1x Cristal de cuarzo 16MHz
2x Condensador cerámico 22pF
7x Diodo N4148 o similar (IN4001)
1x LED rojo 5mm
1x LED amarillo 5mm
1x LED verde 5mm
2x LED rojo 3mm
2x LED verde 3mm
7x Resistencia 220 Ohm
1x Protoboard o Breadboard
nx Cables de conexión de prototipos (extremos macho-macho)
1x Fuente de alimentación de corriente continua a 5v (Opcional, se puede usar el propio Arduino)


Programa

Vamos a comenzar con el sketch que cargamos en el microcontrolador:

/*
 * EL CAJÓN DE ARDUINO
 * www.elcajondeardu.blogspot.com
 * Tutorial Semáforo con ATMEGA328 (sin Arduino)
 * Pablo Sierra Lorente
 */

//Definición de variables
const int ledVerde = 11;
const int ledAmbar = 12;
const int ledRojo = 6;
const int peaton1Rojo = 10;
const int peaton1Verde = 9;
const int peaton2Rojo = 8;
const int peaton2Verde = 7;
const double TIEMPO_ROJO = 25000;
const double TIEMPO_AMBAR = 5000;
const double TIEMPO_VERDE = 30000;
const double TIEMPO_ROJO_CAMBIO = 3000;
const double TIEMPO_PARPADEO = 500;

/*
 * Setup. se ejecutará una vez al iniciar o pulsar el
 * botón de reset.
 */
void setup() {

  //Inicialización de pines
  pinMode(ledVerde ,OUTPUT);
  pinMode(ledAmbar ,OUTPUT);
  pinMode(ledRojo ,OUTPUT);
  pinMode(peaton1Rojo ,OUTPUT);
  pinMode(peaton1Verde ,OUTPUT);
  pinMode(peaton2Rojo ,OUTPUT);
  pinMode(peaton2Verde ,OUTPUT);

  //Apunte de pines inicial
  digitalWrite(ledVerde ,LOW);
  digitalWrite(ledAmbar ,LOW);
  digitalWrite(ledRojo ,LOW);
  digitalWrite(peaton1Rojo ,LOW);
  digitalWrite(peaton1Verde ,LOW);
  digitalWrite(peaton2Rojo ,LOW);
  digitalWrite(peaton2Verde ,LOW);

}

/*
 * Bucle principal. Se irá ejecutando siempre que reciba
 * corriente y no se pulse el botón de reset. Es un bucle
 * de repetición infinito.
 */
void loop() {

  //Verde para los coches
  digitalWrite(ledVerde ,HIGH);
  digitalWrite(ledAmbar ,LOW);
  digitalWrite(ledRojo ,LOW);
  digitalWrite(peaton1Rojo ,HIGH);
  digitalWrite(peaton1Verde ,LOW);
  digitalWrite(peaton2Rojo ,HIGH);
  digitalWrite(peaton2Verde ,LOW);
  delay(TIEMPO_VERDE);

  //Ámbar fijo para los coches
  digitalWrite(ledVerde ,LOW);
  digitalWrite(ledAmbar ,HIGH);
  digitalWrite(ledRojo ,LOW);
  digitalWrite(peaton1Rojo ,HIGH);
  digitalWrite(peaton1Verde ,LOW);
  digitalWrite(peaton2Rojo ,HIGH);
  digitalWrite(peaton2Verde ,LOW);
  delay(TIEMPO_AMBAR);

  //Transición de rojo de coches a verde de peatones
  digitalWrite(ledVerde ,LOW);
  digitalWrite(ledAmbar ,LOW);
  digitalWrite(ledRojo ,HIGH);
  digitalWrite(peaton1Rojo ,HIGH);
  digitalWrite(peaton1Verde ,LOW);
  digitalWrite(peaton2Rojo ,HIGH);
  digitalWrite(peaton2Verde ,LOW);
  delay(TIEMPO_ROJO_CAMBIO);

  //Verde de peatones
  digitalWrite(ledVerde ,LOW);
  digitalWrite(ledAmbar ,LOW);
  digitalWrite(ledRojo ,HIGH);
  digitalWrite(peaton1Rojo ,LOW);
  digitalWrite(peaton1Verde ,HIGH);
  digitalWrite(peaton2Rojo ,LOW);
  digitalWrite(peaton2Verde ,HIGH);
  delay(TIEMPO_ROJO);

  /*
   * Señal de segundos finales. Simula el parpadeo del
   * semáforo de peatones cuando se va a acabar el tiempo.
   */
  parpadeoPeaton();
  parpadeoPeaton();
  parpadeoPeaton();
  parpadeoPeaton();

  //Transición de rojo de peatones a verde de coches
  digitalWrite(peaton1Rojo, HIGH);
  digitalWrite(peaton2Rojo, HIGH);
  delay(TIEMPO_ROJO_CAMBIO);
  
}

/*
 * Definimos este método que hará parpadear el 
 * semáforo verde de peatones cuando vaya a cambiar a
 * rojo.
 */
void parpadeoPeaton(){

  //Se ilumina
  digitalWrite(peaton1Verde ,HIGH);
  digitalWrite(peaton2Verde ,HIGH);
  delay(TIEMPO_PARPADEO);

  //Se apaga
  digitalWrite(peaton1Verde ,LOW);
  digitalWrite(peaton2Verde ,LOW);
  delay(TIEMPO_PARPADEO);
  
}


Como podemos observar, el funcionamiento es el de encendido y apagado de luces por temporizador que se va repitiendo continuamente. Es un ejemplo sencillo para explicar lo más importante del tutorial, que mostramos a continuación.

Tendremos en cuenta el siguiente diagrama de conexiones, para conectar correctamente los pines en nuestro circuito, por si en algún esquema futuro no nos coincidiese el numero del pin del esquema con el real. En este tutorial no nos aportará ningún dato, ya que procuré buscar esquemas que reflejaran exactamente el microcontrolador, pero por si a caso, ahí la dejo. Con él vamos a poder guiarnos también para proyectos futuros:



Vamos a quitar con cuidado el microcontrolador Atmega328 de la placa arduino y a colocarlo en una protoboard. Montaremos un circuito de reloj para que pueda funcionar con 5v a corriente continua como el que se muestra en la siguiente imagen:

¡¡¡Atención!!!

Solo utilizaremos este circuito de reloj cuando NO necesitemos comunicación serial, ya que de los protocolos de comunicación serial se encarga el microcontrolador Atmega16U integrado en la placa arduino. Ya hablaremos de él en próximas publicaciones. Continuemos a lo nuestro:

Una vez montado esa parte, conectaremos al microcontrolador y los diodos según los tengamos definidos en el sketch, en nuestro caso tendremos que seguir el siguiente esquema:


El circuito montado se nos quedará de la siguiente forma:



En la imagen vemos que utilizamos la alimentación a través de los pines gnd y 5v de arduino. Aquí también lo podréis sustituir por una fuente de alimentación de corriente continua de 5v, como un portapilas, por ejemplo.

Por último, dejamos un vídeo para que veáis el funcionamiento del microcontrolador con autonomía:



P.S.L.