Isi kandungan:

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

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

Video: Roller Bola Automatik Dengan Arduino dan Satu Servo: 3 Langkah
Video: DIY Radar With Ultrasonic Sensor And Chat-GPT Generated Arduino Code | Coders Cafe 2024, Julai
Anonim
Image
Image

Ini adalah projek Arduino dan servo kecil sederhana yang memerlukan masa sekitar dua jam untuk disiapkan. Ia menggunakan servo untuk mengangkat salah satu hujung tutup balang sehingga dapat memutar bola keluli di sekeliling keliling. Ia bermula sendiri, dapat mengubah kelajuan dan dapat memutar dua (atau lebih?) Bola sekaligus. Seronok membina dan bekerja. Parameter masa boleh dimainkan dengan kelajuan yang mungkin lebih pantas. Beberapa sensor kesan lorong dengan bola magnet dapat digunakan untuk menjadikannya mesin yang lebih pintar yang dapat mengetahui parameter terbaik.

Saya harus menyebut bahawa seseorang di sini di instruktable.com mempunyai mesin roller bola yang lebih canggih:

Bahan yang diperlukan:

Arduino Uno (atau Arduino apa pun)

Perisai servo (pilihan)

Servo 9g

penutup balang

bola keluli

sebilangan kayu sekerap

Langkah 1: Buat Pemegang Cap Pangkal dan Berengsel

Buat Pemegang Cap Pangkal dan Berengsel
Buat Pemegang Cap Pangkal dan Berengsel

Pangkalannya hanyalah sebongkah kayu untuk memasang sekeping kayu berengsel. Kayu berengsel harus lebih besar daripada penutup balang yang akan anda gunakan dan mempunyai ruang yang cukup untuk engsel dan memasang servo.

Saya menggunakan engsel pesawat kecil plastik rc dan hanya terpaku pada kayu berengsel dan pangkalan.

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 melekatkan sekeping kayu 5 sentimeter ke lengan servo dengan beberapa skru kecil dan mur. Lengan servo harus berada pada 90 darjah pada servo ketika mendatar ke pangkal.

Saya baru saja melekatkan servo ke pemegang kayu berengsel tetapi saya mendapati bahawa jika anda membiarkannya berjalan lebih lama daripada beberapa minit, servo akan memanaskan gam panas dan melepaskannya dari kayu. Oleh itu kaedah lampiran yang lebih baik diperlukan.

Langkah 3: Muatkan dan Jalankan Lakaran

Muatkan dan Jalankan Lakaran
Muatkan dan Jalankan Lakaran

Saya melampirkan servo saya ke pin 7 menggunakan perisai kerana ia hanya mudah dan harganya hanya beberapa dolar. Sekiranya anda tidak mempunyai perisai, pasangkan wayar isyarat servo ke pin 7 di Arduino, wayar merah hingga 5v di Arduino dan kabel tanah ke GND di Arduino. Arduino harus menyediakan arus yang mencukupi untuk mengendalikan servo. Saya menggunakan perisai kerana senang menggunakan voltan luaran hanya untuk servo.

Inilah lakarannya. Saya menulis rutin pengawal kelajuan servo untuk mengubah kelajuan servo kerana mungkin tidak akan berfungsi dengan baik pada kelajuan penuh.

Anda boleh mengubah timingDelay untuk mendapatkan kelajuan bola yang berbeza. Anda juga boleh mengubah parameter ketiga fungsi myServo () untuk mengubah kelajuan juga.

////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////// // dibuat oleh Jim Demello, Shangluo University, 2017

// anda bebas menggunakan, memanipulasi, melakukan apa sahaja yang anda mahukan dengan kod ini, nama saya tidak diperlukan

// Rutin ini membolehkan sebilangan servo diinterpolasi, tambahkan baris baru jika bilangan servo melebihi 4

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

#sertakan

Servo myservo1, myservo2; // buat objek servo untuk mengawal servo

int servoRead (int servoNumber) {

int servoCurrent;

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

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

pulangkan servoCurrent;

}

kekosongan servoWrite (int servoNumber, int offset) {

jika (servoNumber == 1) {myservo1.write (mengimbangi); }

jika (servoNumber == 2) {myservo2.write (mengimbangi); }

}

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

int curAngle;

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

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

jika (curAngle <newAngle) {

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

jika (servoNum == 1) myservo1.write (sudut);

jika (servoNum == 2) myservo2.write (sudut);

kelewatan (incDelay); }

}

lain jika (curAngle> newAngle) {

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

jika (servoNum == 1) myservo1.write (sudut);

jika (servoNum == 2) myservo2.write (sudut);

kelewatan (incDelay); }

}

}

batal interpolate2Servos (int servo1, int servo1Position, int servo2, int servo2Posisi, nombor intLangkah, int timeDelay) {

int servo1Current, servo2Current;

servo1Current = servoRead (servo1);

servo2Current = servoRead (servo2);

// Serial.print ("Servo3Pos dan Semasa"); Serial.print (servo3Position); Cetakan bersiri (""); Serial.println (servo3Current);

// Serial.print ("Servo4Pos dan Semasa"); Serial.print (servo4Position); Cetakan bersiri (""); Serial.println (servo4Current);

// Serial.print ("Servo5Pos dan Semasa"); Serial.print (servo5Position); Cetakan bersiri (""); Serial.println (servo5Current);

// Serial.print ("Servo6Pos dan Semasa"); Serial.print (servo6Position); Cetakan bersiri (""); Serial.println (servo6Current);

// Serial.println ("");

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

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

int cOffsetTotal = 0, dOffsetTotal = 0;

cOffsetTotal = servo1Current;

dOffsetTotal = servo2Current;

untuk (int x = 0; x

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

lain {cOffsetTotal = cOffsetTotal - cOffset; }

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

lain {dOffsetTotal = dOffsetTotal - dOffset; }

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

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

// Serial.print ("a dan b Offset"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); kelewatan (10);

kelewatan (timeDelay);

} // berakhir untuk

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

// jaga baki modulo //

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

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

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

}

int timingDelay = 100;

int servoDelay = 100;

int degGap = 10;

// Ini adalah peringkat permulaan (mestilah kurang dari darjah akhir)

int degStart = 0;

// Ini adalah darjah akhir (mesti lebih besar daripada darjah permulaan)

int degEnd = 360;

// Ini adalah jejari bulatan

jejari int = 8;

persediaan tidak sah ()

{

Serial.begin (9600);

kelewatan (100);

myservo1.attach (7); // melekatkan servo pada pin 7 pada objek servo

myservo1.write (90);

myservo2.attach (8); // melekatkan servo pada pin 8 pada objek servo

myservo2.write (90);

kelewatan (1000); // menunggu servo sampai di sana

interpolate2Servos (1, 90, 2, 90, 10, 60); // berkecuali

kelewatan (1000);

}

gelung kosong () {

timingDelay = 15; // bekerja pada pukul 10

servoDelay = 4;

putaran4 ();

// interpolate2Servos (1, 90, 2, 90, 1, 60); // berkecuali

// kelewatan (1000);

// keluar (0); // jeda program - tekan semula untuk meneruskan

}

kekosongan berputar3 () {

interpolate2Servos (1, 90, 2, 110, 1, 60); // berkecuali

kelewatan (timingDelay);

interpolate2Servos (1, 90, 2, 80, 1, 60); // berkecuali

kelewatan (timingDelay);

}

kekosongan putaran2 () {

// interpolate2Servos (1, 80, 2, 90, 1, 50); // berkecuali

kelewatan (timingDelay);

interpolate2Servos (1, 80, 2, 80, 1, 60); // berkecuali

kelewatan (timingDelay);

interpolate2Servos (1, 110, 2, 80, 1, 60); // berkecuali

kelewatan (timingDelay);

// interpolate2Servos (1, 110, 2, 110, 1, 60); // berkecuali

kelewatan (timingDelay);

}

kekosongan berputar1 () {

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

float deg = (degStart * 3.141592 / 180); // menukar darjah ke radian

terapung xPos = 90 + (cos (deg) * radius);

// xPos = bulat (xPos);

terapung 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); // berkecuali

myservo1.write (xPos);

myservo2.write (yPos);

kelewatan (timingDelay);

jika (degStart> = degEnd) {

degStart = 0;

jika (degGap> 180)

degGap = 180;

// degGap = 0;

yang lain

degGap = degGap + 2;

degGap = degGap - 2;

// degStart = degStart + degGap;

}

degStart = degStart + degGap;

}

kekosongan berputar4 () {

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

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

apungan k = 20 * (sin ((3.14 * i) / 180)) + 90;

myservo1.write (j);

myservo2.write (k);

Cetakan bersiri (j);

Cetakan bersiri (",");

Bersiri.println (k);

kelewatan (100);

}

}

Disyorkan: