logo-site-sefid
Untitled-17

ساخت دستگاه خم کن مفتول

دستگاه خم کن مفتول سه بعدی آردینو

در این آموزش به شما نشان خواهم داد که چگونه یک دستگاه خم کن مفتول سه‌بعدی مبتنی بر آردینو را ساخته‌ام. این در واقع یک سیستم مکانیکی خاص است زیرا شامل مهندسی مکانیک، الکترونیک و کامپیوتر است. بنابراین من معتقدم که بسیاری از دانشجویان مهندسی یا هر کسی که در مهندسی جدید است این پروژه را جالب می‌دانند.

مرور کلی ساخت دستگاه خم کن مفتول

این اصل کار این دستگاه خم کن مفتول سه‌بعدی است. بنابراین اول از همه، مفتول از میان غلتک‌های سری، یا استوار کننده ها عبور می‌کند. مفتول با استفاده از یک استپر موتور دقیقا با مکانیزم خم کن مفتول تغذیه می‌شود که از یک استپر موتور و همچنین یک سرو کوچک برای فرآیند خم کردن استفاده می‌کند.

دستگاه خم کن مفتول

همچنین یک استپر موتور دیگر به نام محور Z وجود دارد، که در واقع دستگاه را قادر می‌سازد تا اشکال سه‌بعدی ایجاد کند. البته، مغز دستگاه یک برد آردینو است که همراه با دیگر اجزای الکترونیکی به یک PCB سفارشی طراحی‌شده متصل شده‌است.

02-مرور-کلی

در مورد طرح، من چند تابع سفارشی برای ساخت اشکال مختلف، مانند یک ستاره، یک مکعب و یک پایه ساده، و همچنین یک حالت دستی ایجاد کردم که در آن می‌توانیم با وارد کردن دستورها از طریق نمایشگر سریال، فرم‌های مفتول را ایجاد کنیم.

مدل سه‌بعدی دستگاه خم کن مفتول سه بعدی دستی

طبق معمول، من با ساخت پروژه با استفاده از یک نرم‌افزار مدل‌سازی سه‌بعدی شروع کردم.

03- مدل- سه بعدی-ماشین-خم کننده-سیم-سه بعدی-دستی

برای برخی از قسمت‌ها، مانند چرخ دنده ها، بلوک‌های pillow یاتاقان و برخی از متصل کننده های شفت از یک چاپگر سه‌بعدی برای ساخت آن‌ها استفاده کردم. چاپگر ۳ بعدی جدید من، Creality CR-10 ، کار بزرگی انجام داد و قطعات را با کیفیت عالی چاپ کرد.

04-مدل-سه بعدی-ماشین-خم کننده-سیم-سه بعدی-دستی

ساخت دستگاه خم کن مفتول

با آماده کردن قسمت‌های دیگر، که برای آن از MDF و تخته چندلا استفاده کردم، ادامه دادم. بنابراین وقتی همه ابعاد را از مدل سه‌بعدی گرفتم، با استفاده از یک اره دایره‌ای، قطعات را به اندازه برش دادم. من از تخته ۸ میلیمتری MDF و تخته چندلا ۱۸ میلیمتری استفاده کردم. به محض اینکه اونا رو آماده کردم با سرهم کردن شروع کردم ابتدا پایه را از دو صفحه MDF و ۴ ستون تخته چندلا ساختم. برای محکم کردن آن‌ها از چسب چوب و چند پیچ استفاده کردم.

05-ساخت-ماشین-خم کننده-سیم

سپس بر روی پانل بالایی، بلوک‌های pillow چاپ‌شده سه‌بعدی را با استفاده از چند پیچ و مهره ۸ میلیمتری متصل کردم. ما در اینجا می‌توانیم متوجه شویم که من صفحات MDF سه میلیمتری را بین بلوک های بالا و بلوک‌های pillow اضافه کردم تا ارتفاع مناسبی به دست آورم. حالا در این بلوک‌ها ما می‌توانیم ۶۲۰۲ یاتاقان را جا به جا کنیم.

06-ساخت-ماشین-خم کننده-سیم

قطر خارجی آن‌ها ۳۵ میلیمتر و قطر داخلی آن‌ها ۱۵ میلیمتر است. بنابراین حالا، از طریق این یاتاقان ها، ما نیاز به قرار دادن یک شفت توخالی ۱۵ میلیمتری داریم به طوری که مفتول بتواند از آن عبور کند. این محور در واقع محور Z است که این امکان را به وجود می‌آورد تا مکانیزم خم کنندگی حول مفتول بچرخد و به این ترتیب شکل سه‌بعدی به خود بگیرد. من برای این منظور از یک لوله مسی استفاده کردم و طول آن باید حدود 30 سانتی متر باشد.
در بین این دو یاتاقان، من یک چرخ دنده چاپ‌شده سه‌بعدی با ماژول ۱.۵ و ۳۰ دندانه نیز قرار دادم. چرخ دنده دارای شیارهای طراحی سفارشی است که در آن می‌توانیم پیچ M3را وارد کنیم و سپس با استفاده از پیچ M3 می‌توانیم پرخ دنده را به شفت محکم کنیم.

07-ساخت-ماشین-خم کننده-سیم

سپس نیاز به نصب استپر موتور محور Z داریم ما از استپر موتور ها در پروژه های دیگر آموزش رباتیک نیز استفاده خواهیم کرد. برای این منظور، من یک براکت نصب سفارشی سه بعدی چاپ کردم. بنابراین با استفاده از پیچ‌های M3 ، استپر را به براکت متصل کردم، و سپس چرخ دنده ۱۸ دندانه را بر روی محور موتور قرار دادم. همان طور که قبلا نشان‌داده شده‌است، من از همان روشی که قبلا نشان داده شده است برای محکم کردن چرخ دنده به شفت استفاده کردم.

08-ساخت-ماشین-خم کننده-سیم

سپس با استفاده از یک مته ۶ میلیمتری دو سوراخ در قسمت بالایی ایجاد کردم براکت نصب روی آن محکم شود. می‌توانیم متوجه شویم که براکت به جای سوراخ، شکاف‌هایی دارد که دو چرخ دنده را قادر می‌سازد تا به درستی جفت شوند.

09-ساخت-ماشین-خم کننده-سیم

من با نصب استپرموتور برای مکانیزم تغذیه کننده حرکت کردم. این موتور مستقیما بر روی صفحه بالایی نصب خواهد شد، بنابراین سوراخ‌های مناسب را بر روی آن ایجاد کردم. سپس با استفاده از چهار پیچ، استپر را به صفحه محکم کردم، و اگر تعجب می‌کنید که این مهره‌ها در اینجا چه می‌کنند، آن‌ها در واقع به عنوان مهره‌های فاصله عمل می‌کنند چون پیچ‌ها بلندتر بودند و نمی‌توانستند در رشته‌های موتور جا بگیرند.

10-ساخت-ماشین-خم کننده-سیم

بنابراین در حال حاضر بر روی محور این استپر باید تغذیه کننده را قرار دهیم. برای این منظور من یک متصل کننده شفت سفارشی را چاپ کردم که بر روی آن یک لوله مسی قرار دادم که در واقع سطح تماس تغذیه کننده خواهد بود.

11-ساخت-ماشین-خم کننده-سیم

سپس در طرف دیگر موتور اهرمی را قرار دادم و یک یاتاقان را به آن وصل کردم که به تغذیه کننده فشار دهد. برای گرفتن قدرت کافی برای اینکه تغذیه کننده بتواند مفتول را حرکت دهد، من یک تکه تخته چندلا با یک مهره T به آن وصل می‌کنم، و سپس با استفاده از یک پیچ می‌توانیم گیره تغذیه کننده را کنترل کنیم.

12-ساخت-ماشین-خم کننده-سیم

گام بعدی ایجاد سیستم مستقیم کردن مفتول است. من با استفاده از سه پیچ M8 یک تخته چندلا را که قبلا براساس مدل سه‌بعدی حفر کرده بودم، محکم کردم. حالا بالای آن، غلتک‌ها را قرار دادم. یاتاقان های بیرونی غلتک ها را ساختم وحلقه های بیرونی شیاردار سه بعدی را چاپ کردم.

13-ساخت-ماشین-خم کننده-سیم

سه غلتک در این سمت و دو غلتک در سمت دیگر حرکت می‌کنند. برای طرف دیگر من یک شکاف در قطعه تخته چندلا درست کردم تا پیچ‌ها با قطعه هم تراز شوند. حالا فقط با استفاده از دو پیچ می‌توانیم دو طرف را با هم جفت کنیم، و با استفاده از مهره ها می‌توانیم مستقیم کننده ها را به درستی محکم کنیم.

14-ساخت-ماشین-خم کننده-سیم

وقتی این مرحله تمام شد، دو قطعه تخته چندلایه دیگر را در جلو و بعد از مستقیم کننده‌ها اضافه کردم که به عنوان راهنمای مفتولی عمل خواهند کرد.
خب، حالا می‌توانیم با ساخت مکانیزم خم کن مفتول ادامه دهیم. ابتدا در یک قطعه MDF باید موتور خم کن را وصل کنیم. قبل از این که این کار را بکنم، قطعه MDF که به شکل دادن آن نیاز داشتم، بنابراین با استفاده از اره دستی، اره مویی و یک سوهان به راحتی به شکل مورد نظر رسیدم. سپس با استفاده از یک سوراخ ۳۸ میلی‌متری دیدم که من یک دهانه برای استپر بزرگ‌تر ساختم که برای خم کردن استفاده خواهیم کرد، یک استپر موتور NEMA 23. همچنین چند سوراخ کوچک‌تر مورد نیاز برای اتصال بخش‌های دیگر را حفر کردم.

15-ساخت-ماشین-خم کننده-سیم

من استپر NEMA 23 را با استفاده از پیچ و مهره M4 و بر روی محور خروجی آن محکم کردم و یک چرخ‌دنده را با ماژول ۲.۵ و ۱۸ دندانه متصل کردم. این دنده با ۳۰ چرخ دنده بزرگ‌تر که یک چرخ دنده سفارشی با صفحه یکپارچه برای سرهم کردن یک سروو MG996R است، جفت می‌شود. این سروو یک مکانیزم دنده و شانه را حرکت می‌دهد، که در واقع یک پین است که از چرخ دنده خارج می‌شود و برای خم کردن مفتول بکار می‌رود. با استفاده از یک اپوکسی ۵ دقیقه‌ای یک یاتاقان را بر روی چرخ دنده محکم کردم و همچنین یک قطعه لوله مسی را بر روی دنده اضافه کردم که سطح تماس در هنگام خم کردن مفتول خواهد بود.

16-ساخت-ماشین-خم کننده-سیم

بعد از این که اپوکسی خشک شد، من دو چرخ دنده را با قرار دادن یک پیچ M8 و یک مهره در جای خود، با هم جفت کردم. سپس دنده و سروو را در آن قرار دادم، و آن را با استفاده از پیچ‌های موجود در بسته سرووها محکم کردم. سپس با استفاده از دو پیچ و مهره M3، چرخ دنده جناحی را روی شاخک گرد آن محکم کردم.

17-ساخت-ماشین-خم کننده-سیم

در نهایت شاخک را به سروو متصل کردم و با این کار مکانیزم خم کنندگی تکمیل شد.

18-ساخت-ماشین-خم کننده-سیم

کاری که اکنون باید انجام دهید این است که خم کن را به محور Z وصل کنید. من این کار را با استفاده از دو گیره شفت چاپ‌شده سه‌بعدی انجام دادم. ابتدا آن‌ها را با استفاده از پیچ و مهره M6 به صفحه خم کن محکم کردم و سپس آن‌ها را در محور Z قرار دادم. دو مهره را در جای خود قرار دادم و با استفاده از پیچ ها گیره‌های آن را محکم کردم. بنابراین حالا همه قطعات در حال حرکت به درستی کار می‌کنند.

19-ساخت-ماشین-خم کننده-سیم

در واقع دو جزء کوچک دیگر نیز باید اضافه شود. این یک نازل ۳ میلیمتری بر روی شفت است که مفتول از آن بیرون می‌آید.

20-ساخت-ماشین-خم کننده-سیم

و در پایین خم کن من یک سوئیچ حدی کوچک قرار دادم که برای تنظیم موقعیت اولیه خم کننده استفاده خواهد شد.

21-ساخت-ماشین-خم کننده-سیم

و همین طور است، دستگاه خم کن مفتول سه‌بعدی ما تقریبا انجام شده‌است. من تقریبا می‌گویم، چون حالا ما نیاز داریم که به این دستگاه زندگی بدهیم، یا اجزای الکترونیکی را به هم متصل کنیم و آن را برنامه‌ریزی کنیم.

نمودار مدار

این نمودار مدار این پروژه است.

22-نمودار-مدار

بنابراین سه استپر موتور با استفاده از سه محرک استپر DRV8825 کنترل می‌شوند. برای تقویت استپرها و کل پروژه، از منبع تغذیه ۱۲ ولت با حداقل نرخ جریان 3A استفاده خواهیم کرد.
برای تقویت سروو، می‌توانیم از ولتاژ ۵ ولت حاصل از آردوینو استفاده کنیم، اما سروو MG996R می‌تواند تشنه قدرت باشد و تنظیم‌کننده ولتاژ ۵ ولت آردوینو ممکن است قادر به کنترل آن نباشد. من تصمیم گرفتم که از یک تنظیم‌کننده ولتاژ ۵ ولت جداگانه به نام LM7805 استفاده کنم، که به اندازه کافی خوب است تا سروو را برای این پروژه تغذیه کند. همچنین یک سوئیچ حدی برای خم کن وجود دارد که دارای یک مقاومت بالای کشیدن است که به یک پین دیجیتالی از برد آردینو متصل شده‌است.

طراحی PCB

سپس، به منظور خلاص شدن از آشفتگی مفتول کشی و حفظ اجزای الکترونیکی، من یک PCB سفارشی را با استفاده از نرم‌افزار طراحی مدار آنلاین رایگان EasyEDA طراحی کردم. این مدار ارتباط زیادی دارد، بنابراین من هم از لایه‌های بالایی و هم از لایه‌های پایینی برای سازماندهی آن‌ها استفاده کردم. من همچنین پین‌ها را برای انتخاب تفکیک کننده استپر ها اضافه کردم، یک اتصال سوییچ حدی دیگر اضافه کردم و پین‌های دیجیتال و آنالوگ دیگری که از آردینو می‌آیند را در صورتی که برای چیزی به آن‌ها نیاز داشته باشیم، فراهم کردم.

23-طراحی-PCB

بنابراین پس از اتمام این طرح، من فایل گربر مورد نیاز برای ساخت PCB را تولید کردم.
سپس من از JLCPCB که در واقع حامی این پروژه است، PCB را سفارش دادم.

24-طراحی-PCB

در اینجا ما به سادگی می‌توانیم فایل گربر را بکشیم و رها کنیم و زمانی که آپلود کردیم، می‌توانیم PCB خود را در نمایشگر گربر بررسی کنیم. اگر همه چیز درست است، می‌توانیم ادامه دهیم، ویژگی‌هایی که برای PCB می‌خواهیم را انتخاب کنیم، و سپس می‌توانی PCB را با قیمت مناسب سفارش دهیم. توجه داشته باشید که اگر اولین سفارش شما از JLCPCB باشد، می‌توانید ۱۰ PCB را تنها به قیمت ۲ دلار دریافت کنید.

25-طراحی-PCB

پس از چند روز PCB ها رسیدند. کیفیت PCB ها عالی است و همه چیز دقیقا مشابه طراحی است.

26-طراحی-PCB

بنابراین اکنون می‌توانیم اجزای الکترونیکی را به PCB منتقل و نصب کنیم. من کار خود را با لحیم هدرهای پین به PCB آغاز کردم. این امر اتصال و قطع آسان‌تر اجزا را در صورت نیاز ممکن می‌سازد. در مورد اجزای کوچک‌تر مانند خازن‌ها، مقاومت‌ها، تنظیم‌کننده ولتاژ و بلوک‌های ترمینال، آن‌ها را مستقیما به PCB لحیم کردم.

27-طراحی-PCB

پس از اتمام این مرحله، اکنون می‌توانیم محرک های استپر و آردینو را در جای خود قرار دهیم. سپس ما باید دوشاخه برق و سوئیچ برق را به بلوک‌های ترمینال متصل کنیم، کابل‌ها را به استپر موتورها در یک طرف متصل کنیم و آن‌ها را به PCB در طرف دیگر متصل کنیم. سروو, به پین دیجیتال شماره ۲ متصل شده و با ولتاژ ۵ ولت حاصل از تنظیم‌کننده ولتاژ LM7805 تغذیه می‌شود. در نهایت می‌توانیم با اتصال پین‌های تفکیک‌کننده زیر محرک ها، تفکیک‌ کننده استپر را انتخاب کنیم.

28-طراحی-PCB

من تصمیم گرفتم از تفکیک کننده مرحله شانزدهم استفاده کنم، بنابراین ما باید به جای آن‌هایی که در عکس بالا دیده شد، پین‌های سمت راست را به هم متصل کنیم. بنابراین اجزای الکترونیکی آماده هستند و ما می‌توانیم با برنامه‌نویسی دستگاه خم کن مفتول پیش برویم.

کد آردینو برای پروژه دستگاه خم کن مفتولی سه‌بعدی

از آنجا که کد کمی طولانی‌تر است، برای درک بهتر، کد منبع برنامه را در بخش‌هایی با توصیف برای هر بخش قرار خواهم داد. و در پایان این مقاله من کد منبع کامل را ارسال خواهم کرد.
برای کنترل استپر موتورها من از کتابخانه 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;
  }
}


در پایان می‌خواهم اشاره کنم که سیستم صاف کردن مفتول دستگاه خم کن مفتول در واقع طوری کار نمی‌کند که باید کار کند، چون اگر آن را بیشتر سفت کنم، فیدر دستگیره را از دست می‌دهد و مفتول حرکت نمی‌کند.

29-کد-آردوینو-برای-پروژه-ماشین-خم کننده-سیمی-سه بعدی

برای حل این مشکل می‌توانید از مواد متفاوت و قوی‌تر از لوله مسی استفاده کنید و یا یک سیستم تغذیه کننده متفاوت بسازید.
پس همین. امیدوارم از این آموزش لذت برده باشید و چیز جدیدی یاد بگیرید. لطفا هر سوالی را در زیر بخش نظرات بپرسید و مجموعه پروژه‌های آردینو من را بررسی کنید.

 

رضا قنبری
متخصص آموزش رباتیک

رضا قنبری هستم متخصص آموزش رباتیک با بیش از 10 سال سابقه فعالیت در ایران

این مطلب را به اشتراک بگذارید

Share on facebook
Share on linkedin
Share on twitter
Share on email
آموزش الکترونیک

برقراری ارتباط بین ESP32 ،ESP8266 و NodeMCU

نحوه پیکربندی یک شبکه توری ESP با استفاده از IDE آردوینو – ارتباط درمیان و بین ESP32، ESP8266 و NodeMCU اینترنت اشیا ‏(IoT)‏ در طول

آموزش الکترونیک

پروژه rfid با آردوینو

سیستم مدیریت رویداد بر پایه IoT با استفاده از RFID و ThingSpeak RFID مخفف شناسایی فرکانس رادیویی است، این یک فن‌آوری بسیار ساده و ارزان

آموزش الکترونیک

ساخت ردیاب برای ماشین

ساخت ردیاب مکان GPS بر پایه IOT با استفاده از ماژول NodeMCU و  Save GPS  –  GPS  مختصات و دید بر روی نقشه های گوگل

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.