Reklame
Nogensinde ønsket, at du havde din egen Knight Industries To Thousand (KITT) bil - ved du fra Knight Rider? Gør din drøm et skridt tættere på virkeligheden ved at bygge en LED-scanner! Her er slutresultatet:
Hvad du har brug for
Der er ikke mange dele til dette projekt, og du har måske allerede mange af dem:
- 1 x Arduino UNO eller lignende
- 1 x Breadboard
- 8 x røde lysdioder
- 8 x 220 ohm-modstande
- 1 x 10 k ohm potentiometer
- Ledninger til mand til mand
Hvis du har en Arduino starter kit Hvad er inkluderet i et Arduino Starter Kit? [MakeUseOf Explains]Jeg har tidligere introduceret Arduino open source-hardware her på MakeUseOf, men du har brug for mere end bare den faktiske Arduino for at bygge noget ud af det og faktisk komme i gang. Arduino "starter sæt" er ... Læs mere det er sandsynligt, at du har alle disse dele (hvad kan du lave med et startsæt? 5 unikke Arduino-projekter til begyndere, du kan lave med bare et startkit Læs mere ).
Næsten enhver Arduino fungerer, forudsat at den har otte tilgængelige stifter (Har du aldrig brugt en Arduino før?
Kom i gang her Kom godt i gang med Arduino: En begynderguideArduino er en open source-elektronikprototypeplatform baseret på fleksibel, letanvendelig hardware og software. Det er beregnet til kunstnere, designere, hobbyister og enhver, der er interesseret i at skabe interaktive objekter eller miljøer. Læs mere ). Du kunne Brug et skiftregister Arduino-programmering - Spil med skiftregistre (a.k.a endnu flere LED'er)I dag vil jeg forsøge at lære dig lidt om skiftregistre. Dette er en forholdsvis vigtig del af Arduino-programmeringen, dybest set fordi de udvider antallet af output, du kan bruge, til gengæld for ... Læs mere at styre LED'erne, selvom dette ikke er nødvendigt til dette projekt, da Arduino har nok stifter.Byg plan
Dette er et meget simpelt projekt. Selvom det kan se kompliceret ud fra det store antal ledninger, er hver enkelt del meget enkel. Hver lysemitterende diode (LED) er tilsluttet sin egen Arduino-pin. Dette betyder, at hver LED kan tændes og slukkes individuelt. Et potentiometer er tilsluttet Arduino-analogen i stifter, som vil blive brugt til at justere hastigheden på scanneren.
Kredsløbet
Forbind den udvendige venstre pin (ser på fronten, med stifterne i bunden) af potentiometeret til jorden. Tilslut den modsatte ydre pin til + 5v. Hvis det ikke fungerer korrekt, skal du vende disse stifter tilbage. Tilslut den midterste pin til Arduino-analog i 2.
Forbind anoden (langbenet) på hver LED til digitale stifter en til otte. Forbind katoderne (korte ben) til Arduino-jorden.
Koden
Opret en ny skitse og gem den som "knightRider". Her er koden:
const int leds [] = {1,2,3,4,5,6,7,8}; // Ledben. const int totalLeds = 8; int-tid = 50; // Standard hastighed tomrumsopsætning () {// Initialiser alle udgange til (int i = 0; i <= totalLeds; ++ i) {pinMode (leds [i], OUTPUT); } } void loop () {for (int i = 0; i 0; --i) {// Scan højre til venstre tid = analoglæse (2); digitalWrite (lysdioder [i], HØJ); forsinkelse); digitalWrite (lysdioder [i - 1], HØJ); forsinkelse); digitalWrite (leds [i], LAV); } }
Lad os nedbryde det. Hver LED-pin er gemt i en matrix:
const int leds [] = {1,2,3,4,5,6,7,8};
En matrix er hovedsageligt en samling af relaterede genstande. Disse elementer er defineret som konstant (“const”), hvilket betyder, at de ikke kan ændres senere. Du behøver ikke at bruge en konstant (koden fungerer perfekt, hvis du fjerner “const”), selvom den anbefales.
Elementerne i en matrix fås ved hjælp af firkantede parenteser (“[]”) og et heltal kaldet et indeks. Indeks starter ved nul, så "leds [2]" vil returnere det tredje element i array - pin 3. Arrays gør koden hurtigere at skrive og lettere at læse, de får computeren til at gøre det hårde arbejde!
En for loop bruges til at opsætte hver pin som en output:
for (int i = 0; i <= totalLeds; ++ i) {pinMode (leds [i], OUTPUT); }
Denne kode er inde i “setup ()” -funktionen, da den kun skal køres én gang ved programstart. For sløjfer er meget nyttige. De giver dig mulighed for at køre den samme kode igen og igen med en anden værdi hver gang. De er perfekte til at arbejde med matriser. Et heltal “i” er deklareret, og kun kode inde i løkken har adgang til denne variabel (dette kaldes “omfang”). Værdien af i starter ved nul, og for hver iteration af løkken forøges i med en. Når værdien af i er mindre end eller lig med "totalLeds" -variablen, brydes loopen (stopper).
Værdien af i bruges til at få adgang til “leds” array. Denne loop får adgang til hvert element i matrixen og konfigurerer det som et output. Du kan manuelt skrive “pinMode (pin, OUTPUT)” otte gange, men hvorfor skrive otte linjer, når du kan skrive tre?
Mens nogle programmeringssprog kan fortælle dig, hvor mange elementer der er i en matrix (normalt med syntaks som array.length), gør Arduino det ikke så enkelt (det involverer lidt mere matematik). Da antallet af elementer i matrixen allerede er kendt, er det ikke et problem.
Inde i hovedsløjfen (void loop ()) er to yderligere til løkker. Den første sætter LED'erne TIL og derefter FRA fra 1 - 8. Den anden sløjfe sætter LED'erne TIL og derefter FRA fra 8 - 1. Læg mærke til, hvordan den aktuelle pin er indstillet, og den aktuelle pin plus en er også aktiveret. Dette sikrer, at der altid er to lysdioder tændt på samme tid, så scanneren ser mere realistisk ud.
Ved starten af hver løkke læses potens værdi ind i variablen “tid”:
tid = analoglæse (2);
Dette gøres to gange, én gang inden i hver løkke. Dette skal konstant kontrolleres og opdateres. Hvis dette var uden for sløjferne, ville det stadig virke, men der ville være en lille forsinkelse - det ville kun køre, når en løkke er færdig med at udføre. Gryder er analoge, hvorfor ”analogRead (pin)” bruges. Dette returnerer værdier mellem nul (minimum) og 1023 (maksimum). Arduino er i stand til at konvertere disse værdier til noget mere nyttigt, men de er perfekte til denne brugssag.
Forsinkelsen mellem skiftende lysdioder (eller scannernes hastighed) indstilles i millisekunder (1/1000 sekund), så den maksimale tid er lidt over 1 sekund.
Avanceret scanner
Nu hvor du kender det grundlæggende, lad os se på noget mere komplekst. Denne scanner vil tænde lysdioderne i par startende udefra og arbejde ind. Det vil derefter vende dette og gå indefra til udvendige par. Her er koden:
const int leds [] = {1,2,3,4,5,6,7,8}; // Ledben. const int totalLeds = 8; const int halfLeds = 4; int-tid = 50; // Standard hastighed tomrumsopsætning () {// Initialiser alle udgange til (int i = 0; i <= totalLeds; ++ i) {pinMode (leds [i], OUTPUT); } } void loop () {for (int i = 0; i 0; --i) {// Scan inden i par ud-tid = analoglæse (2); digitalWrite (lysdioder [i], HØJ); digitalWrite (leds [(totalLeds - i) - 1], HIGH); forsinkelse); digitalWrite (leds [i], LAV); digitalWrite (leds [(totalLeds - i) - 1], LOW); forsinkelse); } }
Denne kode er lidt mere kompleks. Bemærk, hvordan begge sløjfer går fra nul til “halvled - 1” (3). Dette gør en bedre scanner. Hvis begge sløjfer gik fra 4 - 0 og 0 - 4, ville de samme lysdioder blinke to gange i samme rækkefølge - dette ville ikke se meget godt ud.
Du skal nu eje en fungerende Knight Rider LED-scanner! Det ville være let at ændre dette for at bruge flere eller større LED'er eller implementere dit eget mønster. Dette kredsløb er meget let at port til en Hindbær Pi (nyt for Pi? Start her Raspberry Pi: Den uofficielle tutorialUanset om du er en nuværende Pi-ejer, der vil lære mere eller en potentiel ejer af denne enhed med kreditkortstørrelse, er dette ikke en guide, du vil gå glip af. Læs mere ) eller ESP8266 Mød Arduino Killer: ESP8266Hvad hvis jeg fortalte dig, at der er et Arduino-kompatibelt dev-kort med indbygget Wi-Fi for mindre end $ 10? Det er der. Læs mere .
Bygger du en kopi-KITT? Jeg ville elske at se alle ting Knight Rider i kommentarerne.
Joe er uddannet inden for datalogi fra University of Lincoln, UK. Han er en professionel softwareudvikler, og når han ikke flyver droner eller skriver musik, kan han ofte findes, når han tager billeder eller producerer videoer.