ESP8266 WiFi – Servo’s aansturen (SGXX) (NodeMCU)
Op deze pagina vind je een voorbeeld om via de ESP-01 module een servo (SG-XX) aan te sturen via de GPIO pinnen met de firmware NodeMCU.
Hardware
Deze mini servo’s kunnen 180 graden draaien (als je de beveiliging eruit haalt 360 graden), de servo wordt veelal gebruikt in vliegtuig modelbouw, andere toepassingen zijn uiteraard ook mogelijk.
Specificaties:
- Modulatie: Analoog
- Krachtkoppel: 1.80 kg-cm (op 4.8 volt)
- Snelheid: 0.10 sec/60° (op 4.8 volt)
- Motor Type: 3-polig
- Tandwiel Type: Plastic
- Maximale draairichting: 180°
- Pulse breedte: 500-2400 µs
Pinout
Draadkleur: | Functie: |
---|---|
Rood | +5v |
Bruin | GND |
Oranje | Data (stuur signaal) |
Hoe werkt het?
Deze mini servo werkt met PWM (Pulse Width Modulation), volgens de documentatie:
– ca. 2.5 ms puls voor positie naar rechts.
– 1.5 ms puls voor het midden.
– ca. 0.5 ms puls voor positie naar links.
Wat heb je nodig?
1) ESPlorer IDE
Sluit de servo aan volgens onderstaand schema:
Getest op firmware: nodemcu_float_0.9.6-dev_20150704.bin
Upload deze “library” code als servo.lua
Tip: Download de code sla het op als bestand, en gebruik de “Upload…” knop in ESPlorer.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
-- -- define a servo entry where left is the servo value -- at which it is at 0 degrees and right is the value -- at which it is at 180 degrees. -- -- example: -- defineservo(4,200,1850) -- -- the parameters are saved in servoleft and servoright -- and a timernumber is generated and remembered so you -- can change multiple servo's at the same time -- function defineservo (pin, left, right) if not servoleft then servoleft = {} end if not servoright then servoright = {} end if not servotimer then servotimer = {} end servoleft[pin] = left servoright[pin] = right servotimer[pin] = 2+#servotimer gpio.mode(pin,gpio.OUTPUT) end -- -- move the servo on the specified pin to value servovalue -- this is done in 25 steps -- function setservovalue (pin, svalue) local cnt = 25 local tmrnum if not servotimer or not servotimer[pin] then tmrnum = 2 else tmrnum = servotimer[pin] end servovalue = math.min(2000,math.max(svalue,0)) tmr.alarm(tmrnum,20,1,function() if servovalue and servovalue>0 then gpio.write(pin, gpio.HIGH) tmr.delay(servovalue) gpio.write(pin, gpio.LOW) end cnt = cnt-1 if cnt<=0 then tmr.stop(tmrnum) end end) end -- -- after you've defined the servo, you can set the angle -- with this function -- function setservo (pin, angle) local servovalue if servoleft[pin] and servoright[pin] then servovalue = (servoright[pin]-servoleft[pin])/180*angle+servoleft[pin] else servovalue = 2000/180*angle end setservovalue(pin,servovalue) end |
Je kan nu bovenstaande bibliotheek aanroepen om de servo te configureren en in te stellen:
require('servo')
De hoek van de servo (1 t/m 180 graden) kan ingesteld worden met een getal tussen de 0 en 2000, met deze functie kun je de pin van de servo instellen en de juiste draaihoek (praktijktest)
defineservo([pin],[links],[rechts])
bijvoorbeeld: defineservo(4,0,1700)
Met deze functie kun je een waarde opgeven tussen de 1 en 2000:
setservovalue (pin, svalue)
Om het makkelijk te maken is er een andere functie om de hoek in te stellen:
setservo([pin], [hoek])
bijvoorbeeld: setservo(4, 180)
Let op: helaas werken er geen timers met de bibliotheek, je kan de hoek instellen per LUA script en deze aanroepen:
1 2 3 |
require('servo') defineservo(4,0,1800) setservo(4, 1) |
1 2 3 |
require('servo') defineservo(4,0,1800) setservo(4, 90) |
1 2 3 |
require('servo') defineservo(4,0,1800) setservo(4, 180) |
Bron:
piandmore.wordpress.com