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, Juli
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 po unutarnjem obodu. Samostalno se pokreće, može mijenjati brzinu i može okretati dvije (ili više?) Loptica odjednom. Zabavno graditi i raditi. Parametri vremena se mogu igrati za vjerovatno još veće brzine. Nekoliko senzora s Hall efektom s magnetskom kuglom moglo bi se upotrijebiti da bude pametnija mašina koja može odrediti najbolje parametre.

Trebao bih napomenuti da netko ovdje na stranici instructables.com ima sofisticiraniju mašinu za valjke za kuglice:

Potrebni materijali:

Arduino Uno (ili bilo koji Arduino)

Servo štit (opcionalno)

9g servo

poklopac staklenke

čelična kugla

malo starog drveta

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

Napravite držač za postolje i šarke
Napravite držač za postolje i šarke

Baza je samo komad drveta na koji se može montirati šarkirani 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 avione i samo ih vruće zalijepio na šarkama i podnožju.

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

Da bih napravio duži servo krak, samo sam pričvrstio komad drveta od 5 centimetara na servo krak s nekoliko malih vijaka i matica. Servo krak bi trebao biti na 90 stupnjeva na servo -u kada je vodoravan prema podnožju.

Upravo sam vruće zalijepio servo na držač sa šarkama, ali otkrio sam da ako ga pustite da radi duže od nekoliko minuta, servo će 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 zgodno i koštaju samo nekoliko dolara. Ako nemate štit, spojite ž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 lako 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.

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

////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////// //////////////// // kreirao Jim Demello, Univerzitet Shangluo, 2017

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

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

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

#include

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

int servoRead (int servoNumber) {

int servoCurrent;

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

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

return servoCurrent;

}

void servoWrite (int servoNumber, int offset) {

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

if (broj servo == 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 (angle);

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

kašnjenje (incDelay); }

}

else if (curAngle> newAngle) {

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

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

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

kašnjenje (incDelay); }

}

}

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

int servo1Current, servo2Current;

servo1Current = 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 (servo6Current);

// 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 = servo2Current;

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

kašnjenje (timeDelay);

} // završava 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 krajnji stupnjevi (moraju biti veći od početnog stupnja)

int degEnd = 360;

// Ovo je radijus 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

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

kašnjenje (1000);

}

void loop () {{100} {101}

timingDelay = 15; // radi na 10

servoDelay = 4;

spin4 ();

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

// kašnjenje (1000);

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

}

void spin3 () {

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

kašnjenje (timingDelay);

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

kašnjenje (timingDelay);

}

void spin2 () {

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

kašnjenje (timingDelay);

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

kašnjenje (timingDelay);

interpolate2Servos (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); // pretvara stepene u radijane

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

// xPos = okrugli (xPos);

float yPos = 90 + (sin (stepeni) * 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 ="); Serial. 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;

else

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

Serial.print (j);

Serial.print (",");

Serial.println (k);

kašnjenje (100);

}

}

Preporučuje se: