Sadržaj:

Automatizirani kuglični valjak s Arduinom i jednim servom: 3 koraka
Automatizirani kuglični valjak s Arduinom i jednim servom: 3 koraka

Video: Automatizirani kuglični valjak s Arduinom i jednim servom: 3 koraka

Video: Automatizirani kuglični valjak s Arduinom i jednim servom: 3 koraka
Video: Automatizirani skladisni sustavi 2024, Srpanj
Anonim
Image
Image

Ovo je jednostavan mali Arduino i servo projekt koji traje oko dva sata. Koristi servo za podizanje jednog kraja poklopca staklenke kako bi okrenuo čeličnu kuglu oko unutarnjeg opsega. Samostalno se pokreće, može mijenjati brzinu i može okretati dvije (ili više?) Loptica odjednom. Zabavno graditi i raditi. Parametri vremena mogu se igrati za vjerojatno još veće brzine. Nekoliko senzora Hall učinka s magnetskom kuglom moglo bi se upotrijebiti da bude pametniji stroj koji može pronaći najbolje parametre.

Trebao bih napomenuti da netko ovdje na stranici instructables.com ima sofisticiraniji stroj za valjke za kuglice:

Potrebni materijali:

Arduino Uno (ili bilo koji Arduino)

Servo štit (opcionalno)

9 g servo

čep od staklenke

čelična kugla

malo starog drveta

Korak 1: Napravite držač baze i zglobne kape

Napravite držač baze i zglobne kape
Napravite držač baze i zglobne kape

Baza je samo komad drveta na koji se može montirati zglobni komad drveta. Drvo na šarkama treba biti veće od čepa staklenke koji ćete koristiti i imati dovoljno mjesta za šarke i za postavljanje servo pogona.

Koristio sam male plastične rc šarke za zrakoplove i samo ih vruće zalijepio na šarkama drvo i podnožje.

Korak 2: Produžite servo polugu i pričvrstite servo

Produžite servo polugu i pričvrstite servo
Produžite servo polugu i pričvrstite servo
Produžite servo polugu i pričvrstite servo
Produžite servo polugu i pričvrstite servo

Za izradu duljeg servo kraka samo sam pričvrstio komad drva od 5 centimetara na servo krak s nekoliko malih vijaka i matica. Servo krak bi trebao biti na 90 stupnjeva na servo pogonu kada je vodoravan prema podnožju.

Upravo sam vruće zalijepio servo na držač sa šarkama, ali otkrio sam da će, ako ga pustite da radi duže od nekoliko minuta, servo zagrijati vruće ljepilo i otpustiti ga iz drva. Stoga je zajamčena bolja metoda pričvršćivanja.

Korak 3: Učitajte i pokrenite skicu

Učitaj i pokreni skicu
Učitaj i pokreni skicu

Priključio sam svoj servo na pin 7 pomoću štita jer je to jednostavno prikladno i koštaju samo nekoliko dolara. Ako nemate štit, priključite žicu servo signala na pin 7 na Arduinu, crvenu žicu na 5v na Arduinu, a žicu za uzemljenje na GND na Arduinu. Arduino bi trebao osigurati dovoljno struje za rad servo -a. Koristim štit jer je jednostavno koristiti vanjski napon samo za servo.

Evo skice. Napisao sam rutinu servo kontrolera brzine kako bih promijenio brzinu serva jer vjerojatno neće raditi dobro pri punoj brzini.

Možete promijeniti timeingDelay da biste dobili različite brzine kotrljanja loptice. Također možete promijeniti treći parametar funkcije myServo () kako biste promijenili i brzinu.

////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////// //////////////// // stvorio Jim Demello, Sveučilište Shangluo, 2017

// možete koristiti, manipulirati i raditi što god želite s ovim kodom, moje ime nije potrebno

// Ova rutina omogućuje interpolaciju bilo kojeg broja servo -a, samo dodajte nove retke ako broj servo -a prelazi 4

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

#uključi

Servo myservo1, myservo2; // izrada servo objekta za upravljanje servo pogonom

int servoRead (int servoNumber) {

int servoTrenutno;

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

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

povratni servoTrenutni;

}

void servoWrite (int servoBroj, int pomak) {

if (broj serva == 1) {myservo1.write (pomak); }

if (broj serva == 2) {myservo2.write (pomak); }

}

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) {

for (int angle = curAngle; angle <newAngle; angle += angleInc) {

if (servoNum == 1) myservo1.write (kut);

if (servoNum == 2) myservo2.write (kut);

kašnjenje (incDelay); }

}

else if (curAngle> newAngle) {

for (int angle = curAngle; angle> newAngle; angle -= angleInc) {

if (servoNum == 1) myservo1.write (kut);

if (servoNum == 2) myservo2.write (kut);

kašnjenje (incDelay); }

}

}

void interpolate2Servos (int servo1, int servo1Position, int servo2, int servo2Položaj, int numberSteps, int timeDelay) {

int servo1Tekućina, servo2Trenutno;

servo1Trenutno = servoRead (servo1);

servo2Current = servoRead (servo2);

// Serial.print ("Servo3Pos i struja"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Current);

// Serial.print ("Servo4Pos i struja"); Serial.print (servo4Position); Serial.print (""); Serial.println (servo4Current);

// Serial.print ("Servo5Pos i struja"); Serial.print (servo5Position); Serial.print (""); Serial.println (servo5Current);

// Serial.print ("Servo6Pos i struja"); Serial.print (servo6Position); Serial.print (""); Serial.println (servo6Trenutno);

// Serial.println ("");

int cOffset = (servo1Position - servo1Trenutno); cOffset = abs (cOffset)/numberSteps;

int dOffset = (servo2Position - servo2Trenutno); dOffset = abs (dOffset)/numberSteps;

int cOffsetTotal = 0, dOffsetTotal = 0;

cOffsetTotal = servo1Trenutno;

dOffsetTotal = servo2Trenutno;

za (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 ("pomak a i b"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); kašnjenje (10);

kašnjenje (timeDelay);

} // kraj za

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

// pobrinite se za modulo ostataka //

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

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

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

}

int timingDelay = 100;

int servoDelay = 100;

int degGap = 10;

// Ovo je početni stupanj (mora biti manji od završnog stupnja)

int degStart = 0;

// Ovo su završni stupnjevi (moraju biti veći od početnog stupnja)

int degEnd = 360;

// Ovo je polumjer kruga

int radijus = 8;

void setup ()

{

Serial.begin (9600);

kašnjenje (100);

myservo1.attach (7); // priključuje servo na pin 7 na servo objekt

myservo1.write (90);

myservo2.attach (8); // priključuje servo na pin 8 na servo objekt

myservo2.write (90);

kašnjenje (1000); // čeka da servo stigne tamo

interpolirati2Servos (1, 90, 2, 90, 10, 60); // neutralno

kašnjenje (1000);

}

void loop () {{100} {101}

timingDelay = 15; // radi u 10

servoDelay = 4;

spin4 ();

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

// kašnjenje (1000);

// izlaz (0); // pauziranje programa - za nastavak pritisnite reset

}

void spin3 () {

interpolirati2Servos (1, 90, 2, 110, 1, 60); // neutralno

kašnjenje (timingDelay);

interpolirati2Servos (1, 90, 2, 80, 1, 60); // neutralno

kašnjenje (timingDelay);

}

void spin2 () {

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

kašnjenje (timingDelay);

interpolirati2Servos (1, 80, 2, 80, 1, 60); // neutralno

kašnjenje (timingDelay);

interpolirati2Servos (1, 110, 2, 80, 1, 60); // neutralno

kašnjenje (timingDelay);

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

kašnjenje (timingDelay);

}

void spin1 () {

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

float deg = (degStart * 3.141592 / 180); // pretvaranje stupnjeva u radijane

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

// xPos = okrugli (xPos);

float yPos = 90 + (sin (stupnjevi) * radijus);

// yPos = okrugli (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 ="); Serijski. println (yPos);

// interpolate2Servos (1, xPos, 2, yPos, 1, servoDelay); // neutralno

myservo1.write (xPos);

myservo2.write (yPos);

kašnjenje (timingDelay);

if (degStart> = degEnd) {

degStart = 0;

if (degGap> 180)

degGap = 180;

// degGap = 0;

drugo

degGap = degGap + 2;

degGap = degGap - 2;

// degStart = degStart +degGap;

}

degStart = degStart + degGap;

}

void spin4 () {

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

float j = 20 * (cos ((3,14 * i)/180)) + 90;

plovak k = 20 * (sin ((3,14 * i)/180)) + 90;

myservo1.write (j);

myservo2.write (k);

Serijski.ispis (j);

Serial.print (",");

Serijski.println (k);

kašnjenje (100);

}

}

Preporučeni: