Բովանդակություն:

Pan-Tilt Multi Servo Control: 11 քայլ (նկարներով)
Pan-Tilt Multi Servo Control: 11 քայլ (նկարներով)

Video: Pan-Tilt Multi Servo Control: 11 քայլ (նկարներով)

Video: Pan-Tilt Multi Servo Control: 11 քայլ (նկարներով)
Video: Multiple Servo Motor Control with Joystick and Arduino 2024, Դեկտեմբեր
Anonim
Pan-Tilt Multi Servo Control
Pan-Tilt Multi Servo Control

Այս ձեռնարկի վրա մենք կուսումնասիրենք, թե ինչպես կարելի է վերահսկել բազմաթիվ սերվերներ ՝ օգտագործելով Python- ը Raspberry Pi- ի վրա: Մեր նպատակը կլինի տեսախցիկ (PiCam) տեղադրելու PAN/TILT մեխանիզմ:

Այստեղ կարող եք տեսնել, թե ինչպես է աշխատելու մեր վերջնական նախագիծը.

Control Servo Control loop test:

Պատկեր
Պատկեր

Քայլ 1: BoM - նյութի հաշիվ

Հիմնական մասեր.

  1. Raspberry Pi V3 - 32,00 ԱՄՆ դոլար
  2. 5 մեգապիքսել 1080p սենսոր OV5647 մինի տեսախցիկի վիդեո մոդուլ - 13,00 ԱՄՆ դոլար
  3. TowerPro SG90 9G 180 աստիճան Micro Servo (2 X)- 4,00 ԱՄՆ դոլար
  4. Mini Pan/ Tilt Camera Պլատֆորմ Հակավիբրացիոն տեսախցիկի ամրացում 2 ծառայությամբ (*) - 8.00 ԱՄՆ դոլար
  5. Resistor 1K ohm (2X) - ըստ ցանկության
  6. Տարբեր. Մետաղական մասեր, նվագախմբեր և այլն (այն դեպքում, երբ դուք կկառուցեք ձեր Pan/Tilt մեխանիզմը)

(*) դուք կարող եք գնել ամբողջական Pan/Tilt հարթակ սերվերի հետ կամ կառուցել ձեր սեփականը:

Քայլ 2: Ինչպես է աշխատում PWM- ը

Raspberry Pi- ն չունի անալոգային ելք, բայց մենք կարող ենք նմանակել դա ՝ օգտագործելով PWM (Pulse Width Modulation) մոտեցումը: Այն, ինչ մենք կանենք, ֆիքսված հաճախականությամբ թվային ազդանշան ստեղծելն է, որտեղ մենք կփոխենք զարկերակային գնացքի լայնությունը, ինչը «կթարգմանվի» որպես «միջին» ելքային լարման մակարդակ, ինչպես ցույց է տրված ստորև.

Պատկեր
Պատկեր

Մենք կարող ենք օգտագործել այս «միջին» լարման մակարդակը ՝ LED լուսավորությունը վերահսկելու համար, օրինակ.

Պատկեր
Պատկեր

Նկատի ունեցեք, որ այստեղ կարևորը ոչ թե հաճախականությունն է ինքն իրենը, այլ «Աշխատանքային ցիկլը», այսինքն `հարաբերությունները այն ժամանակի միջև, երբ իմպուլսները« բարձր »են բաժանվում ալիքի ժամանակաշրջանի վրա: Օրինակ, ենթադրենք, որ մենք կստեղծենք 50Hz զարկերակային հաճախականություն մեր Raspberry Pi GPIO- ից մեկի վրա: Periodամանակահատվածը (p) կլինի հակադարձ հաճախականությունը կամ 20 ms (1/f): Եթե մենք ուզում ենք, որ մեր լուսադիոդը «կիսով չափ» լուսավոր լինի, մենք պետք է ունենանք 50%աշխատանքային ցիկլ, դա նշանակում է «զարկերակ», որը «բարձր» կլինի 10 ms- ի համար:

Այս սկզբունքը մեզ համար շատ կարևոր կլինի ՝ վերահսկելու մեր սերվոյի դիրքը, երբ «Աշխատանքային ցիկլը» կսահմանի սերվոյի դիրքը, ինչպես ցույց է տրված ստորև.

Սերվո

Քայլ 3: Տեղադրեք Hw

Տեղադրելով Hw
Տեղադրելով Hw
Տեղադրելով Hw
Տեղադրելով Hw

Սպասարկիչները միացված կլինեն արտաքին 5 Վ լարման, որի տվյալների կապը (իմ դեպքում ՝ դեղին լարերը) միացված են Raspberry Pi GPIO- ին ՝ ստորև.

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

Մի մոռացեք GND- ները միացնել ==> Raspberry Pi - Servos - Արտաքին էներգիայի մատակարարում)

Դուք կարող եք որպես տարբերակ ունենալ 1K օմ դիմադրություն Raspberry Pi GPIO- ի և Server- ի տվյալների մուտքագրման քորոցի միջև: Սա կպաշտպանի ձեր RPi- ն servo խնդրի դեպքում:

Քայլ 4: Servos Calibration

Servos Calibration
Servos Calibration
Servos Calibration
Servos Calibration
Servos Calibration
Servos Calibration

Առաջին բանը, որ պետք է անել, դա ձեր սերվերի հիմնական բնութագրերի հաստատումն է: Իմ դեպքում ես օգտագործում եմ Power Pro SG90:

Նրա տվյալների թերթիկից մենք կարող ենք հաշվի առնել.

  • Միջակայքը `180o
  • Սնուցման աղբյուր ՝ 4.8V (արտաքին 5VDC, որպես USB սնուցման աղբյուր, լավ է աշխատում)
  • Աշխատանքային հաճախականությունը `50 Հց (eriամկետը` 20 ms)
  • Իմպուլսի լայնությունը `1 մ -ից 2 մկմ

Տեսականորեն, servo- ն կլինի իր վրա

  • Նախնական դիրքը (0 աստիճան), երբ տվյալների տվյալների տերմինալին կիրառվում է 1 մգ զարկերակ
  • Չեզոք դիրքը (90 աստիճան), երբ տվյալների փոխանցման տերմինալին կիրառվում է 1.5 մգ զարկերակ
  • Վերջնական դիրքը (180 աստիճան), երբ նրա տվյալների տերմինալին կիրառվում է 2 ms զարկերակ

Python- ի միջոցով servo դիրքի ծրագրավորման համար շատ կարևոր կլինի իմանալ վերը նշված դիրքերի համապատասխան «Duty Cycle» թղթակիցը, եկեք որոշ հաշվարկ կատարենք.

  • Սկզբնական դիրքը ==> (0 աստիճան) Իմպուլսի լայնություն ==> 1 մմ ==> Աշխատանքային ցիկլ = 1 մմ/20 մմ ==> 2.0%
  • Չեզոք դիրքը (90 աստիճան) Pարկերակի լայնությունը ՝ 1.5 ms ==> Աշխատանքային ցիկլ = 1.5ms/20ms ==> 7.5%
  • Վերջնական դիրքը (180 աստիճան) Իմպուլսի լայնությունը `2 ms ==> Աշխատանքային ցիկլ = 2 ms/20ms ==> 10%

Այսպիսով, Աշխատանքային ցիկլը պետք է տատանվի 2 -ից 10 %միջակայքում:

Եկեք անհատապես փորձարկենք սերվերը: Դրա համար բացեք ձեր Raspberry տերմինալը և գործարկեք ձեր Python 3 shell խմբագրիչը որպես «sudo» (ձեր պատճառով GPIO- ների հետ աշխատելու համար պետք է լինել «գերծանրքաշային օգտվող»):

sudo python3

Python Shell- ի վրա

>>

Ներմուծեք RPI. GPIO մոդուլը և անվանեք այն GPIO:

ներմուծեք RPi. GPIO- ն որպես GPIO

Սահմանեք, թե որ համարակալման սխեմաներն եք ցանկանում օգտագործել (BCM կամ BOARD): Ես այս թեստը կատարեցի BOARD- ի հետ, ուստի այն կապում, որոնք ես օգտագործում էի, ֆիզիկական կապումներն էին (GPIO 17 = Pin 11 և GPIO 27 Pin 13): Ինձ համար հեշտ էր դրանք հայտնաբերել և թեստի ընթացքում սխալներ թույլ չտալ (Վերջնական ծրագրում ես կօգտագործեմ BCM): Ընտրեք ձեր նախընտրածներից մեկը.

GPIO.setmode (GPIO. BOARD)

Սահմանեք այն servo քորոցը, որն օգտագործում եք.

tiltPin = 11

Եթե փոխարենը, դուք օգտագործել եք BCM սխեման, վերջին 2 հրամանները պետք է փոխարինվեն հետևյալով.

GPIO.setmode (GPIO. BCM)

tiltPin = 17

Այժմ մենք պետք է նշենք, որ այս քորոցը կլինի «ելք»

GPIO.setup (tiltPin, GPIO. OUT)

Եվ ինչպիսի հաճախականություն կստեղծվի այս կապում, որը մեր սերվոյի համար կլինի 50 Հց.

թեքում = GPIO. PWM (tiltPin, 50)

Այժմ, եկեք սկսենք PWM ազդանշանի ստեղծումը քորոցի վրա ՝ սկզբնական աշխատանքային ցիկլով (այն կպահենք «0»).

թեքում = սկիզբ (0)

Այժմ, դուք կարող եք մուտքագրել աշխատանքային ցիկլի տարբեր արժեքներ ՝ դիտելով ձեր սերվոյի շարժումը: Եկեք սկսենք 2% -ով և տեսնենք, թե ինչ է տեղի ունենում (մենք տեսնում ենք, որ servo- ն անցնում է «զրոյական դիրքի»).

թեքում. ChangeDutyCycle (2)

Իմ դեպքում servo- ն իջավ զրոյական դիրքի, բայց երբ հերթափոխի ցիկլը փոխեցի 3% -ի, ես նկատեցի, որ servo- ն մնացել է նույն դիրքում ՝ սկսելով շարժվել 3% -ից ավելի ցիկլերով: Այսպիսով, 3% -ը իմ սկզբնական դիրքն է (o աստիճան): Նույնը տեղի ունեցավ 10%-ի դեպքում, իմ սերվոն բարձրացավ այս արժեքից ՝ դրա վերջը հասցնելով 13%-ի: Այսպիսով, այս հատուկ սերվոյի համար արդյունքը հետևյալն էր.

  • 0 աստիճան ==> աշխատանքային ցիկլը `3%
  • 90 աստիճան ==> աշխատանքային ցիկլը 8%
  • 180 աստիճան ==> աշխատանքի ցիկլը `13%

Փորձարկումներն ավարտելուց հետո դուք պետք է դադարեցնեք PWM- ը և մաքրեք GPIO- ները.

թեքում = կանգառ ()

GPIO.cleanup ()

Վերոնշյալ Տերմինալի տպման էկրանը ցույց է տալիս իմ երկու սերվերի արդյունքը (որը նման արդյունքներ ունի): Ձեր տեսականին կարող է տարբեր լինել:

Քայլ 5: Python Script ստեղծելը

Python Script- ի ստեղծում
Python Script- ի ստեղծում

PWM հրամանները, որոնք պետք է ուղարկվեն մեր սերվոյին, գտնվում են «աշխատանքային ցիկլերում», ինչպես տեսանք վերջին քայլին: Բայց սովորաբար, մենք պետք է «անկյուն» -ը աստիճաններով օգտագործենք ՝ որպես սերվո վերահսկելու պարամետր: Այսպիսով, մենք պետք է փոխարկենք «անկյունը», որն ավելի բնական չափում է մեզ աշխատանքային պարտականությունների շրջանում, ինչպես հասկանալի է մեր Pi- ի կողմից:

Ինչպե՞ս դա անել: Շատ պարզ! Մենք գիտենք, որ աշխատանքային ցիկլի տիրույթը տատանվում է 3% -ից մինչև 13%, և որ դա համարժեք է այն անկյուններին, որոնք կտատանվեն 0 -ից մինչև 180 աստիճան: Բացի այդ, մենք գիտենք, որ այդ տատանումները գծային են, ուստի կարող ենք կառուցել համամասնական սխեմա, ինչպես ցույց է տրված վերևում: Այսպիսով, հաշվի առնելով անկյունը, մենք կարող ենք ունենալ համապատասխան աշխատանքային ցիկլ.

տուրքի ցիկլ = անկյուն/18 + 3

Պահպանեք այս բանաձևը: Մենք այն կօգտագործենք հաջորդ կոդի մեջ:

Եկեք ստեղծենք Python սցենար `թեստերը կատարելու համար: Հիմնականում մենք կկրկնենք այն, ինչ արել էինք նախկինում Python Shell- ում.

ժամանակից ներմուծել քուն

ներմուծել RPi. GPIO- ն որպես GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) def setServoAngle (servo, angle): pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = angle / 18: + 3. pwm. ChangeDutyCycle (dutyCycle) քուն (0.3) pwm.stop () եթե _name_ == '_main_': ներմուծել sys servo = int (sys.argv [1]) GPIO.setup (servo, GPIO. OUT) setServoAngle (servo, int (sys.argv [2])) GPIO.cleanup ()

Վերը նշված կոդի միջուկը setServoAngle գործառույթն է (servo, անկյուն): Այս ֆունկցիան ստանում է որպես արգումենտներ, servo GPIO համար և անկյուն, որտեղ այն պետք է տեղադրվի: Երբ այս ֆունկցիայի մուտքը «անկյուն» է, մենք պետք է տոկոսային հարաբերությամբ այն փոխարկենք աշխատանքային ցիկլի ՝ օգտագործելով նախկինում մշակված բանաձևը:

Երբ սցենարը կատարվում է, դուք պետք է մուտքագրեք որպես պարամետրեր, servo GPIO և անկյուն:

Օրինակ:

sudo python3 անկյուն ServoCtrl.py 17 45

Վերոնշյալ հրամանը կտեղադրի GPIO 17 -ին միացված servo- ն 45 աստիճանով «բարձրության վրա»: Նմանատիպ հրաման կարող է օգտագործվել Pan Servo կառավարման համար (դիրքը «ազիմուտում» մինչև 45 աստիճան).

sudo python angleServoCtrl.py 27 45

AngleServoCtrl.py ֆայլը կարելի է ներբեռնել իմ GitHub- ից

Քայլ 6. Pan-Tilt մեխանիզմը

Pan-Tilt մեխանիզմը
Pan-Tilt մեխանիզմը

«Pan» servo- ն «հորիզոնական» կտեղափոխի մեր տեսախցիկը («ազիմուտի անկյուն»), իսկ մեր «Tilt» սերվոն ՝ «ուղղահայաց» (բարձրության անկյուն):

Ստորև բերված նկարը ցույց է տալիս, թե ինչպես է աշխատում Pan/Tilt մեխանիզմը.

Պատկեր
Պատկեր

Մեր զարգացման ընթացքում մենք չենք գնա «ծայրահեղությունների» և կօգտագործենք մեր Pan/Tilt մեխանիզմը միայն 30 -ից մինչև 150 աստիճան: Այս տեսականին բավական կլինի տեսախցիկով օգտագործելու համար:

Քայլ 7. Pan -Tilt մեխանիզմ - մեխանիկական շինարարություն

Pan -Tilt մեխանիզմ - մեխանիկական շինարարություն
Pan -Tilt մեխանիզմ - մեխանիկական շինարարություն
Pan -Tilt մեխանիզմ - մեխանիկական շինարարություն
Pan -Tilt մեխանիզմ - մեխանիկական շինարարություն
Pan -Tilt մեխանիզմ - մեխանիկական շինարարություն
Pan -Tilt մեխանիզմ - մեխանիկական շինարարություն

Եկեք հիմա հավաքենք մեր 2 ծառայությունները որպես Pan/Tilt մեխանիզմ: Այստեղ կարող եք անել 2 բան. Գնեք Pan-Tilt պլատֆորմի մեխանիզմը, ինչպես վերջին քայլին ցուցադրվածն է կամ կառուցեք ձեր սեփականը ՝ ըստ անհրաժեշտության:

Մեկ օրինակ կարող է լինել այն, ինչ ես կառուցել եմ, միայն սերվոները միմյանց ամրացնելով և հին խաղալիքներից փոքր մետաղական կտորներ օգտագործելով, ինչպես ցույց է տրված վերևի լուսանկարներում:

Քայլ 8: Էլեկտրական թավայի/թեքության հավաքում

Էլեկտրական թավայի/թեքության հավաքում
Էլեկտրական թավայի/թեքության հավաքում
Էլեկտրական թավայի/թեքության հավաքում
Էլեկտրական թավայի/թեքության հավաքում
Էլեկտրական թավայի/թեքության հավաքում
Էլեկտրական թավայի/թեքության հավաքում
Էլեկտրական թավայի/թեքության հավաքում
Էլեկտրական թավայի/թեքության հավաքում

Ձեր Pan/Tilt մեխանիզմը հավաքելուց հետո հետևեք լուսանկարներին ՝ ամբողջական էլեկտրական միացման համար:

  1. Անջատեք ձեր Pi- ն:
  2. Կատարեք բոլոր էլեկտրական միացումները:
  3. Կրկնակի ստուգեք այն:
  4. Սկզբում միացրեք ձեր Pi- ն:
  5. Եթե ամեն ինչ կարգին է, միացրեք ձեր սերվերը:

Այս ձեռնարկի վրա մենք չենք ուսումնասիրի, թե ինչպես կարգավորել տեսախցիկը, սա կբացատրվի հաջորդ ձեռնարկում:

Քայլ 9. Python Script

Եկեք ստեղծենք Python Script ՝ երկու սերվերը միաժամանակ կառավարելու համար.

ժամանակից ներմուծել քուն

ներմուծել RPi. GPIO- ն որպես GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) pan = 27 tilt = 17 GPIO.setup (tilt, GPIO. OUT) # white => TILT GPIO.setup (համահայկական, GPIO. OUT) # gray ==> PAN def setServoAngle (servo, անկյուն). պնդել անկյուն> = 30 և անկյուն 90 (միջին կետ) ==> 150 հավաքածուServoAngle (թեքություն, int (sys.argv [2])) # 30 ==> 90 (միջին միավոր) ==> 150 GPIO.cleanup ()

Երբ սցենարը կատարվում է, դուք պետք է մուտքագրեք որպես պարամետրեր, Pan անկյուն և Թեք անկյուն: Օրինակ:

sudo python3 servoCtrl.py 45 120

Վերոնշյալ հրամանը կտեղադրի Pan/Tilt մեխանիզմը 45 աստիճանով «ազիմուտ» -ում (թեքության անկյուն) և «բարձրության» 120 աստիճանով (թեքության անկյուն): Նկատի ունեցեք, որ պարամետրեր մուտքագրելու դեպքում լռելյայն կլինեն երկուսն էլ ՝ թեքության և թեքության անկյունները ՝ մինչև 90 աստիճան:

Ստորև կարող եք տեսնել որոշ թեստեր.

Պատկեր
Պատկեր

ServoCtrl.py ֆայլը կարելի է ներբեռնել իմ GitHub- ից:

Քայլ 10. Սերվերների օղակի փորձարկում

Եկեք հիմա ստեղծենք Python Script ՝ սերվերի ամբողջ տեսականին ինքնաբերաբար փորձարկելու համար.

ժամանակից ներմուծել քուն

ներմուծել RPi. GPIO- ն որպես GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) pan = 27 tilt = 17 GPIO.setup (tilt, GPIO. OUT) # white => TILT GPIO.setup (համահայկական, GPIO. OUT) # gray ==> PAN def setServoAngle (servo, անկյուն). պնդել անկյուն> = 30 և անկյուն <= 150 pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = angle / 18. + 3: pwm. ChangeDutyCycle (dutyCycle) քուն (0.3) pwm.stop () եթե _name_ == '_main_': i- ի սահմաններում (30, 160, 15). տիրույթ (150, 30, -15).

Automaticallyրագիրը ինքնաբերաբար կիրականացնի 30-150 աստիճանի օղակ երկու անկյուններում:

Ստորև արդյունքը.

Ես մի տատանում եմ միայն այն բանի համար, որպեսզի պատկերավոր դարձնեմ PWM տեսությունը, ինչպես բացատրված էր նախկինում:

Պատկեր
Պատկեր

Վերը նշված կոդը, servoTest.py- ն կարելի է ներբեռնել իմ GitHub- ից:

Քայլ 11: Եզրակացություն

Եզրակացություն
Եզրակացություն

Ինչպես միշտ, ես հույս ունեմ, որ այս նախագիծը կարող է օգնել ուրիշներին գտնել իրենց ճանապարհը դեպի էլեկտրոնիկայի հետաքրքիր աշխարհ:

Մանրամասների և վերջնական ծածկագրի համար այցելեք իմ GitHub դեպոզիտարիան ՝ RPi-Pan-Tilt-Servo-Control

Լրացուցիչ նախագծերի համար այցելեք իմ բլոգը ՝ MJRoBot.org

Ստորև ներկայացնում եմ իմ հաջորդ ձեռնարկի ակնարկը.

Պատկեր
Պատկեր

Սալուդոս աշխարհի հարավից:

Կհանդիպենք իմ հաջորդ հրահանգի մեջ:

Շնորհակալություն, Մարսելո

Խորհուրդ ենք տալիս: