
Obsah:
- Krok 1: BoM - kusovník
- Krok 2: Jak PWM funguje
- Krok 3: Instalace Hw
- Krok 4: Kalibrace serva
- Krok 5: Vytvoření skriptu Python
- Krok 6: Mechanismus naklápění
- Krok 7: Mechanismus naklápění - mechanická konstrukce
- Krok 8: Elektrická sestava otáčení/naklánění
- Krok 9: Skript Python
- Krok 10: Smyčkový test serverů
- Krok 11: Závěr
2025 Autor: John Day | [email protected]. Naposledy změněno: 2025-01-23 14:38

V tomto kurzu prozkoumáme, jak ovládat více serv pomocí Pythonu na Raspberry Pi. Naším cílem bude mechanismus PAN/TILT pro umístění kamery (PiCam).
Zde můžete vidět, jak bude náš konečný projekt fungovat:
Ovládací servo Ovládací test smyčky:

Krok 1: BoM - kusovník
Hlavní části:
- Raspberry Pi V3 - 32,00 USD
- 5megapixelový senzor 1080p Mini kamerový video modul OV5647 - US $ 13,00
- TowerPro SG90 9G 180 stupňů Micro Servo (2 X)- 4,00 USD
- Mini Pan/ Tilt Camera Platform Anti -Vibration Camera Mount w/ 2 Servos (*) - US $ 8.00
- Rezistor 1K ohm (2X) - volitelný
- Různé: kovové části, pásy atd. (V případě, že budete konstruovat svůj mechanismus otáčení/naklánění)
(*) můžete si zakoupit kompletní platformu Pan/Tilt se servy nebo si postavit vlastní.
Krok 2: Jak PWM funguje
Raspberry Pi nemá žádný analogový výstup, ale můžeme to simulovat pomocí přístupu PWM (Pulse Width Modulation). Co budeme dělat, je generovat digitální signál s pevnou frekvencí, kde změníme šířku sledu pulzů, což bude „přeloženo“jako „průměrná“úroveň výstupního napětí, jak je uvedeno níže:

Tuto „průměrnou“úroveň napětí můžeme použít k ovládání jasu LED například:

Všimněte si, že zde není důležitá samotná frekvence, ale „Duty Cycle“, to je vztah mezi časem, kdy jsou pulsy „vysoké“, děleno vlnovou periodou. Předpokládejme například, že na jednom z našich Raspberry Pi GPIO budeme generovat pulzní frekvenci 50 Hz. Perioda (p) bude inverzní k frekvenci nebo 20 ms (1/f). Pokud chceme, aby naše LED s „polovičním“jasem, musíme mít pracovní cyklus 50%, to znamená „puls“, který bude „vysoký“po dobu 10 ms.
Tato zásada bude pro nás velmi důležitá pro ovládání polohy serva, jakmile „pracovní cyklus“definuje polohu serva, jak je uvedeno níže:
Servo
Krok 3: Instalace Hw


Serva budou připojena k externímu 5V napájení, přičemž jejich datový pin (v mém případě jejich žluté zapojení) bude připojen k Raspberry Pi GPIO, jak je uvedeno níže:
- GPIO 17 ==> Naklápěcí servo
- GPIO 27 ==> Pan Servo
Nezapomeňte propojit GND dohromady ==> Raspberry Pi - serva - externí napájecí zdroj)
Mezi pinem Raspberry Pi GPIO a datovým vstupem serveru můžete mít volitelně odpor 1 K ohm. To by ochránilo vaše RPi v případě problému se servem.
Krok 4: Kalibrace serva



První věcí, kterou musíte udělat, je potvrdit hlavní charakteristiky vašich serv. V mém případě používám Power Pro SG90.
Z jeho datového listu můžeme zvážit:
- Rozsah: 180o
- Napájení: 4,8 V (externí 5 V DC jako napájecí zdroj USB funguje dobře)
- Pracovní frekvence: 50 Hz (Období: 20 ms)
- Šířka pulsu: od 1 ms do 2 ms
Servo bude teoreticky na svém
- Počáteční poloha (0 stupňů), když je na jeho datový terminál aplikován impuls 1 ms
- Neutrální poloha (90 stupňů), když je na jeho datový terminál aplikován impuls 1,5 ms
- Konečná poloha (180 stupňů), když je na jeho datový terminál aplikován impuls 2 ms
Chcete -li naprogramovat polohu serva pomocí Pythonu, bude velmi důležité znát odpovídající „pracovní cyklus“pro výše uvedené pozice, udělejme nějaký výpočet:
- Počáteční poloha ==> (0 stupňů) Šířka pulsu ==> 1ms ==> Pracovní cyklus = 1ms/20ms ==> 2,0%
- Neutrální poloha (90 stupňů) Šířka pulsu 1,5 ms ==> Pracovní cyklus = 1,5 ms/20 ms ==> 7,5%
- Konečná poloha (180 stupňů) Šířka pulsu 2 ms ==> Pracovní cyklus = 2ms/20ms ==> 10%
Pracovní cyklus by se tedy měl pohybovat v rozmezí 2 až 10 %.
Pojďme vyzkoušet jednotlivá serva. Chcete -li to provést, otevřete terminál Raspberry a spusťte editor prostředí Python 3 jako „sudo“(protože byste měli být „superuživatelem“pro práci s GPIO):
sudo python3
Na prostředí Python Shell
>>
Importujte modul RPI. GPIO a nazvěte jej GPIO:
importujte RPi. GPIO jako GPIO
Definujte, která schémata číslování pinů chcete použít (BCM nebo BOARD). Tento test jsem provedl s BOARD, takže piny, které jsem použil, byly fyzické piny (GPIO 17 = Pin 11 a GPIO 27 Pin 13). Bylo pro mě snadné je identifikovat a během testu nedělat chyby (V závěrečném programu použiji BCM). Vyberte si jednu z vašich preferencí:
GPIO.setmode (GPIO. BOARD)
Definujte servo pin, který používáte:
tiltPin = 11
Pokud jste místo toho použili schéma BCM, poslední 2 příkazy by měly být nahrazeny:
GPIO.setmode (GPIO. BCM)
tiltPin = 17
Nyní musíme určit, že tento pin bude „výstupem“
GPIO.setup (tiltPin, GPIO. OUT)
A jaká bude frekvence generovaná na tomto pinu, že pro naše servo bude 50 Hz:
tilt = GPIO. PWM (tiltPin, 50)
Nyní začněme generovat signál PWM na pinu s počátečním pracovním cyklem (ponecháme jej "0"):
náklon = začátek (0)
Nyní můžete zadávat různé hodnoty pracovního cyklu a sledovat pohyb svého serva. Začněme 2% a uvidíme, co se stane (vidíme, že servo přejde do „nulové polohy“):
tilt. ChangeDutyCycle (2)
V mém případě se servo dostalo do nulové polohy, ale když jsem změnil pracovní cyklus na 3%, zjistil jsem, že servo zůstalo ve stejné poloze a začalo se pohybovat s pracovními cykly většími než 3%. Moje počáteční pozice (o stupně) jsou tedy 3%. Totéž se stalo s 10%, moje servo se dostalo nad tuto hodnotu a dosáhlo konce na 13%. Takže pro toto konkrétní servo byl výsledek:
- 0 stupeň ==> pracovní cyklus 3%
- 90 stupňů ==> pracovní cyklus 8%
- 180 stupňů ==> pracovní cyklus 13%
Po dokončení testů musíte zastavit PWM a vyčistit GPIO:
tilt = stop ()
GPIO.cleanup ()
Výše uvedená obrazovka Terminálového tisku zobrazuje výsledek pro obě moje serva (která má podobné výsledky). Váš dosah může být odlišný.
Krok 5: Vytvoření skriptu Python

Jak jsme viděli v posledním kroku, příkazy PWM, které mají být odeslány na naše servo, jsou v „pracovních cyklech“. Obvykle však musíme jako parametr pro ovládání serva použít „úhel“ve stupních. Musíme tedy převést „úhel“, který je pro nás v pracovním cyklu přirozenějším měřením, jak je pochopitelné pro naše Pi.
Jak to udělat? Velmi jednoduché! Víme, že rozsah pracovního cyklu se pohybuje od 3% do 13% a že je ekvivalentní úhlům, které se budou pohybovat od 0 do 180 stupňů. Také víme, že tyto variace jsou lineární, takže můžeme sestrojit proporcionální schéma, jak je uvedeno výše. takže vzhledem k úhlu můžeme mít odpovídající pracovní cyklus:
pracovní cyklus = úhel/18 + 3
Dodržujte tento vzorec. Použijeme to v dalším kódu.
Vytvořme skript Pythonu pro provedení testů. V zásadě budeme opakovat to, co jsme dělali dříve na Python Shell:
z časového importu spánku
importujte RPi. GPIO jako GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) def setServoAngle (servo, úhel): pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = úhel / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) spánek (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 ()
Jádrem výše uvedeného kódu je funkce setServoAngle (servo, úhel). Tato funkce přijímá jako argumenty, číslo GPIO serva a hodnotu úhlu, kam musí být servo umístěno. Jakmile je vstup této funkce „úhel“, musíme ji převést na pracovní cyklus v procentech podle vzorce vyvinutého dříve.
Když je skript spuštěn, musíte zadat jako parametry, servo GPIO a úhel.
Například:
sudo python3 angleServoCtrl.py 17 45
Výše uvedený příkaz umístí servo připojené k GPIO 17 o 45 stupňů ve „výšce“. Podobný příkaz lze použít pro ovládání Pan Servo (poloha do 45 stupňů v „azimutu“):
sudo python angleServoCtrl.py 27 45
Soubor AngleServoCtrl.py lze stáhnout z mého GitHubu
Krok 6: Mechanismus naklápění

Servo „Pan“bude pohybovat „horizontálně“naší kamerou („azimutální úhel“) a naše „Tilt“servo jej bude pohybovat „vertikálně“(elevační úhel).
Následující obrázek ukazuje, jak funguje mechanismus Pan/Tilt:

Během našeho vývoje nepůjdeme do „extrémů“a budeme používat náš mechanismus Pan/Tilt pouze od 30 do 150 stupňů. Tento rozsah bude stačit k použití s fotoaparátem.
Krok 7: Mechanismus naklápění - mechanická konstrukce



Pojďme nyní sestavit naše 2 serva jako mechanismus Pan/Tilt. Zde můžete dělat 2 věci. Kupte si platformový mechanismus Pan-Tilt jako na posledním kroku nebo si postavte vlastní podle svých potřeb.
Jedním příkladem může být ten, který jsem postavil, pouze jsem páskoval serva k sobě a používal malé kovové kousky ze starých hraček, jak je vidět na fotografiích výše.
Krok 8: Elektrická sestava otáčení/naklánění




Jakmile budete mít svůj mechanismus otáčení/naklápění sestavený, postupujte podle fotografií, abyste získali úplné elektrické připojení.
- Vypněte Pi.
- Proveďte všechna elektrická připojení.
- Dvakrát to zkontrolujte.
- Nejprve zapněte Pi.
- Pokud je vše v pořádku, zapněte serva.
V tomto tutoriálu nebudeme zkoumat, jak nastavit kameru, to bude vysvětleno v dalším tutoriálu.
Krok 9: Skript Python
Vytvořme skript Pythonu pro ovládání obou serv současně:
z časového importu spánku
import RPi. GPIO jako GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) pan = 27 tilt = 17 GPIO.setup (tilt, GPIO. OUT) # white => TILT GPIO.setup (pan, GPIO. OUT) # grey ==> PAN def setServoAngle (servo, angle): assert angle> = 30 and angle 90 (middle point) ==> 150 setServoAngle (tilt, int (sys.argv [2])) # 30 ==> 90 (střední bod) ==> 150 GPIO.cleanup ()
Když je skript spuštěn, musíte zadat jako parametry úhel posunu a úhel náklonu. Například:
sudo python3 servoCtrl.py 45 120
Výše uvedený příkaz umístí mechanismus Pan/Tilt o 45 stupňů v „azimutu“(úhel Pan) a 120 stupních „elevace“(úhel náklonu). Všimněte si toho, že pokud nejsou zadány žádné parametry, výchozí budou úhly otáčení a náklonu nastaveny až na 90 stupňů.
Níže můžete vidět několik testů:

Soubor servoCtrl.py lze stáhnout z mého GitHubu.
Krok 10: Smyčkový test serverů
Pojďme nyní vytvořit skript Pythonu, který automaticky otestuje celou řadu serv:
z časového importu spánku
import RPi. GPIO jako GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) pan = 27 tilt = 17 GPIO.setup (tilt, GPIO. OUT) # white => TILT GPIO.setup (pan, GPIO. OUT) # grey ==> PAN def setServoAngle (servo, angle): assert angle> = 30 and angle <= 150 pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = angle / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) sleep (0,3) pwm.stop () if _name_ == '_main_': for i in range (30, 160, 15): setServoAngle (pan, i) setServoAngle (tilt, i) for i in rozsah (150, 30, -15): setServoAngle (pan, i) setServoAngle (tilt, i) setServoAngle (pan, 100) setServoAngle (tilt, 90) GPIO.cleanup ()
Program automaticky spustí smyčku od 30 do 150 stupňů v obou úhlech.
Pod výsledkem:
Osciloskop jsem připojil pouze pro ilustraci teorie PWM, jak bylo vysvětleno dříve.

Výše uvedený kód servoTest.py lze stáhnout z mého GitHubu.
Krok 11: Závěr

Jako vždy doufám, že tento projekt pomůže ostatním najít cestu do vzrušujícího světa elektroniky!
Podrobnosti a konečný kód naleznete v mém depozitáři GitHub: RPi-Pan-Tilt-Servo-Control
Pro více projektů navštivte můj blog: MJRoBot.org
Níže letmý pohled na můj další tutoriál:

Saludos z jihu světa!
Uvidíme se v mém dalším pokynu!
Děkuji, Marcelo
Doporučuje:
Arduino Multi Light Controller: 7 kroků (s obrázky)

Arduino Multi Light Controller: Kolega a umělec Jim Hobbs plánoval postavit samostatně stojící instalaci pro výstavu, kterou sestavoval. Tato instalace by se skládala z 8 polic tvořících parabolický tvar. Každá z 8 polic měla mít 10 žárovek
HiFi multi-room WiFi a Bluetooth reproduktor: 10 kroků (s obrázky)

HiFi multi-room WiFi a Bluetooth reproduktor: Reproduktory připojené k Wi-Fi jsou schopné poskytovat výrazně lepší kvalitu zvuku než možnosti Bluetooth. Před přehráváním nekomprimují zvukový obsah, což může mít negativní vliv na zvuk, protože snižuje úroveň detailů
Pan Birch Bumper Instructable: 9 kroků

Pan Birch Bumper Instructable: Účelem tohoto nárazníku je umožnit BoeBotu manévrovat kolem svého okolí. Když něco narazí na obě strany nárazníku, staniolové zabalené nanuky se dotknou a vytvoří spojení, které robotovi řekne, aby zastavil, couval a
Pan Wiggly, myšák: 4 kroky (s obrázky)

Pan Wiggly, myšák: To vám ukáže, jak udělat pana Wigglyho myšáka. Ve výchozím nastavení je většina instalací systému Windows nastavena na přepnutí počítače do režimu spánku po 10 nebo 15 minutách nečinnosti. To lze obvykle snadno deaktivovat na ovládacím panelu, ale existuje několik
Pan E.Z. Vývojová deska tuby: 4 kroky (s obrázky)

Pan E.Z. Rada pro vývoj trubek: Cíl/účel: pan E.Z. Tube je levná zvuková platforma bez elektronky: žádný napájecí transformátor, žádný výstupní transformátor (y). Trubkový zesilovač bude mít obvykle několik těžkých, drahých transformátorů: výstupní transformátory, které chrání řeč