İçindekiler:
2025 Yazar: John Day | [email protected]. Son düzenleme: 2025-01-13 06:58
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, 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 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
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);
}
}