Styrning av servo med Raspberry Pi Pico W och pulsbreddsmodulering (PWM)

En servo är ett av de mest grundläggande sätten att lära sig använda pulsbreddsmodulering med Raspberry Pi.

Vi ska lära oss hur man gör detta med en Raspberry Pi Pico W.

Mål för PWM-tutorials

  • Lär dig hur du använder PWM för att styra servoens vinkel.
  • Konfigurera en server med Pico W
  • Servern levererar en webbsida med ett skjutreglage för att styra servotorn.

Delar som behövs

  • Raspberry Pi Pico W med huvudet
  • Jumpertråd
  • Servo (vi använder Tower Pro SG90 mikroservo)

Vad är pulsbreddsmodulering?

Barn tycker att det är roligt att tända och släcka lampor flera gånger.

För dem är det bara så roligt att se ljuset flimra på och av när de vrider på strömbrytaren. Föräldrarna kanske inte tycker att det är så roligt, men det är ett lärorikt ögonblick för oss alla.

Om du eller dina barn har gjort det har ni upplevt en primitiv form av pulsbreddsmodulering.

Med en Raspberry Pi kan du enkelt göra detta på ett automatiserat sätt. I huvudsak talar du om för Raspberry Pi hur många gånger du vill att saker och ting ska vara "ON" under en viss period.

Detta gör det möjligt att dimma lysdioder:

Picockpit gpio pwm fjärrkontroll
Växla LED-styrkan med PiCockpit PWM-funktionen

Dessutom kan du kontrollera vinkeln på servoarmens arm.

Ett viktigt PWM-koncept: Duty Cycle

En arbetscykel är i princip den tid som kretsen är "hög", vilket innebär att den är påslagen.

Låt oss anta att din krets är på halva tiden. Vi kan därför säga att arbetscykeln är 50%.

Om den är påslagen hela tiden är dess arbetscykel 100%, och vice versa, om den är avstängd hela tiden är den 0.

Illustration av arbetscykeln från Sparkfun (CC BY-SA 4.0)

Om vi återgår till exemplet med ett barn som tänder och släcker lamporna i en regelbunden takt, beror det på att vi bara levererar en spänning under en viss tid.

För en lysdiod innebär detta att lysdioden lyser under en viss tid, sedan dras strömmen, sedan strömmen tillförs igen och så vidare.

Lysdioden blir alltså aldrig tillräckligt ljus för att nå sin fulla ljusstyrka, och den hinner inte heller bli helt mörk.

SG90-servokontroll med PWM

Vi måste vara försiktiga här eftersom alla servon inte fungerar på samma sätt. Den här handledningen är specifik för Tower Pro SG90 mikroservo.

SG90 har en 180-graders rotation, men vissa servos är 120-graders servos. Servos för radiostyrning för hobbybruk är oftast 120-graders servos, så se till att kontrollera databladet för servot som du vill manipulera eftersom det är möjligt att skada servon om du ger den en signal utanför räckvidden.

Detta är databladet för SG90, från Luxor Parts:

I databladet står det två viktiga saker: vilken färg som motsvarar positiv, jord och signal och pulsfrekvensen/arbetscykeln.

  • Brunt = negativt
  • Röd = positiv
  • Orange = signal

Och för pulsfrekvens/duty cycle

  • Du måste ha en arbetscykel på 20 ms eller 50 Hz.
  • En signal på 1ms = noll grader
  • En signal på 2ms = 180 grader roterad
Med en 1ms-signal roteras servotorn noll grader.

Detta innebär att servotypen söker efter en uppdatering varje ms. Om du fortsätter att skicka en 2 ms-signal till den kommer den att fortsätta att rotera fullt ut (180 grader). Om du ändrar den till 1,5 ms kommer den att rotera 90 grader och vid 1 ms kommer den att rotera noll grader.

Med en signal på 2 ms roteras servotypen 180 grader.

Anslutning av servotypen till Pico W

För att kunna använda vår kod måste du ansluta Signaltråd till GPIO 0. Signalkabeln är den orangea kabeln på SG90.

Anslut sedan den röda kabeln till VBUS (vilket ger dig 5V). Som du kan se i databladet är driftsspänningen för SG50 4,8V till 6V, så 3,3V-stiftet på Pico W fungerar inte.

Kodning av Pico W-servokontrollen

Du kan koden finns här på vår Github.

Vi går igenom koden.

main.py, som är en namnkonvention för den fil som vi vill köra vid uppstart, skapar vi en klass för servon och instansierar den:


class Servo:
    def __init__(self, MIN_DUTY=300000, MAX_DUTY=2300000, pin=0, freq=50):
        self.pwm = machine.PWM(machine.Pin(pin))
        self.pwm.freq(freq)
        self.MIN_DUTY = MIN_DUTY
        self.MAX_DUTY = MAX_DUTY
        
    def rotateDeg(self, deg):
        if deg < 0:
            deg = 0
        elif deg > 180:
            deg = 180
        duty_ns = int(self.MAX_DUTY - deg * (self.MAX_DUTY-self.MIN_DUTY)/180)
        self.pwm.duty_ns(duty_ns)

servo = Servo()

Servoklassen använder klassen machine.PWM som finns i MicroPython. Se dokumentationen här.

I det här exemplet använder vi Pico W som en åtkomstpunkt. Här är koden för att göra det möjligt:

ssid = 'Servo-Control'
password = 'PicoW-Servo'

ap = network.WLAN(network.AP_IF)
ap.config(essid=ssid, password=password)
ap.active(True)

while ap.active() == False:
  pass

print('Connection successful')
print(ap.ifconfig())

Som du kan se på de två första raderna är det SSID som du letar efter Servostyrning och lösenordet är PicoW-Servo.

När du har loggat in på WiFi-nätverket kan du gå till Pico W:s IP-adress, som som standard är 192.168.4.1. Alternativt kan du också kontrollera loggen på Thonny för att se vilken IP-adress din Pico har.

Hur kommunicerar webbsidan med servon?

Styrning av servoförskjutare

När du loggar in på Pico W:s IP-adress får du filen index.html, som finns på Github-repo.

I filen index.html finns dessa viktiga rader:

 <form id="form">
            <input type="range" class="slider" min="0" max="180" value="slider_value" name="servo" id="servo">
            <output></output>
        </form>

Som du kan se finns det ett -objekt som är reglaget.

Det finns också en som visar graden av rotation.

JavaScript-delen uppdaterar och uppdaterar URL:en så att Pico W kan fånga data och rotera servot.

Elementen och har ett överordnat element.

Här är skriptet på framsidan,

        <script>
            let i = document.getElementById('servo'),
                o = document.querySelector('output');

            o.innerHTML = i.value;

            i.addEventListener('input', function () {
              o.innerHTML = i.value;
            }, false);
            
            i.addEventListener('change', function ()  {
                document.getElementById("form").submit();
            }, false);
        </script>

Du ser två EventListeners här. När du interagerar med reglaget utlöses en uppdatering av -fältet och skickas in.

När skickas in får URL:n en parameter "servo=[grader]". Om du till exempel har dragit reglaget till 180, blir adressen "index.html?servo=180".

Denna parameter samlas in av Pico W:s backend (main.py), bearbetas för att hitta de grader som användaren har angett och sedan rotateDeg kallas.

        index = request.find('servo=') + len('servo=')
        if request[index].isdigit():
            offset = 1
            if request[index+1].isdigit():
                offset = 2
                if request[index+2].isdigit():
                    offset = 3
            deg = int(request[index:index+offset])
            print(deg)
        
            servo.rotateDeg(deg)

Praktisk användning

Ett servo är ett mycket viktigt mekaniskt verktyg att känna till eftersom det kan användas i många sammanhang. Faktum är att även komplicerade projekt som robotarmar består av många servos som arbetar tillsammans.

Nu kan du bygga ett projekt som släcker lamporna i ditt sovrum:

trådlös trådlös servokontroll för servokontakter
Servo vid full rotation, stänga av strömbrytaren

Å andra sidan kan du också bygga spannmålssorterare, som denna Tiny Sorter, som är tillverkad med hjälp av AI och en mikrokontroller.

Tiny Sorter från Google Creative Lab. (foto från Google)

Om du tittar noga på toppen där ögonen sitter, finns det ett SG90-servo bakom det.

Lämna en kommentar