Satura rādītājs:

Automatizēts lodīšu rullītis ar Arduino un vienu servo: 3 soļi
Automatizēts lodīšu rullītis ar Arduino un vienu servo: 3 soļi

Video: Automatizēts lodīšu rullītis ar Arduino un vienu servo: 3 soļi

Video: Automatizēts lodīšu rullītis ar Arduino un vienu servo: 3 soļi
Video: Fix It Or Blow It Up - 1986 Range Rover | Workshop Diaries | Edd China 2024, Jūlijs
Anonim
Image
Image

Šis ir vienkāršs mazs Arduino un servo projekts, kura pabeigšana prasa apmēram divas stundas. Tas izmanto servo, lai paceltu vienu burkas vāciņa galu tā, lai pa iekšējo apkārtmēru izgrieztu tērauda lodīti. Tas sākas pats, var mainīt ātrumu un vienlaikus var griezt divas (vai vairākas?) Bumbiņas. Prieks būvēt un strādāt. Ar laika parametriem var spēlēt, iespējams, vēl lielākam ātrumam. Varētu izmantot dažus zāles efekta sensorus ar magnētisko lodīti, lai padarītu to par gudrāku mašīnu, kas spēj noskaidrot labākos parametrus.

Man jāpiemin, ka kādam šeit vietnē instructables.com ir sarežģītāka lodīšu veltņu mašīna:

Nepieciešamie materiāli:

Arduino Uno (vai jebkurš Arduino)

Servo vairogs (pēc izvēles)

9g servo

burkas vāciņš

tērauda lodīte

daži koka lūžņi

1. darbība: izveidojiet pamatnes un eņģes vāciņa turētāju

Izgatavojiet pamatnes un šarnīra vāciņa turētāju
Izgatavojiet pamatnes un šarnīra vāciņa turētāju

Pamatne ir tikai koka gabaliņš, uz kura piestiprināt šarnīrveida koka gabalu. Šarnīrveida kokam jābūt lielākam par izmantojamo burkas vāciņu, un tam jābūt pietiekami daudz vietas eņģēm un servo montāžai.

Es izmantoju mazas plastmasas rc lidmašīnas eņģes un vienkārši karsti pielīmēju tās pie eņģu koka un pamatnes.

2. solis: izveidojiet garāku servo roku un pievienojiet servo

Izgatavojiet garāku servo roku un pievienojiet servo
Izgatavojiet garāku servo roku un pievienojiet servo
Izgatavojiet garāku servo roku un pievienojiet servo
Izgatavojiet garāku servo roku un pievienojiet servo

Lai izgatavotu garāku servo rokturi, es tikai pievienoju 5 centimetru koka gabalu pie servo sviras ar pāris mazām skrūvēm un uzgriežņiem. Servo rokai jābūt 90 grādiem uz servo, kad tā ir horizontāli pret pamatni.

Es tikko karsti pielīmēju servo pie šarnīra koka turētāja, bet es atklāju, ka, ja ļausiet tam darboties ilgāk par dažām minūtēm, servo sakarsēs karsto līmi un atlaidīs no koka. Tāpēc labāka piestiprināšanas metode ir pamatota.

3. darbība: ielādējiet un palaidiet skici

Ielādēt un palaist skici
Ielādēt un palaist skici

Es pievienoju savu servo tapai 7, izmantojot vairogu, jo tas ir vienkārši ērti, un tie maksā tikai dažus dolārus. Ja jums nav vairoga, pievienojiet servo signāla vadu Arduino 7. tapai, sarkano vadu līdz 5 V Arduino un zemējuma vadu GND Arduino. Arduino vajadzētu nodrošināt pietiekami daudz strāvas, lai darbinātu servo. Es izmantoju vairogu, jo ir vienkārši izmantot ārēju spriegumu tikai servo.

Šeit ir skice. Es uzrakstīju servo ātruma regulatora rutīnu, lai mainītu servo ātrumu, jo tas, iespējams, nedarbosies labi ar pilnu ātrumu.

Jūs varat mainīt timingDelay, lai iegūtu dažādus bumbas ripināšanas ātrumus. Varat arī mainīt myServo () funkcijas trešo parametru, lai mainītu arī ātrumu.

//////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////// // izveidojis Džims Demello, Šanglū Universitāte, 2017

// ar šo kodu jūs varat brīvi izmantot, manipulēt, darīt visu, ko vēlaties, mans vārds nav obligāts

// Šī kārtība ļauj interpolēt jebkuru servo skaitu, vienkārši pievienojiet jaunas rindas, ja servo skaits pārsniedz 4

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

#iekļaut

Servo myservo1, myservo2; // izveidot servo objektu, lai kontrolētu servo

int servoRead (int servoNumber) {

int servoCurrent;

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

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

atgriešanās servoCurrent;

}

void servoWrite (int servoNumber, int offset) {

ja (servoNumber == 1) {myservo1.write (nobīde); }

ja (servoNumber == 2) {myservo2.write (nobīde); }

}

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

int curAngle;

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

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

if (curAngle <newAngle) {

for (int leņķis = curAngle; leņķis <newAngle; leņķis += leņķisInc) {

ja (servoNum == 1) myservo1.write (leņķis);

ja (servoNum == 2) myservo2.write (leņķis);

kavēšanās (incDelay); }

}

else if (curAngle> newAngle) {

par (int leņķis = curAngle; leņķis> newAngle; leņķis -= leņķisInc) {

ja (servoNum == 1) myservo1.write (leņķis);

ja (servoNum == 2) myservo2.write (leņķis);

kavēšanās (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 un pašreizējais"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Current);

// Serial.print ("Servo4Pos un pašreizējais"); Serial.print (servo4Position); Serial.print (""); Serial.println (servo4Current);

// Serial.print ("Servo5Pos un pašreizējais"); Serial.print (servo5Position); Serial.print (""); Serial.println (servo5Current);

// Serial.print ("Servo6Pos un pašreizējais"); 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;

par (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 un b nobīde"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); kavēšanās (10);

kavēšanās (timeDelay);

} // beigas par

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

// rūpēties par moduļu atlikumiem //

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

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

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

}

int timingDelay = 100;

int servoDelay = 100;

int degGap = 10;

// Šī ir sākuma pakāpe (tai jābūt mazākai par beigu pakāpi)

int degStart = 0;

// Šī ir beigu pakāpe (tai jābūt lielākai par sākuma pakāpi)

int degEnd = 360;

// Šis ir apļa rādiuss

int rādiuss = 8;

anulēts iestatījums ()

{

Sērijas sākums (9600);

kavēšanās (100);

myservo1.attach (7); // piestiprina 7. tapas servo pie servobjekta

myservo1.write (90);

myservo2.attach (8); // piestiprina servo 8. tapā pie servo objekta

myservo2.write (90);

kavēšanās (1000); // gaida, kad servo tur nonāks

interpolate2Servos (1, 90, 2, 90, 10, 60); // neitrāls

kavēšanās (1000);

}

void loop () {

timingDelay = 15; // strādā 10

servoDelay = 4;

spin4 ();

// interpolate2Servos (1, 90, 2, 90, 1, 60); // neitrāls

// kavēšanās (1000);

// izeja (0); // pauzes programma - lai turpinātu, nospiediet atiestatīšanu

}

void spin3 () {

interpolate2Servos (1, 90, 2, 110, 1, 60); // neitrāls

kavēšanās (timingDelay);

interpolate2Servos (1, 90, 2, 80, 1, 60); // neitrāls

kavēšanās (timingDelay);

}

void spin2 () {

// interpolate2Servos (1, 80, 2, 90, 1, 50); // neitrāls

kavēšanās (timingDelay);

interpolate2Servos (1, 80, 2, 80, 1, 60); // neitrāls

kavēšanās (timingDelay);

interpolate2Servos (1, 110, 2, 80, 1, 60); // neitrāls

kavēšanās (timingDelay);

// interpolate2Servos (1, 110, 2, 110, 1, 60); // neitrāls

kavēšanās (timingDelay);

}

void spin1 () {

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

pludiņš deg = (degStart * 3.141592 / 180); // pārvērst grādus par radiāniem

pludiņš xPos = 90 + (cos (deg) * rādiuss);

// xPos = apaļš (xPos);

pludiņš yPos = 90 + (sin (deg) * rādiuss);

// yPos = apaļš (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); // neitrāls

myservo1.write (xPos);

myservo2.write (yPos);

kavēšanās (timingDelay);

ja (degStart> = degEnd) {

degStart = 0;

ja (degGap> 180)

degGap = 180;

// degGap = 0;

citādi

degGap = degGap + 2;

degGap = degGap - 2;

// degStart = degStart +degGap;

}

degStart = degStart + degGap;

}

void spin4 () {

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

pludiņš j = 20 * (cos ((3,14 * i)/180)) + 90;

pludiņš k = 20 * (sin ((3,14 * i)/180)) + 90;

myservo1.write (j);

myservo2.write (k);

Sērijas nospiedums (j);

Serial.print (",");

Sērijas.println (k);

kavēšanās (100);

}

}

Ieteicams: