Mündəricat:
2025 Müəllif: John Day | [email protected]. Son dəyişdirildi: 2025-01-13 06:56
Tamamlanması təxminən iki saat çəkən sadə bir kiçik Arduino və servo layihəsidir. Bir kavanoz qapağının bir ucunu qaldırmaq üçün bir servo istifadə edərək, içəridən bir polad topu fırlatmaq olar. Öz -özünə başlayır, sürəti dəyişə bilər və eyni anda iki (və ya daha çox?) Topu fırlaya bilər. İşləmək və qurmaq əyləncəlidir. Zamanlama parametrləri, ehtimal ki, daha yüksək sürətlər üçün də oynanıla bilər. Maqnit topu olan bir neçə salon effekti sensoru, ən yaxşı parametrləri anlaya bilən daha ağıllı bir maşın halına gətirmək üçün istifadə edilə bilər.
Qeyd etməliyəm ki, burada Instructables.com saytında daha mürəkkəb bir top silindrli maşın var:
Lazım olan materiallar:
Arduino Uno (və ya hər hansı bir Arduino)
Servo qalxanı (isteğe bağlı)
9 g servo
kavanoz qapağı
polad top
bir az ağac qırıntıları
Addım 1: Baza və Menteşeli qapaq tutucusu düzəldin
Baza, menteşeli taxta parçasını monte etmək üçün yalnız bir ağac parçasıdır. Menteşeli ağac, istifadə edəcəyiniz bir kavanoz qapağından daha böyük olmalıdır və menteşələr və servonun quraşdırılması üçün kifayət qədər yer olmalıdır.
Kiçik plastik rc təyyarə menteşələrindən istifadə etdim və onları menteşəli taxta və bazaya yapışdırdım.
Addım 2: Servo Kolunu Uzunlaşdırın və Servo Bağlayın
Daha uzun bir servo qolu düzəltmək üçün bir neçə kiçik vint və qoz -fındıq ilə servo qoluna 5 santimetrlik bir taxta taxdım. Servo qolu bazaya üfüqi olduqda servoda 90 dərəcə olmalıdır.
Sadəcə servonu menteşəli taxta tutucuya yapışdırdım, amma gördüm ki, bir neçə dəqiqədən çox işləməsinə icazə versəniz, servo isti yapışqanı qızdıracaq və odundan çıxacaq. Buna görə daha yaxşı bir bağlama üsulu təmin edilir.
Addım 3: Sketch yükləyin və işləyin
Servoumu bir qalxan istifadə edərək 7 -ci pinlə bağladım, çünki bu çox rahatdır və cəmi bir neçə dollara başa gəlir. Qalxanınız yoxdursa, Arduino'nun 7 -ci pininə servo siqnal telini, qırmızı teli Arduino -da 5v -ə və topraklama telini Arduino -da GND -ə bağlayın. Arduino, servonun işləməsi üçün kifayət qədər cərəyan verməlidir. Qalxandan istifadə edirəm, çünki yalnız servo üçün xarici gərginlik istifadə etmək asandır.
Budur eskiz. Servo sürətini dəyişdirmək üçün bir servo sürət tənzimləyicisi qaydası yazdım, çünki yəqin ki, tam sürətlə yaxşı işləməyəcəkdir.
Topun yuvarlanmasının fərqli sürətlərini əldə etmək üçün Gecikmə vaxtını dəyişə bilərsiniz. MyServo () funksiyasının üçüncü parametrini də sürəti dəyişdirmək üçün dəyişdirə bilərsiniz.
//////////////////////////////////////////////////// //////////////////////////////////////////////////// /////////////// Jim Demello tərəfindən yaradılmışdır, Shangluo Universiteti, 2017
// istifadə etmək, manipulyasiya etmək, bu kodla istədiyinizi etməkdə sərbəstsiniz, mənim adım tələb olunmur
// Bu prosedur istənilən sayda servonun interpolyasiya edilməsinə imkan verir, servoların sayı 4 -dən artıq olduqda yeni sətirlər əlavə edin.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#daxil edin
Servo myservo1, myservo2; // servoya nəzarət etmək üçün servo obyekti yaradın
int servoRead (int servoNumber) {
int servoCurrent;
əgər (servoNumber == 1) {servoCurrent = myservo1.read (); }
əgər (servoNumber == 2) {servoCurrent = myservo2.read (); }
qayıt servoCurrent;
}
boş servoWrite (int servoNumber, int ofset) {
əgər (servoNumber == 1) {myservo1.write (ofset); }
əgər (servoNumber == 2) {myservo2.write (ofset); }
}
boş myServo (int newAngle, int angleInc, int incDelay, int servoNum) {
int curAngle;
əgər (servoNum == 1) {curAngle = myservo1.read (); }
əgər (servoNum == 2) {curAngle = myservo2.read (); }
if (curAngle <newAngle) {
üçün (int açısı = curAngle; bucaq <newAngle; bucaq += angleInc) {
əgər (servoNum == 1) myservo1.write (bucaq);
əgər (servoNum == 2) myservo2.write (bucaq);
gecikmə (gecikmə daxil olmaqla); }
}
başqa halda (curAngle> newAngle) {
üçün (int açısı = curAngle; bucaq> yeniAngle; bucaq -= açıInc) {
əgər (servoNum == 1) myservo1.write (bucaq);
əgər (servoNum == 2) myservo2.write (bucaq);
gecikmə (gecikmə daxil olmaqla); }
}
}
void interpolate2Servos (int servo1, int servo1Position, int servo2, int servo2Mövqe, int sayıArxa, int vaxtDelay) {
int servo1Current, servo2Current;
servo1Current = servoRead (servo1);
servo2Current = servoRead (servo2);
// Serial.print ("Servo3Pos və Cari"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Current);
// Serial.print ("Servo4Pos və Cari"); Serial.print (servo4Position); Serial.print (""); Serial.println (servo4Current);
// Serial.print ("Servo5Pos və Cari"); Serial.print (servo5Mövqe); Serial.print (""); Serial.println (servo5Current);
// Serial.print ("Servo6Pos və Cari"); Serial.print (servo6Mövqe); 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 = servo1Current;
dOffsetTotal = servo2Current;
üçün (int x = 0; x
əgər (servo1Position> servo1Current) {cOffsetTotal = cOffsetTotal + cOffset; }
başqa {cOffsetTotal = cOffsetTotal - cOffset; }
əgər (servo2Position> servo2Current) {dOffsetTotal = dOffsetTotal + dOffset; }
başqa {dOffsetTotal = dOffsetTotal - dOffset; }
if (servo1Position! = servo1Current) servoWrite (servo1, cOffsetTotal);
əgər (servo2Position! = servo2Current) servoWrite (servo2, dOffsetTotal);
// Serial.print ("a və b Ofset"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); gecikmə (10);
gecikmə (vaxt gecikməsi);
} // üçün son
//////////////////////////////////////
// modul qalıqlarına diqqət yetirin //
/////////////////////////////////////
if (servo1Position! = servo1Current) servoWrite (servo1, servo1Position);
əgər (servo2Position! = servo2Current) servoWrite (servo2, servo2Position);
}
int timingDelay = 100;
int servoDelay = 100;
int degGap = 10;
// Bu başlanğıc dərəcəsidir (son dərəcədən az olmalıdır)
int degStart = 0;
// Bu bitmə dərəcələridir (başlanğıc dərəcəsindən böyük olmalıdır)
int degEnd = 360;
// Bu dairənin radiusudur
int radiusu = 8;
boş quraşdırma ()
{
Serial.begin (9600);
gecikmə (100);
myservo1.attach (7); // servo obyektinə pin 7 -də servo bağlayır
myservo1.write (90);
myservo2.attach (8); // 8 -ci pindəki servoyu servo obyektə bağlayır
myservo2.write (90);
gecikmə (1000); // servonun ora çatmasını gözləyir
interpolate2Servos (1, 90, 2, 90, 10, 60); // neytral
gecikmə (1000);
}
boşluq döngəsi () {
timingDelay = 15; // 10 -da işləyir
servoDelay = 4;
spin4 ();
// interpolate2Servos (1, 90, 2, 90, 1, 60); // neytral
// gecikmə (1000);
// çıxmaq (0); // proqramı durdur - davam etmək üçün sıfırla vurun
}
void spin3 () {
interpolate2Servos (1, 90, 2, 110, 1, 60); // neytral
gecikmə (timingDelay);
interpolate2Servos (1, 90, 2, 80, 1, 60); // neytral
gecikmə (timingDelay);
}
void spin2 () {
// interpolate2Servos (1, 80, 2, 90, 1, 50); // neytral
gecikmə (timingDelay);
interpolate2Servos (1, 80, 2, 80, 1, 60); // neytral
gecikmə (timingDelay);
interpolate2Servos (1, 110, 2, 80, 1, 60); // neytral
gecikmə (timingDelay);
// interpolate2Servos (1, 110, 2, 110, 1, 60); // neytral
gecikmə (timingDelay);
}
void spin1 () {
// int deg = (degStart / (180 / 3.14));
float deg = (degStart * 3.141592 / 180); // dərəcələri radiana çevirmək
float xPos = 90 + (cos (deg) * radius);
// xPos = yuvarlaq (xPos);
float yPos = 90 + (sin (deg) * radius);
// yPos = yuvarlaq (yPos);
Serial.print ("degGap ="); Serial.print (degGap); Serial.print ("deg ="); Serial.print (deg); Serial.print ("cos ="); Serial.print (cos (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); // neytral
myservo1.write (xPos);
myservo2.write (yPos);
gecikmə (timingDelay);
əgər (degStart> = degEnd) {
degStart = 0;
əgər (degGap> 180)
degGap = 180;
// degGap = 0;
başqa
degGap = degGap + 2;
degGap = degGap - 2;
// degStart = degStart +degGap;
}
degStart = degStart + degGap;
}
boş spin4 () {
üçün (int i = 0; i <= 360; i ++) {
float j = 20 * (cos ((3.14 * i)/180)) + 90;
float k = 20 * (günah ((3.14 * i)/180)) + 90;
myservo1.write (j);
myservo2.write (k);
Serial. çap (j);
Serial.print (",");
Serial.println (k);
gecikmə (100);
}
}