Բովանդակություն:

Ավտոմատ գնդիկ գլան Arduino- ով և One Servo- ով ՝ 3 քայլ
Ավտոմատ գնդիկ գլան Arduino- ով և One Servo- ով ՝ 3 քայլ

Video: Ավտոմատ գնդիկ գլան Arduino- ով և One Servo- ով ՝ 3 քայլ

Video: Ավտոմատ գնդիկ գլան Arduino- ով և One Servo- ով ՝ 3 քայլ
Video: How to Draw Hyper Realistic Eye | Tutorial for BEGINNERS 2024, Հուլիսի
Anonim
Image
Image

Սա պարզ փոքրիկ Arduino և servo նախագիծ է, որի ավարտին տևում է մոտ երկու ժամ: Այն օգտագործում է սերվո `բանկայի կափարիչի մի ծայրը բարձրացնելու համար, որպեսզի պողպատե գնդակը պտտվի ներքին շրջագծով: Այն սկսում է ինքն իրեն, կարող է փոխել արագությունը և կարող է միանգամից երկու (կամ ավելի) գնդակ պտտել: Funվարճալի է կառուցել և աշխատել: Ingամկետների պարամետրերով կարելի է խաղալ, հավանաբար, նույնիսկ ավելի մեծ արագությունների համար: Մագնիսական գնդակով սրահի էֆեկտի մի քանի տվիչներ կարող են օգտագործվել այն ավելի խելացի մեքենա դարձնելու համար, որը կարող է պարզել լավագույն պարամետրերը:

Պետք է նշեմ, որ ինչ-որ մեկն այստեղ ՝ instructables.com- ում, ունի ավելի բարդ գնդիկավոր մեքենա ՝

Անհրաժեշտ նյութեր

Arduino Uno (կամ ցանկացած Arduino)

Servo վահան (ըստ ցանկության)

9 գ սերվո

բանկա գլխարկ

պողպատե գնդակ

մի կտոր ջարդոն

Քայլ 1. Պատրաստեք հիմք և կախովի գլխարկ

Make Base and Hinged Cap Holder
Make Base and Hinged Cap Holder

Հիմքը պարզապես փայտի կտոր է, որի վրա կարելի է ամրացնել կախովի փայտը: Կախովի փայտը պետք է լինի ավելի մեծ, քան բանկաների կափարիչը, որը դուք կօգտագործեք և բավականաչափ տեղ կունենա ծխնիների և սերվոյի տեղադրման համար:

Ես օգտագործել եմ պլաստմասե փոքր ինքնաթիռի ծխնիներ և դրանք ուղղակի կպցրել եմ կախովի փայտին և հիմքին:

Քայլ 2. Կատարեք երկար սերվո թև և ամրացրեք սերվո

Կատարեք ավելի երկար սերվո Arm և ամրացրեք Servo
Կատարեք ավելի երկար սերվո Arm և ամրացրեք Servo
Կատարեք ավելի երկար սերվո Arm և ամրացրեք Servo
Կատարեք ավելի երկար սերվո Arm և ամրացրեք Servo

Ավելի երկար սերվո թև պատրաստելու համար ես ընդամենը 5 սանտիմետր փայտ կտոր ամրացրեցի սերվոյի թևին մի քանի փոքր պտուտակներով և ընկույզներով: Սերվոյի թևը պետք է լինի 90 աստիճանի վրա սերվոյի վրա, երբ այն հորիզոնական է դեպի հիմքը:

Ես ուղղակի տաքացրի սոսինձը սոսնձվող փայտի ամրակալի վրա, բայց պարզեցի, որ եթե թույլ տաք, որ այն մի քանի րոպեից ավելի գործի, սերվոն տաքացնելու է տաք սոսինձը և բաց է թողնելու փայտից: Այսպիսով, կցման ավելի լավ մեթոդը երաշխավորված է:

Քայլ 3: Բեռնել և գործարկել ուրվագիծը

Բեռնել և գործարկել ուրվագիծը
Բեռնել և գործարկել ուրվագիծը

Ես իմ servo- ն ամրացրեցի 7 -ի կապում `օգտագործելով վահան, քանի որ այն պարզապես հարմար է, և դրանք արժեն ընդամենը մի քանի դոլար: Եթե դուք վահան չունեք, ապա servo ազդանշանի լարը ամրացրեք Arduino- ի 7 -րդ կապին, կարմիր մետաղալարը `Arvino- ի վրա` 5v- ին, իսկ գետնանցքը `GND- ին Arduino- ում: Արդուինոն պետք է բավականաչափ հոսանք ապահովի սերվոյի գործարկման համար: Ես օգտագործում եմ վահանը, քանի որ հեշտ է օգտագործել արտաքին լարման միայն սերվոյի համար:

Ահա ուրվագիծը: Ես գրել եմ servo արագության կարգավարի ռեժիմ, որպեսզի փոխեմ servo- ի արագությունը, քանի որ այն հավանաբար լավ չի աշխատի ամբողջ արագությամբ:

Գնդակի գլորման տարբեր արագություններ ստանալու համար կարող եք փոխել ժամանակի հետաձգումը: Կարող եք նաև փոխել myServo () ֆունկցիայի երրորդ պարամետրը `արագությունը փոխելու համար:

/////////////////////////////////////////////////// /////////////////////////////////////////////////// ///////////////// ստեղծեց Jimիմ Դեմելլոն, Շանգլուոյի համալսարան, 2017 թ

// դուք ազատ եք օգտագործել, շահարկել, անել այն, ինչ ցանկանում եք այս ծածկագրով, իմ անունը պարտադիր չէ

// Այս ռեժիմը թույլ է տալիս սերվերի ցանկացած քանակի ինտերպոլացիա, պարզապես ավելացրեք նոր տողեր, եթե սերվերի թիվը գերազանցում է 4 -ը

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

#ներառում

Servo myservo1, myservo2; // ստեղծել servo օբյեկտ `servo- ն վերահսկելու համար

int servoRead (int servoNumber) {

int servoCurrent;

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

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

վերադարձ servoCurrent;

}

void servoWrite (int servoNumber, int offset) {

եթե (servoNumber == 1) {myservo1.write (offset); }

եթե (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 (); }

եթե (curAngle <newAngle) {

համար (int անկյուն = curAngle; անկյուն <newAngle; անկյուն += angleInc) {

եթե (servoNum == 1) myservo1.write (անկյուն);

եթե (servoNum == 2) myservo2.write (անկյուն);

ուշացում (ներառյալ Հետաձգում); }

}

այլապես, եթե (curAngle> newAngle) {

for (int angle = curAngle; angle> newAngle; անկյուն -= angleInc) {

եթե (servoNum == 1) myservo1.write (անկյուն);

եթե (servoNum == 2) myservo2.write (անկյուն);

ուշացում (ներառյալ Հետաձգում); }

}

}

void interpolate2Servos (int servo1, int servo1Position, int servo2, int servo2Position, int համարըՔայլեր, int ժամանակի հետաձգում) {

int servo1Current, servo2Current;

servo1Current = servoRead (servo1);

servo2Current = servoRead (servo2);

// Serial.print ("Servo3Pos և ընթացիկ"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Current);

// Serial.print ("Servo4Pos և ընթացիկ"); Serial.print (servo4Position); Serial.print (""); Serial.println (servo4Current);

// Serial.print ("Servo5Pos և ընթացիկ"); Serial.print (servo5Position); Serial.print (""); Serial.println (servo5Current);

// Serial.print ("Servo6Pos և ընթացիկ"); 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;

համար (int x = 0; x

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

else {cOffsetTotal = cOffsetTotal - cOffset; }

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

else {dOffsetTotal = dOffsetTotal - dOffset; }

եթե (servo1Position! = servo1Current) servoWrite (servo1, cOffsetTotal);

եթե (servo2Position! = servo2Current) servoWrite (servo2, dOffsetTotal);

// Serial.print ("a and b Offset"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); ուշացում (10);

ուշացում (ժամանակի ուշացում);

} // ավարտի համար

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

// հոգ տանել մոդուլային մնացորդների մասին //

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

եթե (servo1Position! = servo1Current) servoWrite (servo1, servo1Position);

եթե (servo2Position! = servo2Current) servoWrite (servo2, servo2Position);

}

int timingDelay = 100;

int servoDelay = 100;

int degGap = 10;

// Սա մեկնարկային աստիճանն է (պետք է լինի ավարտական աստիճանից փոքր)

int degStart = 0;

// Սա ավարտի աստիճանն է (պետք է լինի ավելի մեծ, քան մեկնարկային աստիճանը)

int degEnd = 360;

// Սա շրջանագծի շառավիղն է

int շառավիղ = 8;

դատարկ կարգավորում ()

{

Serial.begin (9600);

ուշացում (100);

myservo1.attach (7); // ամրացնում է servo- ն pin 7 -ի վրա servo օբյեկտին

myservo1.write (90);

myservo2.attach (8); // ամրացնում է 8 -րդ կապի servo- ն servo օբյեկտին

myservo2.write (90);

ուշացում (1000); // սպասում է, որ սերվոն հասնի այնտեղ

interpolate2Servos (1, 90, 2, 90, 10, 60); // չեզոք

ուշացում (1000);

}

դատարկ շրջան () {

timingDelay = 15; // աշխատում է 10 -ում

servoDelay = 4;

spin4 ();

// interpolate2Servos (1, 90, 2, 90, 1, 60); // չեզոք

// ուշացում (1000);

// ելք (0); // դադար ծրագիր - շարունակելու համար սեղմեք reset

}

դատարկ spin3 () {

interpolate2Servos (1, 90, 2, 110, 1, 60); // չեզոք

ուշացում (ժամկետների հետաձգում);

interpolate2Servos (1, 90, 2, 80, 1, 60); // չեզոք

ուշացում (ժամկետների հետաձգում);

}

դատարկ spin2 () {

// interpolate2Servos (1, 80, 2, 90, 1, 50); // չեզոք

ուշացում (ժամկետների հետաձգում);

interpolate2Servos (1, 80, 2, 80, 1, 60); // չեզոք

ուշացում (ժամկետների հետաձգում);

interpolate2Servos (1, 110, 2, 80, 1, 60); // չեզոք

ուշացում (ժամկետների հետաձգում);

// interpolate2Servos (1, 110, 2, 110, 1, 60); // չեզոք

ուշացում (ժամկետների հետաձգում);

}

դատարկ spin1 () {

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

float deg = (degStart * 3.141592 / 180); // աստիճանը ռադիանի փոխարկել

float xPos = 90 + (cos (deg) * շառավիղ);

// xPos = կլոր (xPos);

բոց yPos = 90 + (sin (deg) * շառավիղ);

// yPos = կլոր (yPos);

Serial.print ("degGap ="); Serial.print (degGap); Serial.print ("deg ="); Serial.print (deg); Serial.print ("cos ="); Serial.print (cos (deg)); Serial.print ("degStart ="); Serial.print (degStart); Serial.print ("x ="); Serial.print (xPos); Serial.print ("y ="); Սերիա println (yPos);

// interpolate2Servos (1, xPos, 2, yPos, 1, servoDelay); // չեզոք

myservo1.write (xPos);

myservo2.write (yPos);

ուշացում (ժամկետների հետաձգում);

եթե (degStart> = degEnd) {

degStart = 0;

եթե (degGap> 180)

degGap = 180;

// degGap = 0;

ուրիշ

degGap = degGap + 2;

degGap = degGap - 2;

// degStart = degStart +degGap;

}

degStart = degStart + degGap;

}

դատարկ spin4 () {

համար (int i = 0; i <= 360; i ++) {

բոց j = 20 * (cos ((3.14 * i)/180)) + 90;

բոց k = 20 * (մեղք ((3.14 * i)/180)) + 90;

myservo1. գրել (ժ);

myservo2.write (k);

Serial.print (j);

Serial.print (",");

Serial.println (k);

ուշացում (100);

}

}

Խորհուրդ ենք տալիս: