Een servo besturen met Raspberry Pi Pico W en PWM

Een servo is een van de meest fundamentele manieren om pulsbreedtemodulatie (PWM) te leren gebruiken met de Raspberry Pi. In dit artikel laat ik je zien hoe je dit kunt doen met een Raspberry Pi Pico W.

PWM tutorial doelstellingen

Een servo met een Pico W en PWM
  • Leren hoe je PWM gebruikt om de hoek van de servo te regelen.
  • Een server opzetten met de Pico W
  • Server levert webpagina met schuifregelaar om servo te bedienen

Benodigde onderdelen

  • Raspberry Pi Pico W met headers
  • Verbindingsdraad
  • Servo (wij gebruiken de Tower Pro SG90 micro servo)

Wat is pulsbreedtemodulatie?

Kinderen vinden het amusant om het licht herhaaldelijk aan en uit te doen.

Voor hen is het amusant om het licht aan en uit te zien flikkeren als ze aan de lichtschakelaar draaien. Ouders vinden het misschien niet grappig, maar dit is een leermoment voor ons allemaal.

Als u of uw kinderen dat hebben gedaan, dan heeft u een primitieve vorm van pulsbreedtemodulatie meegemaakt.

Met een Raspberry Pi kun je dit gemakkelijk geautomatiseerd doen. In wezen vertel je de Raspberry Pi hoe vaak je dingen "AAN" wilt hebben in een bepaalde periode.

Hiermee kun je LED's dimmen:

picockpit gpio pwm afstandsbediening
LED-helderheid schakelen met de PWM-functie van PiCockpit

Ook kun je zo de hoek van de arm van de servo regelen.

Een belangrijk PWM-concept: de duty cycle

Een duty cycle is in feite de tijd dat het circuit "hoog" blijft, wat betekent dat het ingeschakeld is.

Dus, stel dat uw schakeling de helft van de tijd aanstaat. We kunnen dus zeggen dat de duty cycle op 50% ligt.

Als u hem de hele tijd aan heeft staan, is zijn activiteitscyclus 100%, en omgekeerd, als hij de hele tijd uit staat, is dat 0.

Illustratie van de activiteitscyclus van Sparkfun (CC BY-SA 4.0)

Om terug te komen op het voorbeeld van een kind dat in een regelmatig tempo het licht aan en uit doet: de reden waarom het licht niet volledig oplicht of volledig dimt, is dat wij slechts gedurende een bepaald deel van de tijd een spanning leveren.

Voor een LED betekent dit dat de LED gedurende een bepaalde tijd brandt, dan wordt er stroom afgenomen, dan wordt er weer stroom geleverd, en dat herhaalt zich.

De LED wordt dus nooit fel genoeg om zijn volle lichtsterkte te bereiken, noch heeft hij genoeg tijd om volledig donker te worden.

SG90 servobesturing met PWM

We moeten hier voorzichtig zijn, want niet alle servo's werken hetzelfde. Deze handleiding is specifiek voor de Tower Pro SG90 micro servo.

De SG90 heeft een rotatie van 180 graden, maar sommige servo's zijn servo's van 120 graden. Hobby-servo's voor radiocontrole zijn meestal 120-graden servo's, dus controleer de datasheet van de servo die je wilt manipuleren, want het is mogelijk servo's te beschadigen als je ze een signaal buiten het bereik geeft.

Dit is het gegevensblad voor de SG90, van Luxor Parts:

De datasheet vertelt u twee belangrijke dingen: welke kleur overeenkomt met positief, massa en signaal en de pulsfrequentie/bedrijfscyclus.

  • Bruin = negatief
  • Rood = positief
  • Oranje = signaal

En voor pulsfrequentie/bedrijfscyclus

  • U moet een duty cycle hebben van 20ms of 50Hz.
  • Een signaal van 1ms = nul graden
  • Een signaal van 2ms = 180 graden gedraaid
Met een signaal van 1 ms wordt de servo nul graden gedraaid.

Dit betekent dat de servo elke ms op zoek gaat naar een update. Als je hem een signaal van 2 ms blijft sturen, zal hij op volle toeren blijven draaien (180 graden). Verander je het in 1,5 ms, dan zal hij 90 graden draaien, en bij 1 ms zal hij nul graden gedraaid worden.

Bij een signaal van 2ms wordt de servo 180 graden gedraaid.

De servo aansluiten op de Pico W

Om onze code te gebruiken, moet u de signaaldraad naar GPIO 0. De signaaldraad is de oranje draad op de SG90.

Sluit dan de rode draad aan op VBUS (wat 5V oplevert). Zoals je kunt zien in de datasheet is de bedrijfsspanning voor de SG50 4,8V tot 6V, dus de 3,3V pin op de Pico W zal niet werken.

Codering van de Pico W servobesturing

U kunt vind de code hier op onze GitHub.

Laten we de code doornemen.

In main.py, wat een naamgevingsconventie is voor het bestand dat we bij het opstarten willen uitvoeren, maken we een klasse voor de servo en instantiëren die:


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()

De Servo-klasse gebruikt de machine.PWM-klasse die beschikbaar is in MicroPython. Zie documentatie hier.

In dit voorbeeld gebruiken we de Pico W als toegangspunt. Hier is de code om dat te laten gebeuren:

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())

Zoals u aan de eerste twee regels kunt zien, is de SSID die u zoekt Servobesturing en het wachtwoord is PicoW-Servo.

Zodra je je hebt aangemeld bij het WiFi-netwerk, kun je naar het IP-adres van de Pico W gaan, dat standaard 192.168.4.1 is. Je kunt ook in het logboek van Thonny kijken wat het IP-adres van je Pico is.

Hoe communiceert de webpagina met de servo?

Servo schuifregelaar

Wanneer u inlogt op het IP-adres van de Pico W, krijgt u het bestand index.html toegestuurd, dat te vinden is op de Github repo.

Het bestand index.html heeft deze belangrijke regels:

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

Zoals je kunt zien, is er een -object dat de schuifregelaar is.

Er is ook een die de rotatiegraad weergeeft.

Het JavaScript-gedeelte werkt de en de URL bij, zodat de Pico W de gegevens kan vastleggen en de servo kan draaien.

De en elementen hebben een parent.

Hier is het script aan de voorkant,