Innholdsfortegnelse:

Automatisert ballrulle med Arduino og en servo: 3 trinn
Automatisert ballrulle med Arduino og en servo: 3 trinn

Video: Automatisert ballrulle med Arduino og en servo: 3 trinn

Video: Automatisert ballrulle med Arduino og en servo: 3 trinn
Video: Управление 32 сервомоторами с помощью PCA9685 и Arduino: V3 2024, November
Anonim
Image
Image

Dette er et enkelt lite Arduino- og servoprosjekt som tar omtrent to timer å fullføre. Den bruker en servo til å løfte den ene enden av et glasslokk for å snurre en stålkule rundt den indre omkretsen. Den starter selv, kan endre hastighet og kan snurre to (eller flere?) Baller samtidig. Morsomt å bygge og komme i gang. Timingsparametrene kan spilles med for sannsynligvis enda raskere hastigheter. Noen få hall -effektsensorer med en magnetisk ball kan brukes til å gjøre den til en smartere maskin som kan finne ut de beste parameterne.

Jeg skal nevne at noen her på instructables.com har en mer sofistikert ballrullemaskin:

Materialer som trengs:

Arduino Uno (eller hvilken som helst Arduino)

Servoskjold (valgfritt)

9g servo

glasslokk

stål ball

litt skrapvirke

Trinn 1: Lag base og hengslet hetteholder

Lag base og hengslet hetteholder
Lag base og hengslet hetteholder

Basen er bare et stykke tre å montere det hengslede treverket på. Det hengslede treverket skal være større enn et glasshett som du vil bruke og ha nok plass til hengslene og til å montere servoen.

Jeg brukte små rc -flyhengsler av plast og limte dem bare til det hengslede treet og basen.

Trinn 2: Lag en lengre servoarm og fest servoen

Lag lengre servoarm og fest servo
Lag lengre servoarm og fest servo
Lag lengre servoarm og fest servo
Lag lengre servoarm og fest servo

For å lage en lengre servoarm, festet jeg bare et 5 centimeter stykke tre til servoarmen med et par små skruer og muttere. Servoarmen skal være 90 grader på servoen når den er horisontal i forhold til basen.

Jeg har akkurat limt servoen til den hengslede treholderen, men jeg fant ut at hvis du lar den gå i mer enn noen minutter, vil servoen varme opp det varme limet og slippe fra treet. Så en bedre festemetode er berettiget.

Trinn 3: Last og kjør skisse

Last og kjør skisse
Last og kjør skisse

Jeg festet servoen min til pin 7 ved hjelp av et skjold fordi det er praktisk og de koster bare noen få dollar. Hvis du ikke har et skjerm, kobler du servosignaltråden til pinne 7 på Arduino, den røde ledningen til 5v på Arduino og jordledningen til GND på Arduino. Arduinoen skal gi nok strøm til å betjene servoen. Jeg bruker skjoldet fordi det er enkelt å bruke en ekstern spenning bare for servoen.

Her er skissen. Jeg skrev en servohastighetsregulator -rutine for å endre hastigheten på servoen fordi den sannsynligvis ikke vil fungere bra ved full hastighet.

Du kan endre timingDelay for å få forskjellige rullingshastigheter. Du kan også endre den tredje parameteren i myServo () -funksjonen for å også endre hastighet.

//////////////////////////////////////////// ///////////////////////////////////////////// //////////////// // laget av Jim Demello, Shangluo University, 2017

// du er fri til å bruke, manipulere, gjøre hva du vil med denne koden, mitt navn er ikke nødvendig

// Denne rutinen gjør at et hvilket som helst antall servoer kan interpoleres, bare legg til nye linjer hvis antall servoer overstiger 4

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

#inkludere

Servo myservo1, myservo2; // lage servoobjekt for å kontrollere en servo

int servoRead (int servoNumber) {

int servoCurrent;

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

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

returner servoCurrent;

}

void servoWrite (int servoNumber, int offset) {

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

if (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); }

}

else if (curAngle> newAngle) {

for (int vinkel = curAngle; vinkel> nyAngle; 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 servo2Posisjon, 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

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

annet {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 og b Offset"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); forsinkelse (10);

forsinkelse (timeDelay);

} // slutt for

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

// ta vare på modulo -rester //

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

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

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

}

int timingDelay = 100;

int servoDelay = 100;

int degGap = 10;

// Dette er startgraden (må være mindre enn sluttgrad)

int degStart = 0;

// Dette er sluttgradene (må være større enn startgraden)

int degEnd = 360;

// Dette er sirkelradiusen

int radius = 8;

ugyldig oppsett ()

{

Serial.begin (9600);

forsinkelse (100);

myservo1.attach (7); // fester servoen på pinne 7 til servoobjektet

myservo1.write (90);

myservo2.attach (8); // fester servoen på pinne 8 til servoobjektet

myservo2.write (90);

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

interpolate2Servos (1, 90, 2, 90, 10, 60); // nøytral

forsinkelse (1000);

}

void loop () {

timingDelay = 15; // jobber klokken 10

servoDelay = 4;

spin4 ();

// interpolate2Servos (1, 90, 2, 90, 1, 60); // nøytral

// forsinkelse (1000);

// exit (0); // pause program - trykk på reset for å fortsette

}

void spin3 () {

interpolate2Servos (1, 90, 2, 110, 1, 60); // nøytral

forsinkelse (timingDelay);

interpolate2Servos (1, 90, 2, 80, 1, 60); // nøytral

forsinkelse (timingDelay);

}

void spin2 () {

// interpolate2Servos (1, 80, 2, 90, 1, 50); // nøytral

forsinkelse (timingDelay);

interpolate2Servos (1, 80, 2, 80, 1, 60); // nøytral

forsinkelse (timingDelay);

interpolate2Servos (1, 110, 2, 80, 1, 60); // nøytral

forsinkelse (timingDelay);

// interpolate2Servos (1, 110, 2, 110, 1, 60); // nøytral

forsinkelse (timingDelay);

}

void spin1 () {

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

flyte deg = (degStart * 3.141592 / 180); // konvertere grader til radianer

flyte 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); // nøytral

myservo1.write (xPos);

myservo2.write (yPos);

forsinkelse (timingDelay);

if (degStart> = degEnd) {

degStart = 0;

hvis (degGap> 180)

degGap = 180;

// degGap = 0;

ellers

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;

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

myservo1.write (j);

myservo2.write (k);

Serial.print (j);

Serial.print (",");

Serial.println (k);

forsinkelse (100);

}

}

Anbefalt: