Sisukord:
2025 Autor: John Day | [email protected]. Viimati modifitseeritud: 2025-01-13 06:57
See on lihtne väike Arduino ja servoprojekt, mille valmimine võtab aega umbes kaks tundi. See kasutab servo, et tõsta purgi korgi üks ots nii, et see keerleks teraskuuli ümber sisemise ümbermõõdu. See käivitub iseenesest, võib kiirust muuta ja võib keerutada kahte (või enamat?) Palli korraga. Lõbus ehitada ja tööd teha. Ajastusparameetritega saab mängida ilmselt isegi kiiremate kiiruste jaoks. Mõne magnetilise kuuliga saaliefekti anduri abil saaks teha targema masina, mis suudab välja selgitada parimad parameetrid.
Peaksin mainima, et siin saidil instructables.com on kellelgi keerukam pallirullmasin:
Vajalikud materjalid:
Arduino Uno (või mis tahes Arduino)
Servokilp (valikuline)
9g servo
purgi kork
terasest kuul
mõni vanapuit
Samm: valmistage alus ja liigendiga korgihoidja
Alus on lihtsalt puidust tükk, millele hingedega puutükk paigaldada. Hingedega puit peaks olema suurem kui teie kasutatav purgikork ning sellel peaks olema piisavalt ruumi hingedele ja servo paigaldamiseks.
Kasutasin väikeseid plastikust rc -lennukite hingesid ja liimisin need lihtsalt kuumliimiga hingedega puidu ja aluse külge.
2. samm: tehke pikem servohoob ja kinnitage servo
Pikema servohoova tegemiseks kinnitasin lihtsalt paari sentimeetri puutüki paari väikese kruvi ja mutriga servovarre külge. Servohoob peaks olema serval 90 kraadi juures, kui see on aluse suhtes horisontaalne.
Liimisin servo kuumalt hingedega puidust hoidiku külge, kuid leidsin, et kui lasete sellel kauem kui paar minutit töötada, soojendab servo kuuma liimi ja laseb puidust lahti. Seega on parem kinnitusmeetod õigustatud.
3. samm: laadige ja käivitage visand
Kinnitasin oma servo kilbi abil tihvti 7 külge, sest see on lihtsalt mugav ja need maksavad vaid paar dollarit. Kui teil pole varjestust, kinnitage servosignaali juhe Arduino tihvti 7 külge, punane juhe 5 V -le Arduino ja maandusjuhe Arduino GND -le. Arduino peaks andma piisavalt voolu servo käitamiseks. Ma kasutan kilpi, sest lihtsalt servo jaoks on lihtne kasutada välist pinget.
Siin on visand. Kirjutasin servo kiiruse regulaatori rutiini, et muuta servo kiirust, sest see ei tööta tõenäoliselt täiskiirusel hästi.
Saate muuta timingDelay'i, et saada erinevaid pallide veeremise kiirusi. Kiiruse muutmiseks võite muuta ka funktsiooni myServo () kolmandat parameetrit.
/////////////////////////////////////////////////////////////- ////////////////////////////////////////////////////////////- /////////////// // loodud Jim Demello, Shangluo ülikool, 2017
// selle koodiga saate vabalt kasutada, manipuleerida, teha mida iganes soovite, minu nimi pole kohustuslik
// See rutiin võimaldab interpoleerida suvalist arvu servosid, lisage lihtsalt uued read, kui servode arv ületab 4
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#kaasake
Servo myservo1, myservo2; // luua servoobjekt servo juhtimiseks
int servoRead (int servoNumber) {
int servoCurrent;
if (servoNumber == 1) {servoCurrent = myservo1.read (); }
if (servoNumber == 2) {servoCurrent = myservo2.read (); }
tagastada servoCurrent;
}
void servoWrite (int servoNumber, int offset) {
if (servoNumber == 1) {myservo1.write (nihe); }
if (servoNumber == 2) {myservo2.write (nihe); }
}
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) {
jaoks (int nurk = curAngle; nurk <newAngle; nurk += nurkInc) {
if (servoNum == 1) myservo1.write (nurk);
if (servoNum == 2) myservo2.write (nurk);
viivitus (incDelay); }
}
else if (curAngle> newAngle) {
for (int nurk = curAngle; nurk> newAngle; nurk -= nurkInc) {
if (servoNum == 1) myservo1.write (nurk);
if (servoNum == 2) myservo2.write (nurk);
viivitus (incDelay); }
}
}
void interpolate2Servos (int servo1, int servo1Position, int servo2, int servo2Position, int numberSteps, int timeDelay) {
int servo1Vool, servo2Vool;
servo1Vool = servoRead (servo1);
servo2Vool = servoRead (servo2);
// Serial.print ("Servo3Pos ja praegune"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Vool);
// Serial.print ("Servo4Pos ja praegune"); Serial.print (servo4Position); Serial.print (""); Serial.println (servo4Current);
// Serial.print ("Servo5Pos ja praegune"); Serial.print (servo5Position); Serial.print (""); Serial.println (servo5Vool);
// Serial.print ("Servo6Pos ja praegune"); Serial.print (servo6Position); Serial.print (""); Serial.println (servo6Current);
// Serial.println ("");
int cOffset = (servo1Position - servo1Vool); cOffset = abs (cOffset)/numberSteps;
int dOffset = (servo2Position - servo2Vool); dOffset = abs (dOffset)/numberSteps;
int cOffsetTotal = 0, dOffsetTotal = 0;
cOffsetTotal = servo1Vool;
dOffsetTotal = servo2Vool;
jaoks (int x = 0; x
if (servo1Position> servo1Vool) {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 nihe"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); viivitus (10);
viivitus (timeDelay);
} // lõpp jaoks
//////////////////////////////////////
// hoolitsege moodulijääkide eest //
/////////////////////////////////////
if (servo1Position! = servo1Current) servoWrite (servo1, servo1Position);
if (servo2Position! = servo2Current) servoWrite (servo2, servo2Position);
}
int timingDelay = 100;
int servoDelay = 100;
int degGap = 10;
// See on algusaste (peab olema väiksem kui lõppaste)
int degStart = 0;
// See on lõpukraadid (peab olema suurem kui algusaste)
int degEnd = 360;
// See on ringi raadius
int raadius = 8;
tühine seadistus ()
{
Seriaalne algus (9600);
viivitus (100);
myservo1.attach (7); // kinnitab tihvti 7 servo servoobjekti külge
myservo1.write (90);
myservo2.attach (8); // kinnitab tihvti 8 servo servoobjekti külge
myservo2.write (90);
viivitus (1000); // ootab servo jõudmist
interpolate2Servos (1, 90, 2, 90, 10, 60); // neutraalne
viivitus (1000);
}
void loop () {
timingDelay = 15; // töötab kell 10
servoDelay = 4;
spin4 ();
// interpolate2Servos (1, 90, 2, 90, 1, 60); // neutraalne
// viivitus (1000);
// väljumine (0); // programmi peatamine - jätkamiseks vajuta lähtestamisele
}
void spin3 () {
interpolate2Servos (1, 90, 2, 110, 1, 60); // neutraalne
viivitus (timingDelay);
interpolate2Servos (1, 90, 2, 80, 1, 60); // neutraalne
viivitus (timingDelay);
}
void spin2 () {
// interpolate2Servos (1, 80, 2, 90, 1, 50); // neutraalne
viivitus (timingDelay);
interpolate2Servos (1, 80, 2, 80, 1, 60); // neutraalne
viivitus (timingDelay);
interpolate2Servos (1, 110, 2, 80, 1, 60); // neutraalne
viivitus (timingDelay);
// interpolate2Servos (1, 110, 2, 110, 1, 60); // neutraalne
viivitus (timingDelay);
}
tühine spin1 () {
// int deg = (degStart / (180 / 3.14));
ujuk deg = (degStart * 3.141592 / 180); // teisendada kraadid radiaanideks
ujuk xPos = 90 + (cos (deg) * raadius);
// xPos = ümmargune (xPos);
ujuk yPos = 90 + (sin (deg) * raadius);
// yPos = ümmargune (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); // neutraalne
myservo1.write (xPos);
myservo2.write (yPos);
viivitus (timingDelay);
if (degStart> = degEnd) {
degStart = 0;
kui (degGap> 180)
degGap = 180;
// degGap = 0;
muidu
degGap = degGap + 2;
degGap = degGap - 2;
// degStart = degStart +degGap;
}
degStart = degStart + degGap;
}
void spin4 () {
jaoks (int i = 0; i <= 360; i ++) {
ujuk j = 20 * (cos ((3,14 * i)/180)) + 90;
ujuk k = 20 * (sin ((3,14 * i)/180)) + 90;
myservo1.write (j);
myservo2.write (k);
Seeriatrükk (j);
Serial.print (",");
Seeria.println (k);
viivitus (100);
}
}