Daftar Isi:

Roller Bola Otomatis Dengan Arduino dan Satu Servo: 3 Langkah
Roller Bola Otomatis Dengan Arduino dan Satu Servo: 3 Langkah

Video: Roller Bola Otomatis Dengan Arduino dan Satu Servo: 3 Langkah

Video: Roller Bola Otomatis Dengan Arduino dan Satu Servo: 3 Langkah
Video: KECEPATAN KERETA HYPERSONIC || Omjeys ID #shorts #shorts #viral #trandingshorts 2024, November
Anonim
Image
Image

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

Buat Dudukan Tutup Basis dan Berengsel
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

Buat Lengan Servo Lebih Panjang dan Pasang Servo
Buat Lengan Servo Lebih Panjang dan Pasang Servo
Buat Lengan Servo Lebih Panjang dan Pasang Servo
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

Muat dan Jalankan Sketsa
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);

}

}

Direkomendasikan: