สารบัญ:

ลูกกลิ้งลูกกลิ้งอัตโนมัติพร้อม Arduino และ One Servo: 3 ขั้นตอน
ลูกกลิ้งลูกกลิ้งอัตโนมัติพร้อม Arduino และ One Servo: 3 ขั้นตอน

วีดีโอ: ลูกกลิ้งลูกกลิ้งอัตโนมัติพร้อม Arduino และ One Servo: 3 ขั้นตอน

วีดีโอ: ลูกกลิ้งลูกกลิ้งอัตโนมัติพร้อม Arduino และ One Servo: 3 ขั้นตอน
วีดีโอ: ลุงตู่ หรือ ลุงป้อม อย่างฮา แถมสวยมีสเน่ห์อีกด้วย มิสแกรนด์ 2023 🇹🇭 2024, ธันวาคม
Anonim
Image
Image

นี่เป็นโครงการ Arduino และเซอร์โวขนาดเล็กที่ใช้เวลาประมาณสองชั่วโมงจึงจะเสร็จสมบูรณ์ ใช้เซอร์โวยกปลายด้านหนึ่งของฝาโถเพื่อหมุนลูกเหล็กรอบวงใน เป็นตัวสตาร์ทเอง สามารถเปลี่ยนความเร็ว และหมุนสองลูก (หรือมากกว่านั้น) ได้ในคราวเดียว สนุกกับการสร้างและทำงาน พารามิเตอร์เวลาสามารถเล่นได้ด้วยความเร็วที่เร็วยิ่งขึ้น สามารถใช้เซ็นเซอร์เอฟเฟกต์ฮอลล์สองสามตัวที่มีลูกบอลแม่เหล็กเพื่อทำให้เป็นเครื่องจักรที่ชาญฉลาดขึ้นซึ่งสามารถหาพารามิเตอร์ที่ดีที่สุดได้

ฉันควรพูดถึงว่าบางคนที่นี่ที่ Instrucables.com มีเครื่องลูกลูกกลิ้งที่ซับซ้อนกว่านี้:

วัสดุที่จำเป็น:

Arduino Uno (หรือ Arduino ใด ๆ)

เซอร์โวชิลด์ (อุปกรณ์เสริม)

เซอร์โว 9g

ฝาขวด

ลูกเหล็ก

เศษไม้

ขั้นตอนที่ 1: สร้างฐานและที่ยึดฝาปิดแบบบานพับ

ทำฐานและที่ยึดฝาบานพับ
ทำฐานและที่ยึดฝาบานพับ

ฐานเป็นเพียงไม้ก้อนหนึ่งสำหรับยึดแผ่นไม้ที่มีบานพับ ไม้ที่มีบานพับควรมีขนาดใหญ่กว่าฝาโถที่คุณจะใช้และมีพื้นที่เพียงพอสำหรับบานพับและยึดเซอร์โว

ฉันใช้บานพับเครื่องบิน rc พลาสติกขนาดเล็กและติดกาวเข้ากับไม้บานพับและฐาน

ขั้นตอนที่ 2: สร้าง Servo Arm ที่ยาวขึ้นและแนบ Servo

ทำเซอร์โวอาร์มให้ยาวขึ้นและติดเซอร์โว
ทำเซอร์โวอาร์มให้ยาวขึ้นและติดเซอร์โว
ทำเซอร์โวอาร์มให้ยาวขึ้นและติดเซอร์โว
ทำเซอร์โวอาร์มให้ยาวขึ้นและติดเซอร์โว

ในการสร้างแขนเซอร์โวที่ยาวขึ้น ฉันเพียงแค่ติดชิ้นไม้ขนาด 5 เซนติเมตรเข้ากับแขนเซอร์โวด้วยสกรูและน็อตเล็กๆ สองสามตัว แขนเซอร์โวควรอยู่ที่ 90 องศาบนเซอร์โวเมื่ออยู่ในแนวนอนกับฐาน

ฉันเพิ่งติดกาวเซอร์โวไปที่ตัวยึดไม้แบบบานพับ แต่ฉันพบว่าถ้าคุณปล่อยให้มันทำงานนานกว่าสองสามนาที เซอร์โวจะทำให้กาวร้อนร้อนขึ้นและปล่อยออกจากไม้ ดังนั้นจึงรับประกันวิธีการแนบที่ดีกว่า

ขั้นตอนที่ 3: โหลดและเรียกใช้ Sketch

โหลดและเรียกใช้ Sketch
โหลดและเรียกใช้ Sketch

ฉันแนบเซอร์โวของฉันกับพิน 7 โดยใช้ตัวป้องกันเพราะสะดวกและมีราคาเพียงไม่กี่เหรียญ หากคุณไม่มีชีลด์ ให้ต่อสายสัญญาณเซอร์โวเข้ากับพิน 7 บน Arduino, สายสีแดงที่ 5v บน Arduino และสายกราวด์กับ GND บน Arduino Arduino ควรมีกระแสเพียงพอสำหรับใช้งานเซอร์โว ฉันใช้ชิลด์เพราะง่ายต่อการใช้แรงดันไฟฟ้าภายนอกสำหรับเซอร์โวเท่านั้น

นี่คือภาพร่าง ฉันเขียนรูทีนของตัวควบคุมความเร็วเซอร์โวเพื่อเปลี่ยนความเร็วของเซอร์โวเพราะอาจจะทำงานได้ไม่ดีที่ความเร็วเต็มที่

คุณสามารถเปลี่ยนการหน่วงเวลาเพื่อให้ได้ความเร็วที่แตกต่างกันของลูกบอลกลิ้ง คุณยังสามารถเปลี่ยนพารามิเตอร์ที่สามของฟังก์ชัน myServo() เพื่อเปลี่ยนความเร็วได้เช่นกัน

/////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// ////////////// // สร้างโดย Jim Demello, Shangluo University, 2017

// คุณสามารถใช้ จัดการ ทำอะไรก็ได้ที่คุณต้องการด้วยรหัสนี้ ไม่จำเป็นต้องมีชื่อของฉัน

// รูทีนนี้อนุญาตให้มีการสอดแทรกเซอร์โวจำนวนเท่าใดก็ได้ เพียงเพิ่มบรรทัดใหม่หากจำนวนเซอร์โวเกิน 4

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

#รวม

เซอร์โว myservo1, myservo2; // สร้างวัตถุเซอร์โวเพื่อควบคุมเซอร์โว

int servoRead (int servoNumber) {

int servoCurrent;

ถ้า (servoNumber == 1) { servoCurrent = myservo1.read (); }

ถ้า (servoNumber == 2) { servoCurrent = myservo2.read (); }

ส่งคืน servoCurrent;

}

เป็นโมฆะ servoWrite (int servoNumber, int offset) {

ถ้า (servoNumber==1) { myservo1.write (ออฟเซ็ต); }

ถ้า (servoNumber==2) { myservo2.write (ออฟเซ็ต); }

}

เป็นโมฆะ myServo (int newAngle, int angleInc, int incDelay, int servoNum) {

มุมโค้งมน;

ถ้า (servoNum== 1) {curAngle = myservo1.read(); }

ถ้า (servoNum== 2) {curAngle = myservo2.read(); }

ถ้า (curAngle < newAngle) {

สำหรับ (มุม int = curAngle; มุม < newAngle; มุม + = angleInc) {

ถ้า (servoNum == 1) myservo1.write (มุม);

ถ้า (servoNum == 2) myservo2.write (มุม);

ล่าช้า (incDelay); }

}

อื่นถ้า (curAngle > newAngle) {

สำหรับ (มุม int = curAngle;angle > newAngle;angle -= angleInc) {

ถ้า (servoNum == 1) myservo1.write (มุม);

ถ้า (servoNum == 2) myservo2.write (มุม);

ล่าช้า (incDelay); }

}

}

เป็นโมฆะ interpolate2Servos (int servo1, int servo1Position, int servo2, int servo2ตำแหน่ง, int numberSteps, int timeDelay){

int servo1Current, servo2Current;

servo1Current = servoRead (เซอร์โว1);

servo2Current = servoRead (เซอร์โว2);

// Serial.print ("Servo3Pos และปัจจุบัน"); Serial.print (servo3Position); Serial.print(" "); Serial.println (servo3Current);

// Serial.print ("Servo4Pos และปัจจุบัน"); Serial.print (servo4Position); Serial.print(" "); Serial.println (servo4Current);

// Serial.print ("Servo5Pos และปัจจุบัน"); Serial.print(servo5ตำแหน่ง); Serial.print(" "); Serial.println (servo5Current);

// Serial.print ("Servo6Pos และปัจจุบัน"); Serial.print(เซอร์โว6ตำแหน่ง); 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;

สำหรับ (int x=0; x

ถ้า (servo1Position > servo1Current) { cOffsetTotal = cOffsetTotal + cOffset; }

อื่น { cOffsetTotal = cOffsetTotal - cOffset; }

ถ้า (servo2Position > servo2Current) { dOffsetTotal = dOffsetTotal + dOffset; }

อื่น { dOffsetTotal = dOffsetTotal - dOffset; }

ถ้า (servo1Position != servo1Current) servoWrite (servo1, cOffsetTotal);

ถ้า (servo2Position != servo2Current) servoWrite (servo2, dOffsetTotal);

// Serial.print (" a และ b ออฟเซ็ต "); Serial.print (aOffsetTotal); Serial.print(" ");Serial.println(bOffsetTotal); Serial.print(" ");อนุกรม.println(bOffsetTotal); ล่าช้า(10);

ล่าช้า (timeDelay);

}// จบเพื่อ

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

// ดูแลเศษโมดูโล่ //

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

ถ้า (servo1Position != servo1Current) servoWrite (servo1, servo1Position);

ถ้า (servo2Position != servo2Current) servoWrite (servo2, servo2Position);

}

inttimingDelay = 100;

int servoDelay = 100;

int degGap = 10;

// นี่คือระดับเริ่มต้น (ต้องน้อยกว่าระดับสิ้นสุด)

int degStart = 0;

// นี่คือองศาสิ้นสุด (ต้องมากกว่าระดับเริ่มต้น)

int degEnd = 360;

//นี่คือรัศมีวงกลม

รัศมี int = 8;

การตั้งค่าเป็นโมฆะ ()

{

Serial.begin(9600);

ล่าช้า (100);

myservo1.attach(7); // ติดเซอร์โวบนพิน 7 กับวัตถุเซอร์โว

myservo1.write(90);

myservo2.attach(8); // ติดเซอร์โวบนพิน 8 กับวัตถุเซอร์โว

myservo2.write(90);

ล่าช้า (1000); // รอให้เซอร์โวไปถึงที่นั่น

interpolate2Servos(1, 90, 2, 90, 10, 60); // เป็นกลาง

ล่าช้า (1000);

}

วงเป็นโมฆะ () {

เวลาดีเลย์ = 15; // ทำงานที่ 10

เซอร์โวดีเลย์ = 4;

สปิน4();

// interpolate2Servos (1, 90, 2, 90, 1, 60); // เป็นกลาง

// ล่าช้า (1000);

// ออก (0); //หยุดโปรแกรมชั่วคราว - กดรีเซ็ตเพื่อดำเนินการต่อ

}

โมฆะสปิน3() {

interpolate2Servos(1, 90, 2, 110, 1, 60); // เป็นกลาง

ล่าช้า (timingDelay);

interpolate2Servos(1, 90, 2, 80, 1, 60); // เป็นกลาง

ล่าช้า (timingDelay);

}

โมฆะสปิน2 () {

// interpolate2Servos (1, 80, 2, 90, 1, 50); // เป็นกลาง

ล่าช้า (timingDelay);

interpolate2Servos(1, 80, 2, 80, 1, 60); // เป็นกลาง

ล่าช้า (timingDelay);

interpolate2Servos(1, 110, 2, 80, 1, 60); // เป็นกลาง

ล่าช้า (timingDelay);

// interpolate2Servos (1, 110, 2, 110, 1, 60); // เป็นกลาง

ล่าช้า (timingDelay);

}

โมฆะสปิน1() {

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

float deg = (degStart * 3.141592/180); // แปลงองศาเป็นเรเดียน

float xPos = 90 + (cos(deg) * รัศมี);

// xPos = รอบ (xPos);

float yPos = 90 + (บาป (องศา) * รัศมี);

// yPos = รอบ (yPos);

Serial.print("degGap=");Serial.print(degGap);Serial.print(" deg=");Serial.print(deg);Serial.print(" cos=");Serial.print(cos() แบบอนุกรม องศา));Serial.print(" degStart=");Serial.print(degStart);Serial.print("x=");Serial.print(xPos);Serial.print(" y=");อนุกรม. println(yPos);

// interpolate2Servos (1, xPos, 2, yPos, 1, servoDelay); // เป็นกลาง

myservo1.write(xPos);

myservo2.write(yPos);

ล่าช้า (timingDelay);

ถ้า (degStart >= degEnd) {

degStart = 0;

ถ้า (degGap > 180)

degGap = 180;

//degGap = 0;

อื่น

degGap = degGap + 2;

degGap = degGap - 2;

// degStart = degStart +degGap;

}

degStart = degStart + degGap;

}

โมฆะสปิน4() {

สำหรับ (int i=0; i<=360; i++){

float j = 20 * (cos ((3.14 * i)/180)) + 90;

float k = 20 * (บาป ((3.14 * i)/180)) + 90;

myservo1.write(j);

myservo2.write(k);

Serial.print(j);

Serial.print(", ");

Serial.println(k);

ล่าช้า (100);

}

}

แนะนำ: