Mündəricat:

Arduino və Bir Servo ilə Avtomatik Top Roller: 3 addım
Arduino və Bir Servo ilə Avtomatik Top Roller: 3 addım

Video: Arduino və Bir Servo ilə Avtomatik Top Roller: 3 addım

Video: Arduino və Bir Servo ilə Avtomatik Top Roller: 3 addım
Video: ESP8STP-02 Степпер с ESP8266 D1 Mini NodeMCU через WiFi под любым углом 2024, Iyul
Anonim
Image
Image

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

Əsas və Menteşeli Qapaq Tutucusu olun
Əsas və Menteşeli Qapaq Tutucusu olun

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

Uzun Servo qolu düzəldin və Servo əlavə edin
Uzun Servo qolu düzəldin və Servo əlavə edin
Uzun Servo qolu düzəldin və Servo əlavə edin
Uzun Servo qolu düzəldin və Servo əlavə edin

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

Sketch yükləyin və işləyin
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);

}

}

Tövsiyə: