Daftar Isi:
2025 Pengarang: John Day | [email protected]. Terakhir diubah: 2025-01-13 06:57
Ini adalah proyek Arduino dan servo kecil sederhana yang membutuhkan waktu sekitar dua jam untuk diselesaikan. Ini menggunakan servo untuk mengangkat salah satu ujung tutup botol sehingga dapat memutar bola baja di sekitar keliling bagian dalam. Ini dapat dimulai sendiri, dapat mengubah kecepatan dan dapat memutar dua (atau lebih?) bola sekaligus. Menyenangkan untuk membangun dan bekerja. Parameter waktu dapat dimainkan dengan kecepatan yang mungkin lebih cepat. Beberapa sensor efek hall dengan bola magnet dapat digunakan untuk menjadikannya mesin yang lebih cerdas yang dapat menentukan parameter terbaik.
Saya harus menyebutkan bahwa seseorang di sini di instrucables.com memiliki mesin rol bola yang lebih canggih:
Bahan yang dibutuhkan:
Arduino Uno (atau Arduino apa pun)
Perisai servo (opsional)
9g servo
tutup botol
bola baja
beberapa kayu bekas
Langkah 1: Buat Dudukan Tutup Basis dan Berengsel
Basisnya hanya sebongkah kayu untuk memasang potongan kayu yang berengsel. Kayu berengsel harus lebih besar dari tutup botol yang akan Anda gunakan dan memiliki cukup ruang untuk engsel dan untuk memasang servo.
Saya menggunakan engsel pesawat rc plastik kecil dan hanya menempelkannya ke kayu berengsel dan alasnya.
Langkah 2: Buat Lengan Servo Lebih Panjang dan Pasang Servo
Untuk membuat lengan servo yang lebih panjang, saya hanya memasang sepotong kayu 5 sentimeter ke lengan servo dengan beberapa sekrup dan mur kecil. Lengan servo harus berada pada 90 derajat pada servo ketika horizontal ke alas.
Saya baru saja menempelkan servo panas ke dudukan kayu berengsel tetapi saya menemukan bahwa jika Anda membiarkannya berjalan lebih lama dari beberapa menit, servo akan memanaskan lem panas dan melepaskannya dari kayu. Jadi metode lampiran yang lebih baik dijamin.
Langkah 3: Muat dan Jalankan Sketsa
Saya memasang servo saya ke pin 7 menggunakan pelindung karena nyaman dan harganya hanya beberapa dolar. Jika Anda tidak memiliki pelindung maka pasang kabel sinyal servo ke pin 7 di Arduino, kabel merah ke 5v di Arduino dan kabel ground ke GND di Arduino. Arduino harus menyediakan arus yang cukup untuk mengoperasikan servo. Saya menggunakan pelindung karena mudah menggunakan tegangan eksternal hanya untuk servo.
Berikut sketsanya. Saya menulis rutin pengontrol kecepatan servo untuk mengubah kecepatan servo karena mungkin tidak akan bekerja dengan baik pada kecepatan penuh.
Anda dapat mengubah timingDelay untuk mendapatkan kecepatan rolling bola yang berbeda. Anda juga dapat mengubah parameter ketiga dari fungsi myServo() untuk mengubah kecepatan juga.
//////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////////// // dibuat oleh Jim Demello, Universitas Shangluo, 2017
// Anda bebas menggunakan, memanipulasi, melakukan apa pun yang Anda inginkan dengan kode ini, nama saya tidak diperlukan
// Rutin ini memungkinkan sejumlah servo untuk diinterpolasi, cukup tambahkan baris baru jika jumlah servo melebihi 4
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#termasuk
Servo myservo1, myservo2; // buat objek servo untuk mengontrol servo
int servoRead(int servoNumber) {
int servoSaat ini;
if (servoNumber== 1) { servoCurrent = myservo1.read(); }
if (servoNumber== 2) { servoCurrent = myservo2.read(); }
kembali 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);
penundaan (termasuk penundaan); }
}
else if (curAngle > newAngle) {
for(int angle=curAngle;angle > newAngle;angle -= angleInc) {
if (servoNum == 1) myservo1.write(angle);
if (servoNum == 2) myservo2.write(angle);
penundaan (termasuk penundaan); }
}
}
void interpolate2Servos(int servo1, int servo1Position, int servo2, int servo2Posisi, int numberSteps, int timeDelay){
int servo1Arus, servo2Arus;
servo1Saat ini = servoRead(servo1);
servo2Current = servoRead(servo2);
// Serial.print("Servo3Pos dan Arus"); Serial.print(servo3Position); Serial.print(""); Serial.println(servo3Current);
// Serial.print("Servo4Pos dan Arus"); Serial.print(servo4Position); Serial.print(""); Serial.println(servo4Current);
// Serial.print("Servo5Pos dan Arus"); Serial.print(servo5Position); Serial.print(""); Serial.println(servo5Current);
// Serial.print("Servo6Pos dan Arus"); Serial.print(Posisi servo6); 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 = servo1Saat ini;
dOffsetTotal = servo2Current;
untuk (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 dan b Offset "); Serial.print(aOffsetTotal); Serial.print(" ");Serial.println(bOffsetTotal); penundaan (10);
tunda (waktu tunda);
}// akhir untuk
//////////////////////////////////////
// mengurus sisa modulo //
/////////////////////////////////////
if (servo1Position != servo1Current) servoWrite(servo1, servo1Position);
if (servo2Position != servo2Current) servoWrite(servo2, servo2Position);
}
int waktuTunda = 100;
int servoDelay = 100;
int degGap = 10;
// Ini adalah derajat awal (harus lebih kecil dari derajat akhir)
int degMulai = 0;
// Ini adalah derajat akhir (harus lebih besar dari derajat awal)
int degEnd = 360;
//Ini adalah radius lingkaran
int jari-jari = 8;
batalkan pengaturan()
{
Serial.begin(9600);
penundaan(100);
myservo1.attach(7); // pasang servo pada pin 7 ke objek servo
myservo1.write(90);
myservo2.attach(8); // pasang servo pada pin 8 ke objek servo
myservo2.write(90);
penundaan (1000); // menunggu servo sampai di sana
interpolate2Servos(1, 90, 2, 90, 10, 60); // netral
penundaan (1000);
}
lingkaran kosong() {
waktu tunda = 15; // bekerja pada jam 10
servoDelay = 4;
spin4();
//interpolate2Servos(1, 90, 2, 90, 1, 60); // netral
//tunda(1000);
// keluar(0); //jeda program - tekan reset untuk melanjutkan
}
batal spin3() {
interpolate2Servos(1, 90, 2, 110, 1, 60); // netral
tunda (waktu tunda);
interpolate2Servos(1, 90, 2, 80, 1, 60); // netral
tunda (waktu tunda);
}
batal spin2() {
//interpolate2Servos(1, 80, 2, 90, 1, 50); // netral
tunda (waktu tunda);
interpolate2Servos(1, 80, 2, 80, 1, 60); // netral
tunda (waktu tunda);
interpolate2Servos(1, 110, 2, 80, 1, 60); // netral
tunda (waktu tunda);
//interpolate2Servos(1, 110, 2, 110, 1, 60); // netral
tunda (waktu tunda);
}
batalkan putaran1() {
// int deg = (degStart / (180 / 3.14));
float deg = (degStart * 3.141592 / 180); // konversi derajat ke radian
float xPos = 90 + (cos(deg) * radius);
// xPos = bulat(xPos);
float yPos = 90 + (sin(deg) * radius);
// yPos = bulat(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); // netral
myservo1.write(xPos);
myservo2.write(yPos);
tunda (waktu tunda);
if (degStart >= degEnd) {
degMulai = 0;
jika (degGap > 180)
degGap = 180;
//degGap = 0;
lain
degGap = degGap + 2;
degGap = degGap - 2;
// degStart = degStart +degGap;
}
degStart = degStart + degGap;
}
batal spin4() {
untuk(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);
penundaan(100);
}
}