Mundarija:

Arduino va bitta servo bilan avtomatlashtirilgan to'p rulosi: 3 qadam
Arduino va bitta servo bilan avtomatlashtirilgan to'p rulosi: 3 qadam

Video: Arduino va bitta servo bilan avtomatlashtirilgan to'p rulosi: 3 qadam

Video: Arduino va bitta servo bilan avtomatlashtirilgan to'p rulosi: 3 qadam
Video: Управление серводвигателем с помощью потенциометра с помощью Arduino 2024, Iyul
Anonim
Image
Image

Bu oddiy Arduino va servo loyihasi bo'lib, uni bajarish uchun taxminan ikki soat vaqt ketadi. Po'lat to'pni ichki aylana bo'ylab aylantirish uchun kavanoz qopqog'ining bir uchini ko'tarish uchun servo ishlatiladi. U o'z -o'zidan boshlanadi, tezlikni o'zgartirishi mumkin va bir vaqtning o'zida ikkita (yoki undan ko'p) to'pni aylantira oladi. Qurilish va ishlash qiziqarli. Vaqt parametrlarini, ehtimol undan ham yuqori tezlikda o'ynash mumkin. Eng yaxshi parametrlarni aniqlay oladigan aqlli mashinaga aylantirish uchun magnit to'pli bir nechta zal effektli datchiklardan foydalanish mumkin.

Shuni eslatib o'tmoqchimanki, Instructables.com saytida kimdir murakkab rollarda mashinasi bor:

Kerakli materiallar:

Arduino Uno (yoki har qanday Arduino)

Servo qalqoni (ixtiyoriy)

9 g servo

kavanoz qopqog'i

po'lat to'p

ba'zi yog'och qoldiqlari

1 -qadam: Asosiy va menteşeli qopqoq ushlagichini yarating

Asosiy va menteşeli qopqoq ushlagichini yarating
Asosiy va menteşeli qopqoq ushlagichini yarating

Baza - bu yog'ochdan yasalgan yog'ochdan yasalgan yog'och bo'lakni o'rnatish uchun. Menteşeli yog'och siz ishlatadigan kavanoz qopqog'idan kattaroq bo'lishi kerak va menteşe va servo o'rnatish uchun etarli joy bo'lishi kerak.

Men kichik plastmassadan yasalgan samolyot menteşelerinden foydalanardim va ularni faqat yog'och va tayanchga mahkam yopishtirdim.

2 -qadam: Servo qo'lini uzunroq qiling va servo ulang

Servo qo'lini uzunroq qiling va servo ulang
Servo qo'lini uzunroq qiling va servo ulang
Servo qo'lini uzunroq qiling va servo ulang
Servo qo'lini uzunroq qiling va servo ulang

Uzunroq servo qo'lni yasash uchun men 5 santimetrli yog'ochni servo bilagiga bir nechta mayda vint va yong'oq bilan bog'lab qo'ydim. Servo qo'li tayanchga gorizontal holatda bo'lsa, servoda 90 daraja bo'lishi kerak.

Men servoni ilingan yog'och ushlagichga issiq yopishtirdim, lekin shuni aniqladimki, agar siz uni bir necha daqiqadan ko'proq ishlashiga ruxsat bersangiz, servo issiq elimni qizdiradi va o'tinni tashlab yuboradi. Shunday qilib, yaxshiroq biriktirish usuli kafolatlanadi.

3 -qadam: Sketchni yuklang va ishga tushiring

Sketchni yuklang va ishga tushiring
Sketchni yuklang va ishga tushiring

Men servoimni 7 -pinga qalqon yordamida biriktirdim, chunki bu qulay va ular atigi bir necha dollar turadi. Agar sizda qalqon bo'lmasa, Arduino -dagi 7 -pinli servo signal simini, qizil simni Arduino -dagi 5v -ga va er simini Arduino -dagi GND -ga ulang. Arduino servo bilan ishlash uchun etarlicha oqim berishi kerak. Men qalqondan foydalanaman, chunki tashqi kuchlanishni faqat servo uchun ishlatish oson.

Mana eskiz. Men servo tezligini o'zgartirish uchun servo tezlikni nazorat qilish tartibini yozdim, chunki u to'liq tezlikda yaxshi ishlamaydi.

Vaqtni o'zgartirish mumkin, kechikish har xil tezlikda aylanish uchun. Shuningdek, tezlikni o'zgartirish uchun myServo () funktsiyasining uchinchi parametrini o'zgartirishingiz mumkin.

/ / ////////////// // Jim Demello tomonidan yaratilgan, Shangluo universiteti, 2017

// siz ushbu kod yordamida xohlagan narsani ishlatishingiz, boshqarishingiz, erkin qilishingiz mumkin, mening ismim shart emas

// Bu tartib har qanday sonli servolarni interpolatsiyalashga imkon beradi, agar servolar soni 4 tadan oshsa, yangi qatorlarni qo'shing.

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

#qo'shing

Servo myservo1, myservo2; // servoni boshqarish uchun servo ob'ekt yaratish

int servoRead (int servoNumber) {

int servoCurrent;

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

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

qaytish servoCurrent;

}

bekor servoWrite (int servoNumber, int ofset) {

agar (servoNumber == 1) {myservo1.write (ofset); }

agar (servoNumber == 2) {myservo2.write (ofset); }

}

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

int curAngle;

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

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

agar (curAngle <newAngle) {

uchun (int burchak = curAngle; burchak <newAngle; burchak += burchakInc) {

if (servoNum == 1) myservo1.write (burchak);

agar (servoNum == 2) myservo2.write (burchak);

kechikish (kechikish); }

}

aks holda (curAngle> newAngle) {

uchun (int burchak = curAngle; burchak> yangiAngle; burchak -= burchakInc) {

if (servoNum == 1) myservo1.write (burchak);

agar (servoNum == 2) myservo2.write (burchak);

kechikish (kechikish); }

}

}

void interpolate2Servos (int servo1, int servo1Position, int servo2, int servo2 pozitsiyasi, int numberSteps, int timeDelay) {

int servo1Current, servo2Current;

servo1Current = servoRead (servo1);

servo2Current = servoRead (servo2);

// Serial.print ("Servo3Pos va joriy"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Current);

// Serial.print ("Servo4Pos va joriy"); Serial.print (servo4Position); Serial.print (""); Serial.println (servo4Current);

// Serial.print ("Servo5Pos va joriy"); Serial.print (servo5Position); Serial.print (""); Serial.println (servo5Current);

// Serial.print ("Servo6Pos va joriy"); Serial.print (servo6Position); 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;

uchun (int x = 0; x

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

boshqa {cOffsetTotal = cOffsetTotal - cOffset; }

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

boshqa {dOffsetTotal = dOffsetTotal - dOffset; }

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

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

// Serial.print ("a va b ofset"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); kechikish (10);

kechikish (timeDelay);

} // uchun tugatish

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

// modul qoldiqlariga g'amxo'rlik qiling //

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

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

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

}

int timingDelay = 100;

int servoDelay = 100;

int degGap = 10;

// Bu boshlang'ich daraja (oxirgi darajadan past bo'lishi kerak)

int degStart = 0;

// Bu tugatish darajalari (boshlang'ich darajadan katta bo'lishi kerak)

int degEnd = 360;

// Bu aylana radiusi

int radiusi = 8;

bo'sh o'rnatish ()

{

Serial.begin (9600);

kechikish (100);

myservo1.attach (7); // servo moslamaga 7 -pinli servo biriktiriladi

myservo1.write (90);

myservo2.attach (8); // servo moslamaga 8 -pinli servo biriktiriladi

myservo2.write (90);

kechikish (1000); // servoning u erga kelishini kutadi

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

kechikish (1000);

}

void loop () {

timingDelay = 15; // soat 10 da ishlaydi

servoDelay = 4;

spin4 ();

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

// kechikish (1000);

// chiqish (0); // dasturni to'xtatib turish - davom etish uchun reset tugmasini bosing

}

void spin3 () {

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

kechikish (vaqtni kechiktirish);

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

kechikish (vaqtni kechiktirish);

}

void spin2 () {

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

kechikish (vaqtni kechiktirish);

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

kechikish (vaqtni kechiktirish);

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

kechikish (vaqtni kechiktirish);

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

kechikish (vaqtni kechiktirish);

}

void spin1 () {

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

float deg = (degStart * 3.141592 / 180); // darajalarni radianlarga aylantirish

float xPos = 90 + (cos (deg) * radiusi);

// xPos = dumaloq (xPos);

float yPos = 90 + (sin (deg) * radiusi);

// yPos = dumaloq (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);

kechikish (vaqtni kechiktirish);

agar (degStart> = degEnd) {

degStart = 0;

agar (degGap> 180)

degGap = 180;

// degGap = 0;

boshqa

degGap = degGap + 2;

degGap = degGap - 2;

// degStart = degStart +degGap;

}

degStart = degStart + degGap;

}

void spin4 () {

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

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

float k = 20 * (gunoh ((3.14 * i)/180)) + 90;

myservo1.write (j);

myservo2.write (k);

Ketma -ket chop etish (j);

Serial.print (",");

Serial.println (k);

kechikish (100);

}

}

Tavsiya: