Satura rādītājs:

Pan-Tilt Multi Servo Control: 11 soļi (ar attēliem)
Pan-Tilt Multi Servo Control: 11 soļi (ar attēliem)

Video: Pan-Tilt Multi Servo Control: 11 soļi (ar attēliem)

Video: Pan-Tilt Multi Servo Control: 11 soļi (ar attēliem)
Video: Useful tip, blue grease AOC LUBRICANTS 2024, Jūlijs
Anonim
Pan-Tilt Multi Servo Control
Pan-Tilt Multi Servo Control

Šajā apmācībā mēs izpētīsim, kā kontrolēt vairākus servos, izmantojot Python Raspberry Pi. Mūsu mērķis būs PAN/TILT mehānisms kameras (PiCam) novietošanai.

Šeit jūs varat redzēt, kā darbosies mūsu galīgais projekts:

Vadības servo vadības cilpas tests:

Attēls
Attēls

1. solis: BoM - materiālu saraksts

Galvenās daļas:

  1. Raspberry Pi V3 - 32,00 ASV dolāri
  2. 5 megapikseļu 1080p sensors OV5647 mini kameras video modulis - 13,00 ASV dolāri
  3. TowerPro SG90 9G 180 grādu mikro servo (2 X)- 4,00 ASV dolāri
  4. Mini panoramēšanas/ noliekšanas kameras platformas pretvibrācijas kameras stiprinājums ar 2 servos (*) - 8,00 ASV dolāri
  5. Rezistors 1K omi (2X) - pēc izvēles
  6. Dažādi: metāla detaļas, lentes utt. (Gadījumā, ja veidosit Pan/Tilt mehānismu)

(*) jūs varat iegādāties pilnu Pan/Tilt platformu ar servos vai izveidot savu.

2. darbība. Kā darbojas PWM

Raspberry Pi nav analogās izejas, taču mēs to varam simulēt, izmantojot PWM (impulsa platuma modulācijas) pieeju. Tas, ko mēs darīsim, ir ģenerēt digitālu signālu ar fiksētu frekvenci, kur mēs mainīsim impulsa vilciena platumu, kas tiks "tulkots" kā "vidējais" izejas sprieguma līmenis, kā parādīts zemāk:

Attēls
Attēls

Mēs varam izmantot šo "vidējo" sprieguma līmeni, lai kontrolētu LED spilgtumu, piemēram:

Attēls
Attēls

Ņemiet vērā, ka šeit ir svarīga nevis pati frekvence, bet "darba cikls", tas ir, attiecība starp laiku, kad impulss ir "augsts", dalīts ar viļņu periodu. Piemēram, pieņemsim, ka vienā no mūsu Raspberry Pi GPIO ģenerēsim 50 Hz impulsa frekvenci. Periods (p) apgriezīs frekvenci vai 20 ms (1/f). Ja mēs vēlamies, lai mūsu gaismas diode ar “pusi” spilgtumu, mums ir jābūt 50%darba ciklam, tas nozīmē “impulsu”, kas būs “augsts” 10 ms.

Šis princips mums būs ļoti svarīgs, lai kontrolētu mūsu servo stāvokli, kad "darba cikls" noteiks servo stāvokli, kā parādīts zemāk:

Servo

3. darbība: Hw instalēšana

Hw uzstādīšana
Hw uzstādīšana
Hw uzstādīšana
Hw uzstādīšana

Servos tiks pievienots ārējs 5V barošanas avots, un to datu tapa (manā gadījumā - dzeltenā elektroinstalācija) ir savienota ar Raspberry Pi GPIO, kā norādīts zemāk:

  • GPIO 17 ==> Tilt Servo
  • GPIO 27 ==> Pano servo

Neaizmirstiet savienot GND kopā ==> Raspberry Pi - Servos - ārējais barošanas avots)

Kā opcija var būt 1K omu rezistors starp Raspberry Pi GPIO un servera datu ievades tapu. Tas aizsargātu jūsu RPi servo problēmas gadījumā.

4. solis: Servo kalibrēšana

Servo kalibrēšana
Servo kalibrēšana
Servo kalibrēšana
Servo kalibrēšana
Servo kalibrēšana
Servo kalibrēšana

Pirmā lieta, kas jādara, ir apstiprināt jūsu servo galvenās īpašības. Manā gadījumā es izmantoju Power Pro SG90.

No tās datu lapas mēs varam apsvērt:

  • Diapazons: 180o
  • Barošanas avots: 4.8V (ārējais 5VDC kā USB barošanas avots darbojas labi)
  • Darba frekvence: 50Hz (periods: 20 ms)
  • Pulsa platums: no 1 ms līdz 2 ms

Teorētiski servo būs ieslēgts

  • Sākotnējā pozīcija (0 grādi), kad tās datu terminālim tiek piemērots 1 ms impulss
  • Neitrālā pozīcija (90 grādi), kad tās datu terminālim tiek pielikts 1,5 ms impulss
  • Galīgā pozīcija (180 grādi), ja tās datu terminālim tiek piemērots 2 ms impulss

Lai ieprogrammētu servo pozīciju, izmantojot Python, būs ļoti svarīgi zināt korespondentu "Darba cikls" iepriekšminētajām pozīcijām, veiksim dažus aprēķinus:

  • Sākotnējā pozīcija ==> (0 grādi) Pulsa platums ==> 1ms ==> Darba cikls = 1ms/20ms ==> 2,0%
  • Neitrālā pozīcija (90 grādi) Pulsa platums 1,5 ms ==> Darba cikls = 1,5 ms/20 ms ==> 7,5%
  • Galīgā pozīcija (180 grādi) Impulsa platums 2 ms ==> Darba cikls = 2ms/20ms ==> 10%

Tātad darba ciklam vajadzētu mainīties no 2 līdz 10 %.

Pārbaudīsim servos individuāli. Lai to izdarītu, atveriet savu Raspberry termināli un palaidiet savu Python 3 apvalka redaktoru kā "sudo" (tāpēc jums vajadzētu būt "superlietotājam", kas jārīkojas ar GPIO):

sudo python3

Vietnē Python Shell

>>

Importējiet RPI. GPIO moduli un nosauciet to par GPIO:

importēt RPi. GPIO kā GPIO

Definējiet, kuras pin numerācijas shēmas vēlaties izmantot (BCM vai BOARD). Es veicu šo pārbaudi ar BOARD, tāpēc manas tapas bija fiziskās tapas (GPIO 17 = Pin 11 un GPIO 27 Pin 13). Man bija viegli tos identificēt un testa laikā nepieļaut kļūdas (beigu programmā es izmantošu BCM). Izvēlieties vienu no savām vēlmēm:

GPIO.setmode (GPIO. BOARD)

Definējiet izmantojamo servo tapu:

tiltPin = 11

Ja tā vietā esat izmantojis BCM shēmu, pēdējās 2 komandas jāaizstāj ar:

GPIO.setmode (GPIO. BCM)

tiltPin = 17

Tagad mums jānorāda, ka šī tapa būs "izvade"

GPIO iestatīšana (tiltPin, GPIO. OUT)

Un kāda būs šajā tapā ģenerētā frekvence, ka mūsu servo būs 50Hz:

slīpums = GPIO. PWM (tiltPin, 50)

Tagad sāksim ģenerēt PWM signālu uz tapas ar sākotnējo darba ciklu (mēs to saglabāsim "0"):

slīpums = sākums (0)

Tagad jūs varat ievadīt dažādas darba cikla vērtības, novērojot servo kustību. Sāksim ar 2% un redzēsim, kas notiek (mēs redzam, ka servo iet uz "nulles pozīciju"):

tilt. ChangeDutyCycle (2)

Manā gadījumā servo pārgāja uz nulles pozīciju, bet, kad es mainīju darba ciklu uz 3%, es pamanīju, ka servo palika tajā pašā stāvoklī, sākot kustēties, ja darba cikli bija lielāki par 3%. Tātad 3% ir mana sākotnējā pozīcija (o grādi). Tas pats notika ar 10%, mans servo pārsniedza šo vērtību, papildinot savu galu par 13%. Tātad attiecībā uz šo konkrēto servo rezultāts bija šāds:

  • 0 grāds ==> darba cikls 3%
  • 90 grādi ==> darba cikls 8%
  • 180 grādi ==> darba cikls 13%

Pēc testu pabeigšanas jums jāpārtrauc PWM un jāiztīra GPIO:

noliekt = apstāties ()

GPIO.cleanup ()

Iepriekš redzamais termināļa drukas ekrāns parāda abu manu servo (ar līdzīgiem rezultātiem) rezultātu. Jūsu diapazons var būt atšķirīgs.

5. darbība: Python skripta izveide

Python skripta izveide
Python skripta izveide

PWM komandas, kas jānosūta mūsu servo, ir "darba ciklos", kā mēs redzējām pēdējā posmā. Bet parasti, lai kontrolētu servo, mums jāizmanto "leņķis" grādos. Tātad, mums ir jāpārvērš "leņķis", kas ir dabiskāks mērījums mums darba ciklā, kā to saprot mūsu Pi.

Kā to izdarīt? Ļoti vienkārši! Mēs zinām, ka darba cikla diapazons svārstās no 3% līdz 13% un ka tas ir līdzvērtīgs leņķiem no 0 līdz 180 grādiem. Mēs arī zinām, ka šīs variācijas ir lineāras, tāpēc mēs varam izveidot proporcionālu shēmu, kā parādīts iepriekš. tāpēc, ņemot vērā leņķi, mums var būt atbilstošs darba cikls:

darba cikls = leņķis/18 + 3

Saglabājiet šo formulu. Mēs to izmantosim nākamajā kodā.

Izveidosim Python skriptu testu izpildei. Būtībā mēs atkārtosim to, ko mēs darījām iepriekš Python Shell:

no laika importēt miegu

importēt RPi. GPIO kā GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) def setServoAngle (servo, leņķis): pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = leņķis / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) miega režīms (0.3) pwm.stop (), ja _name_ == '_main_': import sys servo = int (sys.argv [1]) GPIO.setup (servo, GPIO. OUT) setServoAngle (servo, int (sys.argv [2]))) GPIO.cleanup ()

Iepriekš minētā koda kodols ir funkcija setServoAngle (servo, leņķis). Šī funkcija saņem argumentus, servo GPIO numuru un leņķa vērtību, kur servo jānovieto. Kad šīs funkcijas ievade ir "leņķis", mums tā jāpārvērš darba ciklā procentos, izmantojot iepriekš izstrādāto formulu.

Kad skripts tiek izpildīts, jums jāievada kā parametri, servo GPIO un leņķis.

Piemēram:

sudo python3 leņķisServoCtrl.py 17 45

Iepriekš minētā komanda pozicionēs GPIO 17 pievienoto servo ar 45 grādu "pacēlumu". Līdzīgu komandu varētu izmantot Pan Servo vadībai (pozīcija līdz 45 grādiem "azimutā"):

sudo python leņķisServoCtrl.py 27 45

Failu angleServoCtrl.py var lejupielādēt no mana GitHub

6. solis: Pan-Tilt mehānisms

Pan-Tilt mehānisms
Pan-Tilt mehānisms

Servo "Pan" pārvietos "horizontāli" mūsu kameru ("azimuta leņķis") un mūsu "Tilt" servo pārvietos to "vertikāli" (pacēluma leņķis).

Zemāk redzamajā attēlā parādīts, kā darbojas Pan/Tilt mehānisms:

Attēls
Attēls

Attīstības laikā mēs nenonāksim "galējībās" un izmantosim savu Pan/Tilt mehānismu tikai no 30 līdz 150 grādiem. Šis diapazons būs pietiekams, lai to varētu izmantot kopā ar kameru.

7. solis: Pan -Tilt mehānisms - mehāniskā konstrukcija

Pan -Tilt mehānisms - mehāniskā konstrukcija
Pan -Tilt mehānisms - mehāniskā konstrukcija
Pan -Tilt mehānisms - mehāniskā konstrukcija
Pan -Tilt mehānisms - mehāniskā konstrukcija
Pan -Tilt mehānisms - mehāniskā konstrukcija
Pan -Tilt mehānisms - mehāniskā konstrukcija

Tagad salieciet mūsu 2 servos kā Pan/Tilt mehānismu. Šeit jūs varat darīt 2 lietas. Iegādājieties Pan-Tilt platformas mehānismu, kā parādīts pēdējā solī, vai izveidojiet savu atbilstoši savām vajadzībām.

Viens piemērs var būt tas, ko es uzbūvēju, tikai piestiprinot servos vienu pie otra un izmantojot mazus metāla gabalus no vecām rotaļlietām, kā parādīts iepriekš redzamajos fotoattēlos.

8. solis: Elektriskās pannas/noliekšanas montāža

Elektriskās pannas/noliekšanas mezgls
Elektriskās pannas/noliekšanas mezgls
Elektriskās pannas/noliekšanas mezgls
Elektriskās pannas/noliekšanas mezgls
Elektriskās pannas/noliekšanas mezgls
Elektriskās pannas/noliekšanas mezgls
Elektriskās pannas/noliekšanas mezgls
Elektriskās pannas/noliekšanas mezgls

Kad esat savācis Pan/Tilt mehānismu, sekojiet fotoattēliem, lai iegūtu pilnu elektrisko savienojumu.

  1. Izslēdziet savu Pi.
  2. Veiciet visus elektriskos savienojumus.
  3. Pārbaudiet to vēlreiz.
  4. Vispirms ieslēdziet savu Pi.
  5. Ja viss ir kārtībā, ieslēdziet savus servos.

Šajā apmācībā mēs neizpētīsim, kā iestatīt kameru, tas tiks izskaidrots nākamajā apmācībā.

9. darbība: Python skripts

Izveidosim Python skriptu, lai vienlaikus vadītu abus servos:

no laika importēt miegu

importēt RPi. GPIO kā GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) pan = 27 slīpums = 17 GPIO.setup (noliekt, GPIO. OUT) # balts => TILT GPIO.setup (pan, GPIO. OUT) # pelēks ==> PAN def setServoAngle (servo, leņķis): apgalvot leņķi> = 30 un leņķi 90 (viduspunkts) ==> 150 setServoAngle (slīpums, int (sys.argv [2])) # 30 ==> 90 (viduspunkts) ==> 150 GPIO. Tīrīšana ()

Kad skripts tiek izpildīts, kā parametri jāievada panoramēšanas leņķis un slīpuma leņķis. Piemēram:

sudo python3 servoCtrl.py 45120

Iepriekš minētā komanda novieto Pan/Tilt mehānismu ar 45 grādiem "azimutā" (panoramēšanas leņķis) un 120 "pacēluma grādos" (slīpuma leņķis). Ņemiet vērā, ka, ja netiek ievadīti parametri, noklusējuma iestatījumi būs gan panoramēšanas, gan slīpuma leņķi līdz 90 grādiem.

Zemāk varat redzēt dažus testus:

Attēls
Attēls

ServoCtrl.py failu var lejupielādēt no mana GitHub.

10. solis: serveru cilpas pārbaude

Tagad izveidosim Python skriptu, lai automātiski pārbaudītu visu servo klāstu:

no laika importēt miegu

importēt RPi. GPIO kā GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) pan = 27 slīpums = 17 GPIO.setup (noliekt, GPIO. OUT) # balts => TILT GPIO.setup (pan, GPIO. OUT) # pelēks ==> PAN def setServoAngle (servo, leņķis): apgalvot leņķi> = 30 un leņķi <= 150 pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = leņķis / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) miega režīms (0,3) pwm.stop (), ja _name_ == '_main_': i diapazonā (30, 160, 15): setServoAngle (pan, i) setServoAngle (noliekt, i) priekš i diapazons (150, 30, -15): setServoAngle (pan, i) setServoAngle (noliekt, i) setServoAngle (pan, 100) setServoAngle (noliekt, 90) GPIO.cleanup ()

Programma automātiski izpildīs cilpu no 30 līdz 150 grādiem abos leņķos.

Zem rezultāta:

Es pievienoju osciloskopu tikai, lai ilustrētu PWM teoriju, kā paskaidrots iepriekš.

Attēls
Attēls

Iepriekš minēto kodu servoTest.py var lejupielādēt no mana GitHub.

11. solis. Secinājums

Secinājums
Secinājums

Kā vienmēr, es ceru, ka šis projekts var palīdzēt citiem atrast ceļu aizraujošajā elektronikas pasaulē!

Lai iegūtu sīkāku informāciju un galīgo kodu, lūdzu, apmeklējiet manu GitHub depozitāriju: RPi-Pan-Tilt-Servo-Control

Lai iegūtu vairāk projektu, lūdzu, apmeklējiet manu emuāru: MJRoBot.org

Zemāk ieskats manā nākamajā apmācībā:

Attēls
Attēls

Sveicieni no pasaules dienvidiem!

Uz tikšanos manā nākamajā pamācībā!

Paldies, Marselo

Ieteicams: