¿Alguna vez deseó tener su propio automóvil Knight Industries Two Thousand (KITT), ya sabe, de Knight Rider? ¡Haga su sueño un paso más cerca de la realidad construyendo un escáner LED! Aquí está el resultado final:
Que necesitas
No se necesitan muchas piezas para este proyecto, y es posible que ya tenga muchas de ellas:
- 1 x Arduino UNO o similar
- 1 x Tablero
- 8 x LED rojos
- 8 resistencias de 220 ohmios
- Potenciómetro de 1 x 10k ohm
- Macho a macho conectar cables
Si tiene un kit de inicio Arduino, ¿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. Los "kits de inicio" de Arduino son ... Leer más, es probable que tenga todas estas partes (¿qué puede hacer con un kit de inicio?) 5 proyectos únicos de Arduino para principiantes que puede hacer con solo un kit de inicio 5 proyectos únicos de Arduino para principiantes Puede hacer con solo un kit de inicio Leer más).
Casi cualquier Arduino funcionará, siempre que tenga ocho pines disponibles (¿Nunca usó un Arduino antes?) Comience aquí Cómo comenzar con Arduino: una guía para principiantes Cómo comenzar con Arduino: una guía para principiantes Arduino es una plataforma de prototipos de electrónica de código abierto basada en flexibilidad, hardware y software fáciles de usar. Está destinado a artistas, diseñadores, aficionados y cualquier persona interesada en crear objetos o entornos interactivos. Lea más). Puede usar una Programación de Arduino de Registro de Cambio - Reproducción con Registros de Cambio (también conocidos como Más LED) Programación de Arduino - Reproducción con Registros de Cambio (también conocidos como Más LED) Hoy intentaré enseñarle un poco acerca de los Registros de Cambio. Estas son una parte bastante importante de la programación de Arduino, básicamente porque amplían la cantidad de salidas que puede usar, a cambio de ... Lea más para controlar los LED, aunque esto no es necesario para este proyecto, ya que el Arduino tiene suficientes pines .
Plan de compilación
Este es un proyecto muy simple. Si bien puede parecer complejo a partir de la gran cantidad de cables, cada parte individual es muy simple. Cada diodo emisor de luz (LED) está conectado a su propio pin Arduino. Esto significa que cada LED se puede encender y apagar individualmente. Un potenciómetro está conectado al análogo de Arduino en pasadores, que se utilizará para ajustar la velocidad del escáner.
El circuito
Conecte el pasador externo izquierdo (mirando al frente, con los pasadores en la parte inferior) del potenciómetro a tierra. Conecte el pin externo opuesto a + 5v. Si no funciona correctamente, invierta estos pines. Conecte el pin central al análogo Arduino en 2.
Conecte el ánodo (pata larga) de cada LED a los pines digitales del uno al ocho. Conecte los cátodos (pata corta) al suelo de Arduino.
El código
Cree un nuevo boceto y guárdelo como "knightRider". Aquí está el código:
const int leds[] = {1, 2, 3, 4, 5, 6, 7, 8}; // Led pins const int totalLeds = 8; int time = 50; // Default speed void setup() { // Initialize all outputs for(int i = 0; i<= totalLeds; ++i) { pinMode(leds[i], OUTPUT); } } void loop() { for(int i = 0; i 0; --i) { // Scan right to left time = analogRead(2); digitalWrite(leds[i], HIGH); delay(time); digitalWrite(leds[i - 1], HIGH); delay(time); digitalWrite(leds[i], LOW); } }
const int leds[] = {1, 2, 3, 4, 5, 6, 7, 8}; // Led pins const int totalLeds = 8; int time = 50; // Default speed void setup() { // Initialize all outputs for(int i = 0; i<= totalLeds; ++i) { pinMode(leds[i], OUTPUT); } } void loop() { for(int i = 0; i 0; --i) { // Scan right to left time = analogRead(2); digitalWrite(leds[i], HIGH); delay(time); digitalWrite(leds[i - 1], HIGH); delay(time); digitalWrite(leds[i], LOW); } }
Vamos a descomponerlo. Cada pin LED se almacena en una matriz:
const int leds[] = {1, 2, 3, 4, 5, 6, 7, 8};
Una matriz es esencialmente una colección de elementos relacionados. Estos elementos se definen como constante ("const"), lo que significa que no se pueden cambiar más adelante. No tiene que usar una constante (el código funcionará perfectamente si elimina "const"), aunque se recomienda.
Se accede a los elementos de una matriz mediante corchetes ("[]") y un entero llamado índice. Los índices comienzan en cero, por lo que "leds [2]" devolvería el tercer elemento en la matriz - pin 3. Las matrices hacen que el código sea más rápido de escribir y más fácil de leer, ¡hacen que la computadora haga el trabajo duro!
Un bucle for se usa para configurar cada pin como salida:
for(int i = 0; i<= totalLeds; ++i) { pinMode(leds[i], OUTPUT); }
Este código está dentro de la función "setup ()", ya que solo necesita ejecutarse una vez al inicio del programa. Para los bucles son muy útiles. Le permiten ejecutar el mismo código una y otra vez, con un valor diferente cada vez. Son perfectos para trabajar con matrices. Se declara un entero "i", y solo el código dentro del bucle puede acceder a esta variable (esto se conoce como "alcance"). El valor de i comienza en cero, y para cada iteración del ciclo, i se incrementa en uno. Una vez que el valor de i es menor o igual que la variable "totalLeds", el ciclo "se rompe" (se detiene).
El valor de i se usa para acceder al conjunto de "leds". Este ciclo accede a cada elemento de la matriz y lo configura como salida. Puede escribir manualmente "pinMode (pin, OUTPUT)" ocho veces, pero ¿por qué escribir ocho líneas cuando puede escribir tres?
Mientras que algunos lenguajes de programación pueden decirle cuántos elementos hay en una matriz (generalmente con sintaxis como array.length), Arduino no lo hace tan simple (implica un poco más de matemáticas). Como la cantidad de elementos en la matriz ya se conoce, no es un problema.
Dentro del bucle principal (bucle vacío () ) hay dos bucles adicionales. El primero enciende los LED y luego los apaga desde 1 - 8. El segundo ciclo establece los LED en ON y luego en OFF desde 8 - 1. Observe cómo se activa el pin actual, y también se activa el pin actual más uno. Esto asegura que siempre haya dos LEDS encendidos al mismo tiempo, lo que hace que el escáner parezca más realista.
Al comienzo de cada bucle, el valor del bote se lee en la variable "tiempo":
time = analogRead(2);
Esto se hace dos veces, una vez dentro de cada ciclo. Esto necesita ser revisado y actualizado constantemente. Si esto estuviera fuera de los bucles, aún funcionaría, sin embargo, habría un pequeño retraso: solo se ejecutaría una vez que un bucle haya terminado de ejecutarse. Las macetas son análogas, por lo que se usa "analogRead (pin)". Esto devuelve valores entre cero (mínimo) y 1023 (máximo). Arduino es capaz de convertir estos valores a algo más útil, sin embargo, son perfectos para este caso de uso.
El retraso entre el cambio de los LED (o la velocidad del escáner) se establece en milisegundos (1/1000 segundos), por lo que el tiempo máximo es de poco más de 1 segundo.
Escáner avanzado
Ahora que conoce los conceptos básicos, veamos algo más complejo. Este escáner iluminará los LED por pares comenzando desde el exterior y trabajando en él. A continuación, invertirá esto y pasará de adentro a afuera. Aquí está el código:
const int leds[] = {1, 2, 3, 4, 5, 6, 7, 8}; // Led pins const int totalLeds = 8; const int halfLeds = 4; int time = 50; // Default speed void setup() { // Initialize all outputs for(int i = 0; i<= totalLeds; ++i) { pinMode(leds[i], OUTPUT); } } void loop() { for(int i = 0; i<(halfLeds - 1); ++i) { // Scan outside pairs in time = analogRead(2); digitalWrite(leds[i], HIGH); digitalWrite(leds[(totalLeds - i) - 1], HIGH); delay(time); digitalWrite(leds[i], LOW); digitalWrite(leds[(totalLeds - i) - 1], LOW); delay(time); } for(int i = (halfLeds - 1); i>0; --i) { // Scan inside pairs out time = analogRead(2); digitalWrite(leds[i], HIGH); digitalWrite(leds[(totalLeds - i) - 1], HIGH); delay(time); digitalWrite(leds[i], LOW); digitalWrite(leds[(totalLeds - i) - 1], LOW); delay(time); } }
Este código es un poco más complejo. Observe cómo ambos bucles pasan de cero a "halfLeds - 1" (3). Esto hace un mejor escáner. Si ambos bucles pasaron de 4-0 y 0-4, entonces los mismos LED parpadearían dos veces en la misma secuencia, esto no se vería muy bien.
¡Ahora debería tener un escáner LED Knight Rider en funcionamiento! Sería fácil modificar esto para usar LEDs más o más grandes, o implementar su propio patrón. Este circuito es muy fácil de portar a un Raspberry Pi (nuevo en Pi? Empieza aquí Raspberry Pi: El Tutorial no oficial Raspberry Pi: El Tutorial no oficial Ya sea que seas un propietario actual de Pi y quieras aprender más o sea un potencial propietario de este crédito -dispositivo de tamaño de tarjeta, esta no es una guía que te quieres perder. Más información) o ESP8266 Conoce al asesino de Arduino: ESP8266 Conoce al asesino de Arduino: ESP8266 ¿Qué pasa si te digo que hay una placa de desarrollo compatible con Arduino con un built-in Wi-Fi por menos de $ 10? Bueno, lo hay. Lee mas .
¿Estás construyendo una réplica KITT? Me encantaría ver todas las cosas de Knight Rider en los comentarios.