Sisällysluettelo:

Pan-Tilt Multi Servo Control: 11 vaihetta (kuvien kanssa)
Pan-Tilt Multi Servo Control: 11 vaihetta (kuvien kanssa)

Video: Pan-Tilt Multi Servo Control: 11 vaihetta (kuvien kanssa)

Video: Pan-Tilt Multi Servo Control: 11 vaihetta (kuvien kanssa)
Video: CS50 2013 - Week 8, continued 2024, Marraskuu
Anonim
Pan-Tilt Multi Servo Control
Pan-Tilt Multi Servo Control

Tässä opetusohjelmassa tutkimme kuinka hallita useita servoja Pythonilla Raspberry Pi: llä. Tavoitteenamme on PAN/TILT -mekanismi kameran sijoittamiseksi (PiCam).

Täältä voit nähdä, miten lopullinen projektimme toimii:

Control Servo Control silmukkatesti:

Kuva
Kuva

Vaihe 1: BoM - Bill of Material

Pääosat:

  1. Raspberry Pi V3 - 32,00 dollaria
  2. 5 megapikselin 1080p -anturi OV5647 -minikameran videomoduuli - 13,00 dollaria
  3. TowerPro SG90 9G 180 asteen mikroservo (2 X)- 4,00 dollaria
  4. Minipannu-/ kallistuskameraalusta tärinänvaimennuskameran kiinnitys kahdella servolla (*) - US $ 8.00
  5. Vastus 1K ohmia (2X) - valinnainen
  6. Sekalaisia: metalliosia, nauhoja jne. (Jos rakennat Pan/Tilt -mekanismin)

(*) voit ostaa täydellisen Pan/Tilt -alustan servojen kanssa tai rakentaa oman.

Vaihe 2: Kuinka PWM toimii

Raspberry Pi: llä ei ole analogista lähtöä, mutta voimme simuloida tätä käyttämällä PWM (Pulse Width Modulation) -lähestymistapaa. Teemme vain digitaalisen signaalin, jolla on kiinteä taajuus, jossa muutamme pulssijonon leveyttä, mikä "käännetään" "keskimääräiseksi" lähtöjännitetasoksi alla esitetyllä tavalla:

Kuva
Kuva

Voimme käyttää tätä "keskimääräistä" jännitetasoa LED -kirkkauden säätämiseen esimerkiksi:

Kuva
Kuva

Huomaa, että tässä ei ole väliä itse taajuudella, vaan "käyttöjaksolla", joka on suhde ajan, jolloin pulssit ovat "korkealla" jaettuna aaltokaudella. Oletetaan esimerkiksi, että muodostamme 50 Hz: n pulssitaajuuden yhdellä Raspberry Pi GPIO -laitteestamme. Jakso (p) on taajuuden käänteinen tai 20 ms (1/f). Jos haluamme, että LED -valomme on "puoliksi" kirkas, meidän on oltava 50%: n käyttöjakso, mikä tarkoittaa "pulssia", joka on "korkea" 10 ms.

Tämä periaate on erittäin tärkeä meille servoaseman hallitsemiseksi, kun "käyttöjakso" määrittää servoasennon alla esitetyllä tavalla:

Servo

Vaihe 3: Hw: n asennus

Hw: n asentaminen
Hw: n asentaminen
Hw: n asentaminen
Hw: n asentaminen

Servot kytketään ulkoiseen 5 V: n virtalähteeseen, ja niiden datatappi (minun tapauksessani keltainen johdotus) on liitetty Raspberry Pi GPIO: hon seuraavasti:

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

Muista kytkeä GND: t yhteen ==> Raspberry Pi - Servot - ulkoinen virtalähde)

Raspberry Pi GPIO: n ja palvelimen tiedonsiirtotapin välissä voi olla lisävarusteena 1K ohmin vastus. Tämä suojaisi RPi: täsi servo -ongelman sattuessa.

Vaihe 4: Servojen kalibrointi

Servojen kalibrointi
Servojen kalibrointi
Servojen kalibrointi
Servojen kalibrointi
Servojen kalibrointi
Servojen kalibrointi

Ensimmäinen asia on vahvistaa servojesi pääominaisuudet. Minun tapauksessani käytän Power Pro SG90: tä.

Sen tietolomakkeesta voimme pohtia:

  • Alue: 180o
  • Virtalähde: 4,8 V (ulkoinen 5 VDC USB -virtalähteenä toimii hyvin)
  • Työskentelytaajuus: 50 Hz (jakso: 20 ms)
  • Pulssin leveys: 1 ms - 2 ms

Teoriassa servo on päällä

  • Alkuasento (0 astetta), kun sen datapäätteeseen kohdistetaan 1 ms pulssi
  • Vapaa asento (90 astetta), kun sen datapäätteeseen kohdistetaan 1,5 ms pulssi
  • Lopullinen sijainti (180 astetta), kun sen datapäätteeseen kohdistetaan 2 ms pulssi

Jos haluat ohjelmoida servoasennon Pythonin avulla, on erittäin tärkeää tietää yllä olevien asemien kirjeenvaihtaja "Tehokierto", teemme laskelman:

  • Alkuasento ==> (0 astetta) Pulssin leveys ==> 1 ms ==> Käyttöjakso = 1 ms/20 ms ==> 2,0%
  • Neutraali asento (90 astetta) Pulssin leveys 1,5 ms ==> Käyttöjakso = 1,5 ms/20 ms ==> 7,5%
  • Lopullinen sijainti (180 astetta) Pulssin leveys 2 ms ==> Käyttöjakso = 2 ms/20 ms ==> 10%

Joten käyttökierron tulisi vaihdella alueella 2-10 %.

Testaa servot erikseen. Avaa tätä varten Raspberry -päätelaite ja käynnistä Python 3 -kuorieditori "sudona" (koska sinun pitäisi olla "superkäyttäjä" GPIO: iden kanssa):

sudo python3

Python Shellissä

>>

Tuo RPI. GPIO -moduuli ja kutsu sitä GPIO: ksi:

tuoda RPi. GPIO GPIO: ksi

Määritä, mitä pin-numerointimalleja haluat käyttää (BCM tai BOARD). Tein tämän testin BOARDilla, joten käyttämäni nastat olivat fyysiset nastat (GPIO 17 = nasta 11 ja GPIO 27 nasta 13). Minun oli helppo tunnistaa ne ja olla tekemättä virheitä testin aikana (lopullisessa ohjelmassa käytän BCM: ää). Valitse haluamasi:

GPIO.setmode (GPIO. BOARD)

Määritä käyttämäsi servotappi:

tiltPin = 11

Jos olet sen sijaan käyttänyt BCM -mallia, kaksi viimeistä komentoa on korvattava seuraavasti:

GPIO.setmode (GPIO. BCM)

tiltPin = 17

Nyt meidän on määritettävä, että tämä nasta on "lähtö"

GPIO.asetukset (tiltPin, GPIO. OUT)

Ja mikä on tällä tapilla tuotettu taajuus, joka servollemme on 50 Hz:

kallistus = GPIO. PWM (tiltPin, 50)

Aloitetaan nyt PWM -signaalin luominen nastalle alkukäyttöjaksolla (pidämme sen "0"):

kallistus = alku (0)

Nyt voit syöttää erilaisia käyttöjaksoarvoja tarkkailemalla servosi liikettä. Aloitetaan 2%: lla ja katsotaan mitä tapahtuu (katsomme, että servo menee "nolla -asentoon"):

tilt. ChangeDutyCycle (2)

Minun tapauksessani servo meni nolla -asentoon, mutta kun muutin käyttöjakson 3%: iin, huomasin, että servo pysyi samassa asennossa ja alkoi liikkua yli 3%: n käyttöjaksoilla. Joten 3% on alkuasento (o astetta). Sama tapahtui 10%: lla, servoni nousi tämän arvon yläpuolelle ja päätyi 13%: iin. Joten tälle servolle tulos oli:

  • 0 astetta ==> käyttöaste 3%
  • 90 astetta ==> käyttöaste 8%
  • 180 astetta ==> käyttöjakso 13%

Kun olet suorittanut testit, sinun on lopetettava PWM ja puhdistettava GPIO: t:

kallistus = pysäytys ()

GPIO.cleanup ()

Yllä oleva terminaalin tulostusnäyttö näyttää molempien servojeni tulokset (joilla on samanlaiset tulokset). Alueesi voi olla erilainen.

Vaihe 5: Python -komentosarjan luominen

Python -komentosarjan luominen
Python -komentosarjan luominen

Servollemme lähetettävät PWM -komennot ovat "käyttöjaksoissa", kuten näimme viimeisessä vaiheessa. Mutta yleensä meidän on käytettävä "kulmaa" asteina parametrina servon ohjaamiseen. Joten meidän on muunnettava "kulma", joka on luonnollisempi mittaus meille käyttöjaksossa, kuten Pi ymmärtäämme.

Kuinka tehdä se? Erittäin yksinkertainen! Tiedämme, että käyttöjakso vaihtelee 3%: sta 13%: iin ja että tämä vastaa 0-180 asteen kulmia. Tiedämme myös, että nämä vaihtelut ovat lineaarisia, joten voimme rakentaa suhteellisen kaavan, kuten yllä on esitetty. joten kulman perusteella meillä voi olla vastaava käyttöjakso:

käyttöjakso = kulma/18 + 3

Säilytä tämä kaava. Käytämme sitä seuraavassa koodissa.

Luodaan Python -komentosarja testien suorittamiseksi. Periaatteessa toistamme sen, mitä teimme aiemmin Python Shellissä:

tuontihetkestä

tuoda RPi. GPIO GPIO: na GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) def setServoAngle (servo, kulma): pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = kulma / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) lepotila (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 ()

Yllä olevan koodin ydin on funktio setServoAngle (servo, kulma). Tämä toiminto vastaanottaa argumentteina servo -GPIO -numeron ja kulma -arvon siihen, mihin servo on sijoitettava. Kun tämän funktion tulo on "kulma", meidän on muutettava se käyttöjaksoksi prosentteina käyttämällä aiemmin kehitettyä kaavaa.

Kun komentosarja suoritetaan, sinun on annettava parametrit, servo GPIO ja kulma.

Esimerkiksi:

sudo python3 -kulmaServoCtrl.py 17 45

Yllä oleva komento asettaa GPIO 17: een liitetyn servon 45 asteen korkeuteen. Samankaltaista komentoa voitaisiin käyttää Pan Servo -ohjaukseen (asento 45 asteeseen "atsimuutissa"):

sudo python -kulmaServoCtrl.py 27 45

Tiedoston angleServoCtrl.py voi ladata GitHubista

Vaihe 6: Pan-Tilt-mekanismi

Pan-kallistusmekanismi
Pan-kallistusmekanismi

"Pan" -servo liikuttaa "vaakasuoraan" kameraamme ("atsimuuttikulma") ja "Tilt" servo siirtää sitä "pystysuoraan" (korkeuskulma).

Alla olevassa kuvassa näkyy Pan/Tilt -mekanismin toiminta:

Kuva
Kuva

Kehityksemme aikana emme mene "äärirajoille" ja käytämme Pan/Tilt -mekanismiamme vain 30-150 astetta. Tämä alue riittää käytettäväksi kameran kanssa.

Vaihe 7: Pan -Tilt -mekanismi - mekaaninen rakenne

Pan -kallistusmekanismi - mekaaninen rakenne
Pan -kallistusmekanismi - mekaaninen rakenne
Pan -kallistusmekanismi - mekaaninen rakenne
Pan -kallistusmekanismi - mekaaninen rakenne
Pan -kallistusmekanismi - mekaaninen rakenne
Pan -kallistusmekanismi - mekaaninen rakenne

Asennetaan nyt kaksi servoa Pan/Tilt -mekanismiksi. Täällä voit tehdä 2 asiaa. Osta Pan-Tilt-alustamekanismi viimeisessä vaiheessa esitetyllä tavalla tai rakenna oma tarpeidesi mukaan.

Yksi esimerkki voi olla se, jonka olen rakentanut, vain hihnat servot toisiinsa ja käyttämällä pieniä metallikappaleita vanhoista leluista, kuten yllä olevissa valokuvissa on esitetty.

Vaihe 8: Sähköpannun/kallistuksen kokoonpano

Sähköinen pan/kallistuskokoonpano
Sähköinen pan/kallistuskokoonpano
Sähköinen pan/kallistuskokoonpano
Sähköinen pan/kallistuskokoonpano
Sähköinen pan/kallistuskokoonpano
Sähköinen pan/kallistuskokoonpano
Sähköinen pan/kallistuskokoonpano
Sähköinen pan/kallistuskokoonpano

Kun olet koonnut Pan/Tilt -mekanismin, noudata valokuvia täydelliseen sähköliitäntään.

  1. Sammuta Pi.
  2. Tee kaikki sähköliitännät.
  3. Tarkista se uudelleen.
  4. Käynnistä ensin Pi.
  5. Jos kaikki on kunnossa, käynnistä servot.

Emme tutki tässä opetusohjelmassa kameran asentamista, tämä selitetään seuraavassa opetusohjelmassa.

Vaihe 9: Python -skripti

Luodaan Python -komentosarja, joka ohjaa molempia servoja samanaikaisesti:

tuontihetkestä

tuoda RPi. GPIO GPIO: ksi GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) pan = 27 kallistus = 17 GPIO.setup (kallistus, GPIO. OUT) # valkoinen => KALLISTETTU GPIO.setup (pan, GPIO. OUT) # harmaa ==> PAN def setServoAngle (servo, kulma): vahvista kulma> = 30 ja kulma 90 (keskipiste) ==> 150 setServoAngle (kallistus, int (sys.argv [2])) # 30 ==> 90 (keskipiste) ==> 150 GPIO.puhdistus ()

Kun komentosarja suoritetaan, sinun on annettava parametreina Pan -kulma ja Kallistuskulma. Esimerkiksi:

sudo python3 servoCtrl.py 45120

Yllä oleva komento asettaa Pan/Tilt -mekanismin 45 astetta "atsimuuttiin" (Pan -kulma) ja 120 "korkeusasteeseen" (kallistuskulma). Huomaa, että jos mitään parametreja ei syötetä, oletusarvo on sekä panorointi- että kallistuskulma, jotka on asetettu 90 asteeseen.

Alla näet joitain testejä:

Kuva
Kuva

ServoCtrl.py -tiedoston voi ladata GitHubista.

Vaihe 10: Palvelinten silmukkatesti

Luodaan nyt Python -skripti, joka testaa automaattisesti kaikki servot:

tuontihetkestä

tuoda RPi. GPIO GPIO: ksi GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) pan = 27 kallistus = 17 GPIO.setup (kallistus, GPIO. OUT) # valkoinen => KALLISTETTU GPIO.setup (pan, GPIO. OUT) # harmaa ==> PAN def setServoAngle (servo, kulma): vahvista kulma> = 30 ja kulma <= 150 pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = kulma / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) lepotila (0,3) pwm.stop () jos _nimi_ == '_main_': i alueella (30, 160, 15): setServoAngle (pan, i) setServoAngle (kallistus, i) for i in alue (150, 30, -15): setServoAngle (pan, i) setServoAngle (kallistus, i) setServoAngle (pan, 100) setServoAngle (kallistus, 90) GPIO.cleanup ()

Ohjelma suorittaa automaattisesti 30 - 150 asteen silmukan molemmista kulmista.

Tuloksen alapuolella:

Liitin oskilloskoopin vain havainnollistamaan PWM -teoriaa, kuten edellä on selitetty.

Kuva
Kuva

Yllä oleva koodi, servoTest.py, voidaan ladata GitHubista.

Vaihe 11: Johtopäätös

Johtopäätös
Johtopäätös

Kuten aina, toivon, että tämä projekti voi auttaa muita löytämään tiensä elektroniikan jännittävään maailmaan!

Katso lisätietoja ja lopullinen koodi GitHub-varastostani: RPi-Pan-Tilt-Servo-Control

Lisää projekteja löydät blogistani: MJRoBot.org

Alla katsaus seuraavaan opetusohjelmaani:

Kuva
Kuva

Terveisiä etelästä maailmasta!

Nähdään seuraavassa ohjeessani!

Kiitos, Marcelo

Suositeltava: