دستگاه خم کن مفتول سه بعدی آردینو
در این آموزش به شما نشان خواهم داد که چگونه یک دستگاه خم کن مفتول سهبعدی مبتنی بر آردینو را ساختهام. این در واقع یک سیستم مکانیکی خاص است زیرا شامل مهندسی مکانیک، الکترونیک و کامپیوتر است. بنابراین من معتقدم که بسیاری از دانشجویان مهندسی یا هر کسی که در مهندسی جدید است این پروژه را جالب میدانند.
مرور کلی ساخت دستگاه خم کن مفتول
این اصل کار این دستگاه خم کن مفتول سهبعدی است. بنابراین اول از همه، مفتول از میان غلتکهای سری، یا استوار کننده ها عبور میکند. مفتول با استفاده از یک استپر موتور دقیقا با مکانیزم خم کن مفتول تغذیه میشود که از یک استپر موتور و همچنین یک سرو کوچک برای فرآیند خم کردن استفاده میکند.
همچنین یک استپر موتور دیگر به نام محور Z وجود دارد، که در واقع دستگاه را قادر میسازد تا اشکال سهبعدی ایجاد کند. البته، مغز دستگاه یک برد آردینو است که همراه با دیگر اجزای الکترونیکی به یک PCB سفارشی طراحیشده متصل شدهاست.
در مورد طرح، من چند تابع سفارشی برای ساخت اشکال مختلف، مانند یک ستاره، یک مکعب و یک پایه ساده، و همچنین یک حالت دستی ایجاد کردم که در آن میتوانیم با وارد کردن دستورها از طریق نمایشگر سریال، فرمهای مفتول را ایجاد کنیم.
مدل سهبعدی دستگاه خم کن مفتول سه بعدی دستی
طبق معمول، من با ساخت پروژه با استفاده از یک نرمافزار مدلسازی سهبعدی شروع کردم.
برای برخی از قسمتها، مانند چرخ دنده ها، بلوکهای pillow یاتاقان و برخی از متصل کننده های شفت از یک چاپگر سهبعدی برای ساخت آنها استفاده کردم. چاپگر ۳ بعدی جدید من، Creality CR-10 ، کار بزرگی انجام داد و قطعات را با کیفیت عالی چاپ کرد.
ساخت دستگاه خم کن مفتول
با آماده کردن قسمتهای دیگر، که برای آن از MDF و تخته چندلا استفاده کردم، ادامه دادم. بنابراین وقتی همه ابعاد را از مدل سهبعدی گرفتم، با استفاده از یک اره دایرهای، قطعات را به اندازه برش دادم. من از تخته ۸ میلیمتری MDF و تخته چندلا ۱۸ میلیمتری استفاده کردم. به محض اینکه اونا رو آماده کردم با سرهم کردن شروع کردم ابتدا پایه را از دو صفحه MDF و ۴ ستون تخته چندلا ساختم. برای محکم کردن آنها از چسب چوب و چند پیچ استفاده کردم.
سپس بر روی پانل بالایی، بلوکهای pillow چاپشده سهبعدی را با استفاده از چند پیچ و مهره ۸ میلیمتری متصل کردم. ما در اینجا میتوانیم متوجه شویم که من صفحات MDF سه میلیمتری را بین بلوک های بالا و بلوکهای pillow اضافه کردم تا ارتفاع مناسبی به دست آورم. حالا در این بلوکها ما میتوانیم ۶۲۰۲ یاتاقان را جا به جا کنیم.
قطر خارجی آنها ۳۵ میلیمتر و قطر داخلی آنها ۱۵ میلیمتر است. بنابراین حالا، از طریق این یاتاقان ها، ما نیاز به قرار دادن یک شفت توخالی ۱۵ میلیمتری داریم به طوری که مفتول بتواند از آن عبور کند. این محور در واقع محور Z است که این امکان را به وجود میآورد تا مکانیزم خم کنندگی حول مفتول بچرخد و به این ترتیب شکل سهبعدی به خود بگیرد. من برای این منظور از یک لوله مسی استفاده کردم و طول آن باید حدود 30 سانتی متر باشد.
در بین این دو یاتاقان، من یک چرخ دنده چاپشده سهبعدی با ماژول ۱.۵ و ۳۰ دندانه نیز قرار دادم. چرخ دنده دارای شیارهای طراحی سفارشی است که در آن میتوانیم پیچ M3را وارد کنیم و سپس با استفاده از پیچ M3 میتوانیم پرخ دنده را به شفت محکم کنیم.
سپس نیاز به نصب استپر موتور محور Z داریم ما از استپر موتور ها در پروژه های دیگر آموزش رباتیک نیز استفاده خواهیم کرد. برای این منظور، من یک براکت نصب سفارشی سه بعدی چاپ کردم. بنابراین با استفاده از پیچهای M3 ، استپر را به براکت متصل کردم، و سپس چرخ دنده ۱۸ دندانه را بر روی محور موتور قرار دادم. همان طور که قبلا نشانداده شدهاست، من از همان روشی که قبلا نشان داده شده است برای محکم کردن چرخ دنده به شفت استفاده کردم.
سپس با استفاده از یک مته ۶ میلیمتری دو سوراخ در قسمت بالایی ایجاد کردم براکت نصب روی آن محکم شود. میتوانیم متوجه شویم که براکت به جای سوراخ، شکافهایی دارد که دو چرخ دنده را قادر میسازد تا به درستی جفت شوند.
من با نصب استپرموتور برای مکانیزم تغذیه کننده حرکت کردم. این موتور مستقیما بر روی صفحه بالایی نصب خواهد شد، بنابراین سوراخهای مناسب را بر روی آن ایجاد کردم. سپس با استفاده از چهار پیچ، استپر را به صفحه محکم کردم، و اگر تعجب میکنید که این مهرهها در اینجا چه میکنند، آنها در واقع به عنوان مهرههای فاصله عمل میکنند چون پیچها بلندتر بودند و نمیتوانستند در رشتههای موتور جا بگیرند.
بنابراین در حال حاضر بر روی محور این استپر باید تغذیه کننده را قرار دهیم. برای این منظور من یک متصل کننده شفت سفارشی را چاپ کردم که بر روی آن یک لوله مسی قرار دادم که در واقع سطح تماس تغذیه کننده خواهد بود.
سپس در طرف دیگر موتور اهرمی را قرار دادم و یک یاتاقان را به آن وصل کردم که به تغذیه کننده فشار دهد. برای گرفتن قدرت کافی برای اینکه تغذیه کننده بتواند مفتول را حرکت دهد، من یک تکه تخته چندلا با یک مهره T به آن وصل میکنم، و سپس با استفاده از یک پیچ میتوانیم گیره تغذیه کننده را کنترل کنیم.
گام بعدی ایجاد سیستم مستقیم کردن مفتول است. من با استفاده از سه پیچ M8 یک تخته چندلا را که قبلا براساس مدل سهبعدی حفر کرده بودم، محکم کردم. حالا بالای آن، غلتکها را قرار دادم. یاتاقان های بیرونی غلتک ها را ساختم وحلقه های بیرونی شیاردار سه بعدی را چاپ کردم.
سه غلتک در این سمت و دو غلتک در سمت دیگر حرکت میکنند. برای طرف دیگر من یک شکاف در قطعه تخته چندلا درست کردم تا پیچها با قطعه هم تراز شوند. حالا فقط با استفاده از دو پیچ میتوانیم دو طرف را با هم جفت کنیم، و با استفاده از مهره ها میتوانیم مستقیم کننده ها را به درستی محکم کنیم.
وقتی این مرحله تمام شد، دو قطعه تخته چندلایه دیگر را در جلو و بعد از مستقیم کنندهها اضافه کردم که به عنوان راهنمای مفتولی عمل خواهند کرد.
خب، حالا میتوانیم با ساخت مکانیزم خم کن مفتول ادامه دهیم. ابتدا در یک قطعه MDF باید موتور خم کن را وصل کنیم. قبل از این که این کار را بکنم، قطعه MDF که به شکل دادن آن نیاز داشتم، بنابراین با استفاده از اره دستی، اره مویی و یک سوهان به راحتی به شکل مورد نظر رسیدم. سپس با استفاده از یک سوراخ ۳۸ میلیمتری دیدم که من یک دهانه برای استپر بزرگتر ساختم که برای خم کردن استفاده خواهیم کرد، یک استپر موتور NEMA 23. همچنین چند سوراخ کوچکتر مورد نیاز برای اتصال بخشهای دیگر را حفر کردم.
من استپر NEMA 23 را با استفاده از پیچ و مهره M4 و بر روی محور خروجی آن محکم کردم و یک چرخدنده را با ماژول ۲.۵ و ۱۸ دندانه متصل کردم. این دنده با ۳۰ چرخ دنده بزرگتر که یک چرخ دنده سفارشی با صفحه یکپارچه برای سرهم کردن یک سروو MG996R است، جفت میشود. این سروو یک مکانیزم دنده و شانه را حرکت میدهد، که در واقع یک پین است که از چرخ دنده خارج میشود و برای خم کردن مفتول بکار میرود. با استفاده از یک اپوکسی ۵ دقیقهای یک یاتاقان را بر روی چرخ دنده محکم کردم و همچنین یک قطعه لوله مسی را بر روی دنده اضافه کردم که سطح تماس در هنگام خم کردن مفتول خواهد بود.
بعد از این که اپوکسی خشک شد، من دو چرخ دنده را با قرار دادن یک پیچ M8 و یک مهره در جای خود، با هم جفت کردم. سپس دنده و سروو را در آن قرار دادم، و آن را با استفاده از پیچهای موجود در بسته سرووها محکم کردم. سپس با استفاده از دو پیچ و مهره M3، چرخ دنده جناحی را روی شاخک گرد آن محکم کردم.
در نهایت شاخک را به سروو متصل کردم و با این کار مکانیزم خم کنندگی تکمیل شد.
کاری که اکنون باید انجام دهید این است که خم کن را به محور Z وصل کنید. من این کار را با استفاده از دو گیره شفت چاپشده سهبعدی انجام دادم. ابتدا آنها را با استفاده از پیچ و مهره M6 به صفحه خم کن محکم کردم و سپس آنها را در محور Z قرار دادم. دو مهره را در جای خود قرار دادم و با استفاده از پیچ ها گیرههای آن را محکم کردم. بنابراین حالا همه قطعات در حال حرکت به درستی کار میکنند.
در واقع دو جزء کوچک دیگر نیز باید اضافه شود. این یک نازل ۳ میلیمتری بر روی شفت است که مفتول از آن بیرون میآید.
و در پایین خم کن من یک سوئیچ حدی کوچک قرار دادم که برای تنظیم موقعیت اولیه خم کننده استفاده خواهد شد.
و همین طور است، دستگاه خم کن مفتول سهبعدی ما تقریبا انجام شدهاست. من تقریبا میگویم، چون حالا ما نیاز داریم که به این دستگاه زندگی بدهیم، یا اجزای الکترونیکی را به هم متصل کنیم و آن را برنامهریزی کنیم.
نمودار مدار
این نمودار مدار این پروژه است.
بنابراین سه استپر موتور با استفاده از سه محرک استپر DRV8825 کنترل میشوند. برای تقویت استپرها و کل پروژه، از منبع تغذیه ۱۲ ولت با حداقل نرخ جریان 3A استفاده خواهیم کرد.
برای تقویت سروو، میتوانیم از ولتاژ ۵ ولت حاصل از آردوینو استفاده کنیم، اما سروو MG996R میتواند تشنه قدرت باشد و تنظیمکننده ولتاژ ۵ ولت آردوینو ممکن است قادر به کنترل آن نباشد. من تصمیم گرفتم که از یک تنظیمکننده ولتاژ ۵ ولت جداگانه به نام LM7805 استفاده کنم، که به اندازه کافی خوب است تا سروو را برای این پروژه تغذیه کند. همچنین یک سوئیچ حدی برای خم کن وجود دارد که دارای یک مقاومت بالای کشیدن است که به یک پین دیجیتالی از برد آردینو متصل شدهاست.
طراحی PCB
سپس، به منظور خلاص شدن از آشفتگی مفتول کشی و حفظ اجزای الکترونیکی، من یک PCB سفارشی را با استفاده از نرمافزار طراحی مدار آنلاین رایگان EasyEDA طراحی کردم. این مدار ارتباط زیادی دارد، بنابراین من هم از لایههای بالایی و هم از لایههای پایینی برای سازماندهی آنها استفاده کردم. من همچنین پینها را برای انتخاب تفکیک کننده استپر ها اضافه کردم، یک اتصال سوییچ حدی دیگر اضافه کردم و پینهای دیجیتال و آنالوگ دیگری که از آردینو میآیند را در صورتی که برای چیزی به آنها نیاز داشته باشیم، فراهم کردم.
بنابراین پس از اتمام این طرح، من فایل گربر مورد نیاز برای ساخت PCB را تولید کردم.
سپس من از JLCPCB که در واقع حامی این پروژه است، PCB را سفارش دادم.
در اینجا ما به سادگی میتوانیم فایل گربر را بکشیم و رها کنیم و زمانی که آپلود کردیم، میتوانیم PCB خود را در نمایشگر گربر بررسی کنیم. اگر همه چیز درست است، میتوانیم ادامه دهیم، ویژگیهایی که برای PCB میخواهیم را انتخاب کنیم، و سپس میتوانی PCB را با قیمت مناسب سفارش دهیم. توجه داشته باشید که اگر اولین سفارش شما از JLCPCB باشد، میتوانید ۱۰ PCB را تنها به قیمت ۲ دلار دریافت کنید.
پس از چند روز PCB ها رسیدند. کیفیت PCB ها عالی است و همه چیز دقیقا مشابه طراحی است.
بنابراین اکنون میتوانیم اجزای الکترونیکی را به PCB منتقل و نصب کنیم. من کار خود را با لحیم هدرهای پین به PCB آغاز کردم. این امر اتصال و قطع آسانتر اجزا را در صورت نیاز ممکن میسازد. در مورد اجزای کوچکتر مانند خازنها، مقاومتها، تنظیمکننده ولتاژ و بلوکهای ترمینال، آنها را مستقیما به PCB لحیم کردم.
پس از اتمام این مرحله، اکنون میتوانیم محرک های استپر و آردینو را در جای خود قرار دهیم. سپس ما باید دوشاخه برق و سوئیچ برق را به بلوکهای ترمینال متصل کنیم، کابلها را به استپر موتورها در یک طرف متصل کنیم و آنها را به PCB در طرف دیگر متصل کنیم. سروو, به پین دیجیتال شماره ۲ متصل شده و با ولتاژ ۵ ولت حاصل از تنظیمکننده ولتاژ LM7805 تغذیه میشود. در نهایت میتوانیم با اتصال پینهای تفکیککننده زیر محرک ها، تفکیک کننده استپر را انتخاب کنیم.
من تصمیم گرفتم از تفکیک کننده مرحله شانزدهم استفاده کنم، بنابراین ما باید به جای آنهایی که در عکس بالا دیده شد، پینهای سمت راست را به هم متصل کنیم. بنابراین اجزای الکترونیکی آماده هستند و ما میتوانیم با برنامهنویسی دستگاه خم کن مفتول پیش برویم.
کد آردینو برای پروژه دستگاه خم کن مفتولی سهبعدی
از آنجا که کد کمی طولانیتر است، برای درک بهتر، کد منبع برنامه را در بخشهایی با توصیف برای هر بخش قرار خواهم داد. و در پایان این مقاله من کد منبع کامل را ارسال خواهم کرد.
برای کنترل استپر موتورها من از کتابخانه AccelStepper توسط Mike McCauley استفاده میکنم. بنابراین ما باید این کتابخانه، و همچنین کتابخانه سروو را برای کنترل سروو موتور در نظر بگیریم. سپس نیاز به تعریف پینها داریم که به آنها پایانهها متصل هستند و برخی متغیرها برای برنامه زیر مورد نیاز است.
#include <AccelStepper.h> #include <Servo.h> #define limitSwitch 11 // Define the stepper motors and the pins the will use AccelStepper feederStepper(1, 5, 6); // (Type:driver, STEP, DIR) AccelStepper zAxisStepper(1, 7, 8); AccelStepper benderStepper(1, 9, 10); Servo servo01; String dataIn = ""; String manualStatus = ""; int count = 0; int dist;
در بخش راهاندازی، موقعیت اولیه سروو یا پین خم کنندگی را تنظیم میکنیم، و همچنین موقعیت اولیه چرخ دنده خم کن را تنظیم میکنیم. این کار با کمک سوئیچ حدی انجام میشود. استپر به سمت سوئیچ میچرخد و زمانی که فشار داده میشود موتور شروع به شمارش مراحل از صفر میکند و خود را در موقعیت صفر درجه، آماده برای خم کردن قرار می دهد.
void setup() { Serial.begin(9600); pinMode(limitSwitch, INPUT_PULLUP); servo01.attach(2); servo01.write(40); // Initial position, bending pin up // Stepper motors max speed feederStepper.setMaxSpeed(2000); zAxisStepper.setMaxSpeed(2000); benderStepper.setMaxSpeed(2000); // Homing while (digitalRead(limitSwitch) != 0) { benderStepper.setSpeed(1200); benderStepper.runSpeed(); benderStepper.setCurrentPosition(0); // When limit switch pressed set position to 0 steps } delay(40); // Move 1400 steps from the limit switch to starting position while (benderStepper.currentPosition() != -1400) { benderStepper.setSpeed(-1200); // if negative rotates anti-clockwise benderStepper.run(); } benderStepper.setCurrentPosition(0); }
حالا در بخش حلقه منتظر فرمانهایی هستیم که از نمایشگر سریال میآیند. اگر ما حالت خم کنندگی دستی را تایپ کنیم، یا اگر برای مثال ستاره را تایپ کنیم، تابع ()start سفارشی اجرا خواهد شد و دستگاه به صورت خودکار یک فرم ستارهای برای ما خواهد ساخت.
void loop() { String mode = Serial.readString(); if (mode.startsWith("manual")) { manual(); } if (mode.startsWith("star")) { star(); } if (mode.startsWith("cube")) { cube(); } if (mode.startsWith("stand")) { stand(); } }
بیایید نگاهی به این عملکرد سفارشی بیندازیم.
void star() { while (count != 5) { int feed = 38; // mm int feedDistance = feed * 48; // 48- constats that map the mm value to number of steps the stepper show move while (feederStepper.currentPosition() != feedDistance) { // run until it reaches the distance value feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); // reset the current position to 0 servo01.write(40); // Set the bender pin up delay(200); int angleConst = 18; // angle constant // Bend the wire 52 degrees while (benderStepper.currentPosition() != -52 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Go back 52 degrees to initial position while (benderStepper.currentPosition() != 52 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Feed the same distance again while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); servo01.write(130); // Set the bender pin down delay(200); // Set bender to new initial position, for bending in the other direction while (benderStepper.currentPosition() != -42 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(200); servo01.write(40); // Bender pin up delay(200); while (benderStepper.currentPosition() != 105 * angleConst) { benderStepper.setSpeed(700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(50); while (benderStepper.currentPosition() != -63 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } delay(100); servo01.write(130); benderStepper.setCurrentPosition(0); count++; } }
بنابراین در اینجا ما یک حلقه زمانی را وارد میکنیم که ۵ بار اجرا میشود، چون واضح است که ستاره ۵ امتیاز دارد. ما با تنظیم مقدار تغذیه شروع میکنیم، یا این که چقدر مفتول با میلی متر تغذیه خواهد شد. سپس این مقدار در ۴۸ ضرب میشود که مقدار تغذیه را به مراحل مناسب برای حرکت استپر موتور تغییر می دهد. سپس با استفاده از تابع ()Run، موتور تغذیه کننده را با یک مجموعه سرعت توسط تابع () Speed دوران میدهیم. زمانی که مقدار feedDistance بالا به دست آید توقف میکنیم، و درست پس از آن مقدار موقعیت فعلی صفر استپر را تنظیم میکنیم.
int feed = 38; // mm int feedDistance = feed * 48; // 48- constats that map the mm value to number of steps the stepper show move while (feederStepper.currentPosition() != feedDistance) { // run until it reaches the distance value feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); // reset the current position to 0
در قدم بعدی مفتول را با زاویه ۵۲ درجه خم میکنیم. این کار مشابه آنچه در بالا توضیح داده شد، انجام میشود. در اینجا همچنین یک زاویه ثابت داریم که در زاویه مورد نظر ضرب میشود. وقتی این مقدار توسط موتور به دست میآید، موتور متوقف میشود، موقعیت فعلی خود را به صفر تنظیم میکند، و سپس همان تعداد گام را در جهت مخالف اجرا میکند که در واقع موتور را به موقعیت اولیه خود برمی گرداند.
// Bend the wire 52 degrees while (benderStepper.currentPosition() != -52 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Go back 52 degrees to initial position while (benderStepper.currentPosition() != 52 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100);
سپس دوباره همان طول مفتول را تغذیه میکنیم و پین را به سمت پایین قرار میدهیم تا خم کن بتواند به موقعیت اولیه جدیدی که برای خم کنندگی در جهت دیگر استفاده میشود، حرکت کند. سپس پین خم کن بالا میرود، و بنابراین مفتول را 105 درجه در جهت مخالف خم میکنیم. فرمان ها ۵ بار تکرار میشوند و به این ترتیب ما شکل ستاره را به دست میآوریم.
همانطور که در بالا توضیح داده شد، ما شکل مکعب یا در واقع هر شکل دیگری که بتوانیم به آن مفتول را میسازیم. در مورد حالت دستی، اصل کار فرمانها یکسان است، با این تفاوت که ما تعداد کمی خط دیگر برای خواندن فرمانهایی داریم که از نمایشگر سریال میآیند. به عنوان مثال برای تغذیه مفتول، ما نیاز به تایپ “f”، به علاوه فاصله در میلی متر، برای خم کردن مفتول، ما نیاز به تایپ “b”، به علاوه زاویه در درجه، و برای چرخش محور Z، ما نیاز به تایپ “z”، به علاوه زاویه در درجه داریم.
if (dataIn.startsWith("f")) { dataInS = dataIn.substring(1, dataIn.length()); // reads the feed value dist = dataInS.toInt(); Serial.print("Feed "); Serial.print(dist); Serial.println("mm wire."); dist = dist * 48; while (feederStepper.currentPosition() != dist) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); }
خب، برنامهای که من ساختم به این صورت بود، اما البته، روشهای بسیار دیگری برای کد گذاری وجود دارد. در اینجا کد کامل آردینو برای این دستگاه خم کن مفتولی سهبعدی ارائه شدهاست:
/* Arduino 3D Wire Bending Machine by Dejan Nedelkovski www.HowToMechatronics.com Library - AccelStepper by Mike McCauley: http://www.airspayce.com/mikem/arduino/AccelStepper/index.html */ #include <AccelStepper.h> #include <Servo.h> #define limitSwitch 11 // Define the stepper motors and the pins the will use AccelStepper feederStepper(1, 5, 6); // (Type:driver, STEP, DIR) AccelStepper zAxisStepper(1, 7, 8); AccelStepper benderStepper(1, 9, 10); Servo servo01; String dataIn = ""; String manualStatus = ""; int count = 0; int dist; void setup() { Serial.begin(9600); pinMode(limitSwitch, INPUT_PULLUP); servo01.attach(2); servo01.write(40); // Initial position, bending pin up // Stepper motors max speed feederStepper.setMaxSpeed(2000); zAxisStepper.setMaxSpeed(2000); benderStepper.setMaxSpeed(2000); // Homing while (digitalRead(limitSwitch) != 0) { benderStepper.setSpeed(1200); benderStepper.runSpeed(); benderStepper.setCurrentPosition(0); // When limit switch pressed set position to 0 steps } delay(40); // Move 1400 steps from the limit switch to starting position while (benderStepper.currentPosition() != -1400) { benderStepper.setSpeed(-1200); // if negative rotates anti-clockwise benderStepper.run(); } benderStepper.setCurrentPosition(0); } void loop() { String mode = Serial.readString(); if (mode.startsWith("manual")) { manual(); } if (mode.startsWith("star")) { star(); } if (mode.startsWith("cube")) { cube(); } if (mode.startsWith("stand")) { stand(); } } void star() { while (count != 5) { int feed = 38; // mm int feedDistance = feed * 48; // 48- constats that map the mm value to number of steps the stepper show move while (feederStepper.currentPosition() != feedDistance) { // run until it reaches the distance value feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); // reset the current position to 0 servo01.write(40); // Set the bender pin up delay(200); int angleConst = 18; // angle constant // Bend the wire 52 degrees while (benderStepper.currentPosition() != -52 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Go back 52 degrees to initial position while (benderStepper.currentPosition() != 52 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Feed the same distance again while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); servo01.write(130); // Set the bender pin down delay(200); // Set bender to new initial position, for bending in the other direction while (benderStepper.currentPosition() != -42 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(200); servo01.write(40); // Bender pin up delay(200); while (benderStepper.currentPosition() != 105 * angleConst) { benderStepper.setSpeed(700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(50); while (benderStepper.currentPosition() != -63 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } delay(100); servo01.write(130); benderStepper.setCurrentPosition(0); count++; } } void cube() { int feed = 40; // mm int feedDistance = feed * 48; int angleConst = 16; // Step 1 while (count != 3) { while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != -90 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != 90 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); count++; } count = 0; // Step 2 while (zAxisStepper.currentPosition() != 88 * angleConst) { zAxisStepper.setSpeed(500); zAxisStepper.run(); } zAxisStepper.setCurrentPosition(0); delay(100); //Step 3 while (count != 2) { while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != -90 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != 90 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); count++; } count = 0; // Step 4 while (zAxisStepper.currentPosition() != 85 * angleConst) { zAxisStepper.setSpeed(500); zAxisStepper.run(); } zAxisStepper.setCurrentPosition(0); delay(100); // Step 5 servo01.write(130); delay(200); while (benderStepper.currentPosition() != -42 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); while (count != 3) { delay(100); servo01.write(40); delay(200); // Step 6 while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != 90 * angleConst) { benderStepper.setSpeed(700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != -90 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); count++; } count = 0; } void stand() { int feed = 20; // mm int feedDistance = feed * 48; int angleConst = 16; // Step 1 while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != -90 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != 90 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Step 2 while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != -70 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != 70 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Step 3 feed = 80; // mm feedDistance = feed * 48; while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); // Step 4 servo01.write(130); delay(200); while (benderStepper.currentPosition() != -42 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); servo01.write(40); delay(200); while (benderStepper.currentPosition() != 108 * angleConst) { benderStepper.setSpeed(700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != -66 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); //Step 5 servo01.write(130); delay(200); // Step 6 feed = 80; // mm feedDistance = feed * 48; while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); servo01.write(40); delay(200); // Step 7 while (zAxisStepper.currentPosition() != -90 * angleConst) { zAxisStepper.setSpeed(-500); zAxisStepper.run(); } zAxisStepper.setCurrentPosition(0); delay(100); // Step 8 while (benderStepper.currentPosition() != -90 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != 90 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Step 6 feed = 45; // mm feedDistance = feed * 48; while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); // Step 10 while (benderStepper.currentPosition() != -90 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != 48 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Step 11 while (zAxisStepper.currentPosition() != 90 * angleConst) { zAxisStepper.setSpeed(500); zAxisStepper.run(); } zAxisStepper.setCurrentPosition(0); delay(100); feed = 80; // mm feedDistance = feed * 48; while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); // Step 12 while (benderStepper.currentPosition() != 110 * angleConst) { benderStepper.setSpeed(700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != -68 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); //Step 13 servo01.write(130); delay(200); feed = 80; // mm feedDistance = feed * 48; while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); servo01.write(40); delay(200); // Step 14 while (benderStepper.currentPosition() != -70 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != 70 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); //Step 15 feed = 25; // mm feedDistance = feed * 48; while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); // Step 16 while (benderStepper.currentPosition() != -90 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != 90 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Step 17 while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); } void manual() { int sign; String dataInS; int angle; int angleConst; Serial.println(" // MANUAL MODE //"); while (!dataIn.startsWith("end")) { servo01.write(130); delay(200); dataIn = Serial.readString(); if (dataIn.startsWith("f")) { dataInS = dataIn.substring(1, dataIn.length()); // reads the feed value dist = dataInS.toInt(); Serial.print("Feed "); Serial.print(dist); Serial.println("mm wire."); dist = dist * 48; while (feederStepper.currentPosition() != dist) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); } if (dataIn.startsWith("b")) { if (dataIn.charAt(1) == '-') { dataInS = dataIn.substring(2, dataIn.length()); ///reads the angle value angle = dataInS.toInt(); Serial.print("Bend -"); Serial.print(angle); Serial.println(" degrees."); angleConst = 16; // Set "negative" bending initial position while (benderStepper.currentPosition() != -43 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); servo01.write(40); delay(200); // Bend the wire while (benderStepper.currentPosition() != angle * angleConst) { benderStepper.setSpeed(700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != (-1) * angle * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); servo01.write(130); delay(200); // Get back to original "positive" bending initial poistion while (benderStepper.currentPosition() != 43 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); } else { dataInS = dataIn.substring(1, dataIn.length()); angle = dataInS.toInt(); Serial.print("Bend "); Serial.print(angle); Serial.println(" degrees."); angleConst = 16; servo01.write(40); delay(200); while (benderStepper.currentPosition() != (-1) *angle * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != angle * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); } dataInS = dataIn.substring(2, dataIn.length()); angle = dataInS.toInt(); angleConst = 16; while (benderStepper.currentPosition() != sign * angle * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != sign * angle * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); } // Z-Axis Control if (dataIn.startsWith("z")) { if (dataIn.charAt(1) == '-') { dataInS = dataIn.substring(2, dataIn.length()); angle = dataInS.toInt(); Serial.print("Move Z-Axis -"); Serial.print(angle); Serial.println(" degrees."); angleConst = 16; while (zAxisStepper.currentPosition() != angle * angleConst) { zAxisStepper.setSpeed(500); zAxisStepper.run(); } zAxisStepper.setCurrentPosition(0); delay(100); } else { dataInS = dataIn.substring(1, dataIn.length()); angle = dataInS.toInt(); Serial.print("Move Z-Axis "); Serial.print(angle); Serial.println(" degrees."); angleConst = 16; while (zAxisStepper.currentPosition() != (-1) *angle * angleConst) { zAxisStepper.setSpeed(-500); zAxisStepper.run(); } zAxisStepper.setCurrentPosition(0); delay(100); } } manualStatus = dataIn; } }
در پایان میخواهم اشاره کنم که سیستم صاف کردن مفتول دستگاه خم کن مفتول در واقع طوری کار نمیکند که باید کار کند، چون اگر آن را بیشتر سفت کنم، فیدر دستگیره را از دست میدهد و مفتول حرکت نمیکند.
برای حل این مشکل میتوانید از مواد متفاوت و قویتر از لوله مسی استفاده کنید و یا یک سیستم تغذیه کننده متفاوت بسازید.
پس همین. امیدوارم از این آموزش لذت برده باشید و چیز جدیدی یاد بگیرید. لطفا هر سوالی را در زیر بخش نظرات بپرسید و مجموعه پروژههای آردینو من را بررسی کنید.