Indholdsfortegnelse:

Automatiseret kuglerulle med Arduino og en servo: 3 trin
Automatiseret kuglerulle med Arduino og en servo: 3 trin

Video: Automatiseret kuglerulle med Arduino og en servo: 3 trin

Video: Automatiseret kuglerulle med Arduino og en servo: 3 trin
Video: Управление серводвигателем с помощью потенциометра с помощью Arduino 2024, Juli
Anonim
Image
Image

Dette er et simpelt lille Arduino- og servoprojekt, der tager cirka to timer at gennemføre. Den bruger en servo til at løfte den ene ende af en krukkehætte for at dreje en stålkugle rundt om den indvendige omkreds. Det starter selv, kan ændre hastighed og kan dreje to (eller flere?) Bolde på én gang. Sjovt at bygge og komme i gang. Timingsparametrene kan spilles med for sandsynligvis endnu hurtigere hastigheder. Et par hall effekt sensorer med en magnetisk kugle kunne bruges til at gøre det til en smartere maskine, der kan finde ud af de bedste parametre.

Jeg skal nævne, at nogen her på instructables.com har en mere sofistikeret kuglerulle:

Nødvendige materialer:

Arduino Uno (eller enhver Arduino)

Servo skjold (valgfrit)

9g servo

krukkehætte

stålkugle

noget skrot

Trin 1: Lav base og hængslet kasketholder

Lav base og hængslet kasketholder
Lav base og hængslet kasketholder

Basen er bare et stykke træ til at montere det hængslede stykke træ på. Det hængslede træ skal være større end en krukkehætte, som du vil bruge, og have plads nok til hængslerne og til montering af servoen.

Jeg brugte små plastiske rc -flyhængsler og hotgluede dem bare til det hængslede træ og basen.

Trin 2: Lav en længere servoarm, og fastgør servoen

Lav en længere servoarm, og fastgør servoen
Lav en længere servoarm, og fastgør servoen
Lav en længere servoarm, og fastgør servoen
Lav en længere servoarm, og fastgør servoen

For at lave en længere servoarm har jeg lige vedhæftet et 5 centimeter stykke træ til servoarmen med et par små skruer og møtrikker. Servoarmen skal være 90 grader på servoen, når den er vandret i forhold til basen.

Jeg har lige varmlimet servoen til den hængslede træholder, men jeg fandt ud af, at hvis du lader den køre i mere end et par minutter, vil servoen varme den varme lim op og slippe fra træet. Så en bedre fastgørelsesmetode er berettiget.

Trin 3: Indlæs og kør skitse

Indlæs og kør skitse
Indlæs og kør skitse

Jeg fastgjorde min servo til pin 7 ved hjælp af et skjold, fordi det bare er praktisk, og de koster kun et par kroner. Hvis du ikke har et skjold, skal du fastgøre servosignaltråden til pin 7 på Arduino, den røde ledning til 5v på Arduino og jordledningen til GND på Arduino. Arduinoen skal levere nok strøm til at betjene servoen. Jeg bruger skjoldet, fordi det er let at bruge en ekstern spænding kun til servoen.

Her er skitsen. Jeg skrev en servohastighedsstyringsrutine for at ændre hastigheden på servoen, fordi den sandsynligvis ikke fungerer godt ved fuld hastighed.

Du kan ændre timingDelay for at få forskellige hastigheder på bolden. Du kan også ændre den tredje parameter i funktionen myServo () for også at ændre hastighed.

///////////////////////////////////////////////// ////////////////////////////////////////////////// //////////////// // // oprettet af Jim Demello, Shangluo University, 2017

// du er fri til at bruge, manipulere, gøre hvad du vil med denne kode, mit navn er ikke påkrævet

// Denne rutine gør det muligt at interpolere et vilkårligt antal servoer, tilføj bare nye linjer, hvis antallet af servoer overstiger 4

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

#omfatte

Servo myservo1, myservo2; // opret et servoobjekt for at styre en servo

int servoRead (int servoNumber) {

int servoCurrent;

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

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

returner servoCurrent;

}

void servoWrite (int servoNumber, int offset) {

hvis (servoNumber == 1) {myservo1.write (offset); }

hvis (servoNumber == 2) {myservo2.write (offset); }

}

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

int curAngle;

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

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

if (curAngle <newAngle) {

for (int vinkel = curAngle; vinkel <newAngle; vinkel += vinkelInc) {

hvis (servoNum == 1) myservo1.write (vinkel);

hvis (servoNum == 2) myservo2.write (vinkel);

forsinkelse (incDelay); }

}

ellers hvis (curAngle> newAngle) {

for (int vinkel = curAngle; vinkel> newAngle; vinkel -= vinkelInc) {

hvis (servoNum == 1) myservo1.write (vinkel);

hvis (servoNum == 2) myservo2.write (vinkel);

forsinkelse (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 og Current"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Current);

// Serial.print ("Servo4Pos og Current"); Serial.print (servo4Position); Serial.print (""); Serial.println (servo4Current);

// Serial.print ("Servo5Pos og Current"); Serial.print (servo5Position); Serial.print (""); Serial.println (servo5Current);

// Serial.print ("Servo6Pos og Current"); 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;

for (int x = 0; x

hvis (servo1Position> servo1Current) {cOffsetTotal = cOffsetTotal + cOffset; }

else {cOffsetTotal = cOffsetTotal - cOffset; }

hvis (servo2Position> servo2Current) {dOffsetTotal = dOffsetTotal + dOffset; }

else {dOffsetTotal = dOffsetTotal - dOffset; }

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

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

// Serial.print ("a og b offset"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); forsinkelse (10);

forsinkelse (timeDelay);

} // slut for

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

// passe modulo rester //

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

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

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

}

int timingDelay = 100;

int servoDelay = 100;

int degGap = 10;

// Dette er startgraden (skal være mindre end slutgrad)

int degStart = 0;

// Dette er slutgrader (skal være større end startgrad)

int degEnd = 360;

// Dette er cirkelradius

int radius = 8;

ugyldig opsætning ()

{

Serial.begin (9600);

forsinkelse (100);

myservo1.attach (7); // fastgør servoen på pin 7 til servoobjektet

myservo1.write (90);

myservo2.attach (8); // fastgør servoen på pin 8 til servoobjektet

myservo2.write (90);

forsinkelse (1000); // venter på, at servoen kommer derhen

interpolate2Servos (1, 90, 2, 90, 10, 60); // neutral

forsinkelse (1000);

}

void loop () {

timingDelay = 15; // arbejder ved 10

servoDelay = 4;

spin4 ();

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

// forsinkelse (1000);

// exit (0); // pause program - tryk på reset for at fortsætte

}

void spin3 () {

interpolate2Servos (1, 90, 2, 110, 1, 60); // neutral

forsinkelse (timingDelay);

interpolate2Servos (1, 90, 2, 80, 1, 60); // neutral

forsinkelse (timingDelay);

}

void spin2 () {

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

forsinkelse (timingDelay);

interpolate2Servos (1, 80, 2, 80, 1, 60); // neutral

forsinkelse (timingDelay);

interpolate2Servos (1, 110, 2, 80, 1, 60); // neutral

forsinkelse (timingDelay);

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

forsinkelse (timingDelay);

}

void spin1 () {

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

float deg = (degStart * 3.141592 / 180); // konverter grader til radianer

float xPos = 90 + (cos (deg) * radius);

// xPos = rund (xPos);

float yPos = 90 + (sin (deg) * radius);

// yPos = rund (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); // neutral

myservo1.write (xPos);

myservo2.write (yPos);

forsinkelse (timingDelay);

hvis (degStart> = degEnd) {

degStart = 0;

hvis (degGap> 180)

degGap = 180;

// degGap = 0;

andet

degGap = degGap + 2;

degGap = degGap - 2;

// degStart = degStart +degGap;

}

degStart = degStart + degGap;

}

void spin4 () {

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

float j = 20 * (cos ((3.14 * i)/180)) + 90;

float k = 20 * (sin ((3.14 * i)/180)) + 90;

myservo1.write (j);

myservo2.write (k);

Serial.print (j);

Serial.print (",");

Serial.println (k);

forsinkelse (100);

}

}

Anbefalede: