Programación de Arduino para principiantes: el controlador de semáforo

La semana pasada, aprendimos sobre la estructura básica de un programa Arduino y echamos un vistazo más de cerca al ejemplo 'blink'. Con suerte aprovechó la oportunidad para experimentar con el código, ajustando los tiempos.

La semana pasada, aprendimos sobre la estructura básica de un programa Arduino y echamos un vistazo más de cerca al ejemplo 'blink'.  Con suerte aprovechó la oportunidad para experimentar con el código, ajustando los tiempos.
Anuncio

El semáforo es un pequeño proyecto divertido, que se puede completar en menos de una hora. Aprende a construir tu propio, usando un Arduino, y cómo modificar el circuito para un modelo avanzado.

No se preocupe si nunca antes ha usado un Arduino, tenemos una guía para principiantes. Comenzando con Arduino: una guía para principiantes Comenzando con Arduino: una guía para principiantes Arduino es una plataforma de creación de prototipos de electrónica de código abierto basada en flexibilidad, facilidad usar hardware y software. Está dirigido a artistas, diseñadores, aficionados y cualquier persona interesada en crear objetos o entornos interactivos. Lee mas .

Nota : Esta es la última de una serie de tutoriales para principiantes para Arduino, la plataforma de creación de prototipos de electrónica de código abierto. Aquí hay una lista de los artículos anteriores de la serie:

  • ¿Qué es Arduino y qué se puede hacer con él? ¿Qué es Arduino y qué se puede hacer con él? ¿Qué es Arduino y qué puedes hacer con eso? El Arduino es un pequeño dispositivo electrónico notable, pero si nunca has usado uno, ¿qué son exactamente y qué puedes hacer con uno? Lee mas
  • ¿Qué es un Arduino Starter Kit y qué contiene? ¿Qué se incluye en un kit de inicio de Arduino? [MakeUseOf Explains] ¿Qué se incluye en un Arduino Starter Kit? [MakeUseOf Explains] Anteriormente introduje el hardware de código abierto Arduino aquí en MakeUseOf, pero vas a necesitar algo más que el Arduino real para construir algo y empezar. Arduino "kits de inicio" son ... Leer más
  • Más componentes interesantes para comprar con su kit de inicio 8 Más componentes interesantes para sus proyectos Arduino 8 Más componentes interesantes para sus proyectos Arduino Por lo tanto, está pensando en adquirir un kit inicial Arduino, pero se pregunta si se van a usar algunos LED y resistencias básicas lo suficiente para mantenerte ocupado durante el fin de semana? Probablemente no. Aquí hay otros 8 ... Leer más
  • Comenzar con su Arduino Starter Kit - Instalar controladores y configurar la placa y el puerto Comenzar con su Arduino Starter Kit - Instalar controladores y configurar la placa y el puerto Comenzar con su Arduino Starter Kit - Instalar controladores y configurar la placa y Puerto Entonces, usted se compró un kit de inicio Arduino, y posiblemente algunos otros componentes geniales al azar, ¿y ahora qué? ¿Cómo empiezas a programar esta cosa de Arduino? ¿Cómo lo configura ... Leer más
  • Una mirada más cercana a la estructura de una aplicación Arduino y el programa de parpadeo de ejemplo

Que necesitas

Además del Arduino básico, necesitarás:

  • LED rojos, amarillos y verdes.
  • Una placa de prueba.
  • 6 x 220? resistencias.
  • Conexión de cables.
  • 1 x interruptor de botón.
  • 1 x 10k? resistor

Casi cualquier Arduino será adecuado, siempre que tenga suficientes pines. Asegúrese de leer nuestra guía de compras Guía de compra de Arduino: ¿Qué placa debe obtener? Guía de compra de Arduino: ¿Qué placa debería obtener? Hay tantos tipos diferentes de tableros Arduino que hay, se te perdonaría por estar confundido. ¿Qué debería comprar para su proyecto? ¡Permítanos ayudarlo con esta guía de compra de Arduino! Lea más si no está seguro de qué modelo necesita. Probablemente tenga estas partes en su kit de inicio ¿Qué hay en su Arduino Starter Kit? [Arduino Beginners] ¿Qué hay en tu Arduino Starter Kit? [Arduino Beginners] Frente a una caja llena de componentes electrónicos, es fácil sentirse abrumado. Aquí hay una guía para encontrar exactamente lo que encontrará en su kit. Lea más ya.

Un ejemplo simple

Comencemos pequeño Un semáforo básico y único es un buen lugar para comenzar. Aquí está el circuito:

arduino_traffic_light

Conecte el ánodo (pata larga) de cada LED a los pines digitales ocho, nueve y diez (a través de una resistencia de 220?). Conecte los cátodos (pata corta) al suelo de Arduino.

Usé Fritzing para dibujar estos diagramas. No solo es fácil de usar, ¡es gratis!

El código

Comience definiendo variables para que podamos abordar las luces por nombre en lugar de por un número. Comience un nuevo proyecto Arduino, y comience con estas líneas:

int red = 10; int yellow = 9; int green = 8; 

A continuación, agreguemos la función de configuración, donde configuraremos los LED rojos, amarillos y verdes para que sean salidas. Como ha creado variables para representar los números de pin, ahora puede referirse a los pines por su nombre.

 void setup(){ pinMode(red, OUTPUT); pinMode(yellow, OUTPUT); pinMode(green, OUTPUT); } 

Eso fue fácil. Ahora, para la parte difícil: la lógica real de un semáforo. Crea una función separada para cambiar las luces (verás por qué más adelante).

Cuando comienza a programar, el código en sí mismo es muy rudimentario, es descubrir los detalles de la lógica minuciosa que presenta el mayor problema. La clave para ser un buen programador es poder mirar cualquier proceso y dividirlo en sus pasos fundamentales. Aquí está el resto del código:

 void loop(){ changeLights(); delay(15000); } void changeLights(){ // green off, yellow on for 3 seconds digitalWrite(green, LOW); digitalWrite(yellow, HIGH); delay(3000); // turn off yellow, then turn red on for 5 seconds digitalWrite(yellow, LOW); digitalWrite(red, HIGH); delay(5000); // red and yellow on for 2 seconds (red is already on though) digitalWrite(yellow, HIGH); delay(2000); // turn off red and yellow, then turn on green digitalWrite(yellow, LOW); digitalWrite(red, LOW); digitalWrite(green, HIGH); delay(3000); } 

¡Hecho! Ahora, cargue y ejecute (asegúrese de seleccionar la placa y el puerto correctos desde el menú Herramientas > Puerto y Herramientas > Tablero ). Debería tener un semáforo en funcionamiento que cambia cada 15 segundos, así (acelerado):

Un cruce de peatones

Ahora que sabes lo básico, mejorémoslo. Agregue un botón para que los peatones cambien la luz cuando lo deseen:

arduino_traffic_light_with_button

Observe cómo el semáforo es exactamente el mismo que en el ejemplo anterior. Conecte el botón al pin digital 12. ¿Notará que el interruptor tiene una alta impedancia de 10k? resistor conectado, y usted se estará preguntando por qué. Esto se llama resistencia pull-down. Es un concepto difícil de entender al principio, pero tengan paciencia conmigo.

Un interruptor deja que la corriente fluya, o no. Esto parece bastante simple, pero en un circuito lógico, la corriente debe fluir siempre en un estado alto o bajo (recuerde - 1 o 0, alto o bajo). Puede suponer que un interruptor de botón que no se está presionando se definiría como estar en un estado bajo, pero de hecho se dice que es "flotante" porque no se está dibujando corriente en absoluto.

En este estado flotante, es posible que se produzca una lectura falsa ya que fluctúa con interferencia eléctrica. En otras palabras, un interruptor flotante no proporciona una lectura confiable de alto ni bajo nivel. Una resistencia de extracción mantiene una pequeña cantidad de corriente cuando el interruptor está cerrado, lo que garantiza una lectura de estado baja precisa. En otros circuitos lógicos, puede encontrar una resistencia pull-up en su lugar; esto funciona según el mismo principio, pero a la inversa, asegurándose de que la compuerta lógica particular se ponga por defecto en alto.

Ahora, en la parte de bucle del código, en lugar de cambiar las luces cada 15 segundos, vamos a leer el estado del interruptor de botón y cambiamos las luces cuando está activado.

El código

Comience añadiendo una nueva variable al comienzo del programa:

 int button = 12; // switch is on pin 12 

Ahora, en la función de configuración, agregue una nueva línea para declarar el interruptor como una entrada. También agregué una sola línea para iniciar el semáforo en el escenario verde. Sin esta configuración inicial, se apagarían, hasta la primera vez que se inició un changeLights () con una función.

 pinMode(button, INPUT); digitalWrite(green, HIGH); 

Cambie la función de bucle completa a la siguiente en su lugar:

 void loop() { if (digitalRead(button) == HIGH){ delay(15); // software debounce if (digitalRead(button) == HIGH) { // if the switch is HIGH, ie. pushed down - change the lights! changeLights(); delay(15000); // wait for 15 seconds } } } 

Deberias hacer eso. Es posible que se pregunte por qué el botón se verifica dos veces ( digitalRead (botón) ), separado por un pequeño retraso. Esto se llama antirrebote. Al igual que el resistor desplegable era necesario para el botón, esta simple comprobación detiene el código detectando interferencias menores como la pulsación de un botón. No tiene que hacer esto (y probablemente funcionaría bien sin él), pero es una buena práctica.

Al esperar dentro de la instrucción if durante 15 segundos, los semáforos no pueden cambiar durante al menos esa duración. Una vez que hayan transcurrido 15 segundos, el ciclo se reinicia. Cada reinicio del ciclo, lee el estado del botón nuevamente, pero si no se presiona, la instrucción if nunca se activa, las luces nunca cambian y simplemente se reinicia.

Así es como se ve (acelerado):

Un cruce

Probemos con un modelo más avanzado. En lugar de un cruce de peatones, modifique su circuito para tener dos semáforos:

arduino_dual_traffic_light

Conecte el segundo semáforo a los pines digitales 11, 12 y 13.

El código

Primero, asigne los nuevos pines del semáforo a las variables y configúrelos como salidas, tal como en el primer ejemplo:

 // light one int red1 = 10; int yellow1 = 9; int green1 = 8; // light two int red2 = 13; int yellow2 = 12; int green2 = 11; void setup(){ // light one pinMode(red1, OUTPUT); pinMode(yellow1, OUTPUT); pinMode(green1, OUTPUT); // light two pinMode(red2, OUTPUT); pinMode(yellow2, OUTPUT); pinMode(green2, OUTPUT); } 

Ahora actualice su ciclo para usar el código del primer ejemplo (en lugar del cruce peatonal):

 void loop(){ changeLights(); delay(15000); } 

Una vez más, todo el trabajo se está llevando a cabo en la función changeLights () . En lugar de ir rojo > rojo y amarillo > verde, este código alternará los semáforos. Cuando uno está en verde, el otro estará en rojo. Aquí está el código:

 void changeLights(){ // turn both yellows on digitalWrite(green1, LOW); digitalWrite(yellow1, HIGH); digitalWrite(yellow2, HIGH); delay(5000); // turn both yellows off, and opposite green and red digitalWrite(yellow1, LOW); digitalWrite(red1, HIGH); digitalWrite(yellow2, LOW); digitalWrite(red2, LOW); digitalWrite(green2, HIGH); delay(5000); // both yellows on again digitalWrite(yellow1, HIGH); digitalWrite(yellow2, HIGH); digitalWrite(green2, LOW); delay(3000); // turn both yellows off, and opposite green and red digitalWrite(green1, HIGH); digitalWrite(yellow1, LOW); digitalWrite(red1, LOW); digitalWrite(yellow2, LOW); digitalWrite(red2, HIGH); delay(5000); } 

Esto es lo que parece (acelerado):

Eso es todo por esta vez, así que espero que hayas aprendido mucho y te hayas divertido escribiendo desde cero. Te ensuciaste las manos con algunos LED y resistencias, y también agregaste un interruptor con una resistencia de extracción, espero que entiendas por qué necesitamos uno. Juega con el código, ajústalo y, lo más importante, diviértete. Si realiza alguna adición o cambio, ¿por qué no nos informa en los comentarios?

Crédito de la imagen: androsvector a través de Shutterstock.com

In this article