3.2. Lập trình các chương trình điều khiển
Chương trình xác định động cơ bước và kết nối ta sẽ sử dụng thư viện AccelStepper của Mike McCauley, Cùng thư viện servo để điều khiển mơ tơ servo. Sau đó, cần xác định các chân mà các bước được kết nối và một số biến cần thiết cho chương trình bên dưới.
Khai báo thư viện và gán chân kết nối cho 3 động cơ bước: #include <AccelStepper.h>
25
#include <Servo.h> #define limitSwitch 11
// Xác định động cơ bước và các chân sẽ sử dụng AccelStepper feederStepper(1, 5, 6);
AccelStepper zAxisStepper(1, 7, 8); AccelStepper benderStepper(1, 9, 10); Servo servo01;
String dataIn = ""; //chuỗi dữ liệu vào String manualStatus = "";
int count = 0; int dist;
Trong phần thiết lập, đặt vị trí ban đầu của servo hoặc chốt uốn, đồng thời đặt vị trí ban đầu của bánh răng uốn. Điều này được thực hiện với sự trợ giúp của cơng tắc giới hạn. Bậc thang quay về phía cơng tắc và một khi nó nhấn, động cơ bắt đầu đếm các bước từ 0 và tự định vị về 0 độ, sẵn sàng uốn.
Lệnh điều khiển Servo, cài đặt vận tốc tối đa cho động cơ bước và xét gốc bàn uốn:
void setup ( ) { Serial.begin(9600);
pinMode (giới hạn chuyển đổi, INPUT_PULLUP); servo01.attach ( 2 ) ;
servo01.write ( 40 ) ;
//Động cơ bước tốc độ tối đa
feederStepper.setMaxSpeed ( 2000 ) ; zAxisStepper.setMaxSpeed ( 2000 ) ; benderStepper.setMaxSpeed ( 2000 ) ; while (digitalRead(limitSwitch) != 0) { benderStepper.setSpeed(1200); benderStepper.runSpeed();
benderStepper.setCurrentPosition(0); // Khi nhấn cơng tắc giới hạn đặt vị trí thành 0 bước
26
}
delay ( 40 ) ;
// Di chuyển 1400 bước từ công tắc giới hạn đến vị trí bắt đầu while (benderStepper.currentPosition() != -1400) { benderStepper.setSpeed(-1200); benderStepper.run ( ) ; } benderStepper.setCurrentPosition ( 0 ) ; }
Bây giờ trong phần vịng lặp, đợi các lệnh đến từ màn hình nối tiếp. Nếu nhập manual, sẽ vào chế độ uốn thủ cơng hoặc nếu nhập ví dụ star, chức năng tùy chỉnh star sẽ được thực thi và máy sẽ tự động tạo dạng sao cho chúng ta.
Chọn các chế độ vận hành thơng qua màn hình nối tiếp.
void loop ( ) {
String mode = Serial.readString ( ) ; if (mode.startsWith("manual")) { manual (); } if (mode.startsWith("star")) { star ( ) ; if (mode.startsWith("sat")) { sat (); if (mode.startsWith("lapphuong")) { lapphuong (); }
Đối với chế độ thủ công, nguyên tắc làm việc của các lệnh là như nhau, ngoại trừ việc có thêm vài dịng để đọc các lệnh đến từ màn hình nối tiếp. Ví dụ, để cung cấp dây, chúng ta cần gõ loại F f, cộng với khoảng cách tính bằng milimet, để uốn dây, chúng ta cần gõ kiểu chữ b, cộng với góc theo độ và để xoay trục Z, chúng ta cần để gõ vào z , cộng với góc theo độ.
27
void manual ( ) {
while (!dataIn.startsWith("end")) { servo01.write ( 130 ) ;
if (dataIn.startsWith("f")) {
dataInS = dataIn.substring(1, dataIn.length()); dist = dataInS.toInt();
Serial.print("Feed "); }
if (dataIn.startsWith("b")) {
dataInS = dataIn.substring(2, dataIn.length()); } if (dataIn.startsWith("z")) { Serial.print("Move Z-Axis -"); Serial.print(angle); Serial.println(" degrees."); }
Nhập một vòng lặp while được thực hiện 5 lần, vì rõ ràng ngơi sao có 5 điểm. chúng ta bắt đầu bằng cách đặt giá trị nguồn cấp, hoặc đó là số lượng dây sẽ được cung cấp tính bằng milimét. Giá trị này sau đó được nhân với 48, chuyển giá trị độ dài thành các bước thích hợp để động cơ bước di chuyển.
Chương trình chạy hình sao tự động:
void star() {
while (count != 5) { int feed = 38; // mm }
feederStepper.setCurrentPosition(0); // đặt lại vị trí hiện tại về 0 servo01.write(40);
delay(200);
int angleConst = 18; // hàm số góc // uốn dây 52 độ
28
benderStepper.setSpeed(-700); benderStepper.run();
}
// Quay trở lại 52 đợ về vị trí ban đầu
while (benderStepper.currentPosition() != 52 * angleConst) { benderStepper.setSpeed(1200);
benderStepper.run(); }
29
Chương 4: LẮP GHÉP VÀ THỬ NGHIỆM 4.1 Các bước vận hành
Bước 1: Giai đoạn chuẩn bị
Trước tiên di chuyển máy đến nơi làm việc, chuẩn bị các loại vật liệu sắt thép cần uốn, chuẩn bị đường dây điện, thiết bị đầu nối đóng cắt máy.
Chọn vị trí đặt nơi bằng phẳng, khơ ráo để tránh gặp các sự cố cũng như mất an toàn về điện.
Bước 2: Kết nối điện cho máy
Để đảm bảo an toàn cho người sử dụng khi đấu điện cần kiểm tra xem máy có bị hở điện, truyền điện ra không. ( Sử dụng bút thử điện để thử), sau đó mới cấp điện cho máy để máy hoạt động.
Hình 4. 1: Kết nối nguồn điện Bước 3: Chạy thử máy
Sau khi đấu điện xong nên kiểm tra xem máy đã hoạt động ổn định hay chưa, chiều quay của động cơ đã đúng chiều chưa, nếu ngược chiều thì chỉ cần đảo jack cắm động cơ để chiều quay của động cơ đúng chiều
30
Sau khi chạy thử nếu thấy máy uốn đúng kĩ thuật thì ta bắt đầu quá trình uốn sắt thép. Để chạy máy ta cần một phần mềm điều khiển. Ở đây em sử dụng phần mềm Arduino IDE
Hình 4. 2: Giao diện Arduino IDE Chọn các thông số phù hợp với board mạch
-
31
Hình 4. 4: Chọn chip xử lí
Hình 4. 5: Chọn Port
32
Hình 4. 6: Nạp code cho vi điều khiển
Tuân thủ đúng các bước trên sẽ giúp máy hoạt động hiệu quả và đảm bảo an toàn, máy sử dụng bền lâu. Ngoài ra khi phát hiện các dấu hiệu bất thường của máy thì ngay lập tức phải đóng ngắt nguồn điện ngay để kiểm tra và thường xuyên bảo dưỡng, bảo trì định kỳ.
4.2 Kết quả vận hành
Sau khi nạp code cho vi điều khiển ta tiến hành điều khiển máy. Máy có 2 chế độ điều khiển chính. Chế độ thủ cơng do người điều khiển nhập các thông số để điều khiển máy hoạt động. Và chế độ tự động máy sẽ hoạt động theo đúng code đã viết.
Để vào chế độ thủ cơng ta kích chuột trái vào Serial monitor màn hình nối tiếp. Ta viết “manual”
Hình 4. 7: Chọn chế độ thủ cơng
33
Hình 4. 8: Chế độ nhập số thủ cơng manual mode
Để đùn dây thép ta dùng lệnh “ f + độ dài mong muốn”. Ví dụ f10 thì màn hình nối tiếp sẽ hiện feed 10mm wire
Hình 4. 9: Lệnh đùn dây
Hình 4. 10: Hình ảnh thực tế khi nhập lệnh f10
Vì máy uốn có thể tạo được hình dạng 3D nhờ vào trục Z. Ta có thể nhập lệnh “z+góc ”. Ví dụ khi nhập “z90”, màn hình nối tiếp sẽ hiện
34
Hình 4. 12: Hình ảnh thực tế khi nhập z90 Để uốn dây ta nhập lệnh “b+góc uốn”. Ví dụ khi nhập b-40
Hình 4. 13: Lệnh bẻ cong
35
Và dưới dây là một vài sản phẩm khi dùng chế độ chạy tự động
Hình 4. 15: Sản phẩm hình lập phương khi chạy tự động uốn dây sắt với đường kính 1mm
KẾT LUẬN
Trong thời gian thực hiện đồ án ,được sự chỉ dạy nhiệt tình của cơ hướng dẫn là cô Đinh Hải Lĩnh, Đề tài: “ Nghiên cứu thiết kế chế tạo mạch điều khiển cho mơ
hình máy uốn sắt mini 3D ” đã hoàn thành đúng thời gian qui định.
Với sự quyết tâm và nỗ lực không ngừng của chúng em trong thời gian làm đồ án tốt nghiệp, chúng em có dịp kiểm tra lại những gì mình đã học tại trường trong suốt thời gian qua và tìm tịi học hỏi được nhiều kiến thức mới trong quá trình làm đồ án tốt nghiệp. Cuốn quyển đồ án này ghi lại những gì liên quan đến đồ án tốt nghiệp của chúng em.
Trong quá trình làm đồ án cũng gặp một số khó khăn như: viết chương trình vẫn mắc phãi nhưng lỗi, làm phần cứng khó khăn vì thiết kế mơ hình và có những lúc mạch điện hoạt động chưa ổn định. Nhưng với sự quyết tâm của nhóm và được sự chỉ dạy tận tình của Cơ hướng dẫn nên chúng em cũng khắc phục được khó khăn và hồn thành đề tài theo quy định.
Qua quá trình thực hiện đồ án, chúng em có dịp nâng cao kiến thức thiết kế và có khả năng viết một số chương trình với Arduino một cách thành thạo hơn.
Chúng em xin chân thành cảm ơn mọi sự giúp đỡ tận tình của các thầy - cơ trong Trường và khoa Cơ Điện- Cơng trình, Cơ hướng dẫn - Cơ Đinh Hải Lĩnh, đã tạo nhiều điều kiện cho chúng em hoàn thành tốt đề tài được giao đúng thời gian qui định.
Một lần nữa, chúng em rất mong sự đóng góp ý kiến của quý thầy – cô trong Trường và khoa Cơ Điện- Cơng trình cùng với các bạn học sinh_sinh viên để cuốn quyển đồ án này được hoàn chỉnh hơn.
PHỤ LỤC
#include <AccelStepper.h> #include <Servo.h> #define limitSwitch 11 int sign; String dataInS; int angle; int angleConst;
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() != -1300) {
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("lap")) { lapphuong(); } if (mode.startsWith("star")) { star(); } if (mode.startsWith("gongkinh")) { gongkinh(); } if (mode.startsWith("sat")) { sat(); } } 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);
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 manual() { int sign;
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);
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; } } void day(int a) { servo01.write(130); Serial.print("Feed "); Serial.print(a); Serial.println("mm wire."); a = a * 48; while (feederStepper.currentPosition() != a) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100);}
void b ( String dataIn) {servo01.write(130); if (dataIn.charAt(0) == '-') {
dataInS = dataIn.substring(1, 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(0, dataIn.length()); angle = dataInS.toInt();
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(1, dataIn.length()); angle = dataInS.toInt();
Serial.print(angle); 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.setCurrentPosition(0); delay(100);
}
void z (String dataIn)
{ servo01.write(130);
if (dataIn.charAt(0) == '-') {
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() != angle * angleConst) { zAxisStepper.setSpeed(500); zAxisStepper.run(); } zAxisStepper.setCurrentPosition(0); delay(100); } else {
dataInS = dataIn.substring(0, 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.setCurrentPosition(0); delay(100); } } void lapphuong() { Serial.println(" // LAPPHUONG //"); servo01.write(130); delay(200); day(40); servo01.write(130); b ("60"); delay(200); day(40); b("60"); delay(200); day(40); b("60"); delay(200); day(40); z ("90"); delay(200); b("-60"); delay(200); day(40); z ("-90"); delay(200); b ("60"); delay(200); day(40); z ("90"); delay(200); b ("-60"); delay(200); day(40); b ("-60"); delay(200); day(40); b ("-60"); delay(200); day(40); z ("-90"); delay(200); } void gongkinh() { Serial.println(" // gongkinh //");
day(15); b ("40"); delay(200); day (30); b ("60"); delay(200); day (30); b ("60"); delay(200); day (30); b ("52"); delay(200); day (22); delay(200); b ("-69"); delay(200); day(20); b ("-69"); delay(200); day (22); b ("52"); delay(200); day (30); b ("60"); delay(200); day (30); b ("60"); delay(200); day (30); b ("40"); delay(200); day(30 ); }
void sat() { Serial.println(" // sat //"); day(20); b ("60"); delay(200); day (20); z ("90"); delay(200); b ("60"); delay(200); day (40); b ("60"); delay(200); day (20); delay(200); z ("90"); delay(200); b ("-60"); delay(200); day(20); b ("-60"); delay(200); day (60); z ("-90"); delay(200); b ("60"); delay(200); day (40); b ("60"); delay(200); day (60); z ("-90"); delay(200); };
DANH MỤC THAM KHẢO
Tiếng việt:
1. Kỹ thuật điện tử.(1999) Đỗ Xuân Thụ. – NXB giáo dục.
2. Giáo trình cảm biến. (2000) Phan Quốc Phô, Nguyễn Đức Chiến. – NXB Khoa học và kĩ thuật.
3. Vi điều khiển câu trúc lập trình và ứng dụng. (2008) Kiều Xuân Thực, Vũ Thị
Hương, Vũ Trung Kiên – NXB Giáo Dục.
Tiếng anh:
1. Beginning Arduino - Mike McRoberts 2. Arduino cookbook – Michael Margolis
Địa chỉ Website: 4. Website http://alldatasheet.com/ 5. Website http://arduino.vn/ 6. Website http://codientu.org/ 7. Website http://webdien.com/ 8. Website http://www.tailieu.vn/ 9. Website http://wikipedia.com/