Sisukord:

Automatiseeritud pallirull Arduino ja ühe servoga: 3 sammu
Automatiseeritud pallirull Arduino ja ühe servoga: 3 sammu

Video: Automatiseeritud pallirull Arduino ja ühe servoga: 3 sammu

Video: Automatiseeritud pallirull Arduino ja ühe servoga: 3 sammu
Video: Как использовать 4-канальное реле для управления нагрузкой переменного тока с помощью кода Arduino 2024, Juuli
Anonim
Image
Image

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

Valmistage alus ja liigendiga korgihoidja
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

Tehke pikem servohoob ja kinnitage servo
Tehke pikem servohoob ja kinnitage servo
Tehke pikem servohoob ja kinnitage servo
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

Laadige ja käivitage visand
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);

}

}

Soovitan: