Image of eBits Academy inputmotion illustration

Servo og Potentiometer

  • June 23, 2023
  • |
  • Jonas Rothausen

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

 

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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

 
SG-90 er en lille, kompakt servo til præcise mekaniske bevægelser, almindelig i hobbyprojekter, robotik og fjernstyrede enheder. Oversigten beskriver SG-90, mens projektet også nævner MG90S; kontrollér derfor specifikationerne for den faktisk leverede servo.
Her er nogle nøglepunkter om Servo Motor SG-90:

  • Styring: SG-90 bruger positionsstyring med feedback. Den bevæger sig i et begrænset vinkelområde, ofte beskrevet som 180 grader; sikker vandring og pulsgrænser afhænger af den præcise model.

  • 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: Kontrollér servoens spændings- og strømmærkning; 4,8 V til 6 V angives ofte for disse hobbyservoer, men er ikke en universel garanti. Brug en reguleret ekstern forsyning dimensioneret til start-/stallstrøm, og forbind dens jord med Arduino-jord. Antag ikke, at UNO’s 5V-udgang kan drive servoen pålideligt.

  • Signalstyring: Servoen modtager positionspulser, hvis bredde angiver den ønskede vinkel. Det kaldes ofte servo-PWM, men er ikke det samme som almindelig duty-cycle-styring med Arduino analogWrite().

  • Tilslutning: Servo Motor SG-90 har typisk tre ledninger - rød (Vcc/+), sort (GND/-) og orange (signal). Farver kan variere, så kontrollér dokumentationen. Forsyning og jord driver motoren; signalledningen modtager positionspulser.

 

 

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.

 

Forsyn først servoen fra en egnet ekstern reguleret forsyning, her nominelt 5V inden for dens dokumenterede mærkning, og forbind forsyningens GND til både servojord og Arduino-jord. Forbind ikke den eksterne plusforsyning til UNO’s 5V-skinne, mens boardet forsynes via USB. Forbind servosignalet til 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.

Potentiometeret deltager også. Forbind dets to yderterminaler til 5V og GND på Arduino, og forbind slæbekontakten til analog pin A0, hvor det viser sin aktuelle 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.

Installér et bibliotek med Arduino IDE:

  1. Åbn Arduino IDE-softwaren på din computer.
  2. Åbn Library Manager i sidepanelet, eller vælg Sketch > Include Library > Manage Libraries.
  3. Søg efter biblioteket, her Servo.
  4. Vælg det rette bibliotek, og kontrollér forfatter og boardkompatibilitet.
  5. Klik Install.
  6. Arduino IDE vil downloade og installere biblioteket automatisk.
  7. Når installationen er afsluttet, vil biblioteket være klar til brug.




I koden bruger vi biblioteket ”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. På klassisk UNO returnerer analogRead normalt 0–1023 fra en 10-bit ADC. Værdien beskriver indgangen i forhold til den valgte referencespænding, normalt nominelt 5 V; opløsning garanterer ikke absolut nøjagtighed.

Vi bruger derefter "map” til at skalere 0–1023 til 0–180 i eksemplet. Kontrollér servoens sikre mekaniske vandring og pulsgrænser, og begræns intervallet ved behov.

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.

    1. Åbn Arduino-softwaren.
    2. Klik Verify i værktøjslinjen. Koden kompileres og kontrolleres for kompileringsfejl; det verificerer ikke fysisk ledningsføring eller al funktion.
    3. Hvis der ikke er nogen fejl, vil du se en meddelelse om, at verificeringen er vellykket.
    4. Vælg det korrekte Arduino board og port fra menuen "Værktøjer" i softwaren.
    5. Klik på knappen "Upload" (overfør) øverst i værktøjslinjen. Dette kompilerer koden og overfører den til Arduinoen.
    6. Hvis alt går godt, vil du se en meddelelse om, at uploadningen er fuldført.
    7. 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 Arduino, servoen og lydsensoren, og forbind dem på breadboardet. Følg vejledningen om separat servoforsyning ovenfor; forsyn øvrige moduler ved deres mærkespænding, her 5V, og forbind alle GND-punkter sammen.

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.

LED-tidsstemplerne bruger unsigned long, som svarer til millis() på klassisk UNO. En ”unsigned long” gemmer ikke-negative heltal i et større interval end UNO’s signerede int.

Brug af unsigned long fjerner ikke overflow: millis() ruller tilbage til nul efter omtrent 49,7 dage på klassisk UNO.


Kontrollér forløbet tid med unsigned-subtraktion, f.eks. now - previous >= interval, og passende intervalgrænser. En almindelig 16-bit int er ikke egnet til millis()-tidsstempler. Rollover-sikker aritmetik er nødvendig ud over den rette type.

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 strømbegrænsende modstande (ca. 1k ohm) til LED’erne. Forbind komponenter med lavt strømforbrug til deres passende forsyning (5V fra Arduinoen) og jord (GND-pinnen på Arduinoen). Følg vejledningen om separat servoforsyning ovenfor. Nu er det tid til at omsætte viden til praksis og se bonusprojektet i aktion!

Efterlad en kommentar

Bemærk venligst, at kommentarer skal godkendes, før de offentliggøres.