Sisukord:

Pan-Tilt Multi Servo Control: 11 sammu (piltidega)
Pan-Tilt Multi Servo Control: 11 sammu (piltidega)

Video: Pan-Tilt Multi Servo Control: 11 sammu (piltidega)

Video: Pan-Tilt Multi Servo Control: 11 sammu (piltidega)
Video: Multiple Servo Motor Control with Joystick and Arduino 2024, Juuli
Anonim
Pan-Tilt Multi Servo Control
Pan-Tilt Multi Servo Control

Selles õpetuses uurime, kuidas Raspberry Pi -l Pythoni abil mitut servot juhtida. Meie eesmärk on PAN/TILT mehhanism kaamera (PiCam) paigutamiseks.

Siin näete, kuidas meie lõplik projekt töötab:

Kontrollservo juhtimissilmuse test:

Pilt
Pilt

1. samm: BoM - materjali arve

Peamised osad:

  1. Raspberry Pi V3 - 32,00 USA dollarit
  2. 5 -megapiksline 1080p andur OV5647 minikaamera videomoodul - 13,00 USA dollarit
  3. TowerPro SG90 9G 180 kraadi mikro servo (2 X)- 4,00 USA dollarit
  4. Mini pan/ kallutatava kaamera platvormi vibratsioonivastase kaamera kinnitus 2 servoga (*) - 8,00 USA dollarit
  5. Takisti 1K oom (2X) - valikuline
  6. Mitmesugused: metallosad, lindid jne (juhuks, kui ehitate oma pan/kallutusmehhanismi)

(*) saate osta täieliku Pan/Tilt platvormi koos servodega või ehitada oma.

Samm: kuidas PWM töötab

Raspberry Pi -l pole analoogväljundit, kuid me saame seda simuleerida, kasutades PWM (impulsi laiuse modulatsiooni) lähenemist. Mida me teeme, on genereerida fikseeritud sagedusega digitaalsignaal, kus muudame impulssrongi laiust, mis tõlgitakse "keskmiseks" väljundpinge tasemeks, nagu allpool näidatud:

Pilt
Pilt

Seda "keskmist" pingetaset saame kasutada LED -i heleduse juhtimiseks, näiteks:

Pilt
Pilt

Pange tähele, et siin ei ole oluline sagedus ise, vaid "töötsükkel", see on suhe aja, mil pulss on "kõrge" jagatud laineperioodiga. Oletame näiteks, et genereerime ühes Raspberry Pi GPIO -s 50 Hz impulsssageduse. Periood (p) on sageduse vastupidine või 20 ms (1/f). Kui tahame, et meie LED oleks pooleldi heledam, peab töötsükkel olema 50%, see tähendab impulsi, mis on 10 ms kõrge.

See põhimõte on meie servoasendi juhtimiseks väga oluline, kui "töötsükkel" määratleb servoasendi, nagu allpool näidatud:

Servo

3. samm: Hw paigaldamine

Hw paigaldamine
Hw paigaldamine
Hw paigaldamine
Hw paigaldamine

Servod ühendatakse välise 5 V toiteallikaga, nende andmestik (minu puhul nende kollane juhtmestik) ühendatakse Raspberry Pi GPIO -ga, nagu allpool:

  • GPIO 17 ==> Kaldservo
  • GPIO 27 ==> Pan Servo

Ärge unustage GND -sid ühendada ==> Raspberry Pi - Servod - väline toiteallikas)

Lisavarustusena võib teil olla 1K oomi takisti Raspberry Pi GPIO ja serveri sisendpinna vahel. See kaitseks teie RPi servoprobleemi korral.

4. samm: servode kalibreerimine

Servode kalibreerimine
Servode kalibreerimine
Servode kalibreerimine
Servode kalibreerimine
Servode kalibreerimine
Servode kalibreerimine

Esimene asi, mida teha, on kinnitada oma servode peamised omadused. Minu puhul kasutan Power Pro SG90.

Selle andmelehe põhjal võime kaaluda järgmist:

  • Vahemik: 180o
  • Toide: 4,8 V (väline 5 V alalisvool USB -toiteallikana töötab hästi)
  • Töösagedus: 50Hz (periood: 20 ms)
  • Impulsi laius: 1 ms kuni 2 ms

Teoreetiliselt on servo peal

  • Algpositsioon (0 kraadi), kui selle andmeterminalile rakendatakse 1 ms impulsi
  • Neutraalne asend (90 kraadi), kui selle andmeterminalile rakendatakse 1,5 ms impulsi
  • Lõppasend (180 kraadi), kui selle andmeterminalile rakendatakse 2 ms impulsi

Servopositsiooni programmeerimiseks Pythoni abil on väga oluline teada ülaltoodud positsioonide korrespondenti "Töötsükkel", teeme mõned arvutused:

  • Algpositsioon ==> (0 kraadi) Impulsi laius ==> 1ms ==> Töötsükkel = 1ms/20ms ==> 2,0%
  • Neutraalne asend (90 kraadi) Impulsi laius 1,5 ms ==> Töötsükkel = 1,5 ms/20 ms ==> 7,5%
  • Lõppasend (180 kraadi) Impulsi laius 2 ms ==> Töötsükkel = 2 ms/20 ms ==> 10%

Seega peaks töötsükkel varieeruma vahemikus 2 kuni 10 %.

Testime servosid individuaalselt. Selleks avage oma Raspberry terminal ja käivitage oma Python 3 kestade redaktor nimega "sudo" (kuna peaksite olema GPIO -dega töötamiseks "superkasutaja"):

sudo python3

Python Shellis

>>

Importige RPI. GPIO moodul ja nimetage see GPIO -ks:

RPi. GPIO importimine GPIO -na

Määrake, milliseid tihvtide nummerdamise skeeme soovite kasutada (BCM või BOARD). Tegin selle testi BOARDiga, seega kasutasin nööpnõeladena füüsilisi tihvte (GPIO 17 = tihvt 11 ja GPIO 27 tihvt 13). Mul oli lihtne neid tuvastada ja testi ajal vigu mitte teha (lõppprogrammis kasutan BCM -i). Valige üks oma eelistustest:

GPIO.setmode (GPIO. BOARD)

Määratlege kasutatav servotihvt:

tiltPin = 11

Kui olete selle asemel kasutanud BCM -skeemi, tuleks viimased 2 käsku asendada järgmisega:

GPIO.setmode (GPIO. BCM)

tiltPin = 17

Nüüd peame täpsustama, et see tihvt on "väljund"

GPIO.seadistus (tiltPin, GPIO. OUT)

Ja milline on sellel tihvtil genereeritud sagedus, mis meie servo jaoks on 50 Hz:

kallutada = GPIO. PWM (tiltPin, 50)

Alustame nüüd PWM -signaali genereerimist tihvtile esialgse töötsükliga (hoiame selle "0"):

kallutamine = algus (0)

Nüüd saate sisestada erinevaid töötsükli väärtusi, jälgides oma servo liikumist. Alustame 2% -ga ja vaatame, mis juhtub (näeme, et servo läheb "nullpositsiooni"):

tilt. ChangeDutyCycle (2)

Minu puhul läks servo nullasendisse, kuid kui muutsin töötsükli 3% -le, märkasin, et servo jäi samasse asendisse ja hakkas liikuma, kui töötsüklid olid suuremad kui 3%. Niisiis, 3% on minu esialgne positsioon (o kraadid). Sama juhtus 10%-ga, minu servo läks sellest väärtusest kõrgemale, ületades oma otsa 13%-ga. Nii et selle konkreetse servo puhul oli tulemus järgmine:

  • 0 kraadi ==> töötsükkel 3%
  • 90 kraadi ==> töötsükkel 8%
  • 180 kraadi ==> töötsükkel 13%

Pärast testide lõpetamist peate PWM -i peatama ja GPIO -d puhastama.

kalluta = peatu ()

GPIO.cleanup ()

Ülaltoodud terminali prindiekraanil kuvatakse mõlema minu servo tulemus (millel on sarnased tulemused). Teie vahemik võib olla erinev.

Samm: Pythoni skripti loomine

Pythoni skripti loomine
Pythoni skripti loomine

Meie servole saadetavad PWM -käsud on "töötsüklites", nagu nägime viimasel etapil. Kuid tavaliselt peame servo juhtimiseks kasutama parameetrit "nurk" kraadides. Niisiis, peame muutma "nurga", mis on meie jaoks loomulikum mõõt, töötsüklis, nagu meie Pi mõistab.

Kuidas seda teha? Väga lihtne! Me teame, et töötsükli vahemik on vahemikus 3% kuni 13% ja see on võrdne nurkadega, mis jäävad vahemikku 0 kuni 180 kraadi. Samuti teame, et need variatsioonid on lineaarsed, nii et saame koostada proportsionaalse skeemi, nagu ülal näidatud. nii et nurga alusel saab meil olla vastav töötsükkel:

töötsükkel = nurk/18 + 3

Hoidke see valem alles. Me kasutame seda järgmises koodis.

Loome testide läbiviimiseks Pythoni skripti. Põhimõtteliselt kordame seda, mida tegime varem Python Shellis:

ajast importige uni

RPi. GPIO importimine GPIO -na GPIO -ks GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) def setServoAngle (servo, nurk): pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = nurk / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) unerežiim (0,3) pwm.stop () kui _name_ == '_main_': import sys servo = int (sys.argv [1]) GPIO.setup (servo, GPIO. OUT) setServoAngle (servo, int (sys.argv [2]))) GPIO.cleanup ()

Ülaltoodud koodi tuum on funktsioon setServoAngle (servo, nurk). See funktsioon saab argumentidena, servo GPIO numbri ja nurga väärtuse, kuhu servo tuleb paigutada. Kui selle funktsiooni sisendiks on "nurk", peame selle teisendama töötsükliks protsentides, kasutades eelnevalt välja töötatud valemit.

Skripti käivitamisel peate sisestama parameetrid, servo GPIO ja nurga.

Näiteks:

sudo python3 nurkServoCtrl.py 17 45

Ülaltoodud käsk asetab GPIO 17 -ga ühendatud servo 45 kraadi kõrgusele. Sarnast käsku saab kasutada ka Pan Servo juhtimiseks (asimuut asendis 45 kraadi):

sudo python nurkServoCtrl.py 27 45

Faili angleServoCtrl.py saab alla laadida minu GitHubist

6. samm: pan-tilt mehhanism

Pan-Tilt mehhanism
Pan-Tilt mehhanism

Servo "Pan" liigutab meie kaamerat "horisontaalselt" ("asimuutnurk") ja meie "Tilt" servo liigutab seda "vertikaalselt" (tõusunurk).

Alloleval pildil on näha, kuidas Pan/Tilt mehhanism töötab:

Pilt
Pilt

Arendamise ajal ei lähe me "äärmustesse" ja kasutame oma Pan/Tilt mehhanismi ainult 30 kuni 150 kraadi. Sellest vahemikust piisab kaameraga kasutamiseks.

Samm 7: Pan -Tilt mehhanism - mehaaniline ehitus

Pan -Tilt mehhanism - mehaaniline ehitus
Pan -Tilt mehhanism - mehaaniline ehitus
Pan -Tilt mehhanism - mehaaniline ehitus
Pan -Tilt mehhanism - mehaaniline ehitus
Pan -Tilt mehhanism - mehaaniline ehitus
Pan -Tilt mehhanism - mehaaniline ehitus

Paneme nüüd kokku 2 servot pan/kallutusmehhanismina. Siin saate teha 2 asja. Ostke Pan-Tilt platvormi mehhanism, nagu on näidatud viimasel etapil, või ehitage oma vajadustele vastavalt.

Üks näide võib olla see, mille ma ehitasin, ainult rihmades servod üksteise külge ja kasutades vanade mänguasjade väikseid metallitükke, nagu on näidatud ülaltoodud fotodel.

8. etapp: elektriline pan/kallutatav kokkupanek

Elektriline pan/kallutatav komplekt
Elektriline pan/kallutatav komplekt
Elektriline pan/kallutatav komplekt
Elektriline pan/kallutatav komplekt
Elektriline pan/kallutatav komplekt
Elektriline pan/kallutatav komplekt
Elektriline pan/kallutatav komplekt
Elektriline pan/kallutatav komplekt

Kui olete oma Pan/Tilt mehhanismi kokku pannud, järgige fotode täielikku elektriühendust.

  1. Lülitage oma Pi välja.
  2. Tehke kõik elektriühendused.
  3. Kontrollige seda veel kord.
  4. Lülitage oma Pi kõigepealt sisse.
  5. Kui kõik on korras, lülitage oma servod sisse.

Me ei uuri selles õpetuses kaamera häälestamist, seda selgitatakse järgmises õpetuses.

Samm: Pythoni skript

Loome Pythoni skripti, et juhtida mõlemat servot korraga:

ajast importige uni

RPi. GPIO importimine GPIO -na GPIO.setmode (GPIO. BCM) GPIO.setwarnings (vale) pan = 27 kallutus = 17 GPIO.seadistus (kallutamine, GPIO. OUT) # valge => KALD GPIO.seadistus (pan, GPIO. OUT) # hall ==> PAN def setServoAngle (servo, nurk): kinnitage nurk> = 30 ja nurk 90 (keskmine punkt) ==> 150 setServoAngle (kallutus, int (sys.argv [2])) # 30 ==> 90 (keskmine punkt) ==> 150 GPIO.cleanup ()

Skripti käivitamisel peate parameetritena sisestama panoraamnurga ja kallutusnurga. Näiteks:

sudo python3 servoCtrl.py 45 120

Ülaltoodud käsk paigutab pan/kallutusmehhanismi 45 kraadini "asimuudis" (panoraamnurk) ja 120 kraadi "tõusus" (kallutusnurk). Pange tähele, et kui parameetreid ei sisestata, on vaikimisi nii panoraam- kui ka kallutusnurgad kuni 90 kraadi.

Allpool näete mõnda testi:

Pilt
Pilt

Faili servoCtrl.py saab alla laadida minu GitHubist.

10. samm: serverite silmustest

Loome nüüd Pythoni skripti, et testida automaatselt kõiki servosid:

ajast importige uni

RPi. GPIO importimine GPIO -na GPIO.setmode (GPIO. BCM) GPIO.setwarnings (vale) pan = 27 kallutus = 17 GPIO.seadistus (kallutamine, GPIO. OUT) # valge => KALD GPIO.seadistus (pan, GPIO. OUT) # hall ==> PAN def setServoAngle (servo, nurk): kinnitage nurk> = 30 ja nurk <= 150 pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = nurk / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) unerežiim (0,3) pwm.stop () kui _name_ == '_main_': i vahemikus (30, 160, 15): setServoAngle (pan, i) setServoAngle (kallutus, i) i jaoks vahemik (150, 30, -15): setServoAngle (pan, i) setServoAngle (kallutus, i) setServoAngle (pan, 100) setServoAngle (kallutamine, 90) GPIO.cleanup ()

Programm käivitab automaatselt silmuse 30 kuni 150 kraadi mõlemas nurgas.

Tulemuse all:

Ühendasin ostsilloskoobi ainult PWM -teooria illustreerimiseks, nagu eelnevalt selgitatud.

Pilt
Pilt

Ülaltoodud koodi servoTest.py saate alla laadida minu GitHubist.

Samm 11: Järeldus

Järeldus
Järeldus

Nagu alati, loodan, et see projekt aitab teistel leida tee põnevasse elektroonikamaailma!

Üksikasjade ja lõpliku koodi saamiseks külastage minu GitHubi hoidlat: RPi-Pan-Tilt-Servo-Control

Rohkemate projektide jaoks külastage palun minu ajaveebi: MJRoBot.org

Allpool pilguheit minu järgmisele õpetusele:

Pilt
Pilt

Tervitused maailma lõunaosast!

Kohtumiseni minu järgmises juhendis!

Aitäh, Marcelo

Soovitan: