Мазмұны:

Pan-Tilt Multi Servo Control: 11 қадам (суреттермен)
Pan-Tilt Multi Servo Control: 11 қадам (суреттермен)

Бейне: Pan-Tilt Multi Servo Control: 11 қадам (суреттермен)

Бейне: Pan-Tilt Multi Servo Control: 11 қадам (суреттермен)
Бейне: Arduino МЫШЬ Поворотный ночник MOUSE PS/2 SERVO LED Pan Tilt Camera Лайфхак Своими руками 2024, Шілде
Anonim
Pan-Tilt Multi Servo басқару
Pan-Tilt Multi Servo басқару

Бұл оқулықта біз Raspberry Pi -де Python көмегімен бірнеше серверлерді қалай басқаруға болатынын қарастырамыз. Біздің мақсат камераны орналастыру үшін PAN/TILT механизмі болады (PiCam).

Мұнда сіз біздің соңғы жобаның қалай жұмыс істейтінін көре аласыз:

Басқару Servo Control циклінің сынағы:

Кескін
Кескін

1 -қадам: БМ - материалдық есеп

Негізгі бөліктер:

  1. Raspberry Pi V3 - 32,00 АҚШ доллары
  2. 5 мегапиксель 1080p сенсор OV5647 шағын камера бейне модулі - 13,00 АҚШ доллары
  3. TowerPro SG90 9G 180 градус Micro Servo (2 X)- 4,00 АҚШ доллары
  4. Шағын панорамалық/ көлбеу камера платформасы 2 сервосы бар дірілге қарсы камера қондырғысы (*) - 8.00 АҚШ доллары
  5. Резистор 1K ом (2Х) - қосымша
  6. Әр түрлі: металл бөлшектер, таспалар және т.

(*) сіз серверлермен толық Pan/Tilt платформасын сатып ала аласыз немесе өзіңіз жасай аласыз.

2 -қадам: PWM қалай жұмыс істейді

Raspberry Pi -де аналогтық шығыс жоқ, бірақ біз мұны PWM (импульстік ені модуляциясы) әдісін қолданып модельдей аламыз. Біз не істейтін боламыз - белгіленген жиіліктегі цифрлық сигналды құру, онда біз импульстік пойыздың енін өзгертеміз, төменде көрсетілгендей «орташа» шығыс кернеуінің деңгейі ретінде «аударылады»:

Кескін
Кескін

Біз бұл «орташа» кернеу деңгейін жарықдиодты жарықтылықты басқару үшін қолдана аламыз, мысалы:

Кескін
Кескін

Назар аударыңыз, бұл жерде жиіліктің өзі емес, «Қызмет циклы» маңызды, бұл импульстердің толқындық кезеңге бөлінетін «жоғары» уақыт арасындағы қатынас. Мысалы, біз Raspberry Pi GPIO бірінде 50 Гц импульс жиілігін шығарамыз деп ойлайық. (P) периоды жиілікке кері немесе 20ms (1/f) болады. Егер біз жарықдиодты «жартылай» жарқырағанын қаласақ, бізде 50%жұмыс циклі болуы керек, бұл 10 мс үшін «жоғары» болатын «импульс» дегенді білдіреді.

Бұл принцип біздің қызметтік позициямызды бақылау үшін өте маңызды болады, егер «Қызмет циклі» төменде көрсетілгендей серво позициясын анықтаса:

Серво

3 -қадам: Hw орнату

Hw орнату
Hw орнату
Hw орнату
Hw орнату

Серверлер 5V сыртқы қуат көзіне қосылады, оның деректер түйіні (менің жағдайда сары сымдары) Raspberry Pi GPIO -ға төмендегідей қосылады:

  • GPIO 17 ==> Серво көлбеу
  • GPIO 27 ==> Pan Servo

GND бірге қосуды ұмытпаңыз ==> Raspberry Pi - Servos - Сыртқы қуат көзі)

Сізде Raspberry Pi GPIO мен Server деректерді енгізу түйреуіші арасында 1K ом резисторы болуы мүмкін. Бұл сервопроблемада сіздің RPi -ні қорғайды.

4 -қадам: Серверлерді калибрлеу

Серверлерді калибрлеу
Серверлерді калибрлеу
Серверлерді калибрлеу
Серверлерді калибрлеу
Серверлерді калибрлеу
Серверлерді калибрлеу

Мұны істеу үшін бірінші кезекте сіздің сервоңыздың негізгі сипаттамаларын растау қажет. Менің жағдайда мен Power Pro SG90 қолданамын.

Оның мәліметтер парағынан мыналарды қарастыруға болады:

  • Ауқымы: 180o
  • Қуат көзі: 4,8 В (сыртқы 5 ВДС USB қуат көзі ретінде жақсы жұмыс істейді)
  • Жұмыс жиілігі: 50 Гц (Мерзімі: 20 мс)
  • Импульстің ені: 1 м -ден 2 мс дейін

Теория бойынша, серво өз күшінде болады

  • Деректер терминалына 1 мс импульс қолданылған кездегі бастапқы позиция (0 градус)
  • Бейтарап позиция (90 градус), оның деректер терминалына 1,5 мс импульс қолданылғанда
  • Ақпараттық терминалға 2 мс импульс қолданылғанда соңғы позиция (180 градус)

Python көмегімен серво позициясын бағдарламалау үшін жоғарыда көрсетілген позициялар үшін «Duty Cycle» корреспондентін білу өте маңызды болады, бірнеше есептеулер жүргізейік:

  • Бастапқы позиция ==> (0 градус) Импульстің ені ==> 1 мс ==> Жұмыс циклы = 1 мс/20 мс ==>> 2,0%
  • Бейтарап позиция (90 градус) Импульстің ені 1,5 мс ==> Жұмыс циклі = 1,5 мс/20 мс ==>> 7,5%
  • Соңғы позиция (180 градус) Импульстің ені 2 мс ==> Жұмыс циклі = 2 мс/20 мс ==>> 10%

Сонымен, қызметтік цикл 2 -ден 10 %-ға дейін өзгеруі керек.

Серваларды жеке тексеріп көрейік. Ол үшін Raspberry терминалын ашып, Python 3 қабық редакторын «sudo» ретінде іске қосыңыз (себебі сіз GPIO -мен жұмыс істейтін «супер пайдаланушы» болуыңыз керек):

sudo python3

Python Shell туралы

>>

RPI. GPIO модулін импорттаңыз және оны GPIO деп атаңыз:

GPO ретінде RPi. GPIO импорттау

Қандай пин-нөмірлеу схемасын қолданғыңыз келетінін анықтаңыз (BCM немесе BOARD). Мен бұл тестті BOARD көмегімен жасадым, сондықтан мен қолданған түйреуіштер физикалық түйреуіштер болды (GPIO 17 = Pin 11 және GPIO 27 Pin 13). Маған оларды анықтау және тест кезінде қателеспеу оңай болды (Қорытынды бағдарламада BCM қолданамын). Өз қалауыңыз бойынша біреуін таңдаңыз:

GPIO.setmode (GPIO. BOARD)

Сіз пайдаланатын серво түйреуішін анықтаңыз:

tiltPin = 11

Егер сіз оның орнына BCM схемасын қолдансаңыз, соңғы 2 пәрмен келесіге ауыстырылуы керек:

GPIO.setmode (GPIO. BCM)

tiltPin = 17

Енді біз бұл түйіннің «шығыс» болатынын көрсетуіміз керек

GPIO.setup (tiltPin, GPIO. OUT)

Бұл түйреуіште жиілік қандай болады, біздің серво үшін 50 Гц болады:

еңкейту = GPIO. PWM (tiltPin, 50)

Енді, бастапқы жұмыс циклі бар түйреуішке PWM сигналын шығаруды бастайық (біз оны «0» күйінде сақтаймыз):

еңкейту = бастау (0)

Енді сіз серво қозғалысын бақылай отырып, әр түрлі жұмыс циклінің мәндерін енгізе аласыз. 2% -дан бастайық және не болатынын көрейік (біз серво «нөлдік позицияға» өтетінін көреміз):

еңкейту. ӨзгертуDutyCycle (2)

Менің жағдайда, серво нөлдік күйге өтті, бірақ мен жұмыс циклін 3% -ға ауыстырған кезде мен 3% -дан жоғары жұмыс циклдерімен қозғала бастағанда сол күйде тұрғанын байқадым. Сонымен, 3% - бұл менің бастапқы ұстанымым (o градус). 10%-мен де солай болды, менің серво бұл мәннен жоғары болды, оның соңы 13%-ға жетті. Бұл арнайы серво үшін нәтиже болды:

  • 0 градус ==> жұмыс циклы 3%
  • 90 градус ==> жұмыс циклы 8%
  • 180 градус ==> жұмыс циклы 13%

Сынақтарды аяқтағаннан кейін сіз PWM -ді тоқтатып, GPIO -ны тазалауыңыз керек:

еңкейту = тоқтау ()

GPIO.cleanup ()

Жоғарыдағы Терминалды басып шығару экраны менің екі серво үшін нәтижені көрсетеді (нәтижелері ұқсас). Сіздің диапазоныңыз әр түрлі болуы мүмкін.

5 -қадам: Python сценарийін құру

Python сценарийін құру
Python сценарийін құру

Біздің сервоға жіберілетін PWM командалары соңғы қадамда көргеніміздей «кезекші циклдарда». Бірақ, әдетте, біз серваны басқару үшін параметр ретінде градуспен «бұрышты» қолдануымыз керек. Сонымен, біз «цикл» түсінігімізге сәйкес келетін қызметтік циклдегі табиғи өлшем болып табылатын «бұрышты» түрлендіруіміз керек.

Мұны қалай істеу керек? Өте қарапайым! Біз жұмыс циклінің диапазоны 3% -дан 13% -ға дейін болатынын білеміз және бұл 0 -ден 180 градусқа дейінгі бұрыштарға тең. Сонымен қатар, біз бұл вариациялар сызықтық екенін білеміз, сондықтан жоғарыда көрсетілгендей пропорционалды схеманы құруға болады. Осылайша, бұрышқа сәйкес, бізде корреспонденттік цикл болуы мүмкін:

Dutycycle = бұрыш/18 + 3

Бұл формуланы сақтаңыз. Біз оны келесі кодта қолданамыз.

Сынақтарды орындау үшін Python сценарийін құрайық. Негізінде, біз бұрын Python Shell -де жасағанды қайталаймыз:

уақыттан бастап ұйқы импортталады

RPi. GPIO -ны GPIO GPIO.setmode (GPIO. BCM) ретінде импорттау GPIO.setwarnings (False) defServoAngle (servo, бұрыш): pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = бұрыш / 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 GPIO нөмірін және серво орналасуы керек бұрыштың мәнін алады. Бұл функцияның кірісі «бұрыш» болғаннан кейін, біз оны бұрын әзірленген формуланы пайдаланып, пайыздық циклге айналдыруымыз керек.

Сценарий орындалған кезде сіз параметрлер, сервистік GPIO және бұрыш ретінде енгізуіңіз керек.

Мысалға:

sudo python3 бұрышыServoCtrl.py 17 45

Жоғарыдағы пәрмен GPIO 17 -де 45 градусқа қосылған серводы «биіктікте» орналастырады. Ұқсас пәрмен Pan Servo басқару үшін қолданылуы мүмкін («азимутта» 45 градусқа дейін орналасуы):

sudo python бұрышыServoCtrl.py 27 45

AngleServoCtrl.py файлын менің GitHub -дан жүктеуге болады

6-қадам: еңкейту механизмі

Бұрылу механизмі
Бұрылу механизмі

«Пан» серво камерамызды «көлденең» жылжытады («азимут бұрышы»), ал «көлбеу» серво оны «тігінен» (биіктік бұрышы) жылжытады.

Төмендегі суретте Pan/Tilt механизмі қалай жұмыс істейтіні көрсетілген:

Кескін
Кескін

Даму барысында біз «шектен шығуға» бармаймыз және біз Pan/Tilt механизмін тек 30 -дан 150 градусқа дейін қолданамыз. Бұл диапазон камерамен пайдалануға жеткілікті болады.

7 -қадам: панельді қисайту механизмі - механикалық құрылыс

Бұрылу механизмі - механикалық құрылыс
Бұрылу механизмі - механикалық құрылыс
Бұрылу механизмі - механикалық құрылыс
Бұрылу механизмі - механикалық құрылыс
Бұрылу механизмі - механикалық құрылыс
Бұрылу механизмі - механикалық құрылыс

Келіңіздер, біздің 2 серводы Pan/Tilt механизмі ретінде құрастырамыз. Мұнда сіз 2 нәрсені жасай аласыз. Pan-Tilt платформасының механизмін соңғы қадамда көрсетілгендей сатып алыңыз немесе өзіңіздің қажеттіліктеріңізге сәйкес өзіңіз жасаңыз.

Бір мысал, мен жасаған сервистер болуы мүмкін, тек қана серваларды бір -біріне байлап, жоғарыдағы фотода көрсетілгендей ескі ойыншықтардың ұсақ металл бөлшектерін қолдана отырып.

8 -қадам: Электрлік панель/көлбеу құрастыру

Электрлік панель/көлбеу құрастыру
Электрлік панель/көлбеу құрастыру
Электрлік панель/көлбеу құрастыру
Электрлік панель/көлбеу құрастыру
Электрлік панель/көлбеу құрастыру
Электрлік панель/көлбеу құрастыру
Электрлік панель/көлбеу құрастыру
Электрлік панель/көлбеу құрастыру

Пан/көлбеу механизмі жиналғаннан кейін, толық электрлік байланыс үшін фотосуреттерді орындаңыз.

  1. Пиді өшіріңіз.
  2. Барлық электрлік қосылуларды жасаңыз.
  3. Оны екі рет тексеріңіз.
  4. Алдымен Pi -ді қосыңыз.
  5. Егер бәрі жақсы болса, серверлерді қосыңыз.

Біз бұл оқулықта камераны қалай орнату керектігін қарастырмаймыз, бұл келесі оқулықта түсіндіріледі.

9 -қадам: Python сценарийі

Python сценарийін жасай отырып, екі сервоны бір уақытта басқарамыз:

уақыттан бастап ұйқы импортталады

RPi. GPIO -ны GPIO GPIO.setmode (GPIO. BCM) ретінде импорттау GPIO.setwarnings (False) pan = 27 еңкейту = 17 GPIO.setup (еңкейту, GPIO. OUT) # ақ => TILT GPIO.setup (пан, GPIO. OUT)) # grey ==> PAN def setServoAngle (servo, бұрыш): бекіту бұрышы> = 30 және бұрышы 90 (орта нүкте) ==> 150 setServoAngle (көлбеу, инт (sys.argv [2])) # 30 ==> 90 (орта нүкте) ==> 150 GPIO.cleanup ()

Сценарий орындалған кезде сіз параметрлер ретінде панорамалық бұрыш пен көлбеу бұрышты енгізуіңіз керек. Мысалға:

sudo python3 servoCtrl.py 45 120

Жоғарыда келтірілген пәрмен Пан/көлбеу механизмін 45 градус «азимутта» (бұрылу бұрышы) және 120 градус «биіктікте» (көлбеу бұрышы) орналастырады. Ешқандай параметр енгізілмесе, әдепкі мәні 90 градусқа дейін жылжу мен еңкейту бұрышы болады.

Төменде сіз бірнеше тесттерді көре аласыз:

Кескін
Кескін

ServoCtrl.py файлын менің GitHub -дан жүктеуге болады.

10 -қадам: Серверлердің циклдық сынағы

Енді сервистердің толық спектрін автоматты түрде тексеру үшін Python сценарийін құрайық:

уақыттан бастап ұйқы импортталады

RPi. GPIO -ны GPIO GPIO.setmode (GPIO. BCM) ретінде импорттау GPIO.setwarnings (False) pan = 27 еңкейту = 17 GPIO.setup (еңкейту, GPIO. OUT) # ақ => TILT GPIO.setup (пан, GPIO. OUT)) # grey ==> PAN def setServoAngle (servo, angle): бекіту бұрышы> = 30 және бұрыш <= 150 pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = бұрыш / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) ұйқысы (0.3) ауқым (150, 30, -15): setServoAngle (пан, i) setServoAngle (еңкейту, i) setServoAngle (табақ, 100) setServoAngle (еңкейту, 90) GPIO.cleanup ()

Бағдарлама автоматты түрде екі бұрышта 30 -дан 150 градусқа дейінгі циклды орындайды.

Нәтиженің астында:

Мен осциллографты тек бұрын түсіндірілген PWM теориясын көрсету үшін қостым.

Кескін
Кескін

Жоғарыда көрсетілген servoTest.py кодын менің GitHub -дан жүктеуге болады.

11 -қадам: Қорытынды

Қорытынды
Қорытынды

Әдеттегідей, бұл жоба басқаларға электрониканың қызықты әлеміне жол табуға көмектеседі деп сенемін!

Мәліметтер мен соңғы кодты алу үшін GitHub депозитарийіме кіріңіз: RPi-Pan-Tilt-Servo-Control

Басқа жобалар үшін менің блогыма кіріңіз: MJRoBot.org

Төменде менің келесі оқулығымды көруге болады:

Кескін
Кескін

Әлемнің оңтүстігінен сәлем!

Келесі нұсқаулықта кездескенше!

Рақмет сізге, Марсело

Ұсынылған: