Vous avez déjà souhaité avoir votre propre voiture Knight Industries Two Thousand (KITT) - vous savez, de Knight Rider? Faites de votre rêve un pas de plus vers la réalité en construisant un scanner LED! Voici le résultat final:
De quoi as-tu besoin
Il n'y a pas beaucoup de pièces nécessaires pour ce projet, et vous pouvez en avoir déjà beaucoup:
- 1 x Arduino UNO ou similaire
- 1 x planche à pain
- 8 x LED rouges
- Résistances 8 x 220 ohms
- Potentiomètre 1 x 10k ohm
- Mâle à mâle accrocher des fils
Si vous avez un kit de démarrage Arduino Qu'est-ce qui est inclus dans un kit de démarrage Arduino? [MakeUseOf explique] Qu'est-ce qui est inclus dans un kit de démarrage Arduino? [MakeUseOf Explains] J'ai déjà présenté le matériel open-source Arduino ici sur MakeUseOf, mais vous aurez besoin de plus que de l'Arduino pour en faire quelque chose et commencer réellement. Arduino "kits de démarrage" sont ... Lire la suite il est probable que vous avez toutes ces pièces (que pouvez-vous faire avec un kit de démarrage? 5 Projets Arduino uniques pour les débutants que vous pouvez faire avec juste un kit de démarrage 5 projets Arduino uniques pour les débutants Peut faire avec juste un kit de démarrage Lire la suite).
Commencez ici Initiation à Arduino: Guide du débutant Premiers pas avec Arduino: un guide pour débutants Arduino est une plate-forme de prototypage électronique open source basée sur des fonctions flexibles., facile à utiliser matériel et logiciel.Il est destiné aux artistes, designers, amateurs, et toute personne intéressée par la création d'objets ou d'environnements interactifs.Lire la suite). Vous pouvez utiliser un registre Shift Programmation Arduino - Jouer avec des registres à décalage (encore plus de LEDs) Programmation Arduino - Jouer avec des registres à décalage (Encore plus de LEDs) Aujourd'hui, je vais essayer de vous en apprendre un peu plus sur les registres à décalage. Il s'agit d'une partie assez importante de la programmation Arduino, essentiellement parce qu'ils augmentent le nombre de sorties que vous pouvez utiliser, en échange de ... Read More pour contrôler les LED, bien que cela ne soit pas nécessaire pour ce projet, car l'Arduino a assez de broches .
Construire un plan
C'est un projet très simple. Alors qu'il peut sembler complexe du grand nombre de fils, chaque partie individuelle est très simple. Chaque diode électroluminescente (DEL) est connectée à sa propre broche Arduino. Cela signifie que chaque LED peut être allumée et éteinte individuellement. Un potentiomètre est connecté à l'analogue Arduino dans les broches, qui seront utilisées pour ajuster la vitesse du scanner.
Le circuit
Connectez la broche gauche extérieure (en regardant à l'avant, avec les broches en bas) du potentiomètre à la terre. Connectez la broche extérieure opposée à + 5v. Si cela ne fonctionne pas correctement, inversez ces broches. Connectez la broche du milieu à l'Arduino analogique en 2.
Connectez l'anode (jambe longue) de chaque LED aux broches numériques de un à huit. Connectez les cathodes (jambe courte) à la terre Arduino.
Le code
Créez une nouvelle esquisse et enregistrez-la en tant que "knightRider". Voici le code:
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); } }
Brisons-le. Chaque broche LED est stockée dans un tableau:
const int leds[] = {1, 2, 3, 4, 5, 6, 7, 8};
Un tableau est essentiellement une collection d'éléments connexes. Ces éléments sont définis comme constants ("const"), ce qui signifie qu'ils ne peuvent pas être modifiés plus tard. Vous n'avez pas besoin d'utiliser une constante (le code fonctionnera parfaitement si vous supprimez "const"), bien que cela soit recommandé.
Les éléments d'un tableau sont accessibles en utilisant des crochets ("[]") et un entier appelé index. Les index commencent à zéro, donc "leds [2]" renverrait le troisième élément du tableau - pin 3. Les tableaux rendent le code plus rapide à écrire et plus facile à lire, ils font travailler dur l'ordinateur!
Une boucle for est utilisée pour configurer chaque broche en tant que sortie:
for(int i = 0; i<= totalLeds; ++i) { pinMode(leds[i], OUTPUT); }
Ce code est à l'intérieur de la fonction "setup ()", car il ne doit être exécuté qu'une seule fois au début du programme. Pour les boucles sont très utiles. Ils vous permettent d'exécuter le même code encore et encore, avec une valeur différente à chaque fois. Ils sont parfaits pour travailler avec des tableaux. Un entier "i" est déclaré, et seul le code à l'intérieur de la boucle peut accéder à cette variable (cela s'appelle "scope"). La valeur de i commence à zéro, et pour chaque itération de la boucle, i est augmenté de un. Une fois que la valeur de i est inférieure ou égale à la variable "totalLeds", la boucle "se casse" (s'arrête).
La valeur de i est utilisée pour accéder au tableau "leds". Cette boucle accède à chaque élément du tableau et le configure en sortie. Vous pouvez manuellement taper "pinMode (pin, OUTPUT)" huit fois, mais pourquoi écrire huit lignes quand vous pouvez écrire trois?
Alors que certains langages de programmation peuvent vous dire combien d'éléments sont dans un tableau (généralement avec une syntaxe comme array.length), Arduino ne le rend pas si simple (il implique un peu plus de maths). Comme le nombre d'éléments dans le tableau est déjà connu, ce n'est pas un problème.
À l'intérieur de la boucle principale (boucle vide () ) sont deux autres pour les boucles. Le premier allume les DEL, puis les éteint de 1 à 8. La deuxième boucle allume les DEL, puis les éteint de 8 à 1. Remarquez comment la broche actuelle est activée et la broche actuelle plus une est également activée. Cela garantit qu'il y a toujours deux LED allumées en même temps, ce qui rend le scanner plus réaliste.
Au début de chaque boucle, la valeur du pot est lue dans la variable "time":
time = analogRead(2);
Ceci est fait deux fois, une fois à l'intérieur de chaque boucle. Cela doit être constamment vérifié et mis à jour. Si cela se trouvait en dehors des boucles, cela fonctionnerait encore, mais il y aurait un petit retard - il ne fonctionnerait qu'une fois qu'une boucle a fini d'être exécutée. Les pots sont analogiques, c'est pourquoi "analogRead (pin)" est utilisé. Cela renvoie des valeurs entre zéro (minimum) et 1023 (maximum). Arduino est capable de convertir ces valeurs en quelque chose de plus utile, mais elles sont parfaites pour ce cas d'utilisation.
Le délai entre la modification des voyants (ou la vitesse du scanner) est défini en millisecondes (1/1000 seconde), de sorte que la durée maximale est légèrement supérieure à 1 seconde.
Scanner avancé
Maintenant que vous connaissez les bases, regardons quelque chose de plus complexe. Ce scanner allumera les LED par paire en partant de l'extérieur et en travaillant. Il inversera ensuite ce mouvement et ira de l'intérieur vers l'extérieur. Voici le code:
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); } }
Ce code est légèrement plus complexe. Remarquez comment les deux boucles vont de zéro à "halfLeds - 1" (3). Cela rend un meilleur scanner. Si les deux boucles passaient de 4 à 0 et de 0 à 4, les mêmes DEL clignotaient deux fois dans la même séquence - cela ne paraîtrait pas très bien.
Vous devriez maintenant posséder un scanner LED Knight Rider fonctionnel! Il serait facile de modifier ceci pour utiliser plus de LED ou plus, ou implémenter votre propre pattern. Ce circuit est très facile à mettre en communication avec un Raspberry Pi (nouveau sur Pi? Démarrer ici Raspberry Pi: le tutoriel non officiel Raspberry Pi: le tutoriel officieux Si vous êtes un propriétaire actuel Pi qui veut en savoir plus ou un propriétaire potentiel de ce crédit ESP8266 Rencontrez le tueur Arduino: ESP8266 Rencontrez le tueur Arduino: ESP8266 Et si je vous disais qu'il y a une carte de développement compatible Arduino avec built-in Wi-Fi pour moins de 10 $? Eh bien, il y a. Lire la suite .
Est-ce que vous construisez une réplique KITT? J'aimerais voir toutes les choses Knight Rider dans les commentaires.