استپر موتورها (موتورهای پلهای)، موتورهای قدرتمندی برای کنترل موقعیت هستند. آنها نوع خاصی از موتورهای بدون جاروبک هستند که یک دوران کامل را بین تعدادی پله (گام) یکسان تقسیم میکنند. در پرینترهای رومیزی، پرینترهای سه بعدی، دستگاههای فرز CNC و هرچیز دیگری که نیاز به کنترل دقیق موقعیت دارد، معمولا از استپر موتورها استفاده میشود.
برای اینکه بتوانید با هزینه کمی یک استپر موتور را راه اندازی کنید، استپر موتور 28BYJ-48 یک انتخاب عالی برای شما خواهد بود. این استپر موتور معمولا دارای یک برد درایور ULN2003 است و همین باعث شده تا کار با آن بسیار راحت باشد. در ادامه بیشتر با این موتور آشنا خواهید شد.
استپر موتورها چگونه کار میکنند؟استپر موتورها برای دوران یک پله در هر زمان، از چرخدندهای با 32 دندانه و 4 آهنربای الکتریکی استفاده میکنند. ارسال هر پالس HIGH، به سیمپیچ انرژی میدهد. خاصیت مغناطیسی ایجاد شده توسط سیم پیچ نیز، نزدیکترین دندانهی چرخدنده را جذب میکند و در نهایت موتور را یک پله به حرکت درمیآورد. نحوه عملکرد استپر موتور را میتوانید در انیمیشن زیر مشاهده کنید: |
استپر موتور 28BYJ-48
برای اینکه بتوانید راه اندازی استپر موتور 28BYJ-48 با درایور ULN2003 و آردوینو را شروع کنید، باید با این استپر موتور و این درایور به طور کامل آشنا شوید.
28BYJ-48 یک استپر موتور پنج سیمهی تک قطبی است که با 5 ولت راه اندازی میشود.
یکی از نکات بسیار جالب در مورد این نوع استپر موتورها قدمت طولانی آنها است. طی دهههای گذشته، در کاربردهای مختلفی مانند دستگاههای تهویه هوا، دستگاه CNC و پرینترها از این موتورها استفاده شده است.
یکی از بهترین مزیتهای این نوع از استپر موتورها این است که میتوانند به طور دقیق در هر زمان یک پله جابهجا شوند. مزیت دیگری که میتوانیم در مورد این موتورها ذکر کنیم، قابل اطمینان بودن آنها به دلیل عدم استفاده از جاروبک است.
بهطور کلی این نوع استپر موتورها، حتی در حالت سکون هم گشتاور خوبی ایجاد میکنند که تا زمانیکه تغذیه موتور تأمین شود، همچنان حفظ میگردد. اما تنها نقطه ضعف این موتورها این است که همیشه گشنه هستند! یعنی حتی زمانیکه در حرکت نیستند هم، برق مصرف میکنند.
ضریب کاهش سرعت چرخش 28BYJ-48
براساس دیتاشیت استپر موتور 28BYJ-48، زمانیکه این موتور در مد پلهی کامل کار میکند، به ازای هر پله 11.25 درجه میچرخد. این موضوع به این معنا است که در هر دوران 32 پله وجود دارد (32=11.25°/360).
برای کاهش ضریب سرعت چرخش موتور، نسبت 4 چرخدنده استپر موتور در هم ضرب میشود و حاصل آن برابر 63.68395 است.
علاوه بر این، موتور 28BYJ-48 دارای نسبت تبدیل سرعت 1.64 است (نسبت تبدیل سرعت در واقع 1/63.68395 است، اما در اکثر کاربردها 1.64، معمولا نسبت مناسبی خواهد بود). اما این دقیقا به چه معنا است؟ این یعنی در هر دوران، عملاً 63.68395*32 پله وجود دارد که برابر 2037.8864 و حدودا 2038 پله است.
مصرف برق 28BYJ-48
مصرف برق استپر موتور 28BYJ-48 حدود 240 میلی آمپر است. همانطور که میبینید، این موتور برق زیادی مصرف میکند. به همین دلیل بهتر است برای تامین برق مورد نیاز آن، به جای آردوینو، مستقیماً از یک منبع تغذیهی 5 ولت خارجی استفاده کنید.
نکته | این نکته را هیچ وقت فراموش نکنید که استپر موتور 28BYJ-48، حتی در حالت ساکن هم برق مصرف میکند. |
برد درایور ULN2003
اکنون زمان بررسی برد درایور ULN2003 است. موتور 28BYJ-48 معمولاً همراه با یک برد درایور مبتنی بر ULN2003 به کار میرود.
ULN2003 یکی از رایجترین آی سی درایور موتورهایی است که از 7 زوج ترانزیستور دارلینگتون تشکیل شده است. هر زوج از این ترانزیستورها قادر است بارهایی تا حداکثر 500 میلیآمپر و 50 ولت را راه اندازی کند. در برد درایور ULN2003، از میان 7 جفت زوج دارلینگتون، از 4 جفت آن استفاده شده است.
این برد، دارای کانکتوری است که کاملا با سیمهای موتور متناسب میباشد و اتصال موتور به آن را بسیار آسان کرده است. علاوه بر این، بر روی این برد، اتصالاتی نیز برای چهار ورودی کنترلی و تغذیه وجود دارد.
برد ULN2003، چهار LED نیز دارد که فعالیت در چهار خط ورودی کنترلی را نشان میدهد (برای نمایش حالت پلهای). این چهار LED هنگام حرکت موتور، تصویری از آن را ارائه میدهند.
علاوه بر اینها، این برد یک جامپر ON/OFF برای قطع برق از استپر موتور دارد.
پایه های برد درایور پلهای ULN2003
در بخش قبلی با ویژگیهای برد درایور ULN2003 آشنا شدید، اما بیایید نگاهی به پایههای این برد داشته باشیم تا بتوانید بهراحتی راه اندازی استپر موتور با این درایور را انجام دهید. پایههای این برد را میتوانید در تصویر زیر ببینید:
IN1 – IN4 : از این چهار پایه برای راهاندازی موتور استفاده میشود. این پایهها را باید به پایههای خروجی دیجیتال آردوینو متصل کنید.
GND: پایهی زمین مشترک است.
VDD : این پایه برق موتور را تأمین میکند و باید به یک منبع تغذیهی 5 ولت خارجی متصل شود. همانطور که قبلا گفتیم، موتور برق زیادی مصرف میکند، به همین دلیل هرگز از 5 ولت تغذیهی آردوینو برای تأمین برق این استپر موتور استفاده نکنید.
Motor Connector : کانکتور موتور قسمتی است که موتور به آن متصل میشود. این کانکتور از نوع قفلدار میباشد، به همین دلیل تنها در یک جهت قابل استفاده است.
راه اندازی استپر موتور 28BYJ-48 با درایور ULN2003 و آردوینو
اکنون همه چیز را در مورد استپر موتور 28BYJ-48 و درایور ULN2003 میدانید. بنابراین وقت آن رسیده است که استپر موتور 28BYJ-48 را با درایور ULN2003 و آردوینو راه اندازی کنیم. قطعات این پروژه عبارت اند از:
- ماژول درایور استپ موتور ULN2003 SMD
- استپر موتور 28BYJ-48-5V
- کانکتور XH مادگی
- ماژول آردوینو UNO R3 CH340G
- سیم جامپر نری / مادگی
در ابتدا، منبع تغذیه را به درایور ULN2003 متصل کنید. در اینجا باید به این نکته دقت داشته باشید که تأمین برق استپر موتور از طریق آردوینو امکانپذیر است. با این حال، معمولا این کار توصیه نمیشود، زیرا ممکن است موتور نویز الکتریکی را به خطوط تغذیهی خود القا کند و باعث آسیب دیدن آردوینو شود. بنابراین، از یک منبع تغذیهی 5 ولت مجزا برای تأمین برق استپر موتور خود استفاده کنید.
در قدم بعدی، زمین منبع تغذیه را به زمین آردوینو وصل کنید. این کار اهمیت بسیاری دارد، زیرا شما میتوانید مرجع ولتاژ یکسانی بین این دو ایجاد کنید.
در مرحله بعدی، IN4, IN3, IN2, IN1 برد درایور را به ترتیب به پایههای دیجیتال 8، 9، 10 و 11 آردوینو متصل نمائید.
در نهایت، کابل استپر موتور را به برد درایور متصل کنید.
پس از اتمام سیمکشی، باید چیزی مشابه تصویر زیر داشته باشید:
نحوه سیمکشی یک استپر موتور 28BYJ-48
کد آردوینو – با استفاده از کتابخانهی استپر موجود در آردوینو
برای اولین آزمایشمان، از کتابخانهی استپر آردوینو که همراه با نرم افزار آردوینو ارائه میشود، استفاده میکنیم. این کتابخانه براساس توالی پلهها عمل میکند و با دادن پالسهای متوالی، استپر موتور را بهصورت مستقیم به جلو هدایت میکند. از طریق این کتابخانه انواع زیادی از استپر موتورها، چه تک قطبی و چه دوقطبی را میتوان بهراحتی کنترل کرد.
در ادامه نمونه کد سادهای برای شما قرار دادهایم که ابتدا استپر موتور را به آرامی بهصورت ساعتگرد و سپس با سرعت به صورت پادساعتگرد حرکت میدهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | //Includes the Arduino Stepper Library #include <Stepper.h> // Defines the number of steps per rotation const int stepsPerRevolution = 2038; // Creates an instance of stepper class // Pins entered in sequence IN1-IN3-IN2-IN4 for proper step sequence Stepper myStepper = Stepper(stepsPerRevolution, 8, 10, 9, 11); void setup() { // Nothing to do (Stepper Library sets pins as outputs) } void loop() { // Rotate CW slowly myStepper.setSpeed(100); myStepper.step(stepsPerRevolution); delay(1000); // Rotate CCW quickly myStepper.setSpeed(700); myStepper.step(-stepsPerRevolution); delay(1000); } |
توضیحات کد:
در اینجا میخواهیم دستورات بالا را باهم بررسی کنیم تا شما متوجه شوید که با بارگذاری این کد دقیقا چه اتفاقی رخ میدهد.
این نمونه کد با افزودن کتابخانهی استپر موتور آغاز میشود.
1 | #include <Stepper.h> |
در خط بعدی دستورات، متغیر ثابت stepPerRevolution را تعریف میکنید و تعداد پلههایی را که موتور در یک دوران کامل طی خواهد کرد، به آن تخصیص میدهید. در اینجا تعداد پلهها 2038 است.
1 | const int stepsPerRevolution = 2038; |
ترتیب پلهها در استپر موتور تک قطبی 28BYJ-48 بهصورت IN4- IN3 – IN2 – IN1 میباشد. باید از این اطلاعات استفاده کنید تا با ایجاد شی myStepper از کتابخانهی استپر، موتور را راه اندازی کنید. برای رعایت ترتیب پلهها، در اینجا پایهها باید به شکل 8, 10, 9, 11 باشد، زیرا پایه IN1 تا IN4 به ترتیب به پایه 8 تا 11 متصل شدهاند.
حتما از ترتیب درست پلهها و پایهها مطمئن شوید. زیرا اگر به اشتباه این کار را انجام دهید، موتور بهدرستی عمل نخواهد کرد.
1 | Stepper myStepper = Stepper(stepsPerRevolution, 8, 10, 9, 11); |
در تابع setup، نیازی نیست چیزی را تنظیم کنید، زیرا کتابخانهی استپر چهار پایهی I/O را به عنوان خروجی تنظیم کرده است.
1 2 | void setup() { } |
در تابع Loop، باید از تابع ()setSpeed برای تنظیم سرعت حرکت استپر موتور و متعاقباً از تابع ()step برای بیان تعداد پلهها در هر دوران استفاده کنید. اگر یک عدد منفی به تابع ()step بدهید، جهت چرخش موتور معکوس خواهد شد.
طبق قسمت اول کد در تابع Loop، موتور به آرامی بهصورت ساعتگرد میچرخد و طبق قسمت دوم آن، موتور با سرعت بیشتری بهصورت پادساعتگرد دوران خواهد کرد.
1 2 3 4 5 6 7 8 9 10 11 | void loop() { // Rotate CW slowly myStepper.setSpeed(100); myStepper.step(stepsPerRevolution); delay(1000); // Rotate CCW quickly myStepper.setSpeed(700); myStepper.step(-stepsPerRevolution); delay(1000); } |
کد آردوینو – با استفاده از کتابخانهی AccelStepper
کتابخانهی استاندارد استپر آردوینو برای کاربردهای ساده و پروژههایی که از یک موتور استفاده میکنند، بسیار مناسب است. اما اگر بخواهید چندین استپر موتور را باهم کنترل کنید، به کتابخانهی بهتری نیاز خواهید داشت.
به همین دلیل، در دومین آزمایش، از یک کتابخانهی استپر موتور پیشرفته تحت عنوان AccelStepper استفاده میکنیم. این کتابخانه از چندین جهت کتابخانهی استاندارد استپر آردوینو را بهبود میبخشد:
- پشتیبانی از افزایش و کاهش سرعت استپر موتور (تغییر سرعت)
- پشتیبانی از چرخش نیم پله
- پشتیبانی از چندین استپر همزمان، با حرکت پلهای مستقل و همزمان در هر استپر
این کتابخانه در نرم افزار آردوینو وجود ندارد، به همین دلیل ابتدا باید آن را نصب کنید.
نصب کتابخانه
برای نصب کتابخانه AccelStepper از مسیر Sketch > Include Library > Manage Libraries به قسمت Manage Library بروید. سپس منتظر بمانید تا Manage Library فهرست کتابخانهها را دانلود و لیست کتابخانههای نصب شده را به روزرسانی نماید.
پس از مشاهده لیست کتابخانهها در Library manager، در قسمت جستجو بالای صفحه، نام کتابخانه مورد نظر یعنی accelatepper را وارد کنید. پس از جستجو نام کتابخانه، بر روی اولین مورد پیدا شده کلیک کنید و با انتخاب گزینه Install، آن را نصب نمایید.
کد آردوینو
در اینجا نمونه کد ساده ای را قرار دادهایم که سرعت استپر موتور را در یک جهت افزایش میدهد و سپس از سرعت آن میکاهد تا در حالت استراحت قرار بگیرد. زمانیکه موتور یک دور دوران کند، این کد، جهت دوران آن را تغییر میدهد و این امر را چندین مرتبه تکرار میکند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | // Include the AccelStepper Library #include <AccelStepper.h> // Define step constant #define FULLSTEP 4 // Creates an instance // Pins entered in sequence IN1-IN3-IN2-IN4 for proper step sequence AccelStepper myStepper(FULLSTEP, 8, 10, 9, 11); void setup() { // set the maximum speed, acceleration factor, // initial speed and the target position myStepper.setMaxSpeed(1000.0); myStepper.setAcceleration(50.0); myStepper.setSpeed(200); myStepper.moveTo(2038); } void loop() { // Change direction once the motor reaches target position if (myStepper.distanceToGo() == 0) myStepper.moveTo(-myStepper.currentPosition()); // Move the motor one step myStepper.run(); } |
توضیحات کد:
و اما نوبت بررسی این نمونه کد است. در خط اول این نمونه کد، کتابخانهی AccelStepper که به تازگی نصب کردهاید، اضافه میکنید.
1 | #include <AccelStepper.h> |
از آنجاییکه میخواهیم موتور خود را در حالت پلهی کامل راه اندازی کنیم، باید یک متغیر ثابت به همین منظور تعریف کنیم. اگر میخواهید موتور خود را در حالت نیم پله راهاندازی کنید، متغیر ثابت را بر روی 8 تنظیم نمائید.
1 | #define FULLSTEP 4 |
در خط سوم، یک نمونه شی استپر تحت عنوان myStepper با ترتیب پایههای 8، 10، 9 و 11 ایجاد میکنیم (به یاد داشته باشید ترتیب پلهها برای این موتورها IN4 – IN3 – IN2 – IN1 است). مجدداً مطمئن شوید این کار را صحیح انجام دادهاید، در غیر این صورت موتور به درستی عمل نمیکند.
1 | AccelStepper myStepper(FULLSTEP, 8, 10, 9, 11); |
در تابع ()setup، ابتدا ماکزیمم سرعت موتور را روی 1000 تنظیم کنید. این بیشترین سرعتی است که این موتورها میتوانند با آن حرکت کنند. سپس یک ضریب شتاب برای موتور تنظیم کنید تا بتوانید سرعت حرکات استپر موتور را کم و زیاد کنید.
پس از آن سرعت معمولی را روی 200 و تعداد پلهها را روی 2038 تنظیم کنید (همانطور که قبلا گفتیم 28BYJ-48 با چرخدندهاش، در هر دوران 2038 پله را طی خواهد نمود).
1 2 3 4 5 6 | void setup() { myStepper.setMaxSpeed(1000.0); myStepper.setAcceleration(50.0); myStepper.setSpeed(200); myStepper.moveTo(2038); } |
در تابع Loop، باید شرطی قرار دهید که جهت چرخش موتور را بعد از یک دور کامل عوض کند. همانطور که قبلا گفته شد، تعداد پلهها توسط تابع moveTo روی 2038 یعنی یک دور کامل تنظیم شده است و تابع distanceToGo میزان فاصله تا عدد تنظیم شده توسط تابع moveTo را به شما میدهد. بنابراین، زمانیکه distanceToGo به صفر برسد، موتور یک دور کامل طی کرده است، پس جهت چرخش آن باید تغییر کند. برای تغییر جهت موتور، باید موقعیت فعلی آن را منفی کنید. با این کار موتور در هر موقعیتی که قرار دارد، جهت خود را تغییر خواهد داد.
اکنون در زیر تابع Loop، تابعی تحت عنوان ()run را فراخوانی میکنید. این تابع اهمیت بسیاری دارد، زیرا تا زمانیکه این تابع اجرا نشود، استپر موتور حرکت نخواهد کرد.
1 2 3 4 5 6 7 8 | void loop() { // Change direction once the motor reaches target position if (myStepper.distanceToGo() == 0) myStepper.moveTo(-myStepper.currentPosition()); // Move the motor one step myStepper.run(); } |
کنترل همزمان دو استپر موتور 28BYJ-48
در سومین آزمایش، میخواهیم یک استپر 28BYJ-48 و درایور ULN2003 دیگر را به آردوینو اضافه کنیم تا دو موتور را به طور همزمان راهاندازی کنیم.
سیم کشی
اتصالاتی را که قبلا انجام دادهاید، به همان شکل رها کنید و برای اتصال استپر موتور و درایور جدید، به شکل زیر عمل کنید:
همانند آزمایشات دیگری که انجام دادید، از منبع تغذیهی 5 ولت برای تأمین برق برد درایور ULN2003 استفاده کنید.
سپس، پایههای IN4, IN3, IN2, IN1 از دومین برد درایور را به ترتیب به پایه های 4، 5، 6 و 7 دیجیتال آردوینو متصل کنید. در تصویر زیر میتوانید نحوه سیمکشی را مشاهده کنید:
نحوه سیمکشی دو استپر موتور 28BYJ-48
کد آردوینو
در اینجا نمونه کدی برای راه اندازی دومین استپر موتور 28BYJ-48 و درایور ULN2003 قرار دادهایم.
این نمونه کد، یک موتور را در حالت پلهی کامل و دیگری را در حالت نیم پله راه اندازی میکند. زمانیکه موتورها یک دور دوران کنند، جهت دوران آنها تغییر خواهد کرد. علاوه بر این، سرعت موتورها میتواند کاهش یا افزایش پیدا کند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | // Include the AccelStepper Library #include <AccelStepper.h> // Define step constants #define FULLSTEP 4 #define HALFSTEP 8 // Creates two instances // Pins entered in sequence IN1-IN3-IN2-IN4 for proper step sequence AccelStepper stepper1(HALFSTEP, 8, 10, 9, 11); AccelStepper stepper2(FULLSTEP, 4, 6, 5, 7); void setup() { // set the maximum speed, acceleration factor, // initial speed and the target position for motor 1 stepper1.setMaxSpeed(1000.0); stepper1.setAcceleration(50.0); stepper1.setSpeed(200); stepper1.moveTo(2038); // set the same for motor 2 stepper2.setMaxSpeed(1000.0); stepper2.setAcceleration(50.0); stepper2.setSpeed(200); stepper2.moveTo(-2038); } void loop() { // Change direction once the motor reaches target position if (stepper1.distanceToGo() == 0) stepper1.moveTo(-stepper1.currentPosition()); if (stepper2.distanceToGo() == 0) stepper2.moveTo(-stepper2.currentPosition()); // Move the motor one step stepper1.run(); stepper2.run(); } |
توضیحات کد:
در اینجا، این نمونه کد را مانند قبل با هم بررسی میکنیم.
در ابتدای این کد، کتابخانهی AccelStepper فراخوانی میشود.
1 | #include <AccelStepper.h> |
از آنجا که قصد داریم یک موتور را در حالت پلهی کامل و دیگری را در حالت نیم پله راهاندازی کنیم، باید دو متغیر ثابت تعریف کنید.
1 2 | #define FULLSTEP 4 #define HALFSTEP 8 |
سپس، برای هر موتور باید یک شی ایجاد کنید و از تعاریف پایه و پله برای تنظیم این دو شی استفاده نمایید.
1 2 | AccelStepper stepper1(HALFSTEP, 8, 10, 9, 11); AccelStepper stepper2(FULLSTEP, 4, 6, 5, 7); |
در تابع setup، ابتدا ماکزیمم سرعت stepper1 را روی 1000 تنظیم میکنید. سپس یک ضریب شتاب برای موتور تنظیم میکنید تا بتوانید سرعت حرکات استپر موتور را افزایش یا کاهش دهید.
پس از آن، سرعت معمولی را روی 200 و تعداد پلهها را روی 2038 تنظیم میکنید (28BYJ-48 با چرخدندهاش در هر دوران 2038 پله طی میکند).
دقیقاً همین کار را باید برای stepper2 نیز انجام دهید، با این تفاوت که به آن فرمان میدهید تا به 2038- برسد، زیرا هدف ما این است که موتور به صورت پادساعتگرد حرکت کند.
1 2 3 4 5 6 7 8 9 10 11 12 13 | void setup() { // settings for motor 1 stepper1.setMaxSpeed(1000.0); stepper1.setAcceleration(50.0); stepper1.setSpeed(200); stepper1.moveTo(2038); // settings for motor 2 stepper2.setMaxSpeed(1000.0); stepper2.setAcceleration(50.0); stepper2.setSpeed(200); stepper2.moveTo(-2038); } |
در تابع Loop، برای هر دو موتور، از یک عبارت شرطی (عبارت if) استفاده میکنید تا بفهمید موتورها چه مقدار دیگر (از طریق خواندن ویژگی distanceToGo) برای رسیدن به موقعیت مورد نظر باید طی کنند ( توسط moveTo تنظیم شده است). زمانیکه distanceToGo به صفر برسد، موقعیت moveTo آنها را به مقدار منفی موقعیت فعلیشان تغییر میدهید تا موتورها در جهت معکوس شروع به حرکت کنند.
در نهایت، با فراخوانی تابع ()run، موتورها را به حرکت درمیآورید.
1 2 3 4 5 6 7 8 9 10 11 | void loop() { // Change direction once the motor reaches target position if (stepper1.distanceToGo() == 0) stepper1.moveTo(-stepper1.currentPosition()); if (stepper2.distanceToGo() == 0) stepper2.moveTo(-stepper2.currentPosition()); // Move the motor one step stepper1.run(); stepper2.run(); } |
خلاصه
در این مقاله تلاش بر این بود تا شما بتوانید استپر موتور 28BYJ-48 را با درایور ULN2003 و آردوینو راه اندازی کنید. به همین منظور، علاوه بر ارائه مطالبی در جهت آشنایی شما با این استپر موتور، سه نمونه کد برای شما فراهم کردیم:
- نمونه کد اول، با فراخوانی کتابخانه استپر آردوینو، براساس توالی پلهها عمل میکند و استپر موتور را با دادن پالس بهطور مستقیم به جلو حرکت میدهد.
- در نمونه کد دوم از کتابخانه AccelStepper استفاده کردیم تا بتوانیم سرعت موتور را در یک جهت کم و زیاد کنیم.
- در آخرین نمونه کد، نیز کتابخانه AccelStepper را فراخوانی کردیم تا بتوانیم چند استپر موتور را همزمان کنترل کنیم.
دیدگاه خود را بنویسید