Maak een Knight Rider LED Scanner met Arduino

Ooit gewenst dat je je eigen Knight Industries Two Thousand (KITT) auto had - weet je, van Knight Rider? Maak uw droom een ​​stap dichter bij de realiteit door een LED-scanner te bouwen!

Ooit gewenst dat je je eigen Knight Industries Two Thousand (KITT) auto had - weet je, van Knight Rider?  Maak uw droom een ​​stap dichter bij de realiteit door een LED-scanner te bouwen!
Advertentie

Ooit gewenst dat je je eigen Knight Industries Two Thousand (KITT) auto had - weet je, van Knight Rider? Maak uw droom een ​​stap dichter bij de realiteit door een LED-scanner te bouwen! Dit is het eindresultaat:

Wat je nodig hebt

Er zijn niet veel onderdelen nodig voor dit project en je hebt er misschien al veel:

  • 1 x Arduino UNO of vergelijkbaar
  • 1 x breadboard
  • 8 x rode leds
  • 8 x 220 ohm weerstanden
  • 1 x 10k ohm potentiometer
  • Van mannelijk naar mannelijk aansluitdraden

Als u een Arduino-starterkit heeft Wat zit er in een Arduino-starterkit? [MakeUseOf Explains] Wat zit er in een Arduino Starter Kit? [MakeUseOf Explains] Ik heb eerder de Arduino open-source hardware hier op MakeUseOf geïntroduceerd, maar je zult meer nodig hebben dan alleen de echte Arduino om er iets van te maken en daadwerkelijk aan de slag te gaan. Arduino "starterkits" zijn ... Lees Meer waarschijnlijk heb je al deze onderdelen (wat kun je maken met een starterkit? 5 Unieke Arduino-projecten voor beginners die je kunt maken met slechts een beginnerspakket 5 Unieke Arduino-projecten voor beginners Kan maken met slechts een starterkit Lees meer).

Bijna elke Arduino werkt, mits hij acht beschikbare pinnen heeft (Nooit eerder een Arduino gebruikt? Aan de slag Beginnen met Arduino: een beginnershandleiding Aan de slag met Arduino: een beginnersgids Arduino is een prototype-platform voor open-source elektronica op basis van flexibel, eenvoudig te gebruiken hardware en software, bedoeld voor kunstenaars, ontwerpers, hobbyisten en iedereen die geïnteresseerd is in het maken van interactieve objecten of omgevingen. Je zou een Shift Register kunnen gebruiken Arduino Programmeren - Spelen met Shift Registers (ook bekend als Nog More LED's) Arduino Programmeren - Spelen met Shift Registers (ook bekend als Even More LED's) Vandaag zal ik proberen je een klein beetje over Shift Registers te leren. Deze zijn een vrij belangrijk onderdeel van Arduino-programmering, voornamelijk omdat ze het aantal uitgangen uitbreiden dat je kunt gebruiken, in ruil voor ... Lees Meer om de LED's te besturen, hoewel dit niet nodig is voor dit project, omdat de Arduino genoeg pins heeft .

Bouw plan

Arduino-Knight-Rider-Led-Scanner-Complete
Dit is een heel eenvoudig project. Hoewel het complex kan lijken op het grote aantal draden, is elk onderdeel zeer eenvoudig. Elke Light Emitting Diode (LED) is verbonden met zijn eigen Arduino-pin. Dit betekent dat elke LED afzonderlijk kan worden in- en uitgeschakeld. Een potentiometer is verbonden met de Arduino-analoog in pinnen, die zal worden gebruikt om de snelheid van de scanner aan te passen.

Het circuit

Arduino-Knight-Rider-Circuit
Verbind de buitenste linkerpin (kijkend naar de voorkant, met de pinnen aan de onderkant) van de potentiometer naar de grond. Verbind de tegenoverliggende buitenpen met + 5v. Als het niet goed werkt, draai deze pinnen om. Verbind de middelste pin met Arduino-analoog in 2.

Verbind de anode (lange poot) van elke LED met digitale pinnen één tot en met acht. Verbind de kathodes (korte poot) met Arduino-grond.

De code

Maak een nieuwe schets en sla deze op als "ridderRider". Hier is de 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); } } 

Laten we het afbreken. Elke LED-pin wordt opgeslagen in een array:

 const int leds[] = {1, 2, 3, 4, 5, 6, 7, 8}; 

Een array is in essentie een verzameling gerelateerde items. Deze elementen worden gedefinieerd als constant ("const"), wat betekent dat ze later niet kunnen worden gewijzigd. U hoeft geen constante te gebruiken (de code werkt perfect als u "const" verwijdert), hoewel dit wordt aanbevolen.

Elementen van een array worden geopend met behulp van vierkante haken ("[]") en een geheel getal dat een index wordt genoemd. Indexen beginnen bij nul, dus "leds [2]" zou het derde element in de array teruggeven - pin 3. Arrays maken code sneller te schrijven en gemakkelijker te lezen, ze maken de computer het harde werk!

Een for-lus wordt gebruikt om elke pin als een uitvoer in te stellen:

 for(int i = 0; i<= totalLeds; ++i) { pinMode(leds[i], OUTPUT); } 

Deze code bevindt zich in de "setup ()" -functie, omdat deze slechts één keer hoeft te worden uitgevoerd aan het begin van het programma. For-loops zijn erg handig. Hiermee kunt u dezelfde code steeds opnieuw uitvoeren, met elke keer een andere waarde. Ze zijn perfect voor het werken met arrays. Een geheel getal "i" wordt gedeclareerd en alleen code binnen de lus heeft toegang tot deze variabele (dit wordt "scope" genoemd). De waarde van i begint bij nul en voor elke iteratie van de lus wordt i met één verhoogd. Zodra de waarde van i kleiner is dan of gelijk aan de "totalLeds" -variabele, "breekt" de lus (stopt).

De waarde van i wordt gebruikt om toegang te krijgen tot de array "leds". Deze lus geeft toegang tot elk element in de array en configureert het als een uitvoer. Je zou handmatig acht keer "pinMode (pin, OUTPUT)" kunnen typen, maar waarom zou je acht regels schrijven als je er drie kunt schrijven?

Hoewel sommige programmeertalen u kunnen vertellen hoeveel elementen zich in een array bevinden (meestal met syntaxis zoals array.length), maakt Arduino het niet zo eenvoudig (het omvat een beetje meer wiskunde). Aangezien het aantal elementen in de array al bekend is, is dit geen probleem.

Arduino-Knight-Rider-LEDS

Binnen de hoofdlus ( void loop () ) zijn er twee verder voor loops. De eerste zet de LED's AAN en vervolgens UIT van 1 - 8. De tweede lus zet de LED's AAN en vervolgens UIT van 8 - 1. Let op hoe de huidige pin wordt ingeschakeld en de huidige pin plus één wordt ook ingeschakeld. Dit zorgt ervoor dat er altijd twee LEDS tegelijkertijd branden, waardoor de scanner er realistischer uitziet.

Aan het begin van elke lus wordt de waarde van de pot ingelezen in de variabele "tijd":

 time = analogRead(2); 

Dit gebeurt twee keer, eenmaal binnen elke lus. Dit moet voortdurend worden gecontroleerd en bijgewerkt. Als dit buiten de lussen was, zou het nog steeds werken, maar er zou een kleine vertraging zijn - het zou alleen draaien als een lus klaar is met uitvoeren. Potten zijn analoog, vandaar dat "analooglees (pin)" wordt gebruikt. Dit retourneert waarden tussen nul (minimum) en 1023 (maximum). Arduino is in staat deze waarden te converteren naar iets nuttiger, maar ze zijn perfect voor dit gebruik.

De vertraging tussen het wisselen van LED's (of de snelheid van de scanner) wordt ingesteld in milliseconden (1/1000 seconde), dus de maximale tijd is iets meer dan 1 seconde.

Geavanceerde scanner

Arduino-LED-Outside-Pairs

Nu dat je de basis kent, laten we eens naar iets complexers kijken. Deze scanner zal de LED's in paren aansteken, beginnend vanaf de buitenkant en inwerkend. Het zal dan dit omkeren en van binnen naar buiten paren gaan. Hier is de 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); } } 

Deze code is iets complexer. Merk op hoe beide lussen van nul naar "halfLeds - 1" gaan (3). Dit maakt een betere scanner. Als beide lussen van 4 - 0 en 0 - 4 gingen, zouden dezelfde LED's twee keer in dezelfde reeks knipperen - dit zou niet erg goed zijn.

U zou nu een werkende Knight Rider LED-scanner moeten hebben! Het zou gemakkelijk zijn om dit aan te passen om meer of grotere LED's te gebruiken, of om uw eigen patroon te implementeren. Dit circuit kan heel eenvoudig worden overgezet naar een Raspberry Pi (nieuw in Pi? Start hier Raspberry Pi: de onofficiële zelfstudie Raspberry Pi: de onofficiële zelfstudie Of je nu een Pi-eigenaar bent die meer wil leren of een potentiële eigenaar van dit tegoed -kaartformaat apparaat, dit is geen handleiding die je wilt missen. Lees meer) of ESP8266 Maak kennis met de Arduino-moordenaar: ESP8266 Maak kennis met de Arduino-moordenaar: ESP8266 Wat als ik je heb verteld dat er een Arduino-compatibel dev-bord is met ingebouwde Wifi voor minder dan $ 10? Welnu, dat is er. Lees verder .

Bouw je een replica KITT? Ik zou graag alle dingen van Knight Rider in de comments zien.

In this article