فهرست مطالب:

Pan-Tilt Multi Servo Control: 11 مرحله (همراه با تصاویر)
Pan-Tilt Multi Servo Control: 11 مرحله (همراه با تصاویر)

تصویری: Pan-Tilt Multi Servo Control: 11 مرحله (همراه با تصاویر)

تصویری: Pan-Tilt Multi Servo Control: 11 مرحله (همراه با تصاویر)
تصویری: How Use Stable Diffusion, SDXL, ControlNet, LoRAs For FREE Without A GPU On Kaggle Like Google Colab 2024, جولای
Anonim
Pan-Tilt Multi Servo Control
Pan-Tilt Multi Servo Control

در این آموزش ، نحوه کنترل چندین سرویس با استفاده از پایتون در رزبری پای را بررسی می کنیم. هدف ما مکانیسم PAN/TILT برای قرار دادن دوربین (PiCam) خواهد بود.

در اینجا می توانید نحوه کار پروژه نهایی ما را مشاهده کنید:

تست حلقه کنترل سروو کنترل:

تصویر
تصویر

مرحله 1: BoM - Bill of Material

قسمت های اصلی:

  1. رزبری پای V3 - 32 دلار آمریکا
  2. سنسور 5 مگاپیکسلی سنسور 1080p OV5647 مینی دوربین فیلمبرداری - 13.00 دلار آمریکا
  3. TowerPro SG90 9G 180 درجه میکرو سرویس (2 X)- 4.00 دلار آمریکا
  4. Mini Pan/ Tilt Camera Platform Anti -Vibration Camera Mount w/ 2 Servos (*) - 8.00 دلار آمریکا
  5. مقاومت 1K اهم (2X) - اختیاری
  6. متفرقه: قطعات فلزی ، نوارها و غیره (در صورت ایجاد مکانیسم Pan/Tilt)

(*) می توانید یک پلت فرم کامل Pan/Tilt را با سرویس ها خریداری کرده یا خود را بسازید.

مرحله 2: نحوه کار PWM

رزبری پای خروجی آنالوگ ندارد ، اما ما می توانیم این را با استفاده از روش PWM (مدولاسیون عرض پالس) شبیه سازی کنیم. آنچه ما انجام خواهیم داد این است که یک سیگنال دیجیتالی با فرکانس ثابت تولید کنیم ، جایی که عرض قطار پالس را تغییر می دهیم ، همانطور که در زیر نشان داده می شود "ولتاژ خروجی" متوسط ".

تصویر
تصویر

ما می توانیم از این سطح ولتاژ "متوسط" برای کنترل روشنایی LED استفاده کنیم:

تصویر
تصویر

توجه کنید که آنچه در اینجا اهمیت دارد خود فرکانس نیست ، بلکه "چرخه وظیفه" است ، یعنی رابطه بین زمان "زیاد" بودن ضربان بر دوره موج تقسیم می شود. به عنوان مثال ، فرض کنید ما فرکانس پالس 50 هرتز را در یکی از Raspberry Pi GPIO خود تولید می کنیم. دوره (p) معکوس فرکانس یا 20ms (1/f) خواهد بود. اگر می خواهیم LED ما با "نیمه" روشن باشد ، باید یک چرخه وظیفه 50٪ داشته باشیم ، این بدان معناست که "نبض" برای 10 میلی ثانیه "زیاد" خواهد بود.

این اصل برای ما بسیار مهم است ، برای کنترل موقعیت سروو ، هنگامی که "چرخه وظیفه" موقعیت سرو را مطابق شکل زیر مشخص می کند:

سروو

مرحله 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 و پین ورودی داده سرور داشته باشید. این امر در صورت بروز مشکل سروو از RPi شما محافظت می کند.

مرحله 4: کالیبراسیون Servos

کالیبراسیون سرووس
کالیبراسیون سرووس
کالیبراسیون سرووس
کالیبراسیون سرووس
کالیبراسیون سرووس
کالیبراسیون سرووس

اولین کاری که باید انجام دهید این است که ویژگی های اصلی سروهای خود را تأیید کنید. در مورد من ، من از Power Pro SG90 استفاده می کنم.

از برگه داده آن می توان موارد زیر را در نظر گرفت:

  • محدوده: 180 درجه
  • منبع تغذیه: 4.8V (5VDC خارجی به عنوان منبع تغذیه USB خوب کار می کند)
  • فرکانس کار: 50 هرتز (مدت زمان: 20 میلی ثانیه)
  • عرض نبض: از 1ms تا 2ms

از لحاظ تئوری ، سروو روی آن کار می کند

  • موقعیت اولیه (0 درجه) هنگامی که یک پالس 1 میلی ثانیه به پایانه داده آن اعمال می شود
  • موقعیت خنثی (90 درجه) هنگامی که یک پالس 1.5 میلی ثانیه به پایانه داده آن اعمال می شود
  • موقعیت نهایی (180 درجه) هنگامی که یک پالس 2 میلی ثانیه به پایانه داده آن اعمال می شود

برای برنامه ریزی موقعیت سرو با استفاده از پایتون ، دانستن خبرنگار "چرخه وظیفه" برای موقعیت های فوق بسیار مهم است ، بیایید محاسبه ای انجام دهیم:

  • موقعیت اولیه ==> ((0 درجه) عرض پالس ==> 1ms ==> چرخه وظیفه = 1ms/20ms ==> 2.0٪
  • موقعیت خنثی (90 درجه) عرض نبض 1.5 میلی ثانیه ==> چرخه کار = 1.5 میلی ثانیه/20 میلی متر ==> 7.5
  • موقعیت نهایی (180 درجه) عرض پالس 2 ms ==> چرخه کار = 2ms/20ms ==> 10٪

بنابراین چرخه وظیفه باید در محدوده 2 تا 10 درصد متفاوت باشد.

بیایید سروها را به صورت جداگانه آزمایش کنیم. برای انجام این کار ، ترمینال رزبری خود را باز کنید و ویرایشگر پوسته Python 3 خود را به عنوان "sudo" راه اندازی کنید (زیرا شما باید با GPIO ها "فوق کاربر" باشید):

sudo python3

در پایتون شل

>>

ماژول RPI. GPIO را وارد کرده و آن را GPIO بنامید:

RPi. GPIO را به عنوان GPIO وارد کنید

تعیین کنید که از کدام طرح شماره گذاری پین می خواهید استفاده کنید (BCM یا BOARD). من این آزمایش را با BOARD انجام دادم ، بنابراین پین هایی که استفاده کردم پین های فیزیکی بودند (GPIO 17 = پین 11 و GPIO 27 پین 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 start شروع کنیم و ببینیم چه اتفاقی می افتد (ما مشاهده می کنیم که سروو به "موقعیت صفر" می رود):

tilt. ChangeDutyCycle (2)

در مورد من ، سروو به موقعیت صفر رسید اما وقتی چرخه کار را به 3 changed تغییر دادم ، مشاهده کردم که سرو در همان وضعیت باقی می ماند و با چرخه های کاری بیشتر از 3 starting شروع به حرکت می کند. بنابراین ، 3 position موقعیت اولیه من (درجه) است. همین امر با 10 happened اتفاق افتاد ، سروو من از این مقدار بالاتر رفت و پایان آن 13 بود. بنابراین برای این سرووی خاص ، نتیجه این بود:

  • 0 درجه ==> چرخه وظیفه 3
  • 90 درجه ==> چرخه کار 8
  • 180 درجه ==> چرخه کار 13

پس از اتمام آزمایشات ، باید PWM را متوقف کرده و GPIO ها را تمیز کنید:

شیب = توقف ()

GPIO.cleanup ()

صفحه چاپ ترمینال بالا نتیجه را برای هر دو سرویس من نشان می دهد (که نتایج مشابهی دارد). محدوده شما می تواند متفاوت باشد.

مرحله 5: ایجاد یک اسکریپت پایتون

ایجاد اسکریپت پایتون
ایجاد اسکریپت پایتون

دستورات PWM برای ارسال به سروو ما در "چرخه وظیفه" هستند ، همانطور که در آخرین مرحله دیدیم. اما معمولاً باید از "angle" در درجه به عنوان پارامتر برای کنترل سروو استفاده کنیم. بنابراین ، ما باید "زاویه" را که یک اندازه گیری طبیعی تر است در چرخه وظیفه به Pi تبدیل کنیم.

چگونه انجامش بدهیم؟ بسیار ساده! ما می دانیم که محدوده چرخه وظیفه از 3 to تا 13 goes است و این معادل زاویه هایی است که از 0 تا 180 درجه متغیر است. همچنین ، ما می دانیم که این تغییرات خطی هستند ، بنابراین می توانیم یک طرح متناسب همانطور که در بالا نشان داده شده است بسازیم. بنابراین ، با توجه به زاویه ، می توانیم یک چرخه وظیفه مربوطه داشته باشیم:

dutycycle = angle/18 + 3

این فرمول را حفظ کنید. در کد بعدی از آن استفاده خواهیم کرد.

بیایید یک اسکریپت پایتون برای اجرای آزمایشات ایجاد کنیم. اساساً ما آنچه را که قبلاً در Python Shell انجام دادیم تکرار می کنیم:

از زمان وارد کردن خواب

وارد کردن RPi. GPIO به عنوان GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) def setServoAngle (سروو ، زاویه): pwm = GPIO. PWM (سروو ، 50) pwm.start (8) وظیفه چرخه = زاویه / 18 + 3. pwm. ChangeDutyCycle (dutyCycle) sleep (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 ()

هسته اصلی کد بالا تابع setServoAngle (سروو ، زاویه) است. این تابع به عنوان آرگومان ، یک شماره GPIO سروو و مقدار زاویه ای که سروو باید در آن قرار گیرد دریافت می کند. هنگامی که ورودی این تابع "زاویه" است ، باید آن را با درصد به چرخه وظیفه تبدیل کنیم ، با استفاده از فرمول قبلاً ایجاد شده.

هنگامی که اسکریپت اجرا می شود ، باید به عنوان پارامترها ، سروو GPIO و زاویه وارد کنید.

مثلا:

sudo python3 angleServoCtrl.py 17 45

دستور بالا سروو متصل به GPIO 17 را با 45 درجه در "ارتفاع" قرار می دهد. یک فرمان مشابه می تواند برای کنترل Pan Servo (موقعیت تا 45 درجه در "آزیموت") استفاده شود:

sudo python angleServoCtrl.py 27 45

فایل angleServoCtrl.py را می توان از GitHub من بارگیری کرد

گام ششم: مکانیسم پان-شیب

مکانیسم Pan-Tilt
مکانیسم Pan-Tilt

سروو "Pan" دوربین ما را "افقی" ("زاویه آزیموت") و سروو "Tilt" ما آن را "عمودی" (زاویه ارتفاع) حرکت می دهد.

تصویر زیر نحوه عملکرد مکانیسم Pan/Tilt را نشان می دهد:

تصویر
تصویر

در طول توسعه ما "افراط" نخواهیم کرد و از مکانیسم Pan/Tilt خود فقط از 30 تا 150 درجه استفاده خواهیم کرد. این محدوده برای استفاده با دوربین کافی خواهد بود.

مرحله 7: مکانیسم پان -شیب - ساخت مکانیکی

مکانیسم 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: اسکریپت پایتون

بیایید یک اسکریپت پایتون ایجاد کنیم تا هر دو سرویس را به طور همزمان کنترل کنیم:

از زمان وارد کردن خواب

وارد کردن RPi. GPIO به عنوان GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) pan = 27 tilt = 17 GPIO.setup (tilt، GPIO. OUT) # white => TILT GPIO.setup (pan، GPIO. OUT) # خاکستری ==> PAN def setServoAngle (سروو ، زاویه): زاویه تأیید> = 30 و زاویه 90 (نقطه وسط) ==> 150 مجموعهServoAngle (شیب ، int (sys.argv [2])) # 30 ==> 90 (نقطه میانی) ==> 150 GPIO.cleanup ()

هنگامی که اسکریپت اجرا می شود ، باید به عنوان پارامترها ، Pan angle و Tilt angle وارد کنید. مثلا:

sudo python3 servoCtrl.py 45 120

دستور بالا مکانیسم Pan/Tilt را با 45 درجه در "آزیموت" (زاویه پان) و 120 درجه "ارتفاع" (زاویه شیب) قرار می دهد. توجه داشته باشید که اگر هیچ پارامتری وارد نشود ، پیش فرض هر دو ، زاویه چرخش و شیب تا 90 درجه تنظیم می شود.

در زیر می توانید چند آزمایش را مشاهده کنید:

تصویر
تصویر

فایل servoCtrl.py را می توان از GitHub من بارگیری کرد.

مرحله 10: تست حلقه سرورها

بیایید یک اسکریپت پایتون ایجاد کنیم تا به طور خودکار طیف وسیعی از سرویس ها را آزمایش کند:

از زمان وارد کردن خواب

وارد کردن RPi. GPIO به عنوان GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) pan = 27 tilt = 17 GPIO.setup (tilt، GPIO. OUT) # white => TILT GPIO.setup (pan، GPIO. OUT) # gray ==> PAN def setServoAngle (سروو ، زاویه): زاویه را تأیید کنید> = 30 و زاویه <= 150 pwm = GPIO. PWM (سروو ، 50) pwm.start (8) dutyCycle = angle / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) خواب (0.3) pwm.stop () اگر _name_ == '_main_': برای i در محدوده (30 ، 160 ، 15): setServoAngle (تابه ، i) setServoAngle (کج ، i) برای i در محدوده (150 ، 30 ، -15): setServoAngle (تابه ، i) مجموعهServoAngle (شیب ، i) مجموعهServoAngle (تابه ، 100) مجموعهServoAngle (شیب ، 90) GPIO.cleanup ()

این برنامه به صورت خودکار یک حلقه را از 30 تا 150 درجه در هر دو زاویه اجرا می کند.

زیر نتیجه:

من فقط یک اسیلوسکوپ را متصل کردم تا نظریه PWM را همانطور که قبلاً توضیح داده شد نشان دهم.

تصویر
تصویر

کد بالا ، servoTest.py را می توانید از GitHub من بارگیری کنید.

مرحله 11: نتیجه گیری

نتیجه
نتیجه

مثل همیشه ، امیدوارم این پروژه بتواند به دیگران کمک کند تا به دنیای هیجان انگیز الکترونیک راه پیدا کنند!

برای اطلاعات بیشتر و کد نهایی ، لطفاً از مخزن GitHub من دیدن کنید: RPi-Pan-Tilt-Servo-Control

برای پروژه های بیشتر ، لطفاً از وبلاگ من دیدن کنید: MJRoBot.org

در زیر نگاهی اجمالی به آموزش بعدی من:

تصویر
تصویر

سلودوس از جنوب جهان!

شما را در دستورالعمل بعدی من می بینم!

متشکرم،

مارسلو

توصیه شده: