Turinys:

Automatinis rutulinis ritinėlis su „Arduino“ir viena servo sistema: 3 žingsniai
Automatinis rutulinis ritinėlis su „Arduino“ir viena servo sistema: 3 žingsniai

Video: Automatinis rutulinis ritinėlis su „Arduino“ir viena servo sistema: 3 žingsniai

Video: Automatinis rutulinis ritinėlis su „Arduino“ir viena servo sistema: 3 žingsniai
Video: Почему же приходится менять корпус "автомата" Aisin для Toyota, Chevrolet, Suzuki и Ford? 2024, Liepa
Anonim
Image
Image

Tai paprastas mažas „Arduino“ir „servo“projektas, kuriam užbaigti reikia apie dvi valandas. Jis naudoja servo, kad pakeltų vieną stiklainio dangtelio galą ir suktų plieninį rutulį aplink vidinę perimetrą. Jis prasideda savaime, gali pakeisti greitį ir vienu metu suktis du (ar daugiau?) Kamuoliukus. Smagu kurti ir dirbti. Laiko parametrus galima žaisti turbūt dar didesniam greičiui. Galima naudoti kelis salės efekto jutiklius su magnetiniu rutuliu, kad tai taptų protingesne mašina, galinčia išsiaiškinti geriausius parametrus.

Turėčiau paminėti, kad kažkas čia, instructables.com, turi sudėtingesnę rutulinių ritinėlių mašiną:

Reikalingos medžiagos:

„Arduino Uno“(arba bet kuris „Arduino“)

Servo skydas (neprivaloma)

9g servo

stiklainio dangtelis

plieninis rutulys

šiek tiek medžio laužo

1 žingsnis: padarykite pagrindo ir vyrio dangtelio laikiklį

Padarykite pagrindo ir vyrio dangtelio laikiklį
Padarykite pagrindo ir vyrio dangtelio laikiklį

Pagrindas yra tik medžio gabalas, ant kurio pritvirtinamas atverčiamas medžio gabalas. Šarnyrinė mediena turėtų būti didesnė už naudojamą stiklainio dangtelį ir turėti pakankamai vietos vyriams ir servo montavimui.

Aš naudoju mažai plastikinių rc orlaivių vyrių ir tiesiog karštai priklijavau juos prie atverčiamos medienos ir pagrindo.

2 žingsnis: Padarykite ilgesnę servo ranką ir pritvirtinkite servo

Padarykite ilgesnę servo ranką ir pritvirtinkite servo
Padarykite ilgesnę servo ranką ir pritvirtinkite servo
Padarykite ilgesnę servo ranką ir pritvirtinkite servo
Padarykite ilgesnę servo ranką ir pritvirtinkite servo

Norėdami pagaminti ilgesnę servo ranką, aš tiesiog pritvirtinau 5 centimetrų medžio gabalą prie servo rankos su keliais mažais varžtais ir veržlėmis. Servo svirtis turi būti 90 laipsnių kampu ant servo, kai ji yra horizontali pagrindo atžvilgiu.

Aš tiesiog karštai priklijavau servo prie atlenkto medžio laikiklio, bet pastebėjau, kad jei leisite veikti ilgiau nei kelias minutes, servo įkaitins karštus klijus ir atleis nuo medžio. Taigi geresnis tvirtinimo būdas yra pagrįstas.

3 veiksmas: įkelkite ir paleiskite eskizą

Įkelti ir paleisti eskizą
Įkelti ir paleisti eskizą

Aš pritvirtinau savo servo prie 7 kaiščio, naudodamas skydą, nes tai tiesiog patogu ir jie kainuoja tik kelis dolerius. Jei neturite skydo, pritvirtinkite servo signalo laidą prie „Arduino“7 kaiščio, raudoną laidą prie 5 V „Arduino“ir įžeminimo laido prie GND „Arduino“. Arduino turėtų tiekti pakankamai srovės, kad galėtų valdyti servo. Aš naudoju skydą, nes lengva naudoti išorinę įtampą tik servo.

Čia yra eskizas. Parašiau servo greičio valdiklio rutiną, kad pakeisčiau servo greitį, nes greičiausiai jis neveiks visu greičiu.

Galite pakeisti „timingDelay“, kad gautumėte skirtingą rutulio ridenimo greitį. Taip pat galite pakeisti trečiąjį „myServo“() funkcijos parametrą, kad pakeistumėte greitį.

///////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// /////////////// // sukūrė Jim Demello, Šangluo universitetas, 2017 m.

// su šiuo kodu galite laisvai naudotis, manipuliuoti, daryti ką tik norite, mano vardas nereikalingas

// Ši tvarka leidžia interpoliuoti bet kokį servo skaičių, tiesiog pridėkite naujų eilučių, jei servų skaičius viršija 4

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

#įtraukti

Servo myservo1, myservo2; // sukurti servo objektą valdyti servo

int servoRead (int servoNumber) {

int servoCurrent;

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

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

return servoCurrent;

}

void servoWrite (int servoNumber, int offset) {

if (servoNumber == 1) {myservo1.write (poslinkis); }

if (servoNumber == 2) {myservo2.write (poslinkis); }

}

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 kampas = curAngle; kampas <newAngle; kampas += kampasInc) {

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

if (servoNum == 2) myservo2.write (kampas);

vėlavimas (incDelay); }

}

else if (curAngle> newAngle) {

for (int kampas = curAngle; kampas> newAngle; kampas -= kampasInc) {

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

if (servoNum == 2) myservo2.write (kampas);

vėlavimas (incDelay); }

}

}

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

int servo1Current, servo2Current;

servo1Current = servoRead (servo1);

servo2Current = servoRead (servo2);

// Serial.print ("Servo3Pos ir srovė"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Current);

// Serial.print ("Servo4Pos ir srovė"); Serial.print (servo4Position); Serial.print (""); Serial.println (servo4Current);

// Serial.print ("Servo5Pos ir srovė"); Serial.print (servo5Position); Serial.print (""); Serial.println (servo5Current);

// Serial.print ("Servo6Pos ir srovė"); 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;

už (int x = 0; x

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

else {cOffsetTotal = cOffsetTotal - cOffset; }

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

else {dOffsetTotal = dOffsetTotal - dOffset; }

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

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

// Serial.print ("a ir b poslinkis"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); vėlavimas (10);

uždelsimas (timeDelay);

} // pabaiga

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

// pasirūpinkite modulo likučiais //

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

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

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

}

int timingDelay = 100;

int servoDelay = 100;

int degGap = 10;

// Tai yra pradinis laipsnis (turi būti mažesnis už pabaigą)

int degStart = 0;

// Tai baigiamieji laipsniai (turi būti didesnis nei pradžios laipsnis)

int degEnd = 360;

// Tai apskritimo spindulys

int spindulys = 8;

negaliojanti sąranka ()

{

Serial.begin (9600);

vėlavimas (100);

myservo1.attach (7); // pritvirtina 7 kaiščio servo prie servo objekto

myservo1.write (90);

myservo2.attach (8); // prie servo objekto pritvirtina 8 kaiščio servo

myservo2.write (90);

vėlavimas (1000); // laukia, kol servo ten pateks

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

vėlavimas (1000);

}

void loop () {

timingDelay = 15; // dirba 10 val

servoDelay = 4;

spin4 ();

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

// uždelsimas (1000);

// išeiti (0); // pristabdyti programą - paspauskite reset, kad tęstumėte

}

void spin3 () {

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

uždelsimas (timingDelay);

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

uždelsimas (timingDelay);

}

void spin2 () {

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

uždelsimas (timingDelay);

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

uždelsimas (timingDelay);

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

uždelsimas (timingDelay);

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

uždelsimas (timingDelay);

}

void spin1 () {

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

plūdė deg = (degStart * 3.141592 / 180); // konvertuoti laipsnius į radianus

plūdė xPos = 90 + (cos (deg) * spindulys);

// xPos = apvalus (xPos);

plūdė yPos = 90 + (sin (deg) * spindulys);

// yPos = apvalus (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 ="); Serial. println (yPos);

// interpolate2Servos (1, xPos, 2, yPos, 1, servoDelay); // neutralus

myservo1.write (xPos);

myservo2.write (yPos);

uždelsimas (timingDelay);

if (degStart> = degEnd) {

degStart = 0;

jei (degGap> 180)

degGap = 180;

// degGap = 0;

Kitas

degGap = degGap + 2;

degGap = degGap - 2;

// degStart = degStart +degGap;

}

degStart = degStart + degGap;

}

void spin4 () {

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

plūdė j = 20 * (cos ((3.14 * i)/180)) + 90;

plūdė k = 20 * (sin ((3.14 * i)/180)) + 90;

myservo1.write (j);

myservo2.write (k);

Serijinis.spaudas (j);

Serial.print (",");

Serijinis.println (k);

vėlavimas (100);

}

}

Rekomenduojamas: