Mục lục:

Con lăn bi tự động với Arduino và một Servo: 3 bước
Con lăn bi tự động với Arduino và một Servo: 3 bước

Video: Con lăn bi tự động với Arduino và một Servo: 3 bước

Video: Con lăn bi tự động với Arduino và một Servo: 3 bước
Video: Điều khiển động cơ Servo với Arduino - Tự học lập trình Arduino Tập 32 2024, Tháng bảy
Anonim
Image
Image

Đây là một dự án Arduino và servo nhỏ đơn giản, mất khoảng hai giờ để hoàn thành. Nó sử dụng một servo để nâng một đầu của nắp lọ để quay một quả bóng thép quanh chu vi bên trong. Nó tự khởi động, có thể thay đổi tốc độ và có thể quay hai (hoặc nhiều hơn?) Quả bóng cùng một lúc. Vui vẻ để xây dựng và làm việc. Các thông số thời gian có thể được phát với tốc độ thậm chí còn nhanh hơn. Một số cảm biến hiệu ứng hội trường với một quả cầu từ tính có thể được sử dụng để biến nó thành một cỗ máy thông minh hơn có thể tìm ra các thông số tốt nhất.

Tôi nên đề cập rằng một người nào đó ở đây tại Guidables.com có một máy lăn bi phức tạp hơn:

Vật liệu cần thiết:

Arduino Uno (hoặc bất kỳ Arduino nào)

Lá chắn Servo (tùy chọn)

9g servo

nắp lọ

bóng thép

một số gỗ vụn

Bước 1: Làm đế và giá đỡ nắp bản lề

Làm đế và giá đỡ nắp bản lề
Làm đế và giá đỡ nắp bản lề

Phần đế chỉ là một khúc gỗ để gắn miếng gỗ có bản lề vào. Bản lề gỗ phải lớn hơn nắp lọ mà bạn sẽ sử dụng và có đủ chỗ cho bản lề cũng như để gắn servo.

Tôi đã sử dụng bản lề máy bay rc bằng nhựa nhỏ và chỉ dán chúng vào gỗ bản lề và đế.

Bước 2: Tạo Cánh tay Servo dài hơn và Gắn Servo

Tạo cánh tay Servo dài hơn và gắn Servo
Tạo cánh tay Servo dài hơn và gắn Servo
Tạo cánh tay Servo dài hơn và gắn Servo
Tạo cánh tay Servo dài hơn và gắn Servo

Để tạo một cánh tay servo dài hơn, tôi chỉ cần gắn một miếng gỗ 5 cm vào cánh tay servo bằng một vài ốc vít và đai ốc nhỏ. Cánh tay servo phải ở 90 độ trên servo khi nó nằm ngang với đế.

Tôi vừa mới dán nóng servo vào giá đỡ bản lề gỗ nhưng tôi thấy rằng nếu bạn để nó chạy lâu hơn một vài phút, servo sẽ làm nóng keo nóng và bong ra khỏi gỗ. Vì vậy, một phương pháp đính kèm tốt hơn được bảo hành.

Bước 3: Tải và chạy Sketch

Tải và chạy Sketch
Tải và chạy Sketch

Tôi đã gắn servo của mình vào chân số 7 bằng cách sử dụng một tấm chắn vì nó rất tiện lợi và chúng chỉ tốn một vài đô la. Nếu bạn không có tấm chắn thì hãy gắn dây tín hiệu servo vào chân 7 trên Arduino, dây màu đỏ vào chân 5v trên Arduino và dây nối đất vào GND trên Arduino. Arduino phải cung cấp đủ dòng điện để vận hành servo. Tôi sử dụng tấm chắn vì nó dễ dàng sử dụng điện áp bên ngoài chỉ cho servo.

Đây là bản phác thảo. Tôi đã viết một quy trình điều khiển tốc độ servo để thay đổi tốc độ của servo vì nó có thể sẽ không hoạt động tốt ở tốc độ tối đa.

Bạn có thể thay đổi thời gian trễ để có được các tốc độ lăn bóng khác nhau. Bạn cũng có thể thay đổi tham số thứ ba của hàm myServo () để thay đổi tốc độ.

//////////////////////////////////////////////////////// //////////////////////////////////////////////////////// ////////////// // được tạo bởi Jim Demello, Đại học Shangluo, 2017

// bạn có thể tự do sử dụng, thao tác, làm bất cứ điều gì bạn muốn với mã này, tên tôi không bắt buộc

// Quy trình này cho phép nội suy bất kỳ số lượng servos nào, chỉ cần thêm các dòng mới nếu số lượng servos vượt quá 4

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#bao gồm

Servo myservo1, myservo2; // tạo đối tượng servo để điều khiển một servo

int servoRead (int servoNumber) {

int servoCurrent;

if (servoNumber == 1) {servoCurrent = myservo1.read (); }

if (servoNumber == 2) {servoCurrent = myservo2.read (); }

trả về servoCurrent;

}

void servoWrite (int servoNumber, int offset) {

if (servoNumber == 1) {myservo1.write (offset); }

if (servoNumber == 2) {myservo2.write (offset); }

}

void myServo (int newAngle, int angleInc, int incDelay, int servoNum) {

int curAngle;

if (servoNum == 1) {curAngle = myservo1.read (); }

if (servoNum == 2) {curAngle = myservo2.read (); }

if (curAngle <newAngle) {

for (int angle = curAngle; angle <newAngle; angle + = angleInc) {

if (servoNum == 1) myservo1.write (angle);

if (servoNum == 2) myservo2.write (angle);

trì hoãn (incDelay); }

}

else if (curAngle> newAngle) {

for (int angle = curAngle; angle> newAngle; angle - = angleInc) {

if (servoNum == 1) myservo1.write (angle);

if (servoNum == 2) myservo2.write (angle);

trì hoãn (incDelay); }

}

}

void interpolate2Servos (int servo1, int servo1Position, int servo2, int servo2Position, int numberSteps, int timeDelay) {

int servo1Current, servo2Current;

servo1Current = servoRead (servo1);

servo2Current = servoRead (servo2);

// Serial.print ("Servo3Pos va hien tai"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Current);

// Serial.print ("Servo4Pos va hien tai"); Serial.print (servo4Position); Serial.print (""); Serial.println (servo4Current);

// Serial.print ("Servo5Pos va hien tai"); Serial.print (servo5Position); Serial.print (""); Serial.println (servo5Current);

// Serial.print ("Servo6Pos va hien tai"); Serial.print (servo6Position); Serial.print (""); Serial.println (servo6Current);

// Serial.println ("");

int cOffset = (servo1Position - servo1Current); cOffset = abs (cOffset) / numberSteps;

int dOffset = (servo2Position - servo2Current); dOffset = abs (dOffset) / numberSteps;

int cOffsetTotal = 0, dOffsetTotal = 0;

cOffsetTotal = servo1Current;

dOffsetTotal = servo2Current;

for (int x = 0; x

if (servo1Position> servo1Current) {cOffsetTotal = cOffsetTotal + cOffset; }

else {cOffsetTotal = cOffsetTotal - cOffset; }

if (servo2Position> servo2Current) {dOffsetTotal = dOffsetTotal + dOffset; }

else {dOffsetTotal = dOffsetTotal - dOffset; }

if (servo1Position! = servo1Current) servoWrite (servo1, cOffsetTotal);

if (servo2Position! = servo2Current) servoWrite (servo2, dOffsetTotal);

// Serial.print ("a va b Offset"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); chậm trễ (10);

trì hoãn (timeDelay);

} // kết thúc cho

//////////////////////////////////////

// chăm sóc phần còn lại của modulo //

/////////////////////////////////////

if (servo1Position! = servo1Current) servoWrite (servo1, servo1Position);

if (servo2Position! = servo2Current) servoWrite (servo2, servo2Position);

}

int timingDelay = 100;

int servoDelay = 100;

int degGap = 10;

// Đây là độ bắt đầu (phải nhỏ hơn độ cuối)

int degStart = 0;

// Đây là độ kết thúc (phải lớn hơn độ bắt đầu)

int degEnd = 360;

// Đây là bán kính hình tròn

bán kính int = 8;

void setup ()

{

Serial.begin (9600);

chậm trễ (100);

myservo1.attach (7); // gắn servo trên chân 7 vào đối tượng servo

myservo1.write (90);

myservo2.attach (8); // gắn servo trên chân 8 vào đối tượng servo

myservo2.write (90);

chậm trễ (1000); // đợi servo đến đó

interpolate2Servos (1, 90, 2, 90, 10, 60); // Trung lập

chậm trễ (1000);

}

void loop () {

timingDelay = 15; // hoạt động lúc 10

servoDelay = 4;

quay4 ();

// interpolate2Servos (1, 90, 2, 90, 1, 60); // Trung lập

// delay (1000);

// thoát ra (0); // tạm dừng chương trình - nhấn đặt lại để tiếp tục

}

void spin3 () {

interpolate2Servos (1, 90, 2, 110, 1, 60); // Trung lập

trì hoãn (timingDelay);

interpolate2Servos (1, 90, 2, 80, 1, 60); // Trung lập

trì hoãn (timingDelay);

}

void spin2 () {

// interpolate2Servos (1, 80, 2, 90, 1, 50); // Trung lập

trì hoãn (timingDelay);

interpolate2Servos (1, 80, 2, 80, 1, 60); // Trung lập

trì hoãn (timingDelay);

interpolate2Servos (1, 110, 2, 80, 1, 60); // Trung lập

trì hoãn (timingDelay);

// interpolate2Servos (1, 110, 2, 110, 1, 60); // Trung lập

trì hoãn (timingDelay);

}

void spin1 () {

// int deg = (degStart / (180 / 3.14));

float deg = (degStart * 3,141592 / 180); // chuyển đổi độ sang radian

float xPos = 90 + (cos (deg) * bán kính);

// xPos = round (xPos);

float yPos = 90 + (sin (deg) * bán kính);

// yPos = round (yPos);

Serial.print ("degGap ="); Serial.print (degGap); Serial.print ("deg ="); Serial.print (deg); Serial.print ("cos ="); Serial.print (cos (deg)); Serial.print ("degStart ="); Serial.print (degStart); Serial.print ("x ="); Serial.print (xPos); Serial.print ("y ="); Serial. println (yPos);

// interpolate2Servos (1, xPos, 2, yPos, 1, servoDelay); // Trung lập

myservo1.write (xPos);

myservo2.write (yPos);

trì hoãn (timingDelay);

if (degStart> = degEnd) {

degStart = 0;

nếu (degGap> 180)

degGap = 180;

// degGap = 0;

khác

degGap = degGap + 2;

degGap = degGap - 2;

// degStart = degStart + degGap;

}

degStart = degStart + degGap;

}

void spin4 () {

for (int i = 0; i <= 360; i ++) {

float j = 20 * (cos ((3,14 * i) / 180)) + 90;

float k = 20 * (sin ((3,14 * i) / 180)) + 90;

myservo1.write (j);

myservo2.write (k);

Serial.print (j);

Serial.print (",");

Serial.println (k);

chậm trễ (100);

}

}

Đề xuất: