Obsah:

Pan-Tilt Multi Servo Control: 11 kroků (s obrázky)
Pan-Tilt Multi Servo Control: 11 kroků (s obrázky)

Video: Pan-Tilt Multi Servo Control: 11 kroků (s obrázky)

Video: Pan-Tilt Multi Servo Control: 11 kroků (s obrázky)
Video: 1. Q Light Controller + Začínáme s QLC +. Přístroje a funkce 2024, Červenec
Anonim
Pan-Tilt Multi Servo Control
Pan-Tilt Multi Servo Control

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:

obraz
obraz

Krok 1: BoM - kusovník

Hlavní části:

  1. Raspberry Pi V3 - 32,00 USD
  2. 5megapixelový senzor 1080p Mini kamerový video modul OV5647 - US $ 13,00
  3. TowerPro SG90 9G 180 stupňů Micro Servo (2 X)- 4,00 USD
  4. Mini Pan/ Tilt Camera Platform Anti -Vibration Camera Mount w/ 2 Servos (*) - US $ 8.00
  5. Rezistor 1K ohm (2X) - volitelný
  6. 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:

obraz
obraz

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

obraz
obraz

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

Instalace Hw
Instalace Hw
Instalace Hw
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

Kalibrace serva
Kalibrace serva
Kalibrace serva
Kalibrace serva
Kalibrace serva
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

Vytvoření skriptu Python
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í

Mechanismus naklápění
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:

obraz
obraz

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

Mechanismus naklápění - mechanická konstrukce
Mechanismus naklápění - mechanická konstrukce
Mechanismus naklápění - mechanická konstrukce
Mechanismus naklápění - mechanická konstrukce
Mechanismus naklápění - mechanická konstrukce
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í

Elektrická sestava Pan/Tilt
Elektrická sestava Pan/Tilt
Elektrická sestava Pan/Tilt
Elektrická sestava Pan/Tilt
Elektrická sestava Pan/Tilt
Elektrická sestava Pan/Tilt
Elektrická sestava Pan/Tilt
Elektrická sestava Pan/Tilt

Jakmile budete mít svůj mechanismus otáčení/naklápění sestavený, postupujte podle fotografií, abyste získali úplné elektrické připojení.

  1. Vypněte Pi.
  2. Proveďte všechna elektrická připojení.
  3. Dvakrát to zkontrolujte.
  4. Nejprve zapněte Pi.
  5. 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ů:

obraz
obraz

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.

obraz
obraz

Výše uvedený kód servoTest.py lze stáhnout z mého GitHubu.

Krok 11: Závěr

Závěr
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:

obraz
obraz

Saludos z jihu světa!

Uvidíme se v mém dalším pokynu!

Děkuji, Marcelo

Doporučuje: