Përmbajtje:

Roller i automatizuar i topit me Arduino dhe një servo: 3 hapa
Roller i automatizuar i topit me Arduino dhe një servo: 3 hapa

Video: Roller i automatizuar i topit me Arduino dhe një servo: 3 hapa

Video: Roller i automatizuar i topit me Arduino dhe një servo: 3 hapa
Video: Ludacris - Rollout (My Business) (Official Music Video) 2024, Nëntor
Anonim
Image
Image

Ky është një projekt i thjeshtë i vogël Arduino dhe servo që kërkon rreth dy orë për t'u përfunduar. Ai përdor një servo për të hequr një fund të kapakut të kavanozit në mënyrë që të rrotullojë një top çeliku rreth perimetrit të brendshëm. Fillon vetë, mund të ndryshojë shpejtësinë dhe mund të rrotullojë dy (ose më shumë?) Topa në të njëjtën kohë. Argëtuese për të ndërtuar dhe për të punuar. Parametrat e kohës mund të luhen me shpejtësi ndoshta edhe më të larta. Disa sensorë të efektit të sallës me një top magnetik mund të përdoren për ta bërë atë një makinë më të zgjuar që mund të kuptojë parametrat më të mirë.

Duhet të përmend se dikush këtu në instructables.com ka një makinë rrotulluese më të sofistikuar:

Materialet e nevojshme:

Arduino Uno (ose ndonjë Arduino)

Mburoja servo (opsionale)

9g servo

kapak kavanoz

top çeliku

disa dru skrap

Hapi 1: Bëni mbajtësen e bazës dhe kapakut të varur

Bëni bazën dhe mbajtësen e kapakut të varur
Bëni bazën dhe mbajtësen e kapakut të varur

Baza është vetëm një copë druri për të montuar pjesën e drurit të varur. Druri i varur duhet të jetë më i madh se një kapak kavanoz që do të përdorni dhe të ketë hapësirë të mjaftueshme për menteshat dhe montimin e servo.

Kam përdorur disa varet plastike të avionëve rc dhe i kam ngjitur ato në dru të varur dhe në bazë.

Hapi 2: Bëni krahun më të gjatë servo dhe bashkojeni servo

Bëni krahun më të gjatë të shërbimit dhe lidhni servo
Bëni krahun më të gjatë të shërbimit dhe lidhni servo
Bëni krahun më të gjatë të shërbimit dhe lidhni servo
Bëni krahun më të gjatë të shërbimit dhe lidhni servo

Për të bërë një krah më të gjatë servo, unë vetëm bashkova një copë druri 5 centimetra në krahun servo me disa vida dhe arra të vogla. Krahu servo duhet të jetë në 90 gradë mbi servo kur është horizontalisht në bazë.

Unë thjesht e ngjita servo në mbajtësen e drurit të varur, por zbulova se nëse e lini të funksionojë për më shumë se disa minuta, servo do të ngrohë ngjitësin e nxehtë dhe do të largohet nga druri. Pra, një metodë më e mirë e bashkëngjitjes është e garantuar.

Hapi 3: Ngarko dhe Drejto Skicën

Ngarko dhe Drejto Skicën
Ngarko dhe Drejto Skicën

Unë e bashkova servonin tim me pin 7 duke përdorur një mburojë sepse është thjesht i përshtatshëm dhe kushtojnë vetëm disa dollarë. Nëse nuk keni një mburojë, atëherë lidhni telin e sinjalit servo në pin 7 në Arduino, tela e kuqe në 5v në Arduino dhe tela tokëzues në GND në Arduino. Arduino duhet të sigurojë rrymë të mjaftueshme për të operuar servo. Unë përdor mburojën sepse është e lehtë të përdorësh një tension të jashtëm vetëm për servo.

Këtu është skica. Kam shkruar një rutinë të kontrolluesit të shpejtësisë servo në mënyrë që të ndryshoj shpejtësinë e servo sepse ndoshta nuk do të funksionojë mirë me shpejtësi të plotë.

Ju mund të ndryshoni vonesën e kohës për të marrë shpejtësi të ndryshme të rrotullimit të topit. Ju gjithashtu mund të ndryshoni parametrin e tretë të funksionit myServo () për të ndryshuar gjithashtu shpejtësinë.

/////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////// /////////////// // krijuar nga Jim Demello, Universiteti Shangluo, 2017

// ju jeni të lirë të përdorni, manipuloni, bëni çfarë të doni me këtë kod, emri im nuk kërkohet

// Kjo rutinë lejon që çdo numër servos të interpolohen, thjesht shtoni rreshta të rinj nëse numri i servove tejkalon 4

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

#përfshi

Servo myservo1, myservo2; // krijoni një servo objekt për të kontrolluar një servo

int servoRead (int servoNumber) {

int servoCurrent;

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

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

kthimi servoCurrent;

}

void servoWrite (int servoNumber, int offset) {

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

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

}

void myServo (int newAngle, int angleInc, int incVonesë, int servoNum) {

int curAngle;

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

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

nëse (curAngle <newAngle) {

për (int angle = curAngle; angle <newAngle; angle += angleInc) {

nëse (servoNum == 1) myservo1.shkruaj (këndi);

nëse (servoNum == 2) myservo2.shkruaj (këndi);

vonesë (me vonesë); }

}

tjetër nëse (curAngle> newAngle) {

për (int angle = curAngle; angle> newAngle; angle -= angleInc) {

nëse (servoNum == 1) myservo1.shkruaj (këndi);

nëse (servoNum == 2) myservo2.shkruaj (këndi);

vonesë (me vonesë); }

}

}

void interpolate2Servos (int servo1, int servo1Pozicioni, int servo2, int servo2Pozicioni, numri int Hapat, int koha Vonesa) {

int servo1Current, servo2Current;

servo1Current = servoRead (servo1);

servo2Current = servoRead (servo2);

// Serial.print ("Servo3Pos dhe aktuale"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Current);

// Serial.print ("Servo4Pos dhe aktuale"); Serial.print (servo4Position); Serial.print (""); Serial.println (servo4Current);

// Serial.print ("Servo5Pos dhe aktuale"); Serial.print (servo5Position); Serial.print (""); Serial.println (servo5Current);

// Serial.print ("Servo6Pos dhe aktuale"); Serial.print (servo6Position); Serial.print (""); Serial.println (servo6Current);

// Serial.println ("");

int cOffset = (servo1Position - servo1Current); cOffset = abs (cOffset)/numberHapa;

int dOffset = (servo2Position - servo2Current); dOffset = abs (dOffset)/numberHapat;

int cOffsetTotal = 0, dOffsetTotal = 0;

cOffsetTotal = servo1Current;

dOffsetTotal = servo2Current;

për (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 dhe b Offset"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); vonesa (10);

vonesa (vonesa në kohë);

} // fund për

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

// kujdesuni për mbetjet modulo //

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

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

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

}

int timingVonesa = 100;

int servoVonesa = 100;

int degGap = 10;

// Kjo është shkalla fillestare (duhet të jetë më pak se shkalla përfundimtare)

int degStart = 0;

// Kjo është shkalla e përfundimit (duhet të jetë më e madhe se shkalla e fillimit)

int degEnd = 360;

// Kjo është rrezja e rrethit

rreze int = 8;

void setup ()

{

Serial.filloj (9600);

vonesë (100);

myservo1.tach (7); // i bashkon servo -në pin 7 me objektin servo

myservo1.shkruaj (90);

myservo2.attach (8); // bashkon servo në pin 8 me objektin servo

myservo2.shkruaj (90);

vonesa (1000); // pret që servo të arrijë atje

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

vonesa (1000);

}

lak void () {

kohaVonesë = 15; // punon në 10

servoVonesa = 4;

spin4 ();

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

// vonesa (1000);

// dalje (0); // program pauzë - shtyp rivendosjen për të vazhduar

}

void spin3 () {

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

vonesa (vonesa në kohë);

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

vonesa (vonesa në kohë);

}

void spin2 () {

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

vonesa (vonesa në kohë);

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

vonesa (vonesa në kohë);

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

vonesa (vonesa në kohë);

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

vonesa (vonesa në kohë);

}

void spin1 () {

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

noton deg = (degStart * 3.141592 / 180); // konvertoni gradë në radian

noton xPos = 90 + (cos (deg) * rreze);

// xPos = rrumbullak (xPos);

noton yPos = 90 + (sin (deg) * rreze);

// yPos = rrumbullak (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, servoVonesë); // neutrale

myservo1.shkruaj (xPos);

myservo2.shkruaj (yPos);

vonesa (vonesa në kohë);

nëse (degStart> = degEnd) {

degStart = 0;

nëse (degGap> 180)

degGap = 180;

// degGap = 0;

tjeter

degGap = degGap + 2;

degGap = degGap - 2;

// degStart = degStart +degGap;

}

degStart = degStart + degGap;

}

void spin4 () {

për (int i = 0; i <= 360; i ++) {

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

noton k = 20 * (mëkati ((3.14 * i)/180)) + 90;

myservo1.shkruaj (j);

myservo2.shkruaj (k);

Serial.print (j);

Serial.print (",");

Serial.println (k);

vonesë (100);

}

}

Recommended: