Någonsin önskat att du hade din egen Knight Industries Two Thousand (KITT) bil - du vet, från Knight Rider? Gör din dröm ett steg närmare verkligheten genom att bygga en LED-skanner! Här är slutresultatet:
Vad du behöver
Det finns inte många delar som behövs för detta projekt, och du kanske har många av dem redan:
- 1 x Arduino UNO eller liknande
- 1 x brödbräda
- 8 x röda lysdioder
- 8 x 220 ohm motstånd
- 1 x 10 k ohm potentiometer
- Man till manlig hake upp ledningar
Om du har ett Arduino startpaket Vad ingår i ett Arduino Starter Kit? [MakeUseOf Förklarar] Vad ingår i ett Arduino Starter Kit? [MakeUseOf Explains] Jag har tidigare introducerat Arduino open source-hårdvaran här på MakeUseOf, men du behöver mer än bara den verkliga Arduino att bygga något ut av det och faktiskt komma igång. Arduino "startpaket" är ... Läs mer Det är troligt att du har alla dessa delar (vad kan du göra med ett startpaket? 5 Unika Arduino-projekt för nybörjare du kan göra med bara en startpaket 5 Unika Arduino-projekt för nybörjare Du Kan göra med bara en startpaket läs mer).
Nästan alla Arduino kommer att fungera, förutsatt att den har åtta tillgängliga stift (Har aldrig använt en Arduino tidigare? Kom igång här Komma igång med Arduino: En nybörjarhandbok Komma igång med Arduino: En nybörjarhandbok Arduino är en öppen källkods elektronikprototypplattform baserat på flexibel, lättanvänd maskinvara och programvara. Den är avsedd för artister, designers, hobbyister och alla som är intresserade av att skapa interaktiva objekt eller miljöer. Läs mer). Du kan använda ett Shift Register Arduino Programmering - Spela med skiftregister (även mer LED) Arduino Programmering - Spelar med Shift Registers (även mer LED) Idag försöker jag lära dig lite om Shift Registers. Dessa är en ganska viktig del av Arduino programmering, i grund och botten eftersom de utökar antalet utdata du kan använda, i utbyte mot ... Läs mer för att styra LED-lamporna, även om det inte behövs för detta projekt, eftersom Arduino har tillräckligt med pinnar .
Byggplan
Detta är ett mycket enkelt projekt. Även om det kan se komplex ut från det stora antalet ledningar är varje enskild del väldigt enkel. Varje lysdiod (LED) är ansluten till sin egen Arduino-stift. Det betyder att varje LED kan slås på och av individuellt. En potentiometer är ansluten till Arduino-analogen i stiften, som används för att justera skannerns hastighet.
Kretskortet
Anslut den yttre vänstra stiftet (se framsidan, med stiften på botten) på potentiometern till marken. Anslut den motsatta ytterstiftet till + 5v. Om det inte fungerar korrekt, vänd dessa stiften. Anslut mellannålen till Arduino analog i 2.
Ansluta anoden (långbenet) till varje LED till digitala stift en till åtta. Anslut katoderna (kort ben) till Arduino marken.
Koden
Skapa en ny skiss och spara den som "knightRider". Här är koden:
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); } }
Låt oss bryta ner det. Varje LED-stift lagras i en array:
const int leds[] = {1, 2, 3, 4, 5, 6, 7, 8};
En array är i huvudsak en samling relaterade objekt. Dessa element definieras som konstant ("const"), vilket innebär att de inte kan ändras senare. Du behöver inte använda en konstant (koden fungerar perfekt om du tar bort "const"), även om det rekommenderas.
Elements av en array är åtkomliga genom att använda fälthakpar ("[]") och ett heltal som heter ett index. Indexerna börjar vid noll, så "ledare [2]" skulle returnera det tredje elementet i matrisen 3. Arrays gör kod snabbare att skriva och lättare att läsa, de gör datorn gör det hårda arbetet!
A for loop används för att ställa in varje stift som en utgång:
for(int i = 0; i<= totalLeds; ++i) { pinMode(leds[i], OUTPUT); }
Denna kod är inne i funktionen "setup ()", eftersom den bara behöver springa en gång i början av programmet. För loopar är mycket användbara. De låter dig köra samma kod om och om igen, med ett annat värde varje gång. De är perfekta för att arbeta med arrays. Ett heltal "i" deklareras, och endast koden i slingan kan nå denna variabel (detta kallas "scope"). Värdet på jag börjar vid noll, och för varje iteration av slingan ökas jag med en. När värdet på i är mindre än eller lika med "totalLeds" -variabeln, slingrar "breaks" (stoppar).
Värdet på i används för att komma åt "leds" -raden. Denna slinga öppnar varje element i matrisen och konfigurerar det som en utgång. Du kan manuellt skriva "pinMode (pin, OUTPUT)" åtta gånger, men varför skriva åtta rader när du kan skriva tre?
Även om vissa programmeringsspråk kan berätta hur många element som finns i en array (vanligtvis med syntax som array.length), gör Arduino inte det så enkelt (det innebär lite mer matematik). Eftersom antalet element i matrisen redan är känt är det inte ett problem.
Inuti huvudslingan ( tomrumslingan) är två ytterligare för slingor. Den första sätter lysdioderna på och sedan av från 1 till 8. Den andra slingan ställer lysdioderna på och sedan av från 8 - 1. Lägg märke till hur den aktuella stiftet är på och den nuvarande stiftet plus en är också på. Detta säkerställer att det alltid finns två lysdioder på samtidigt, vilket gör att scannern ser mer realistisk ut.
Vid början av varje slinga läses värdet på krukan i "tid" -variabeln:
time = analogRead(2);
Detta görs två gånger, en gång inuti varje slinga. Detta måste ständigt kontrolleras och uppdateras. Om detta var utanför slingorna skulle det fortfarande fungera, men det skulle vara en liten fördröjning - det skulle bara springa när en slinga har slutförts. Potter är analoga, varför varför "analogRead (pin)" används. Detta returnerar värden mellan noll (minimum) och 1023 (max). Arduino kan konvertera dessa värden till något mer användbart, men de är perfekta för detta användningsfall.
Fördröjningen mellan skiftande lysdioder (eller skannerns hastighet) ställs in i millisekunder (1/1000 sekund), så maximal tid är drygt 1 sekund.
Avancerad scanner
Nu när du vet grunderna, låt oss titta på något mer komplext. Denna skanner kommer att tända LED-lamporna i par från utsidan och arbeta in. Det kommer då att vända om det och gå från inuti till utvändigt par. Här är koden:
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); } }
Denna kod är lite mer komplex. Lägg märke till hur båda looparna går från noll till "halfLeds - 1" (3). Detta ger en bättre skanner. Om båda looparna gick från 4 - 0 och 0 - 4 blinkar de samma lysdioderna två gånger i samma sekvens - det ser inte bra ut.
Du borde nu ha en fungerande Knight Rider LED-skanner! Det skulle vara lätt att ändra detta för att använda fler eller större lysdioder, eller implementera ditt eget mönster. Raspberry Pi: Den inofficiella handledningen Raspberry Pi: Den inofficiella handledningen Om du är en nuvarande Pi-ägare som vill lära sig mer eller en potentiell ägare av denna kredit -kortstorlek, detta är inte en guide du vill sakna. Läs mer) eller ESP8266 Möt Arduino Killer: ESP8266 Möt Arduino Killer: ESP8266 Vad händer om jag sa till dig att det finns en Arduino-kompatibel dev board med inbyggd Wi-Fi för mindre än $ 10? Jo, det finns det. Läs mer .
Byggar du en kopia KITT? Jag skulle gärna se alla saker Knight Rider i kommentarerna.