
Turinys:
- 1 žingsnis: „BoM - Bill of Material“
- 2 veiksmas: kaip veikia PWM
- 3 žingsnis: Hw įdiegimas
- 4 žingsnis: Servo kalibravimas
- 5 veiksmas: sukurkite „Python“scenarijų
- 6 žingsnis: „Pan-Tilt“mechanizmas
- 7 žingsnis: „Pan -Tilt“mechanizmas - mechaninė konstrukcija
- 8 veiksmas: elektrinės plokštės/pakreipimo surinkimas
- 9 veiksmas: „Python“scenarijus
- 10 veiksmas: serverių ciklo testas
- 11 žingsnis: Išvada
2025 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2025-01-23 14:59

Šioje pamokoje mes išnagrinėsime, kaip valdyti kelias servo sistemas naudojant „Python“„Raspberry Pi“. Mūsų tikslas bus PAN/TILT mechanizmas, skirtas fotoaparatui („PiCam“) nustatyti.
Čia galite pamatyti, kaip veiks mūsų galutinis projektas:
Valdymo servo valdymo kilpos bandymas:

1 žingsnis: „BoM - Bill of Material“
Pagrindinės dalys:
- „Raspberry Pi V3“- 32,00 USD
- 5 megapikselių 1080p jutiklis OV5647 mini kameros vaizdo modulis - 13,00 USD
- „TowerPro SG90 9G“180 laipsnių „Micro Servo“(2 X)- 4,00 USD
- „Mini Pan/ Tilt“fotoaparato platformos anti -vibracijos kameros laikiklis su 2 servo (*) - 8,00 USD
- Rezistorius 1K omas (2X) - neprivaloma
- Įvairūs: metalinės dalys, juostos ir kt. (Jei sukursite „Pan/Tilt“mechanizmą)
(*) galite nusipirkti pilną „Pan/Tilt“platformą su servo servisais arba sukurti savo.
2 veiksmas: kaip veikia PWM
„Raspberry Pi“neturi analoginio išvesties, tačiau mes galime tai imituoti naudodami PWM (impulso pločio moduliacijos) metodą. Ką mes padarysime, tai sugeneruosime fiksuoto dažnio skaitmeninį signalą, kuriame pakeisime impulsinio traukinio plotį, kuris bus „išverstas“kaip „vidutinis“išėjimo įtampos lygis, kaip parodyta žemiau:

Mes galime naudoti šį „vidutinį“įtampos lygį LED šviesumui valdyti, pavyzdžiui:

Atkreipkite dėmesį, kad čia svarbu ne pats dažnis, o „darbo ciklas“, tai yra santykis tarp laiko, kai pulsas yra „didelis“, padalytas iš bangos periodo. Pavyzdžiui, tarkime, kad mes sukursime 50 Hz impulsų dažnį viename iš mūsų Raspberry Pi GPIO. Laikotarpis (p) bus atvirkštinis dažnis arba 20 ms (1/f). Jei norime, kad mūsų šviesos diodas būtų „perpus“šviesus, turime turėti 50%darbo ciklą, o tai reiškia „impulsą“, kuris bus „didelis“10 ms.
Šis principas mums bus labai svarbus, norint valdyti savo servo padėtį, kai „darbo ciklas“nustatys servo padėtį, kaip parodyta žemiau:
Servo
3 žingsnis: Hw įdiegimas


Servos bus prijungtos prie išorinio 5 V maitinimo šaltinio, o jų duomenų kaištis (mano atveju - geltona instaliacija) bus prijungtas prie „Raspberry Pi GPIO“, kaip nurodyta toliau:
- GPIO 17 ==> Tilt Servo
- GPIO 27 ==> „Pan Servo“
Nepamirškite prijungti GND kartu ==> Raspberry Pi - Servos - išorinis maitinimo šaltinis)
Galite pasirinkti 1K omo rezistorių tarp „Raspberry Pi GPIO“ir serverio duomenų įvesties kaiščio. Tai apsaugotų jūsų RPi esant servo problemai.
4 žingsnis: Servo kalibravimas



Pirmas dalykas, kurį reikia padaryti, yra patvirtinti pagrindines jūsų servo savybes. Mano atveju aš naudoju „Power Pro SG90“.
Iš jo duomenų lapo galime apsvarstyti:
- Diapazonas: 180o
- Maitinimo šaltinis: 4.8V (išorinis 5VDC kaip USB maitinimo šaltinis veikia gerai)
- Darbinis dažnis: 50Hz (periodas: 20 ms)
- Impulsų plotis: nuo 1 ms iki 2 ms
Teoriškai servo bus ant jo
- Pradinė padėtis (0 laipsnių), kai jos duomenų terminale yra taikomas 1 ms impulsas
- Neutrali padėtis (90 laipsnių), kai jos duomenų terminale veikiamas 1,5 ms impulsas
- Galutinė padėtis (180 laipsnių), kai jos duomenų terminale veikiamas 2 ms impulsas
Norint programuoti servo padėtį naudojant „Python“, bus labai svarbu žinoti aukščiau nurodytų pozicijų korespondentą „Darbo ciklas“, atlikime keletą skaičiavimų:
- Pradinė padėtis ==> (0 laipsnių) Pulso plotis ==> 1ms ==> Darbo ciklas = 1ms/20ms ==> 2,0%
- Neutrali padėtis (90 laipsnių) Pulso plotis 1,5 ms ==> Darbo ciklas = 1,5 ms/20 ms ==> 7,5%
- Galutinė padėtis (180 laipsnių) Impulsų plotis 2 ms ==> Darbo ciklas = 2ms/20ms ==> 10%
Taigi darbo ciklas turėtų svyruoti nuo 2 iki 10 %.
Išbandykime servus atskirai. Norėdami tai padaryti, atidarykite „Raspberry“terminalą ir paleiskite „Python 3“apvalkalo redaktorių kaip „sudo“(nes jūs turite būti „super vartotojas“, tvarkantis su GPIO):
sudo python3
„Python Shell“
>>
Importuokite RPI. GPIO modulį ir pavadinkite jį GPIO:
importuoti RPi. GPIO kaip GPIO
Apibrėžkite, kurias PIN kodų schemas norite naudoti (BCM arba BOARD). Aš atlikau šį testą su BOARD, todėl kaiščiai, kuriuos naudojau, buvo fiziniai smeigtukai (GPIO 17 = Pin 11 ir GPIO 27 Pin 13). Man buvo lengva juos atpažinti ir nepadaryti klaidų testo metu (galutinėje programoje naudosiu BCM). Pasirinkite vieną iš jūsų pageidavimų:
GPIO.setmode (GPIO. BOARD)
Apibrėžkite naudojamą servo kaištį:
tiltPin = 11
Jei vietoj to naudojote BCM schemą, paskutines 2 komandas reikia pakeisti:
GPIO.setmode (GPIO. BCM)
tiltPin = 17
Dabar turime nurodyti, kad šis kaištis bus „išvestis“
GPIO nustatymas (tiltPin, GPIO. OUT)
Ir koks bus šio kaiščio generuojamas dažnis, kad mūsų servo bus 50 Hz:
pakreipti = GPIO. PWM (tiltPin, 50)
Dabar pradėkime generuoti PWM signalą ant kaiščio su pradiniu darbo ciklu (mes jį išlaikysime „0“):
pakreipti = pradėti (0)
Dabar galite įvesti skirtingas darbo ciklo vertes, stebėdami savo servo judėjimą. Pradėkime nuo 2% ir pažiūrėkime, kas atsitiks (matome, kad servo sistema eina į „nulinę padėtį“):
tilt. ChangeDutyCycle (2)
Mano atveju, servo sistema nukrypo į nulinę padėtį, bet kai pakeičiau darbo ciklą į 3%, pastebėjau, kad servo sistema liko toje pačioje padėtyje ir pradėjo judėti, kai darbo ciklai yra didesni nei 3%. Taigi, 3% yra mano pradinė padėtis (o laipsniai). Tas pats atsitiko su 10%, mano servo lygis viršijo šią vertę ir viršijo 13%. Taigi šio konkretaus servo rezultatas buvo toks:
- 0 laipsnių ==> darbo ciklas 3%
- 90 laipsnių ==> darbo ciklas 8%
- 180 laipsnių ==> darbo ciklas 13%
Baigę testus, turite sustabdyti PWM ir išvalyti GPIO:
pakreipti = sustoti ()
GPIO.cleanup ()
Aukščiau pateiktame terminalo spausdinimo ekrane rodomas abiejų mano servo (kurio rezultatai panašūs) rezultatas. Jūsų diapazonas gali būti skirtingas.
5 veiksmas: sukurkite „Python“scenarijų

PWM komandos, siunčiamos į mūsų servo, yra „darbo cikluose“, kaip matėme paskutiniame žingsnyje. Tačiau paprastai „servo“valdymui turime naudoti „kampą“laipsniais. Taigi, mes turime konvertuoti „kampą“, kuris yra natūralesnis matavimas, kad mes veikimo cikle, kaip tai suprantama mūsų Pi.
Kaip tai padaryti? Labai paprasta! Mes žinome, kad darbo ciklo diapazonas svyruoja nuo 3% iki 13% ir kad tai atitinka kampus, kurie svyruoja nuo 0 iki 180 laipsnių. Be to, mes žinome, kad tie variantai yra tiesiniai, todėl galime sukurti proporcingą schemą, kaip parodyta aukščiau. Taigi, atsižvelgiant į kampą, galime turėti atitinkamą darbo ciklą:
darbo ciklas = kampas/18 + 3
Laikykitės šios formulės. Mes jį naudosime kitame kode.
Sukurkime „Python“scenarijų testams atlikti. Iš esmės pakartosime tai, ką darėme anksčiau „Python Shell“:
iš laiko importuoti miegą
importuoti RPi. GPIO kaip GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) def setServoAngle (servo, kampas): pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = angle / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) miegas (0,3) pwm.stop () if _name_ == '_main_': import sys servo = int (sys.argv [1]) GPIO.setup (servo, GPIO. OUT) setServoAngle (servo, int (sys.argv [2]))) GPIO.cleanup ()
Aukščiau pateikto kodo esmė yra funkcija setServoAngle (servo, kampas). Ši funkcija gauna kaip argumentus, servo GPIO numerį ir kampo vertę, kur turi būti padėtas servo. Kai šios funkcijos įvestis yra „kampas“, turime ją konvertuoti į darbo ciklą procentais, naudodami anksčiau sukurtą formulę.
Kai scenarijus vykdomas, turite įvesti kaip parametrus, servo GPIO ir kampą.
Pavyzdžiui:
sudo python3 kampasServoCtrl.py 17 45
Aukščiau pateikta komanda nustatys „GPIO 17“prijungtą servo sistemą 45 laipsnių aukštyje. Panaši komanda gali būti naudojama „Pan Servo“valdymui (padėtis iki 45 laipsnių „azimute“):
45. „Sudo python“kampas
Failą angleServoCtrl.py galima atsisiųsti iš „GitHub“
6 žingsnis: „Pan-Tilt“mechanizmas

„Pan“servo sistema „fotoaparatą“perkels „horizontaliai“(„azimuto kampas“), o „Tilt“- „vertikaliai“(pakėlimo kampas).
Žemiau esančiame paveikslėlyje parodyta, kaip veikia „Pan/Tilt“mechanizmas:

Vystydamiesi mes nesileisime į „kraštutinumus“ir naudosime tik „Pan/Tilt“mechanizmą nuo 30 iki 150 laipsnių. Šio diapazono užteks naudoti su fotoaparatu.
7 žingsnis: „Pan -Tilt“mechanizmas - mechaninė konstrukcija



Dabar surinkime 2 servo sistemas kaip „Pan/Tilt“mechanizmą. Čia galite padaryti 2 dalykus. Pirkite „Pan-Tilt“platformos mechanizmą, kaip parodyta paskutiniame žingsnyje, arba susikurkite savo pagal savo poreikius.
Vienas iš pavyzdžių gali būti tas, kurį aš sukūriau, tik pririšdamas servo servisus vienas prie kito ir naudodamas mažus metalinius gabalus iš senų žaislų, kaip parodyta aukščiau esančiose nuotraukose.
8 veiksmas: elektrinės plokštės/pakreipimo surinkimas




Surinkę „Pan/Tilt“mechanizmą, vadovaukitės nuotraukomis, kad gautumėte visą elektros jungtį.
- Išjunkite „Pi“.
- Atlikite visas elektros jungtis.
- Dukart patikrinkite.
- Pirmiausia įjunkite „Pi“.
- Jei viskas gerai, įjunkite savo servus.
Šioje pamokoje nenagrinėsime, kaip nustatyti fotoaparatą, tai bus paaiškinta kitoje pamokoje.
9 veiksmas: „Python“scenarijus
Sukurkime „Python“scenarijų, kad vienu metu valdytume abu servus:
iš laiko importuoti miegą
importuoti RPi. GPIO kaip GPIO GPIO.setmode (GPIO. BCM) GPIO.setwingsings (False) pan = 27 tilt = 17 GPIO.setup (tilt, GPIO. OUT) # white => TILT GPIO.setup (pan, GPIO. OUT) # pilka ==> PAN def setServoAngle (servo, kampas): tvirtinimo kampas> = 30 ir kampas 90 (vidurinis taškas) ==> 150 setServoAngle (pakreipimas, int (sys.argv [2])) # 30 ==> 90 (vidurinis taškas) ==> 150 GPIO. Valymas ()
Vykdant scenarijų, kaip parametrus turite įvesti „Pan kampas“ir „Pakreipimo kampas“. Pavyzdžiui:
sudo python3 servoCtrl.py 45 120
Aukščiau pateikta komanda nustatys „Pan/Tilt“mechanizmą 45 laipsnių „azimutu“(pasukimo kampu) ir 120 laipsnių „pakilimu“(pakreipimo kampas). Atminkite, kad jei neįvedami jokie parametrai, numatytasis nustatymas yra tiek pasukimo, tiek pakreipimo kampai, nustatyti iki 90 laipsnių.
Žemiau galite pamatyti keletą testų:

ServoCtrl.py failą galima atsisiųsti iš „GitHub“.
10 veiksmas: serverių ciklo testas
Dabar sukurkime „Python“scenarijų, kad automatiškai išbandytume visą servo seriją:
iš laiko importuoti miegą
importuoti RPi. GPIO kaip GPIO GPIO.setmode (GPIO. BCM) GPIO.setwingsings (False) pan = 27 tilt = 17 GPIO.setup (tilt, GPIO. OUT) # white => TILT GPIO.setup (pan, GPIO. OUT) # pilka ==> PAN def setServoAngle (servo, kampas): įtvirtinimo kampas> = 30 ir kampas <= 150 pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = kampas / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) miego režimas (0,3) pwm.stop (), jei _name_ == '_main_': i diapazone (30, 160, 15): setServoAngle (pan, i) setServoAngle (tilt, i) for i in diapazonas (150, 30, -15): setServoAngle (pan, i) setServoAngle (tilt, i) setServoAngle (pan, 100) setServoAngle (pakreipimas, 90) GPIO.cleanup ()
Programa automatiškai atliks kilpą nuo 30 iki 150 laipsnių abiem kampais.
Žemiau rezultato:
Aš prijungiau osciloskopą tik norėdamas iliustruoti PWM teoriją, kaip paaiškinta anksčiau.

Pirmiau pateiktą kodą servoTest.py galima atsisiųsti iš „GitHub“.
11 žingsnis: Išvada

Kaip visada, tikiuosi, kad šis projektas gali padėti kitiems rasti kelią į jaudinantį elektronikos pasaulį!
Norėdami gauti daugiau informacijos ir galutinį kodą, apsilankykite mano „GitHub“saugykloje: „RPi-Pan-Tilt-Servo-Control“
Norėdami gauti daugiau projektų, apsilankykite mano tinklaraštyje: MJRoBot.org
Žemiau žvilgsnis į kitą mano vadovėlį:

Saludos iš pasaulio pietų!
Iki pasimatymo mano kitoje pamokoje!
Ačiū, Marcelo
Rekomenduojamas:
Pasidaryk pats „Servo“variklio kampo valdymas naudojant „Visuino“sekos komponentą: 10 žingsnių

„Pasidaryk pats“Kaip valdyti servo variklio kampą naudojant „Visuino“sekos komponentą: Šioje pamokoje mes naudosime „Servo Motor“ir „Arduino UNO“bei „Visuino“, kad valdytume servo variklio kampą naudodami sekos komponentą. Sekos komponentas puikiai tinka situacijoms, kai norime paleisti kelis įvykius iš eilės mūsų atveju servo variklio degr
Šešiakampis „Arduino Pololu Maestro Servo“valdymas: 11 žingsnių

Šešiakampis „Arduino Pololu Maestro Servo“valdymas: Nach dem mein erster Versuch mit einem Hexapod, daran gescheitert war das die servos zu schwach waren jetzt ein neuer Versuch mit mit 10Kg Servos aus HK. Ausserdem habe ich mich für ein neuen Sevocontroller von Pololu entschieden
Ryškumo valdymas PWM pagrįstas LED valdymas naudojant mygtukus, „Raspberry Pi“ir „Scratch“: 8 žingsniai (su nuotraukomis)

Ryškumo valdymas PWM pagrįstas LED valdymas naudojant mygtukus, „Raspberry Pi“ir „Scratch“: bandžiau rasti būdą, kaip paaiškinti, kaip PWM veikė mano mokiniams, todėl iškėliau sau užduotį pabandyti valdyti šviesos diodo ryškumą naudojant du mygtukus - vienas mygtukas padidina šviesos diodo ryškumą, o kitas - jį pritemdo. Programa
ESP8266 RGB LED juostelės WIFI valdymas - „NODEMCU“kaip IR nuotolinio valdymo pultas „Led Strip“, valdomas per „Wifi“- RGB LED STRIP išmaniojo telefono valdymas: 4 žingsniai

ESP8266 RGB LED juostelės WIFI valdymas | „NODEMCU“kaip IR nuotolinio valdymo pultas „Led Strip“, valdomas per „Wifi“| „RGB LED STRIP“išmaniojo telefono valdymas: Sveiki vaikinai, šioje pamokoje mes išmoksime naudoti „nodemcu“arba „esp8266“kaip IR nuotolinio valdymo pultą, norint valdyti RGB LED juostą, o „Nodemcu“bus valdomas išmaniuoju telefonu per „Wi -Fi“. Taigi iš esmės galite valdyti RGB LED juostelę savo išmaniuoju telefonu
3 servo variklių valdymas naudojant 3 potenciometrus ir „Arduino“: 11 žingsnių (su nuotraukomis)

3 servo variklių valdymas naudojant 3 potenciometrus ir „Arduino“: Sveiki. Tai pirmas mano pamokomas dalykas, todėl tikiuosi, kad būsite kantrūs su manimi, jei padarysiu klaidų jį nustatydamas. Jis parašytas pradedantiesiems, todėl labiau pažengusieji tarp jūsų gali daug ką praleisti ir tiesiog pradėti jį prijungti. Tikslas, kurį nustatiau „mysel“