İçindekiler:

Arduino ve Bir Servo ile Otomatik Bilyalı Silindir: 3 Adım
Arduino ve Bir Servo ile Otomatik Bilyalı Silindir: 3 Adım

Video: Arduino ve Bir Servo ile Otomatik Bilyalı Silindir: 3 Adım

Video: Arduino ve Bir Servo ile Otomatik Bilyalı Silindir: 3 Adım
Video: Kendini tornaci sanan mal 2024, Temmuz
Anonim
Image
Image

Bu, tamamlanması yaklaşık iki saat süren basit bir Arduino ve servo projesidir. Bir çelik bilyeyi iç çevresi etrafında döndürmek için bir kavanoz kapağının bir ucunu kaldırmak için bir servo kullanır. Kendi kendine başlar, hızı değiştirebilir ve aynı anda iki (veya daha fazla?) top döndürebilir. İnşa etmek ve çalışmaya başlamak eğlenceli. Zamanlama parametreleri ile muhtemelen daha da yüksek hızlar için oynanabilir. Manyetik bilyeli birkaç salon etkisi sensörü, onu en iyi parametreleri bulabilen daha akıllı bir makine yapmak için kullanılabilir.

Burada instructables.com'daki birinin daha gelişmiş bir bilyeli silindir makinesine sahip olduğunu belirtmeliyim:

İhtiyac duyulan malzemeler:

Arduino Uno (veya herhangi bir Arduino)

Servo kalkanı (isteğe bağlı)

9g servo

kavanoz kapağı

Çelik top

biraz hurda odun

Adım 1: Taban ve Menteşeli Kapak Tutacağı Yapın

Taban ve Menteşeli Kapak Tutacağı Yapın
Taban ve Menteşeli Kapak Tutacağı Yapın

Taban, menteşeli tahta parçasını monte etmek için sadece bir parça tahtadır. Menteşeli ahşap, kullanacağınız kavanoz kapağından daha büyük olmalı ve menteşeler ve servoyu monte etmek için yeterli alana sahip olmalıdır.

Küçük plastik rc uçak menteşeleri kullandım ve bunları menteşeli ahşaba ve tabana yapıştırdım.

Adım 2: Daha Uzun Servo Kolu Yapın ve Servoyu Takın

Daha Uzun Servo Kolu Yapın ve Servoyu Takın
Daha Uzun Servo Kolu Yapın ve Servoyu Takın
Daha Uzun Servo Kolu Yapın ve Servoyu Takın
Daha Uzun Servo Kolu Yapın ve Servoyu Takın

Daha uzun bir servo kol yapmak için birkaç küçük vida ve somunla servo kola 5 santimetrelik bir tahta parçası bağladım. Servo kol, tabana yatay olduğunda servo üzerinde 90 derece olmalıdır.

Servoyu menteşeli ahşap tutucuya sıcak yapıştırdım, ancak birkaç dakikadan daha uzun süre çalışmasına izin verirseniz, servonun sıcak tutkalı ısıtacağını ve tahtadan ayrılacağını buldum. Bu yüzden daha iyi bir bağlantı yöntemi garanti edilir.

Adım 3: Sketch'i Yükleyin ve Çalıştırın

Çizimi Yükle ve Çalıştır
Çizimi Yükle ve Çalıştır

Servomu bir kalkan kullanarak pim 7'ye bağladım çünkü bu sadece uygun ve sadece birkaç dolara mal oluyor. Bir kalkanınız yoksa, servo sinyal kablosunu Arduino'daki pim 7'ye, kırmızı kabloyu Arduino'daki 5v'ye ve topraklama kablosunu Arduino'daki GND'ye bağlayın. Arduino, servoyu çalıştırmak için yeterli akım sağlamalıdır. Kalkanı kullanıyorum çünkü sadece servo için harici voltaj kullanmak kolay.

İşte kroki. Servonun hızını değiştirmek için bir servo hız kontrol rutini yazdım çünkü muhtemelen tam hızda iyi çalışmayacaktır.

Farklı top yuvarlama hızları elde etmek için zamanlama Gecikmesini değiştirebilirsiniz. Ayrıca hızı değiştirmek için myServo() işlevinin üçüncü parametresini de değiştirebilirsiniz.

//////////////////////////////////////////// //////////////////////////////////////////// ///////////// // Jim Demello, Shangluo Üniversitesi, 2017 tarafından oluşturuldu

// bu kodla kullanmakta, değiştirmekte, istediğinizi yapmakta özgürsünüz, benim adım zorunlu değil

// Bu rutin, herhangi bir sayıda servonun enterpolasyonuna izin verir, servo sayısı 4'ü aşarsa sadece yeni satırlar ekleyin

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

#Dahil etmek

Servo myservo1, myservo2; // bir servoyu kontrol etmek için servo nesnesi yarat

int servoRead(int servoNumber) {

int servoAkım;

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

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

dönüş servoAkım;

}

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 açı=curAngle;açı < yeniAçı;açı += açıInc) {

if (servoNum == 1) myservo1.write(açı);

if (servoNum == 2) myservo2.write(açı);

gecikme (incGecikme); }

}

else if (curAngle > newAngle) {

for(int açı=kıvrımlıAçı;açı > yeniAçı;açı -= açıInc) {

if (servoNum == 1) myservo1.write(açı);

if (servoNum == 2) myservo2.write(açı);

gecikme (incGecikme); }

}

}

void interpolate2Servos(int servo1, int servo1Position, int servo2, int servo2Pozisyon, int sayıAdımlar, int timeDelay){

int servo1Akım, servo2Akım;

servo1Current = servoRead(servo1);

servo2Current = servoRead(servo2);

// Serial.print("Servo3Pos ve Akım "); Serial.print(servo3Position); Seri.print(" "); Serial.println(servo3Current);

// Serial.print("Servo4Pos ve Akım "); Serial.print(servo4Position); Seri.print(" "); Serial.println(servo4Current);

// Serial.print("Servo5Pos ve Akım "); Serial.print(servo5Position); Seri.print(" "); Serial.println(servo5Akım);

// Serial.print("Servo6Pos ve Akım "); Serial.print(servo6Position); Seri.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;

cOffsetToplam = servo1Akım;

dOffsetToplam = servo2Akım;

for (int x=0; x

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

başka { cOffsetTotal = cOffsetTotal - cOffset; }

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

başka { dOffsetTotal = dOffsetTotal - dOffset; }

if (servo1Position != servo1Akım) servoWrite(servo1, cOffsetTotal);

if (servo2Position != servo2Akım) servoWrite(servo2, dOffsetTotal);

// Serial.print(" a ve b Ofset "); Serial.print(aOffsetTotal); Serial.print(" ");Serial.println(bOffsetTotal); gecikme(10);

gecikme(zamanGecikmesi);

}// için son

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

// modulo kalanlarıyla ilgilen //

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

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

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

}

int zamanlamaGecikmesi = 100;

int servoGecikme = 100;

int dereceGap = 10;

// Bu başlangıç derecesidir (bitiş derecesinden küçük olmalıdır)

int dereceBaşlangıç = 0;

// Bu, bitiş dereceleridir (başlangıç derecesinden büyük olmalıdır)

int dereceEnd = 360;

//Bu daire yarıçapıdır

int yarıçap = 8;

geçersiz kurulum()

{

Seri.başla(9600);

gecikme(100);

myservo1.attach(7); // pim 7'deki servoyu servo nesnesine bağlar

myservo1.write(90);

myservo2.attach(8); // pim 8'deki servoyu servo nesnesine bağlar

myservo2.write(90);

gecikme(1000); // servonun oraya varmasını bekler

interpolate2Servos(1, 90, 2, 90, 10, 60); // doğal

gecikme(1000);

}

boşluk döngüsü () {

zamanlamaGecikmesi = 15; // 10'da çalışır

servoGecikme = 4;

spin4();

//interpolate2Servos(1, 90, 2, 90, 1, 60); // doğal

//gecikme(1000);

// çıkış (0); // programı duraklat - devam etmek için sıfırla

}

geçersiz spin3() {

interpolate2Servos(1, 90, 2, 110, 1, 60); // doğal

gecikme (zamanlamaGecikmesi);

interpolate2Servos(1, 90, 2, 80, 1, 60); // doğal

gecikme (zamanlamaGecikmesi);

}

geçersiz spin2() {

//interpolate2Servos(1, 80, 2, 90, 1, 50); // doğal

gecikme (zamanlamaGecikmesi);

interpolate2Servos(1, 80, 2, 80, 1, 60); // doğal

gecikme (zamanlamaGecikmesi);

interpolate2Servos(1, 110, 2, 80, 1, 60); // doğal

gecikme (zamanlamaGecikmesi);

//interpolate2Servos(1, 110, 2, 110, 1, 60); // doğal

gecikme (zamanlamaGecikmesi);

}

void spin1() {

// int derece = (dereceBaşlangıç / (180 / 3.14));

kayan derece = (derece Başlangıç * 3.141592 / 180); // dereceyi radyana çevir

float xPos = 90 + (cos(der) * yarıçap);

// xPos = yuvarlak(xPos);

float yPos = 90 + (sin(der) * yarıçap);

// yPos = yuvarlak(yPos);

Serial.print("degGap=");Serial.print(degGap);Serial.print(" deg=");Serial.print(der);Serial.print(" cos=");Serial.print(cos(derece));Serial.print(" degStart=");Serial.print(degStart);Serial.print("x=");Serial.print(xPos);Serial.print(" y=");Serial. println(yPos);

// enterpolate2Servos(1, xPos, 2, yPos, 1, servoDelay); // doğal

myservo1.write(xPos);

myservo2.write(yPos);

gecikme (zamanlamaGecikmesi);

if (degStart >= dereceEnd) {

dereceBaşlangıç = 0;

if (derece aralığı > 180)

degGap = 180;

// dereceGap = 0;

Başka

degGap = degGap + 2;

degGap = degGap - 2;

// degStart = degStart +degGap;

}

degStart = degStart + degGap;

}

geçersiz spin4() {

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

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

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

myservo1.write(j);

myservo2.write(k);

Seri.baskı(j);

Seri.print(", ");

Seri.println(k);

gecikme(100);

}

}

Önerilen: