Nyheter i Android, Telefoner, Prylar Och Recensioner

Gör en Knight Rider LED-skanner med Arduino

Har du 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 behövs inte många delar för det här projektet, och du kanske redan har många av dem:

1 x Arduino UNO eller liknande 1 x Breadboard 8 x röda lysdioder 8 x 220 ohm motstånd 1 x 10k ohm potentiometer Hane till hane anslutningskablar

Om du har ett Arduino startpaket är det troligt att du har alla dessa delar (vad kan du göra med ett startpaket?).

Nästan alla Arduino kommer att fungera, förutsatt att den har åtta tillgängliga stift (Har du aldrig använt en Arduino tidigare? Kom igång här). Du kan använda ett Shift Register för att styra lysdioderna, även om detta inte behövs för detta projekt, eftersom Arduino har tillräckligt med stift.

Byggplan

Detta är ett mycket enkelt projekt. Även om det kan se komplicerat ut från det stora antalet ledningar, är varje enskild del väldigt enkel. Varje lysdiod (LED) är ansluten till sin egen Arduino-stift. Detta innebär att varje LED kan tändas och släckas individuellt. En potentiometer är ansluten till Arduino analoga stift, som kommer att användas för att justera hastigheten på skannern.

Kretsen

Anslut potentiometerns yttre vänstra stift (om du tittar på framsidan, med stiften i botten) till jord. Anslut det motsatta yttre stiftet till +5v. Om det inte fungerar korrekt, vänd på dessa stift. Anslut mittstiftet till Arduino analog i 2.

Anslut anoden (långt ben) på varje lysdiod till digitala stift ett till åtta. Anslut katoderna (kort ben) till Arduino jord.

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 < totalLeds - 1; ++i) {
// Scan left to right
time = analogRead(2);
digitalWrite(leds[i], HIGH);
delay(time);
digitalWrite(leds[i + 1], HIGH);
delay(time);
digitalWrite(leds[i], LOW);
}
for(int i = totalLeds; 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 konstanta (“const”), vilket innebär att de inte kan ändras senare. Du behöver inte använda en konstant (koden kommer att fungera perfekt om du tar bort “const”), även om det rekommenderas.

Relaterad  JPMorgan bombarderas med 1-stjärniga recensioner på Yelp efter Elon-hotet

Element i en array nås med hakparenteser (“[ ]”) och ett heltal som kallas ett index. Index börjar på noll, så “leds[2]” skulle returnera det tredje elementet i arrayen — pin 3. Arrayer gör kod snabbare att skriva och lättare att läsa, de får datorn att göra det hårda arbetet!

En 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);
}

Den här koden finns i funktionen “setup()”, eftersom den bara behöver köras 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 arrayer. Ett heltal “i” deklareras, och endast kod inuti slingan kan komma åt denna variabel (detta kallas “scope”). Värdet på i börjar på noll, och för varje iteration av slingan ökas i med ett. När värdet på i är mindre än eller lika med variabeln “totalLeds”, “bryts” slingan (stoppar).

Värdet på i används för att komma åt “leds”-arrayen. Denna loop kommer åt varje element i arrayen och konfigurerar den 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 det inte så enkelt (det involverar lite mer matematik). Eftersom antalet element i arrayen redan är känt är det inget problem.

Inne i huvudslingan (void loop()) är två ytterligare för loopar. Den första sätter lysdioderna PÅ och sedan AV från 1 – 8. Den andra slingan sätter lysdioderna PÅ och sedan AV från 8 – 1. Lägg märke till hur det aktuella stiftet sätts på, och det aktuella stiftet plus ett är inställt också. Detta säkerställer att det alltid är två lysdioder på samtidigt, vilket gör att skannern ser mer realistisk ut.

Relaterad  Call of Duty Warzone och Vanguard: en läcka avslöjar Operatörerna för säsong 2

I början av varje slinga läses pottens värde in i variabeln “tid”:

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 looparna skulle det fortfarande fungera, men det skulle bli en liten fördröjning — det skulle bara köras när en loop har avslutats. Krukor är analoga, därför används “analogRead(pin)”. Detta returnerar värden mellan noll (minimum) och 1023 (maximum). 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 byte av lysdioder (eller hastigheten på skannern) är inställd i millisekunder (1/1000 sekund), så den maximala tiden är drygt 1 sekund.

Avancerad skanner

Nu när du kan grunderna, låt oss titta på något mer komplext. Den här skannern kommer att tända lysdioderna i par från utsidan och arbeta in. Den kommer sedan att vända på detta och gå från insidan till utsidan 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 något mer komplex. Lägg märke till hur båda slingorna går från noll till “halva lysdioder – 1” (3). Detta gör en bättre skanner. Om båda slingorna gick från 4 – 0 och 0 – 4 skulle samma lysdioder blinka två gånger i samma sekvens — detta skulle inte se särskilt bra ut.

Relaterad  Ape Fight Club är ett bisarrt fightingspel med apor och NFT: detaljerna

Du bör nu äga en fungerande Knight Rider LED-skanner! Det skulle vara lätt att modifiera detta för att använda fler eller större lysdioder, eller implementera ditt eget mönster. Denna krets är mycket lätt att porta till en Raspberry Pi (ny på Pi? Börja här) eller ESP8266.

Bygger du en replik KITT? Jag skulle älska att se allt som rör Knight Rider i kommentarerna.

Om författaren

Joe Coburn (134 artiklar publicerade)

Joe har en examen i datavetenskap från University of Lincoln, Storbritannien. Han är en professionell mjukvaruutvecklare, och när han inte flyger drönare eller skriver musik kan han ofta hittas som fotograferar eller producerar videor.

Mer från Joe Coburn

Prenumerera på vårt nyhetsbrev

Gå med i vårt nyhetsbrev för tekniska tips, recensioner, free e-böcker och exklusiva erbjudanden!

Klicka här för att prenumerera