Velkommen til vores anden blog i denne serie, der handler om at styre en servo med et potentiometer! I denne guide vil vi udforske spændende muligheder med Arduino og lære, hvordan vi kan bruge et potentiometer til at kontrollere bevægelsen af en servo. En servo er en motor, der er designet til præcis styring af positionen. I vores projekt vil vi bruge en MG90S metal gear servo motor, der er kendt for sin pålidelighed og præcision.
Ved hjælp af et potentiometer, som er en variabel modstand, vil vi kunne ændre spændingsniveauet og dermed styre bevægelsen af servoens aksel. Når vi drejer potentiometeret, vil servoens aksel bevæge sig i overensstemmelse hermed. Dette åbner op for en verden af kreative muligheder, hvor vi kan skabe interaktive mekaniske bevægelser og robot applikationer.
Så lad os kombinere hardware og software til at skabe dynamiske projekter. Lad os dykke ned i detaljerne og lære, hvordan vi kan opbygge vores egen servo-kontrollerede konstruktioner ved hjælp af Arduino-platformen!
Komponenter, der bruges i projektet
Arduino UNO |
Servo Motor |
Potentiometer |
Jumper-ledninger |
Breadboard |
-
Arduino UNO: Arduino UNO er hjertet i vores projekt. Det er en mikrocontroller-baseret enhed, der fungerer som vores programmerbare hjerne. Det giver os mulighed for at oprette forbindelse til og kontrollere forskellige elektroniske komponenter og udføre forskellige opgaver.
-
Servo Motor: Servo motoren er en speciel type motor, der bruges til præcise bevægelser. I vores projekt styrer vi en 'MG90S metal gear servo motor'. Den modtager kommandoer fra Arduinoen og drejer sig i en bestemt vinkel, hvilket giver os mulighed for at opnå præcis positionering og bevægelse.
-
Potentiometer: Potentiometeret er en variabel resistor. Det fungerer som en drejeknap, der giver os mulighed for at justere værdien af modstanden. I vores projekt bruger vi potentiometeret til at styre bevægelsen af vores servo motor ved at ændre den vinkel, den drejer sig i.
-
Jumper-ledninger: Jumper-ledningerne er korte ledninger med stik i enderne, der giver os mulighed for at oprette forbindelse mellem forskellige komponenter. De er meget fleksible og nemme at bruge til at oprette forbindelse mellem vores Arduino, servo motor, potentiometer og breadboard.
- Breadboard/fumlebræt: Et breadboard, også kendt som et fumlebræt, er et nyttigt værktøj til midlertidig prototyping af elektroniske kredsløb. Det giver os mulighed for nemt at oprette forbindelse mellem vores komponenter uden at skulle lave permanente lodninger. Vi kan indsætte vores komponenter i hullerne på breadboardet og oprette forbindelser ved hjælp af jumper-ledningerne.
Lad os hurtigt kigge lidt nærmere på vores Servo Motor.
Servo Motor SG-90
Servo Motor SG-90 er en lille og kompakt motor, der bruges til at bevæge mekaniske dele med præcision. Den er meget almindelig i hobbyprojekter, robotik og fjernstyrede apparater.
Her er nogle nøglepunkter om Servo Motor SG-90:
-
Styring: Servo Motor SG-90 er en type motor med lukket løkke, hvilket betyder, at den nøjagtigt følger de styresignaler, den modtager. Den kan dreje inden for en bestemt vinkel (normalt 180 grader) og bevæge sig til en bestemt position.
-
Drejningsmoment: SG-90 har et relativt lavt drejningsmoment sammenlignet med større servomotorer, men det er tilstrækkeligt til mange lette til mellemstore projekter. Det kan bevæge små mekaniske dele og komponenter.
-
Spænding: Servo Motor SG-90 arbejder typisk med en driftsspænding på 4,8 V til 6 V. Det kan bruge en ekstern strømkilde eller få strøm fra Arduino-boardet, afhængigt af projektets krav.
-
Signalstyring: For at styre Servo Motor SG-90 skal den modtage et PWM (Pulse Width Modulation) signal. PWM-signalet består af pulser med forskellig varighed, hvor varigheden angiver den ønskede position eller vinkel for motoren.
-
Tilslutning: Servo Motor SG-90 har typisk tre ledninger - rød (Vcc/+), sort (GND/-) og orange (signal). Rød og sort ledningerne er til strømforsyning, mens den orange ledning er til at modtage PWM-styringssignalet.
Kredsløbet i projektet
Eftersom vi allerede har bygget vores første kredsløb og dermed har lidt erfaring, er der denne gang plas til lidt... metaforer... i forklaringen for projektets kredsløb. So let's go...
I vores spændende kredsløb, der får vores servo til at danse efter potentiometerets melodi, vender vi os igen mod vores trofaste følgesvend, breadboardet. Denne gang slår vi os sammen med en særlig karakter, nemlig 'MG90S metal gear servo motor', der er kendt for sin legendariske præcision. Ved siden af ham har vi vores livlige hjælpere, jumper-ledningerne, og det charmerende potentiometer, der giver os fuld kontrol.
Vi forbinder først vores servo til vores Arduino ved at give den en solid forbindelse til 5V og GND, hvilket giver ham den energi og grounding, han har brug for til sine dansebevægelser. Derefter inviterer vi ham til at tage plads ved GPIO 9-pinnen, hvor han vil modtage vores kommandoer og forvandle dem til graciøse bevægelser. Det er på dette tidspunkt, at vores potentiometer træder ind på scenen med sin egen glamourøse tilstedeværelse.
Vores potentiometer er også en del af vores elektriske fest og får lige så meget kærlighed som servoen. Vi forbinder det med 5V og GND fra vores elskede Arduino for at sikre, at det føler sig godt tilpas og jordet. Derefter inviterer vi det til at dele sine hemmeligheder ved at forbinde det til den analoge pin GPIO A0, hvor det vil fortælle os historien om dets nuværende position.
Nu hvor vores kredsløb er på plads og vores komponenter er klar til ACTION, er det tid til at fokusere på koden. Vi vil igen i denne blog bruge Arduino-kode til at styre vores servo og potentiometer og skabe en elegant bevægelsessekvens. Lad os dykke ned i programmeringens verden og udforske, hvordan vi kan tæmme disse komponenter og bringe dem i harmoni med vores ønskede bevægelser.
Koden
I denne kode introducerer vi Libraries/Biblioteker på Arduino IDE platformen!
Arduino Libraries er vigtige, fordi de giver os adgang til færdiglavet kode, der er udviklet af andre super dygtige mennesker. Dette gør det nemmere for resten os at implementere komplekse funktioner eller styre forskellige komponenter uden at skulle skrive alt koden fra bunden. Libraries indeholder foruddefinerede funktioner, konstanter og definitioner, der gør programmering med Arduino mere effektiv og tilgængelig for alle.
Tænk på libraries som programmer vi kan downloade for at tage valide genveje i vores programmering.
For at installere indbyggede libraries i Arduino IDE gør følgende:
- Åbn Arduino IDE-softwaren på din computer.
- Gå til "Sketch" i menuen øverst på skærmen.
- Klik på "Include Library" (Inkluder bibliotek).
- En liste med forskellige biblioteker vises. Søg via søge-feltet og find det ønskede bibliotek.
- Klik på bibliotekets navn for at installere det.
- Arduino IDE vil downloade og installere biblioteket automatisk.
- Når installationen er afsluttet, vil biblioteket være klar til brug.
I koden bruger vi en biblioteksfunktion kaldet "Servo". Som sagt så er et bibliotek en samling af foruddefinerede funktioner og kode, der gør det nemmere for os at arbejde med specifikke komponenter eller funktionaliteter. I dette tilfælde bruger vi Servo-biblioteket til at styre vores servo motor.
Her er koden for projektet
#include <Servo.h> // Tilføj servo-biblioteket
Servo myservo; // Opret servo-objekt til at styre en servo
int potpin = 0; // Analog pin brugt til at forbinde potentiometeret
int val; // Variabel til at læse værdien fra den analoge pin
void setup() {
myservo.attach(9); // Tilslut servoen på pin 9 til servo-objektet
}
void loop() {
val = analogRead(potpin); // Læser værdien fra potentiometeret (værdi mellem 0 og 1023)
val = map(val, 0, 1023, 0, 180); // Skalér værdien til brug med servoen (værdi mellem 0 og 180)
myservo.write(val); // Indstil servoen til den skalerede værdi
delay(15); // Vent på at servoen når den ønskede position
I denne serie, og dermed i denne blog, fortsætter vi med at bruge hyperlinks til Arduino-platformen for at introducere nye programmeringskoncepter. Vi anbefaler, at du klikker på disse hyperlinks og læser beskrivelserne, hvis de skulle forvirre dig. Det kan virke overvældende i starten, men med lidt tålmodighed og vilje kan du sagtens overkomme det og mestre det!
Vi starter med at inkludere Servo-biblioteket ved at skrive "#include <Servo.h>". Dette giver os adgang til alle de nyttige funktioner og kommandoer, der er tilgængelige i Servo-biblioteket.
Derefter opretter vi et objekt ved navn "myservo" ved hjælp af "Servo myservo;". Dette objekt giver os mulighed for at kontrollere vores servo motor.
Vi definerer en variabel "potpin" og tildeler den værdien 0. Denne variabel bruges til at læse værdien fra vores potentiometer, som er tilsluttet den analoge pin 0 på Arduinoen.
I setup-funktionen bruger vi "myservo.attach(9);" til at tilknytte vores servo motor til pin 9 på Arduinoen.
I loop-funktionen læser vi værdien af potentiometeret ved at bruge "val = analogRead(potpin);".
analogRead() ligner meget digitalRead(), som vi lærte om i den første blog i denne serie: Lys & Lyd.
analogRead-funktionen bruges til at læse værdier fra analoge indgangspins på Arduino-boardet. Til forskel fra digitalRead, der kun kan læse enten høj (1) eller lav (0), kan analogRead læse en bredere vifte af værdier, der repræsenterer spændingsniveauer.
På en Arduino UNO er der 6 analoge indgangspins markeret som A0 til A5. Når du bruger analogRead på et af disse pins, vil funktionen levere en værdi mellem 0 og 1023. Denne værdi er baseret på den analoge spænding, der er tilsluttet pinden. 0 svarer til en analog spænding på 0 volt, og 1023 svarer til den reference spænding, der er angivet på Arduino (normalt 5 volt på Arduino UNO).
Vi bruger derefter "map" funktionen til at skalere denne værdi fra intervallet 0-1023 til intervallet 0-180, da vores servo motor kan dreje sig i dette interval.
Vi bruger "myservo.write(val);" til at indstille servoens position i henhold til den skalerede værdi.
Til sidst bruger vi "delay(15);" til at vente i 15 millisekunder, før loop-funktionen gentages.
Upload Koden
For at uploade koden og teste om vores projekt fungerer, så tilslutter vi Arduinoen til vores computer ved hjælp af et USB-kabel og følger trinene nedenfor.
- Åbn Arduino-softwaren.
- Klik på knappen "Verify" (kontrolér) øverst i værktøjslinjen. Dette tjekker koden for eventuelle fejl eller problemer.
- Hvis der ikke er nogen fejl, vil du se en meddelelse om, at verificeringen er vellykket.
- Vælg det korrekte Arduino board og port fra menuen "Værktøjer" i softwaren.
- Klik på knappen "Upload" (overfør) øverst i værktøjslinjen. Dette kompilerer koden og overfører den til Arduinoen.
- Hvis alt går godt, vil du se en meddelelse om, at uploadningen er fuldført.
- Nu kan du teste dit projekt og se, om det fungerer som forventet.
Vi har nu udforsket spændende projekter med både en lydsensor og en servo motor. Du har lært at opbygge kredsløbene, programmere Arduinoen og se dine kreationer tage form. Men vent! Der er mere i vente!
Hvis du skulle have lyst til at udvikle mere elektronik så har vi en spændende bonus - et ekstra projekt til dig, der kombinerer det bedste fra begge verdener. Vi vil kombinere servoen fra blog 2 med lydsensoren fra blog 1 i serien og skabe et interaktivt lydstyret bevægelsesprojekt.
BONUS PROJEKT
I vores spændende bonus projekt vil vi kombinere det bedste fra begge verdener og skabe et interaktivt lydstyret bevægelsesprojekt. Vi vil bruge servomotoren fra blog 2 og lydsensoren fra blog 1 til at skabe en unik og sjov oplevelse.
I dette projekt vil vi programmere Arduinoen til at reagere på lyde, specifikt knips med fingrene. Når du knipser én gang, vil servomotoren dreje i en bestemt retning og den grønne LED vil være tændt, og når du knipser to gange, vil den dreje i den modsatte retning nu vil den røde LED være tændt i stedet for. Denne kombination af lyd og bevægelse giver dig mulighed for at interagere med dit projekt på en helt ny måde.
Nu kommer det mest spændende ved vores bonusprojekt - det er tid til at sætte dine egne færdigheder på prøve! Vi udfordrer dig til at opbygge kredsløbet og implementere koden for at få vores lydstyrede bevægelsesprojekt til at fungere.
Tag din elskede Arduino, din trofaste servomotor og din pålidelige lydsensor. Forbind dem med kærlighed og lidenskab på breadboardet ved hjælp af jumper-ledningerne. Glem ikke at give dem den rette forbindelse til 5V og GND.
Nu er det tid til at kigge nærmere på vores kode. Åbn Arduino IDE og kopier den præsenterede kode ind i et nyt sketch-vindue.
#include <Servo.h>
Servo myservo;
int soundSensor = 2; // Lydsensor er tilsluttet pin 2
int greenLED = 5; // Grøn LED er tilsluttet pin 5
int redLED = 4; // Rød LED er tilsluttet pin 4
boolean greenLEDStatus = false; // Status for grøn LED
boolean redLEDStatus = false; // Status for rød LED
unsigned long greenLEDTimestamp = 0; // Tidsstempel for grøn LED
unsigned long redLEDTimestamp = 0; // Tidsstempel for rød LED
int doubleSnapDelay = 2000; // Juster denne værdi efter behov
void setup() {
myservo.attach(9);
pinMode(soundSensor, INPUT);
pinMode(greenLED, OUTPUT);
pinMode(redLED, OUTPUT);
myservo.write(0); // Indstil servoens position til 0 grader
delay(1000); // Vent et øjeblik for at servo nå den indledende position
}
void loop() {
int SensorData = digitalRead(soundSensor);
if (SensorData == 1) {
unsigned long currentTime = millis();
// Tjek om der er gået nok tid siden grøn LED sidst blev tændt
if (currentTime - greenLEDTimestamp >= doubleSnapDelay) {
greenLEDStatus = false;
digitalWrite(greenLED, LOW);
}
// Tjek om der er gået nok tid siden rød LED sidst blev tændt
if (currentTime - redLEDTimestamp >= doubleSnapDelay) {
redLEDStatus = false;
digitalWrite(redLED, LOW);
}
if (greenLEDStatus == false && redLEDStatus == false) {
greenLEDStatus = true;
digitalWrite(greenLED, HIGH);
// Ét knips registreret, drej servo fra 0 til 180 grader
myservo.write(180);
delay(700); // Juster forsinkelsen om nødvendigt
// Opdater tidsstempel for grøn LED
greenLEDTimestamp = millis();
} else if (greenLEDStatus == true && redLEDStatus == false) {
unsigned long snapTime = millis();
int numSnaps = 0;
boolean doubleSnapDetected = false;
while (millis() - snapTime <= doubleSnapDelay) {
int SensorData = digitalRead(soundSensor);
if (SensorData == 1) {
numSnaps++;
delay(100); // Forsinkelse for at undgå flere knips-detektioner
if (numSnaps > 1) {
doubleSnapDetected = true;
break;
}
}
}
if (doubleSnapDetected) {
// To knips registreret, tænd rød LED
redLEDStatus = true;
digitalWrite(redLED, HIGH);
// Drej servo fra 180 til 0 grader
myservo.write(0);
delay(700); // Juster forsinkelsen om nødvendigt
}
// Opdater tidsstempel for rød LED
redLEDTimestamp = millis();
// Sluk grøn LED
greenLEDStatus = false;
digitalWrite(greenLED, LOW);
}
}
}
PSST! Her er en lille hjælp til at komme i gang.
Først og fremmest så i denne kode bruger vi en ny funktion kaldet millis().
Denne funktion returnerer antallet af millisekunder, der er gået siden Arduinoen blev startet eller nulstillet.
I vores projekt bruger vi millis() til at holde styr på tiden, der er gået siden et knips blev registreret. Vi gemmer tidspunktet i en variabel, og senere sammenligner vi det med den nuværende tid for at se, om der er gået nok tid til at udføre en bestemt handling.
I dette projekt definerer vi "timestamps" for vores LED'er som variabler af typen "unsigned long". Dette skyldes, at "timestamps" bruger en stor mængde talværdier, da de repræsenterer tidspunkter målt i millisekunder. En "unsigned long" variabeltype er i stand til at gemme større positive heltal sammenlignet med andre variabeltyper.
Ved at bruge "unsigned long" undgår vi potentielle problemer med overflow, hvor en variabel når sin maksimale værdi og derefter "ruller rundt" tilbage til nul.
Selvom en almindelig "int" nok ville være tilstrækkelig her, er det godt at "træne med god form" fra starten og derfor bruge "unsigned long" til at sikre præcision og undgå eventuelle problemer med overflow i fremtidige projekter.
Så nu, hvor vi har en bedre forståelse af koden til bonusprojektet, kan du prøve at aflæse, hvordan kredsløbet skal sættes op. F. eks. baseret på linjen "int soundSensor = 2;", kan vi se, at lydsensoren skal forbindes til pin 2 på Arduinoen. Kan du aflæse hvordan de andre komponenter skal opsættes?
Husk også at bruge modstande (ca. 1k ohm) for at beskytte LED'erne og forbinde komponenterne til både forsyningsspændingen (5V fra Arduinoen) og jord (GND-pinnen på Arduinoen). Nu er det tid til at omsætte viden til praksis og se bonusprojektet i aktion!