DIY Camera di chuyển trên thanh trượt – Dự án Arduino

Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách để tạo ra một camera di chuyển trên khung trượt với thanh trượt và khung thay đổi góc. Dự án dựa trên Arduino này là 100% DIY, được xây dựng bằng vật liệu rẻ tiền như gỗ dán và ván ép và được điều khiển bằng Arduino, ba động cơ bước, một số ốc vít và cần điều khiển gắn trên PCB được thiết kế tùy chỉnh. Mặc dù vậy, kết quả cuối cùng khá ấn tượng, với các chuyển động camera siêu mượt cho phép chúng ta có được những bức ảnh chuyên nghiệp.

Tổng quan

Sử dụng bộ điều khiển, chúng ta có thể tự di chuyển camera xung quanh hoặc chúng ta có thể đặt điểm bắt đầu và điểm kết thúc và sau đó camera sẽ tự động di chuyển từ vị trí này sang vị trí khác. Ngoài ra, sử dụng cánh tay hỗ trợ, chúng ta có thể gắn thanh trượt ngay cả trên giá ba chân nhỏ hơn, ở bất kỳ góc nào chúng ta muốn và vẫn có được chuyển động ổn định.

Để bắt đầu, tôi đã thiết kế thanh trượt bằng phần mềm mô hình 3D.

Bạn có thể tải xuống với tất cả các kích thước từ mô hình 3D bên dưới.

Solidworks:

DIY Camera Slider 3D Model

Tệp COLLADA (có thể mở bằng phần mềm mô hình 3D miễn phí SketchUp):

DIY Camera Slider.dae

Xây dựng thanh trượt camera

Tôi bắt đầu với việc làm ray trượt với ống đồng có đường kính 22mm. Tôi sử dụng 2 thanh trượt dài 1 mét. Ống đồng có thể dễ dàng oxy hóa vì vậy chúng ta cần sơn bóng chúng bằng loại sơn bóng kim loại. Trong trường hợp của tôi, tôi không có loại sơn này nên tôi đã sử dụng kem đánh răng cho mục đích đó.

Đây không phải là giải pháp hoàn hảo nhưng tôi vẫn thực hiện và thấy sự khác biệt và làm cho ống hạn chế bị oxy hóa.

Sau đó, tôi tiếp tục với việc làm đế bằng gỗ, hai ống sẽ được gắn vào trên đế và nó cũng sẽ hổ trợ cho việc gắn thanh trượt lên chân máy. Sử dụng một cái cưa tròn tôi cắt hai miếng gỗ dán dày 21mm và dán chúng lại với nhau để tạo thành một miếng gỗ. Sau đó, sử dụng gỗ cứng, tôi tạo một khung gắn giá ba chân và gắn nó vào miếng gỗ dán bằng keo dán gỗ và ốc vít. Bây giờ khung trượt có thể dễ dàng gắn trên giá ba chân.

Tôi sẽ gắn các thanh trượt vào đế bằng các thanh ren 8 mm để tôi tạo hai lỗ trên đế và chèn các thanh dài 138mm mà tôi đã cắt. Tiếp theo tôi phải khoan lỗ 8 mm trong các ống – có thể hơi khó.

Với mục đích đó, tôi đã tạo ra một khuôn đơn giản trong đó tôi nâng bút chì lên độ cao 11mm hoặc bằng một nửa đường kính ống. Sau đó, tôi cố định ống trên một bề mặt phẳng và sử dụng khuôn đánh dấu ống từ cả hai bên. Điều này để có được lỗ chính xác từ cả hai bên. Vì vậy, đầu tiên tôi đánh dấu các điểm khoan bằng đầu vít sắc và sau đó khoan chúng từ từ bằng cách sử dụng mũi khoan 2, 4, 6 và 8 mm.

Sau đó, tôi chèn các thanh ray qua các thanh ren và sử dụng một số vòng đệm và đai ốc để cố định chúng vào đế trượt. Theo cách tương tự, sử dụng một miếng gỗ dán và một thanh ren để cố định các đầu của ray.

Tiếp theo là đế trượt. Một lần nữa tôi đã sử dụng một cái cưa tròn để cắt tấm gỗ dày 8 mm theo kích thước theo mô hình 3D. Tôi cũng tạo ra một số lỗ 8 mm cho các thanh ren và ổ đỡ sẽ được gắn vào đó. Để lắp ráp đế tôi đã sử dụng keo dán gỗ và một số ốc vít. Đầu tiên tôi sử dụng máy khoan không dây tạo ra các lỗ thí điểm, sau đó cố định bộ đệm bằng ốc vít 3 mm vào vị trí.

Khi các tấm được cố định, tôi tiếp tục lắp ráp hệ thống ổ trục. Vòng bi mà tôi đang sử dụng là 608Z với đường kính ngoài 22mm. Hai vòng đệm và đai ốc giữa hai vòng bi tạo ra khoảng cách vừa đủ giữa chúng, do đó cho phép tiếp xúc tốt với đường ray 22mm.

Để làm cho đế chắc chắn hơn có thể sử dụng thanh trượt ở một góc, theo cách tương tự, tôi đã chèn thêm hai bộ vòng bi ở phía dưới của đế. Cuối cùng, đế trượt hoàn thành và hoạt động hoàn hảo.

Ở đây chúng ta có thể nhận thấy rằng khi di chuyển bục dọc theo thanh trượt trên giá ba chân nhỏ, nó không thể giữ trọng lượng của bục nên tôi phải làm một tay đỡ để ổn định thanh trượt. Vì vậy, bằng cách sử dụng hai miếng gỗ và một số đai ốc và bu lông tôi đã tạo ra một chiếc kẹp đơn giản có thể gắn chặt vào một trong các chân của chân máy.

Kẹp có một bu lông trên đó cánh tay hỗ trợ có thể được gắn vào. Tiếp theo tôi phải tạo một khe trên cánh tay đỡ để có thể định vị thanh trượt ở các góc khác nhau. Tôi đã tạo ra các khe bằng cách đơn giản là khoan vài lỗ 6 mm gần nhau, và sau đó tạo thành một đường thẳng.

Tôi đã tiếp tục tạo khung này bằng cách thêm chân vào thanh trượt, trong trường hợp bạn không muốn hoặc không cần sử dụng chân máy. Tôi đã làm chúng bằng gỗ công nghiệp 8 mm. Sử dụng cưa tay, tôi dễ dàng có được hình dạng mong muốn của chân đế. Sau đó, sử dụng một ít keo và hai đai ốc tôi cố định chúng vào hai đầu của thanh trượt.

Giai đoạn tiếp theo là lắp ráp hệ thống trượt, nó sẽ được gắn trên đỉnh của khung trượt. Sử dụng cưa tròn, tôi cắt tất cả các mảnh cần thiết, với kích thước được lấy từ mô hình 3D. Tôi đã sử dụng một vài miếng gỗ dán để tạo cơ chế bản lề của bệ cân bằng cho máy ảnh khi thanh trượt được đặt ở một góc, cũng như một số tấm gỗ mà tôi đã tạo các lỗ thích hợp cho động cơ và vòng bi cho hệ thống trượt.

Tiếp theo lắp ráp động cơ bước và đai vào đế trượt. Ở một bên của đế, tôi cố định động cơ bước bằng một miếng ván MDF và một số ốc vít và bu lông. Và ở phía bên kia của thanh trượt, tôi lắp một ròng rọc để có thể cố định đai. Sử dụng hai bu lông và dây buộc tôi dễ dàng lắp đai cho đế trượt.

Với bước này, cơ chế trượt đã hoàn thành.

Tôi tiếp tục với việc làm phần trên của hệ thống trượt. Theo mô hình 3D, tôi đã tạo ra tất cả các lỗ thích hợp cho động cơ bước và vòng bi, và dán, vặn mọi thứ lại với nhau.

Một người bạn của tôi đã in 3D 80 ròng rọc cho tôi. Bằng cách này, tôi đã giảm được 5 lần tốc độ so với ròng rọc 16 răng được gắn trên động cơ bước.

Ròng rọc 80 răng để giảm tốc độ 5 lần

Bây giờ tôi cần phải tạo một đai vòng kín theo thiết lập của mình, vì vậy tôi đã đo chiều dài của đai tôi cần, cắt nó và sau đó chỉ cần dán nó bằng keo CA và thêm một miếng băng dính lên trên nó. Keo CA dán cao su khá tốt để tạo đai vòng kín hoạt động mà không gặp vấn đề gì.

Tiếp theo tôi bắt đầu lắp ráp bước cuối cùng của hệ thống trượt. Đầu tiên tôi bảo đảm động cơ nghiêng bằng cách sử dụng một số bu lông và sau đó thêm hai vòng bi vào vị trí trong khi cố định chúng trong các khe bằng một số epoxy. Sau đó, tôi cố định khung nghiêng trên đế trượt bằng cách sử dụng một số bu lông 8 mm và đồng thời tôi gắn ròng rọc 80 răng vào nó cùng với dây đai.

Ở đây tôi nhận thấy rằng dây đai hơi lỏng nhưng tôi đã thêm một ổ trục nhỏ ở vị trí mà bu lông động cơ bước di chuyển để hoạt động như một bộ căng đai. Điều này đã được giải quyết và vì vậy bây giờ dây đai đã có đủ sức căng để hoạt động chính xác.

Tiếp theo tôi bảo đảm động cơ trượt và thêm vòng bi ở phía trên của đế, cũng như phía dưới. Sau đó, tôi chèn một bu lông xuyên qua chúng, thêm một ổ đỡ lực đẩy, ròng rọc răng 80 và vòng đai, và trên đầu chúng thêm khung nghiêng được lắp ráp trước đó. Cuối cùng tôi cố định nó bằng một bu lông và thế là xong bước này, việc lắp ráp thanh trượt được hoàn thành.

Sơ đồ mạch

Ok, tiếp theo là phần thú vị là lắp ráp các linh kiện điện tử. Đây là sơ đồ mạch của dự án trượt camera DIY này.

Ba động cơ bước Nema 17 sẽ được điều khiển thông qua ba trình điều khiển bước A4988. Để điều khiển chuyển động trượt, chúng tôi sử dụng một biến trở được kết nối với đầu vào analog của Arduino, và để điều khiển thanh trượt và đầu nghiêng, chúng tôi sử dụng mô-đun cần điều khiển bao gồm hai biến trở, do đó, nó được kết nối với hai đầu vào analog. Ngoài ra còn có một biến trở khác được sử dụng để thiết lập tốc độ di chuyển tự động từ các vị trí vào và ra. Những vị trí vào và ra được thiết lập với sự trợ giúp của nút ấn. Nút ấn này có điện trở kéo lên và nó được kết nối với chân digital của board Arduino. Ngoài ra còn có nút ấn thiết lập lại, công tắc nguồn và giắc cắm nguồn, cũng như công tắc giới hạn cho thanh trượt và hai đèn LED để chỉ trạng thái vào và ra. Chúng ta có thể cung cấp nguồn cho dự án này với 9 hoặc 12V.

Các linh kiện cần thiết cho dự án này:

  • Động cơ bước (Nema17)
  • A4988 Stepper Driver
  • Bộ chuyển đổi 12V 2A
  • Dây nối
  • Board Arduino

Thiết kế PCB

Tiếp theo, theo sơ đồ mạch in PCB tôi đã thiết kế để giữ cho các linh kiện điện tử được điều khiển.

Tôi đã làm điều đó bằng cách sử dụng phần mềm thiết kế mạch trực tuyến miễn phí EasyEDA. Mạch có khá nhiều kết nối, vì vậy tôi đã sử dụng cả 2 mặt của board để có được PCB hoạt động tốt và dễ nhìn. Sau khi hoàn thành bước này, tôi tạo tệp Gerber để tạo PCB.

Ở đây chúng ta chỉ cần tải lên tệp Gerber và sau khi tải lên, chúng ta có thể xem lại PCB của mình trong trình xem Gerber. Nếu mọi thứ đều ổn thì chúng ta có thể tiếp tục, chọn các thuộc tính mà chúng ta muốn cho PCB của chúng ta, và sau đó chúng ta có thể đặt hàng PCB với giá cả hợp lý. Lưu ý rằng nếu đó là đơn đặt hàng đầu tiên của bạn từ JLCPCB, bạn có thể nhận được tối đa 10 PCB chỉ với 2 đô la.

Tuy nhiên, sau một tuần, PCB sẽ được giao đến. Chất lượng của PCB là tuyệt vời và tôi phải thừa nhận rằng khá hài lòng khi có thiết kế PCB của riêng bạn được sản xuất.

Lắp ráp thiết bị điện tử

Tiếp theo tôi chuyển sang lắp ráp các linh kiện điện tử. Tôi bắt đầu bằng cách hàn chân PCB. Điều này cho phép kết nối và ngắt kết nối các linh kiện dễ dàng hơn khi cần thiết. Tôi thực sự đã sử dụng các chân cho tất cả mọi thứ trừ các tụ điện và điện trở mà tôi đã hàn trực tiếp trên PCB. Vì vậy, tôi tiếp tục với hàn dây dẫn cho tất cả các linh kiện điện tử.

Bằng cách này, tôi có thể dễ dàng gắn các linh kiện vào vỏ bộ điều khiển và đồng thời kết nối chúng với PCB.

Để tiện cho việc điều khiển, tôi quyết định dặt nó vào khung mica trong suốt 4mm vì tôi muốn tất cả các linh kiện điện tử được nhìn thấy. Tôi đã sử dụng một cái cưa tròn để cắt các tấm mica cho phù hợp kích thước linh kiện. Sau đó, sử dụng mũi khoan và bit Forstner tôi đã tạo lỗ trên cho các vít, biến trở, công tắc nguồn và cần điều khiển. Sau đó, sử dụng epoxy 5 phút, tôi lắp ráp vỏ máy, và đối với mặt trên tôi đã chèn và dán hai bu lông thông qua mặt trước có thể được chèn và cố định đai ốc ở trên nó.

Cuối cùng tôi bắt đầu lắp ráp các thiết bị điện tử bằng cách chèn board Arduino và trình điều khiển bước A4988 vào PCB. Sau đó, tôi tiếp tục với việc chèn và cố định vít và các linh kiện khác trên board điều khiển.

Khi tôi đã cố định chúng, tôi kết nối các linh kiện với các chân thích hợp trên PCB. Trên board điều khiển bên của vỏ máy tôi đã thêm giắc cắm nguồn, sau đó lắp PCB vào vỏ. Trên cùng một board điều khiển cũng có một lỗ thông qua đó tôi nối dây dẫn để kết nối các trình điều khiển với động cơ bước, cũng như công tắc giới hạn mà tôi đặt nó ở cuối thanh trượt.

Sử dụng một số ống co nhiệt tôi đã sắp xếp các dây dẫn ra khỏi vỏ bộ điều khiển và cuối cùng, điều còn lại phải làm là kết nối bộ điều khiển với ba động cơ bước và công tắc.

Để cung cấp nguồn cho thanh trượt, tôi đã sử dụng ba pin Li-ion 3.7V được nối nối tiếp để tạo nguồn 11V. Bây giờ thanh trượt được thực hiện và hoạt động hoàn hảo.

Code Arduino

Bây giờ những gì còn lại trong hướng dẫn này là nạp code Arduino và giải thích cách chương trình hoạt động. Vì code khá dài, để hiểu rõ hơn, tôi sẽ đăng code của chương trình trong các phần có mô tả cho từng phần. Và cuối bài viết này tôi sẽ đăng code hoàn chỉnh.

Chương trình này dựa trên thư viện AccelStepper của Mike McCauley. Đây là một thư viện đáng kinh ngạc cho phép dễ dàng điều khiển nhiều động cơ bước cùng một lúc. Vì vậy, cần có thư viện các linh kiện và thư viện MultiStepper.h, chúng tôi cần xác định tất cả các chân Arduino sẽ được sử dụng, xác định các thể hiện cho các bước, cũng như một số biến cần cho chương trình bên dưới.

#include <MultiStepper.h>

 

#define JoyX A0 // Joystick X pin

#define JoyY A1 // Joystick Y pin

#define slider A2 // Slider potentiometer

#define inOutPot A3 // In and Out speed potentiometer

#define JoySwitch 10 // Joystick switch connected

#define InOutSet 12 // Set Button

#define limitSwitch 11

#define inLED 8

#define outLED 9

 

// Define the stepper motors and the pins the will use

AccelStepper stepper1(1, 7, 6); // (Type:driver, STEP, DIR)

AccelStepper stepper2(1, 5, 4);

AccelStepper stepper3(1, 3, 2);

 

MultiStepper StepperControl; // Create instance of MultiStepper

 

long gotoposition[3]; // An array to store the In or Out position for each stepper motor

 

int JoyXPos = 0;

int JoyYPos = 0;

int sliderPos = 0;

int currentSpeed = 100;

int inOutSpeed = 100;

 

int XInPoint = 0;

int YInPoint = 0;

int ZInPoint = 0;

int XOutPoint = 0;

int YOutPoint = 0;

int ZOutPoint = 0;

int InandOut = 0;

Trong phần thiết lập, chúng tôi đặt các giá trị tốc độ ban đầu cho các bước, xác định một số giá trị của chân, cũng như thêm ba bước vào đối tượng điều khiển nhiều bước có tên là Step StepContControl. Sử dụng các vòng lặp while chúng ta di chuyển thanh trượt đến vị trí ban đầu hoặc nó di chuyển cho đến khi nhấn công tắc giới hạn và sau đó nó di chuyển trở lại 200 bước để giải phóng công tắc giới hạn.

void setup() {

// Set initial seed values for the steppers

stepper1.setMaxSpeed(3000);

stepper1.setSpeed(200);

stepper2.setMaxSpeed(3000);

stepper2.setSpeed(200);

stepper3.setMaxSpeed(3000);

stepper3.setSpeed(200);

pinMode(JoySwitch, INPUT_PULLUP);

pinMode(InOutSet, INPUT_PULLUP);

pinMode(limitSwitch, INPUT_PULLUP);

pinMode(inLED, OUTPUT);

pinMode(outLED, OUTPUT);

 

// Create instances for MultiStepper – Adding the 3 steppers to the StepperControl instance for multi control

StepperControl.addStepper(stepper1);

StepperControl.addStepper(stepper2);

StepperControl.addStepper(stepper3);

 

// Move the slider to the initial position – homing

while (digitalRead(limitSwitch) != 0) {

stepper1.setSpeed(3000);

stepper1.runSpeed();

stepper1.setCurrentPosition(0); // When limit switch pressed set position to 0 steps

}

delay(20);

// Move 200 steps back from the limit switch

while (stepper1.currentPosition() != –200) {

stepper1.setSpeed(3000);

stepper1.run();

}

}

Trong phần vòng lặp, chúng tôi bắt đầu bằng cách kiểm tra xem thanh trượt đã đạt đến các vị trí giới hạn hay đó là công tắc giới hạn hoặc 80cm ở phía bên kia của nó.

// Giới hạn chuyển động – Không làm gì nếu nhấn công tắc giới hạn hoặc khoảng cách di chuyển theo hướng khác lớn hơn 80cm

while (digitalRead(limitSwitch) == 0 || stepper1.currentPosition() < –64800) {}

Với câu lệnh if tiếp theo, chúng tôi tăng tốc độ động cơ trượt với mỗi lần nhấn công tắc cần điều khiển.

// If Joystick pressed increase the Pan and Tilt speeds

if (digitalRead(JoySwitch) == 0) {

currentSpeed = currentSpeed + 50;

delay(200);

}

Sau đó, chúng tôi kiểm tra xem có nhấn nút Set không, được sử dụng để đặt vị trí IN và OUT. Với lần nhấn nút đầu tiên, chúng tôi lưu trữ các vị trí IN của động cơ bước và cũng làm sáng đèn LED IN.

switch (InandOut) {
case 0: // Set IN position
InandOut = 1;
XInPoint = stepper1.currentPosition(); // Set the IN position for steppers 1
YInPoint = stepper2.currentPosition(); // Set the IN position for steppers 2
ZInPoint = stepper3.currentPosition(); // Set the IN position for steppers 3
digitalWrite(inLED, HIGH); // Light up inLed
break;

Theo cách tương tự, với lần đẩy thứ hai, chúng tôi lưu trữ các vị trí OUT và bật đèn LED OUT.

case 1: // Set OUT position
InandOut = 2;
XOutPoint = stepper1.currentPosition(); // Set the OUT Points for both steppers
YOutPoint = stepper2.currentPosition();
ZOutPoint = stepper3.currentPosition();
digitalWrite(outLED, HIGH);
break;

Sau đó, với lần nhấn nút tiếp theo, chúng ta đọc giá trị của biến trở tốc độ tự động được sử dụng để đặt tốc độ tối đa của động cơ. Ngoài ra, chúng tôi đặt các vị trí IN vào trong mảng “gotopocation” của góc được sử dụng trong hàm moveTo () để tính tốc độ cần thiết cho tất cả các bước riêng biệt. Sau đó, sử dụng hàm runSpeedToPosition(), thanh trượt tự động di chuyển đến vị trí In.

case 2: // Move to IN position / go to case 3
InandOut = 3;
inOutSpeed = analogRead(inOutPot); // Auto speed potentiometer
// Place the IN position into the Array
gotoposition[0] = XInPoint;
gotoposition[1] = YInPoint;
gotoposition[2] = ZInPoint;
stepper1.setMaxSpeed(inOutSpeed);
stepper2.setMaxSpeed(inOutSpeed);
stepper3.setMaxSpeed(inOutSpeed);
StepperControl.moveTo(gotoposition); // Calculates the required speed for all motors
StepperControl.runSpeedToPosition(); // Blocks until all steppers are in position
delay(200);
break;

Theo cùng một cách chính xác, trong trường hợp số 3 hoặc với một lần nhấn nút khác, chúng tôi di chuyển thanh trượt đến vị trí OUT.

case 3: // Move to OUT position / go back to case 2
InandOut = 2;
inOutSpeed = analogRead(inOutPot);
// Place the OUT position into the Array
gotoposition[0] = XOutPoint;
gotoposition[1] = YOutPoint;
gotoposition[2] = ZOutPoint;
stepper1.setMaxSpeed(inOutSpeed);
stepper2.setMaxSpeed(inOutSpeed);
stepper3.setMaxSpeed(inOutSpeed);
StepperControl.moveTo(gotoposition); // Calculates the required speed for all motors
StepperControl.runSpeedToPosition(); // Blocks until all are in position
delay(200);
break;

Trong trường hợp chúng tôi giữ nút Set được đẩy lâu hơn nửa giây, câu lệnh trường hợp thứ 4 sẽ được thực thi, điều này đặt lại vị trí IN và OUT để chúng tôi có thể đặt những cái mới.

Tiếp theo là phím điều khiển Pan và Tilt control. Giá trị tương tự mà chúng ta nhận được từ cần điều khiển là từ 0 đến 1024 hoặc khi nó nằm ở giữa, các giá trị nằm trong khoảng 500. Vì vậy, nếu chúng ta di chuyển phím điều khiển sang trái và giá trị tương tự lớn hơn 600, chúng ta sẽ đặt tốc độ của động cơ cụ thể thành dương, và ngược lại, khi chúng ta di chuyển cần điều khiển sang phải, chúng ta sẽ đặt tốc độ của động cơ thành âm, có nghĩa là nó sẽ quay theo chiều ngược lại.

// Joystick X – Pan movement
JoyXPos = analogRead(JoyX);
// if Joystick is moved left, move stepper 2 or pan to left
if (JoyXPos > 600) {
stepper2.setSpeed(currentSpeed);
}
// if Joystick is moved right, move stepper 2 or pan to right
else if (JoyXPos < 400) {
stepper2.setSpeed(-currentSpeed);
}
// if Joystick stays in middle, no movement
else {
stepper2.setSpeed(0);
}

Trong trường hợp nó nằm ở giữa, tốc độ được đặt thành 0. Phương pháp này được sử dụng cho cả trục của cần điều khiển cũng như biến trở trượt. Trên thực tế, trong trường hợp biến trở, chúng tôi sử dụng giá trị tương tự của nó để tăng tốc độ của động cơ khi tiếp tục quay biến trở.

// Slider potentiometer
sliderPos = analogRead(slider);
// If potentiometer is turned left, move slider left
if (sliderPos > 600) {
sliderPos = map(sliderPos, 600, 1024, 0, 3000);
stepper1.setSpeed(sliderPos); // Increase speed as turning
}
// If potentiometer is turned right, move slider right
else if (sliderPos < 400 ) {
sliderPos = map(sliderPos, 400, 0, 0, 3000);
stepper1.setSpeed(-sliderPos); // Increase speed as turning
}
// If potentiometer in middle, no movement
else {
stepper1.setSpeed(0);
}

Cuối cùng, chúng ta gọi các hàm runSpeed​​() cho mỗi động cơ bước và thực hiện các lệnh trên hoặc xoay động cơ một cách thích hợp.

// Thực hiện các lệnh trên – chạy các động cơ bước

stepper1.runSpeed();
stepper2.runSpeed();
stepper3.runSpeed();

Đây là code hoàn chỉnh:

#include <AccelStepper.h>
#include <MultiStepper.h>

#define JoyX A0       // Joystick X pin
#define JoyY A1       // Joystick Y pin
#define slider A2     // Slider potentiometer
#define inOutPot A3   // In and Out speed potentiometer
#define JoySwitch 10  // Joystick switch connected
#define InOutSet 12   // Set Button
#define limitSwitch 11
#define inLED 8
#define outLED 9

// Define the stepper motors and the pins the will use
AccelStepper stepper1(1, 7, 6); // (Type:driver, STEP, DIR)
AccelStepper stepper2(1, 5, 4);
AccelStepper stepper3(1, 3, 2);

MultiStepper StepperControl;  // Create instance of MultiStepper

long gotoposition[3]; // An array to store the In or Out position for each stepper motor

int JoyXPos = 0;
int JoyYPos = 0;
int sliderPos = 0;
int currentSpeed = 100;
int inOutSpeed = 100;

int XInPoint = 0;
int YInPoint = 0;
int ZInPoint = 0;
int XOutPoint = 0;
int YOutPoint = 0;
int ZOutPoint = 0;
int InandOut = 0;

void setup() {
  // Set initial seed values for the steppers
  stepper1.setMaxSpeed(3000);
  stepper1.setSpeed(200);
  stepper2.setMaxSpeed(3000);
  stepper2.setSpeed(200);
  stepper3.setMaxSpeed(3000);
  stepper3.setSpeed(200);
  pinMode(JoySwitch, INPUT_PULLUP);
  pinMode(InOutSet, INPUT_PULLUP);
  pinMode(limitSwitch, INPUT_PULLUP);
  pinMode(inLED, OUTPUT);
  pinMode(outLED, OUTPUT);

  // Create instances for MultiStepper - Adding the 3 steppers to the StepperControl instance for multi control
  StepperControl.addStepper(stepper1);
  StepperControl.addStepper(stepper2);
  StepperControl.addStepper(stepper3);

  // Move the slider to the initial position - homing
  while (digitalRead(limitSwitch) != 0) {
    stepper1.setSpeed(3000);
    stepper1.runSpeed();
    stepper1.setCurrentPosition(0); // When limit switch pressed set position to 0 steps
  }
  delay(20);
  // Move 200 steps back from the limit switch
  while (stepper1.currentPosition() != -200) {
    stepper1.setSpeed(-3000);
    stepper1.run();
  }

}

void loop() {
  // Limiting the movement - Do nothing if limit switch pressed or distance traveled in other direction greater then 80cm
  while (digitalRead(limitSwitch) == 0 || stepper1.currentPosition() < -64800) {}

  // If Joystick pressed increase the Pan and Tilt speeds
  if (digitalRead(JoySwitch) == 0) {
    currentSpeed = currentSpeed + 50;
    delay(200);
  }
  // If Set button is pressed - toggle between the switch cases
  if (digitalRead(InOutSet) == 0) {
    delay(500);
    // If we hold set button pressed longer then half a second, reset the in and out positions
    if (digitalRead(InOutSet) == 0) {
      InandOut = 4;
    }
    switch (InandOut) { 
      case 0:   // Set IN position
        InandOut = 1;
        XInPoint = stepper1.currentPosition(); // Set the IN position for steppers 1
        YInPoint = stepper2.currentPosition(); // Set the IN position for steppers 2
        ZInPoint = stepper3.currentPosition(); // Set the IN position for steppers 3
        digitalWrite(inLED, HIGH); // Light up inLed
        break;

      case 1: // Set OUT position
        InandOut = 2;
        XOutPoint = stepper1.currentPosition(); //  Set the OUT Points for both steppers
        YOutPoint = stepper2.currentPosition();
        ZOutPoint = stepper3.currentPosition();
        digitalWrite(outLED, HIGH);
        break;

      case 2: // Move to IN position / go to case 3
        InandOut = 3;
        inOutSpeed = analogRead(inOutPot); // Auto speed potentiometer
        // Place the IN position into the Array
        gotoposition[0] = XInPoint;
        gotoposition[1] = YInPoint;
        gotoposition[2] = ZInPoint;
        stepper1.setMaxSpeed(inOutSpeed);
        stepper2.setMaxSpeed(inOutSpeed);
        stepper3.setMaxSpeed(inOutSpeed);
        StepperControl.moveTo(gotoposition); // Calculates the required speed for all motors
        StepperControl.runSpeedToPosition(); // Blocks until all steppers are in position
        delay(200);
        break;

      case 3: // Move to OUT position / go back to case 2
        InandOut = 2;
        inOutSpeed = analogRead(inOutPot);
        // Place the OUT position into the Array
        gotoposition[0] = XOutPoint;
        gotoposition[1] = YOutPoint;
        gotoposition[2] = ZOutPoint;
        stepper1.setMaxSpeed(inOutSpeed);
        stepper2.setMaxSpeed(inOutSpeed);
        stepper3.setMaxSpeed(inOutSpeed);
        StepperControl.moveTo(gotoposition); // Calculates the required speed for all motors
        StepperControl.runSpeedToPosition(); // Blocks until all are in position
        delay(200);
        break;

      case 4: // If Set button is held longer then half a second go back to case 0
        InandOut = 0;
        digitalWrite(inLED, LOW);
        digitalWrite(outLED, LOW);
        delay(1000);
        break;
    }
  }

  // Joystick X - Pan movement
  JoyXPos = analogRead(JoyX);
  // if Joystick is moved left, move stepper 2 or pan to left
  if (JoyXPos > 600) {
    stepper2.setSpeed(currentSpeed);
  }
  // if Joystick is moved right, move stepper 2 or pan to right
  else if (JoyXPos < 400) {
    stepper2.setSpeed(-currentSpeed);
  }
  // if Joystick stays in middle, no movement
  else {
    stepper2.setSpeed(0);
  }

  //Joystick Y - Tilt movement
  JoyYPos = analogRead(JoyY);
  if (JoyYPos > 600) {
    stepper3.setSpeed(currentSpeed);
  }
  else if (JoyYPos < 400) {
    stepper3.setSpeed(-currentSpeed);
  }
  else {
    stepper3.setSpeed(0);
  }

  // Slider potentiometer
  sliderPos = analogRead(slider);
  // If potentiometer is turned left, move slider left
  if (sliderPos > 600) {
    sliderPos = map(sliderPos, 600, 1024, 0, 3000);
    stepper1.setSpeed(sliderPos); // Increase speed as turning
  }
  // If potentiometer is turned right, move slider right
  else if (sliderPos < 400 ) {
    sliderPos = map(sliderPos, 400, 0, 0, 3000);
    stepper1.setSpeed(-sliderPos); // Increase speed as turning
  }
  // If potentiometer in middle, no movement
  else {
    stepper1.setSpeed(0);
  }
  // Execute the above commands - run the stepper motors
  stepper1.runSpeed();
  stepper2.runSpeed();
  stepper3.runSpeed();
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Chat hỗ trợ
Chat ngay