สารบัญ:
- ขั้นตอนที่ 1: สร้างฐานและที่ยึดฝาปิดแบบบานพับ
- ขั้นตอนที่ 2: สร้าง Servo Arm ที่ยาวขึ้นและแนบ Servo
- ขั้นตอนที่ 3: โหลดและเรียกใช้ Sketch
วีดีโอ: ลูกกลิ้งลูกกลิ้งอัตโนมัติพร้อม Arduino และ One Servo: 3 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:03
นี่เป็นโครงการ Arduino และเซอร์โวขนาดเล็กที่ใช้เวลาประมาณสองชั่วโมงจึงจะเสร็จสมบูรณ์ ใช้เซอร์โวยกปลายด้านหนึ่งของฝาโถเพื่อหมุนลูกเหล็กรอบวงใน เป็นตัวสตาร์ทเอง สามารถเปลี่ยนความเร็ว และหมุนสองลูก (หรือมากกว่านั้น) ได้ในคราวเดียว สนุกกับการสร้างและทำงาน พารามิเตอร์เวลาสามารถเล่นได้ด้วยความเร็วที่เร็วยิ่งขึ้น สามารถใช้เซ็นเซอร์เอฟเฟกต์ฮอลล์สองสามตัวที่มีลูกบอลแม่เหล็กเพื่อทำให้เป็นเครื่องจักรที่ชาญฉลาดขึ้นซึ่งสามารถหาพารามิเตอร์ที่ดีที่สุดได้
ฉันควรพูดถึงว่าบางคนที่นี่ที่ Instrucables.com มีเครื่องลูกลูกกลิ้งที่ซับซ้อนกว่านี้:
วัสดุที่จำเป็น:
Arduino Uno (หรือ Arduino ใด ๆ)
เซอร์โวชิลด์ (อุปกรณ์เสริม)
เซอร์โว 9g
ฝาขวด
ลูกเหล็ก
เศษไม้
ขั้นตอนที่ 1: สร้างฐานและที่ยึดฝาปิดแบบบานพับ
ฐานเป็นเพียงไม้ก้อนหนึ่งสำหรับยึดแผ่นไม้ที่มีบานพับ ไม้ที่มีบานพับควรมีขนาดใหญ่กว่าฝาโถที่คุณจะใช้และมีพื้นที่เพียงพอสำหรับบานพับและยึดเซอร์โว
ฉันใช้บานพับเครื่องบิน rc พลาสติกขนาดเล็กและติดกาวเข้ากับไม้บานพับและฐาน
ขั้นตอนที่ 2: สร้าง Servo Arm ที่ยาวขึ้นและแนบ Servo
ในการสร้างแขนเซอร์โวที่ยาวขึ้น ฉันเพียงแค่ติดชิ้นไม้ขนาด 5 เซนติเมตรเข้ากับแขนเซอร์โวด้วยสกรูและน็อตเล็กๆ สองสามตัว แขนเซอร์โวควรอยู่ที่ 90 องศาบนเซอร์โวเมื่ออยู่ในแนวนอนกับฐาน
ฉันเพิ่งติดกาวเซอร์โวไปที่ตัวยึดไม้แบบบานพับ แต่ฉันพบว่าถ้าคุณปล่อยให้มันทำงานนานกว่าสองสามนาที เซอร์โวจะทำให้กาวร้อนร้อนขึ้นและปล่อยออกจากไม้ ดังนั้นจึงรับประกันวิธีการแนบที่ดีกว่า
ขั้นตอนที่ 3: โหลดและเรียกใช้ 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);
}
}
แนะนำ:
ติดตาม: ศูนย์สื่อขั้นสูงพร้อม Odroid N2 และ Kodi (รองรับ 4k และ HEVC): 3 ขั้นตอน
ติดตาม: Advanced Media Center พร้อม Odroid N2 และ Kodi (รองรับ 4k และ HEVC): บทความนี้เป็นบทความต่อจากบทความก่อนหน้าของฉันที่ประสบความสำเร็จค่อนข้างมากเกี่ยวกับการสร้างศูนย์สื่ออเนกประสงค์ โดยอ้างอิงจาก Raspberry PI ที่ได้รับความนิยมมากในตอนแรก แต่ ในภายหลัง เนื่องจากไม่มีเอาต์พุตที่สอดคล้องกับ HEVC, H.265 และ HDMI 2.2 จึงมีสวิตช์
Blinds Control ด้วย ESP8266, Google Home และ Openhab Integration และ Webcontrol: 5 ขั้นตอน (พร้อมรูปภาพ)
การควบคุมมู่ลี่ด้วย ESP8266, Google Home และ Openhab Integration และ Webcontrol: ในคำแนะนำนี้ ฉันจะแสดงให้คุณเห็นว่าฉันเพิ่มระบบอัตโนมัติให้กับมู่ลี่ของฉันอย่างไร ฉันต้องการเพิ่มและลบระบบอัตโนมัติได้ ดังนั้นการติดตั้งทั้งหมดจึงเป็นแบบหนีบ ส่วนหลักคือ: สเต็ปเปอร์มอเตอร์ ตัวขับสเต็ปควบคุม bij ESP-01 เกียร์และการติดตั้ง
DIY IBeacon และ Beacon Scanner ด้วย Raspberry Pi และ HM13: 3 ขั้นตอน
DIY IBeacon และ Beacon Scanner ด้วย Raspberry Pi และ HM13: Story A beacon จะส่งสัญญาณอย่างต่อเนื่องเพื่อให้อุปกรณ์บลูทู ธ อื่น ๆ รู้ว่ามีอยู่ และฉันอยากได้บีคอนบลูทูธเพื่อติดตามกุญแจมาตลอด เพราะฉันลืมเอามันมาเหมือน 10 ครั้งในปีที่แล้ว และฉันก็เกิดขึ้น
RuuviTag และ PiZero W และ Blinkt! เทอร์โมมิเตอร์แบบ Bluetooth Beacon: 3 ขั้นตอน (พร้อมรูปภาพ)
RuuviTag และ PiZero W และ Blinkt! เครื่องวัดอุณหภูมิที่ใช้ Bluetooth Beacon: คำแนะนำนี้อธิบายวิธีการอ่านข้อมูลอุณหภูมิและความชื้นจาก RuuviTag โดยใช้ Bluetooth กับ Raspberry Pi Zero W และเพื่อแสดงค่าเป็นเลขฐานสองบน Pimoroni กะพริบตา! pHAT.หรือเรียกสั้นๆ ว่า จะสร้างสถานะอย่างไร
วิธีการสร้าง Quadcoptor (NTM 28-30S 800kV 300W และ Arducopter APM 2.6 & 6H GPS 3DR Radio และ FlySky TH9X): 25 ขั้นตอน (พร้อมรูปภาพ)
วิธีการสร้าง Quadcoptor (NTM 28-30S 800kV 300W และ Arducopter APM 2.6 & 6H GPS 3DR Radio และ FlySky TH9X): นี่คือบทแนะนำเกี่ยวกับวิธีการสร้าง Quadcopter โดยใช้มอเตอร์ NTM 28-30S 800kV 300W และ Arducopter APM 2.6 & 6H GPS & วิทยุ 3DR ฉันพยายามอธิบายแต่ละขั้นตอนด้วยรูปภาพจำนวนหนึ่ง หากคุณมีคำถามหรือความคิดเห็นใด ๆ โปรดตอบกลับ