Sisällysluettelo:

Automaattinen pallorulla Arduinolla ja yhdellä servolla: 3 vaihetta
Automaattinen pallorulla Arduinolla ja yhdellä servolla: 3 vaihetta

Video: Automaattinen pallorulla Arduinolla ja yhdellä servolla: 3 vaihetta

Video: Automaattinen pallorulla Arduinolla ja yhdellä servolla: 3 vaihetta
Video: Nollaa 10 000 dollariin tytäryhtiömarkkinoinnilla (TOTE suunnitelma, jonka voit ladata) 2024, Marraskuu
Anonim
Image
Image

Tämä on yksinkertainen pieni Arduino- ja servoprojekti, joka kestää noin kaksi tuntia. Se käyttää servoa nostaakseen purkin korkin toisen pään teräksisen pallon pyörittämiseksi sisäkehän ympäri. Se käynnistyy itsestään, voi muuttaa nopeutta ja voi pyörittää kahta (tai useampaa?) Palloa kerralla. Hauska rakentaa ja työskennellä. Ajoitusparametreilla voidaan pelata luultavasti jopa nopeammilla nopeuksilla. Muutamia magneettikuulalla varustettuja tehosteantureita voitaisiin käyttää älykkäämmäksi koneeksi, joka pystyy selvittämään parhaat parametrit.

Minun on mainittava, että joku täällä instructables.com-sivustolla on kehittyneempi pallorullakone:

Tarvittavat materiaalit:

Arduino Uno (tai mikä tahansa Arduino)

Servosuoja (valinnainen)

9 g servoa

purkin korkki

teräspallo

hiukan puuta

Vaihe 1: Tee pohja- ja saranakannen pidike

Tee pohja- ja saranakannen pidike
Tee pohja- ja saranakannen pidike

Pohja on vain puukappale saranoidun puukappaleen kiinnittämiseksi. Saranoidun puun on oltava suurempi kuin käyttämäsi purkkikorkki, ja siinä on oltava riittävästi tilaa saranoille ja servon asentamiselle.

Käytin pieniä muovisia rc -lentokoneiden saranoita ja liimasin ne vain saranoituun puuhun ja pohjaan.

Vaihe 2: Tee pidempi servovarsi ja kiinnitä servo

Tee pidempi servovarsi ja kiinnitä servo
Tee pidempi servovarsi ja kiinnitä servo
Tee pidempi servovarsi ja kiinnitä servo
Tee pidempi servovarsi ja kiinnitä servo

Pitkän servovarren tekemiseksi kiinnitin juuri 5 senttimetrin puukappaleen servovarteen muutamalla pienellä ruuvilla ja mutterilla. Servovarren tulisi olla 90 asteen kulmassa servossa, kun se on vaakasuorassa alustaan nähden.

Liimasin juuri servon saranoituun puupidikkeeseen, mutta huomasin, että jos annat sen käydä muutaman minuutin ajan, servo lämmittää kuuman liiman ja päästää irti puusta. Joten parempi kiinnitysmenetelmä on perusteltua.

Vaihe 3: Lataa ja suorita luonnos

Lataa ja suorita luonnos
Lataa ja suorita luonnos

Liitin servoni nastaan 7 käyttämällä suojaa, koska se on vain kätevää ja ne maksavat vain muutaman dollarin. Jos sinulla ei ole suojaa, kiinnitä servosignaalijohto Arduinon nastaan 7, punainen johto 5 V: iin Arduinossa ja maadoitusjohto GND: hen Arduinossa. Arduino -laitteen pitäisi antaa tarpeeksi virtaa servon käyttämiseen. Käytän suojaa, koska ulkoista jännitettä on helppo käyttää vain servolle.

Tässä on luonnos. Kirjoitin servonopeuden säätimen rutiinin muuttaakseni servon nopeutta, koska se ei todennäköisesti toimi hyvin täydellä nopeudella.

Voit muuttaa ajoituksen viivästymistä saadaksesi eri pallonopeudet. Voit myös muuttaa myServo () -toiminnon kolmatta parametria muuttaaksesi nopeutta.

//////////////////////////////////////////////////////////////////////////////////////. //////////////////////////////////////////////////////////////////////////////////////. /////////////// // luonut Jim Demello, Shangluo University, 2017

// voit vapaasti käyttää, manipuloida, tehdä mitä haluat tällä koodilla, nimeni ei ole pakollinen

// Tämä rutiini mahdollistaa minkä tahansa servojen interpoloinnin, lisää vain uusia rivejä, jos servojen määrä ylittää 4

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

#sisältää

Servo myservo1, myservo2; // luoda servo -objekti servoa ohjaamaan

int servoRead (int servoNumber) {

int servoCurrent;

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

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

paluu servovirta;

}

void servoWrite (int servoNumber, int offset) {

jos (servonumero == 1) {myservo1.write (offset); }

jos (servonumero == 2) {myservo2.write (offset); }

}

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

int curAngle;

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

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

if (curAngle <newAngle) {

for (int kulma = curAngle; kulma <newAngle; kulma += kulmaInc) {

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

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

viive (incDelay); }

}

else if (curAngle> newAngle) {

for (int kulma = curAngle; kulma> newAngle; kulma -= kulmaInc) {

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

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

viive (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 ja nykyinen"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Current);

// Serial.print ("Servo4Pos ja nykyinen"); Serial.print (servo4Position); Serial.print (""); Serial.println (servo4Current);

// Serial.print ("Servo5Pos ja nykyinen"); Serial.print (servo5Position); Serial.print (""); Serial.println (servo5Current);

// Serial.print ("Servo6Pos ja nykyinen"); Serial.print (servo6Position); Serial.print (""); Serial.println (servo6Current);

// Sarja.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;

for (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 ja b Offset"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); viive (10);

viive (timeDelay);

} // loppu

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

// huolehdi modulo -jäännöksistä //

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

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

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

}

int timingDelay = 100;

int servoDelay = 100;

int degGap = 10;

// Tämä on alkuaste (sen on oltava pienempi kuin lopullinen aste)

int degStart = 0;

// Tämä on päättymisaste (sen on oltava suurempi kuin aloitusaste)

int degEnd = 360;

// Tämä on ympyrän säde

int säde = 8;

mitätön asennus ()

{

Sarja.alku (9600);

viive (100);

myservo1.attach (7); // kiinnittää nastan 7 servon servo -objektiin

myservo1.write (90);

myservo2.attach (8); // kiinnittää nastan 8 servon servo -objektiin

myservo2.write (90);

viive (1000); // odottaa servon pääsyä sinne

interpolaatio2Servot (1, 90, 2, 90, 10, 60); // neutraali

viive (1000);

}

void loop () {

ajoitusviive = 15; // toimii klo 10

servoDelay = 4;

spin4 ();

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

// viive (1000);

// exit (0); // keskeytä ohjelma - jatka painamalla reset

}

void spin3 () {

interpolaatio2Servot (1, 90, 2, 110, 1, 60); // neutraali

viive (ajoitusviive);

interpolaatio2Servot (1, 90, 2, 80, 1, 60); // neutraali

viive (ajoitusviive);

}

void spin2 () {

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

viive (ajoitusviive);

interpolaatio2Servot (1, 80, 2, 80, 1, 60); // neutraali

viive (ajoitusviive);

interpolaatio2Servot (1, 110, 2, 80, 1, 60); // neutraali

viive (ajoitusviive);

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

viive (ajoitusviive);

}

void spin1 () {

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

float deg = (degStart * 3.141592 / 180); // muuntaa astetta radiaaniksi

float xPos = 90 + (cos (deg) * säde);

// xPos = pyöreä (xPos);

float yPos = 90 + (sin (deg) * säde);

// yPos = pyöreä (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); // neutraali

myservo1.write (xPos);

myservo2.write (yPos);

viive (ajoitusviive);

jos (degStart> = degEnd) {

degStart = 0;

jos (degGap> 180)

degGap = 180;

// degGap = 0;

muu

degGap = degGap + 2;

degGap = degGap - 2;

// degStart = degStart +degGap;

}

degStart = degStart + degGap;

}

void spin4 () {

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

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

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

myservo1.write (j);

myservo2.write (k);

Sarjanjälki (j);

Serial.print (",");

Sarja.println (k);

viive (100);

}

}

Suositeltava: