Styr en servo med Raspberry Pi Pico W och PWM
En servo är ett av de mest grundläggande sätten att lära sig använda pulsbreddsmodulering (PWM) med Raspberry Pi. I den här artikeln ska jag visa dig hur du 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:
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.
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
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.
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.
På 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?
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 skjutreglaget.
Det finns också en som visar graden av rotation.
JavaScript-delen uppdaterar samt uppdaterar URL:en så att Pico W kan samla in data och rotera servon.
Elementen och har en överordnad .
Här är skriptet på framsidan,