Sisällysluettelo:
2025 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2025-01-13 06:57
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
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
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
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);
}
}