Tartalomjegyzék:

Automatizált labdahenger Arduino -val és egy szervóval: 3 lépés
Automatizált labdahenger Arduino -val és egy szervóval: 3 lépés

Videó: Automatizált labdahenger Arduino -val és egy szervóval: 3 lépés

Videó: Automatizált labdahenger Arduino -val és egy szervóval: 3 lépés
Videó: Испытательные камеры Böllhoff - Полностью автоматизированная обработка RIVSET® и RIVTAC® 2024, Július
Anonim
Image
Image

Ez egy egyszerű kis Arduino és szervo projekt, amely körülbelül két órát vesz igénybe. Szervó segítségével felemeli az üvegedény kupakjának egyik végét, hogy acélgolyót forgasson a belső kerület körül. Önindító, megváltoztathatja a sebességet, és egyszerre két (vagy több?) Golyót is forgathat. Élvezet építeni és dolgozni. Az időzítési paraméterekkel valószínűleg még gyorsabb sebességgel is lehet játszani. Néhány hall effekt érzékelőt mágneses golyóval lehet használni, hogy okosabb gép legyen, amely képes kitalálni a legjobb paramétereket.

Meg kell említenem, hogy valakinek itt az instructables.com webhelyen van egy kifinomultabb labdahenger gépe:

Szükséges anyagok:

Arduino Uno (vagy bármelyik Arduino)

Szervo pajzs (opcionális)

9 g szervó

üveg kupak

acélgolyó

néhány fahulladék

1. lépés: Készítse el az alap- és csuklós kupaktartót

Készítse el a talpat és a csuklós kupakot
Készítse el a talpat és a csuklós kupakot

Az alap csak egy darab fa, amire a csuklós fadarabot rögzítheti. A csuklós fának nagyobbnak kell lennie, mint az edény kupakja, amelyet használni fog, és elegendő hely kell legyen a csuklópántokhoz és a szervó felszereléséhez.

Kevés műanyag rc repülőgéppántot használtam, és csak ragasztottam őket a csuklós fához és az alaphoz.

2. lépés: Készítsen hosszabb szervókarot és rögzítse a szervót

Készítsen hosszabb szervókarot és rögzítse a szervót
Készítsen hosszabb szervókarot és rögzítse a szervót
Készítsen hosszabb szervókarot és rögzítse a szervót
Készítsen hosszabb szervókarot és rögzítse a szervót

Hosszabb szervókar készítéséhez csak egy 5 centis fadarabot erősítettem a szervókarhoz pár apró csavarral és anyával. A szervókarnak 90 fokosnak kell lennie a szervón, amikor vízszintes az alaphoz képest.

Most forróan ragasztottam a szervót a csuklós fa tartóhoz, de azt tapasztaltam, hogy ha néhány percnél tovább hagyja működni, a szervó felmelegíti a forró ragasztót, és elengedi a fát. Tehát jobb rögzítési módszer indokolt.

3. lépés: Töltse be és futtassa a vázlatot

Vázlat betöltése és futtatása
Vázlat betöltése és futtatása

A szervómat pajzs segítségével rögzítettem a 7 -es csaphoz, mert egyszerűen kényelmes, és csak néhány dollárba kerülnek. Ha nincs pajzsa, akkor csatlakoztassa a szervo jelvezetéket az Arduino 7 -es tűjéhez, a piros vezetéket az 5 A -hoz az Arduino -hoz, és a földelő vezetéket a GND -hez az Arduino -n. Az arduino -nak elegendő áramot kell biztosítania a szervó működtetéséhez. Az árnyékolást azért használom, mert könnyű a külső feszültséget csak a szervóhoz használni.

Itt a vázlat. Írtam egy szervo sebességszabályozó rutinot, hogy megváltoztassam a szervó sebességét, mert valószínűleg nem fog jól működni teljes sebességgel.

Módosíthatja a timingDelay -t, hogy különböző sebességű gördülést érjen el. A sebesség megváltoztatásához megváltoztathatja a myServo () függvény harmadik paraméterét is.

//////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////// /////////////// // készítette: Jim Demello, Shangluo Egyetem, 2017

// szabadon használhatod, manipulálhatod, bármit megtehetsz ezzel a kóddal, a nevem nem kötelező

// Ez a rutin lehetővé teszi tetszőleges számú szervó interpolálását, csak adjon hozzá új sorokat, ha a szervók száma meghaladja a 4 -et

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

#befoglalni

Szervo myservo1, myservo2; // szervo objektum létrehozása a szervó vezérlésére

int servoRead (int servoNumber) {

int servoCurrent;

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

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

visszatérő szervoCurrent;

}

void servoWrite (int servoNumber, int offset) {

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

if (servoNumber == 2) {myservo2.write (eltolás); }

}

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 szög = curAngle; szög <newAngle; szög += szögInc) {

if (servoNum == 1) myservo1.write (szög);

if (servoNum == 2) myservo2.write (szög);

késleltetés (incDelay); }

}

else if (curAngle> newAngle) {

for (int szög = curAngle; szög> newAngle; szög -= szögInc) {

if (servoNum == 1) myservo1.write (szög);

if (servoNum == 2) myservo2.write (szög);

késleltetés (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 és Current"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Current);

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

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

// Serial.print ("Servo6Pos és Current"); Serial.print (servo6Position); Serial.print (""); Serial.println (servo6Current);

// Sorozat.println ("");

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

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

int cOffsetTotal = 0, dOffsetTotal = 0;

cOffsetTotal = szervo1Current;

dOffsetTotal = szervo2Current;

for (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 és b eltolás"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); késleltetés (10);

késleltetés (timeDelay);

} // end for

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

// vigyázzon a modulo maradványokra //

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

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

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

}

int timingDelay = 100;

int servoDelay = 100;

int degGap = 10;

// Ez a kezdő fokozat (kisebbnek kell lennie, mint a végfok)

int degStart = 0;

// Ez a végfok (nagyobbnak kell lennie, mint a kezdő fok)

int degEnd = 360;

// Ez a kör sugara

int sugár = 8;

üres beállítás ()

{

Sorozat.kezdet (9600);

késleltetés (100);

myservo1.attach (7); // a 7 -es csap szervóját a szervo -objektumhoz rögzíti

myservo1.write (90);

myservo2.attach (8); // a szervo objektumhoz csatolja a 8 -as csap szervóját

myservo2.write (90);

késleltetés (1000); // várja, hogy a szervó odaérjen

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

késleltetés (1000);

}

void loop () {

timingDelay = 15; // 10 -kor dolgozik

servoDelay = 4;

spin4 ();

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

// delay (1000);

// exit (0); // program szüneteltetése - a folytatáshoz nyomja meg a reset gombot

}

void spin3 () {

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

késleltetés (timingDelay);

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

késleltetés (timingDelay);

}

void spin2 () {

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

késleltetés (timingDelay);

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

késleltetés (timingDelay);

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

késleltetés (timingDelay);

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

késleltetés (timingDelay);

}

void spin1 () {

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

float deg = (degStart * 3.141592 / 180); // fokok radiánokká alakítása

úszó xPos = 90 + (cos (deg) * sugár);

// xPos = kerek (xPos);

úszó yPos = 90 + (sin (deg) * sugár);

// yPos = kerek (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); // semleges

myservo1.write (xPos);

myservo2.write (yPos);

késleltetés (timingDelay);

if (degStart> = degEnd) {

degStart = 0;

ha (degGap> 180)

degGap = 180;

// degGap = 0;

más

degGap = degGap + 2;

degGap = degGap - 2;

// degStart = degStart +degGap;

}

degStart = degStart + degGap;

}

void spin4 () {

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

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

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

myservo1.write (j);

myservo2.write (k);

Sorozatnyomat (j);

Serial.print (",");

Soros.println (k);

késleltetés (100);

}

}

Ajánlott: