Obsah:

Automatický kuličkový válec s Arduinem a jedním servem: 3 kroky
Automatický kuličkový válec s Arduinem a jedním servem: 3 kroky

Video: Automatický kuličkový válec s Arduinem a jedním servem: 3 kroky

Video: Automatický kuličkový válec s Arduinem a jedním servem: 3 kroky
Video: Otočný stůl PRT - kluzný rotační pohyb 2024, Listopad
Anonim
Image
Image

Jedná se o jednoduchý malý projekt Arduino a servo, jehož dokončení trvá přibližně dvě hodiny. Pomocí serva zvedne jeden konec víčka nádoby tak, aby roztáčel ocelovou kouli po vnitřním obvodu. Je to samočinné spouštění, může měnit rychlost a může točit dvě (nebo více?) Koule najednou. Zábava stavět a pracovat. S časovacími parametry lze hrát pravděpodobně ještě rychleji. Mohlo by být použito několik senzorů s Hallovým efektem s magnetickou koulí, aby byl chytřejší stroj, který dokáže zjistit nejlepší parametry.

Měl bych zmínit, že někdo zde na instructables.com má důmyslnější stroj s kuličkovými válečky:

Potřebné materiály:

Arduino Uno (nebo jakékoli Arduino)

Servo štít (volitelně)

9g servo

jar cap

ocelový míč

nějaký šrot

Krok 1: Vyrobte základnu a sklopný držák víčka

Vyrobte základnu a sklopný držák čepice
Vyrobte základnu a sklopný držák čepice

Základna je jen kus dřeva, na který lze připevnit závěsný kus dřeva. Kloubové dřevo by mělo být větší než víčko nádoby, které budete používat, a mít dostatek místa pro závěsy a pro montáž serva.

Použil jsem malé plastové závěsy RC letadel a jen je přilepil na závěsné dřevo a základnu.

Krok 2: Vytvořte delší servo rameno a připojte servo

Prodlužte rameno serva a připojte servo
Prodlužte rameno serva a připojte servo
Prodlužte rameno serva a připojte servo
Prodlužte rameno serva a připojte servo

Abych vyrobil delší rameno serva, připevnil jsem na rameno serva 5 centimetrů dřeva pomocí několika malých šroubů a matic. Servo rameno by mělo být na 90 stupňů na servu, když je vodorovně k základně.

Právě jsem za tepla nalepil servo na kloubový držák dřeva, ale zjistil jsem, že pokud ho necháte běžet déle než několik minut, servo zahřeje horké lepidlo a pustí ho ze dřeva. Je tedy zaručena lepší metoda připevnění.

Krok 3: Načtěte a spusťte skicu

Načíst a spustit skicu
Načíst a spustit skicu

Připojil jsem své servo na pin 7 pomocí štítu, protože je to pohodlné a stojí jen pár dolarů. Pokud nemáte štít, připojte signální vodič serva ke kolíku 7 na Arduinu, červený vodič k 5v na Arduinu a uzemňovací vodič k GND na Arduinu. Arduino by mělo poskytovat dostatek proudu pro provoz serva. Používám štít, protože je snadné použít externí napětí jen pro servo.

Tady je skica. Napsal jsem rutinu ovladače rychlosti serva, abych změnil rychlost serva, protože to pravděpodobně nebude fungovat dobře při plné rychlosti.

Můžete změnit časové zpoždění, abyste získali různé rychlosti otáčení míče. Také můžete změnit třetí parametr funkce myServo () a změnit rychlost.

////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////// //////////////// // vytvořil Jim Demello, Shangluo University, 2017

// s tímto kódem můžete svobodně používat, manipulovat, dělat, co chcete, moje jméno není povinné

// Tato rutina umožňuje interpolovat libovolný počet serv, stačí přidat nové řádky, pokud počet serv přesáhne 4

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

#zahrnout

Servo myservo1, myservo2; // vytvoření objektu serva pro ovládání serva

int servoRead (int servoNumber) {

int servoCurrent;

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

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

vrátit 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;

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 (úhel);

if (servoNum == 2) myservo2.write (úhel);

zpoždění (včetně Zpoždění); }

}

else if (curAngle> newAngle) {

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

if (servoNum == 1) myservo1.write (úhel);

if (servoNum == 2) myservo2.write (úhel);

zpoždění (včetně Zpoždění); }

}

}

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 a aktuální"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Current);

// Serial.print ("Servo4Pos a aktuální"); Serial.print (servo4Position); Serial.print (""); Serial.println (servo4Current);

// Serial.print ("Servo5Pos a aktuální"); Serial.print (servo5Position); Serial.print (""); Serial.println (servo5Current);

// Serial.print ("Servo6Pos a aktuální"); 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;

pro (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 a b offset"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); zpoždění (10);

zpoždění (timeDelay);

} // konec pro

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

// postarejte se o zbytky modulo //

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

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

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

}

int timingDelay = 100;

int servoDelay = 100;

int degGap = 10;

// Toto je počáteční stupeň (musí být menší než koncový stupeň)

int degStart = 0;

// Toto jsou koncové stupně (musí být větší než počáteční stupeň)

int degEnd = 360;

// Toto je poloměr kruhu

int poloměr = 8;

neplatné nastavení ()

{

Serial.begin (9600);

zpoždění (100);

myservo1.attach (7); // připojí servo na pinu 7 k objektu serva

myservo1.write (90);

myservo2.attach (8); // připojí servo na pinu 8 k objektu serva

myservo2.write (90);

zpoždění (1000); // čeká, až se tam servo dostane

interpolate2Servos (1, 90, 2, 90, 10, 60); // neutrální

zpoždění (1000);

}

prázdná smyčka () {

timingDelay = 15; // funguje v 10

servoDelay = 4;

spin4 ();

// interpolate2Servos (1, 90, 2, 90, 1, 60); // neutrální

// zpoždění (1000);

// exit (0); // pozastavení programu - pokračujte stisknutím reset

}

void spin3 () {

interpolate2Servos (1, 90, 2, 110, 1, 60); // neutrální

zpoždění (timingDelay);

interpolate2Servos (1, 90, 2, 80, 1, 60); // neutrální

zpoždění (timingDelay);

}

void spin2 () {

// interpolate2Servos (1, 80, 2, 90, 1, 50); // neutrální

zpoždění (timingDelay);

interpolate2Servos (1, 80, 2, 80, 1, 60); // neutrální

zpoždění (timingDelay);

interpolate2Servos (1, 110, 2, 80, 1, 60); // neutrální

zpoždění (timingDelay);

// interpolate2Servos (1, 110, 2, 110, 1, 60); // neutrální

zpoždění (timingDelay);

}

void spin1 () {

// int deg = (degStart / (180 / 3,14));

float deg = (degStart * 3,141592 / 180); // převod stupňů na radiány

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

// xPos = kulatý (xPos);

float yPos = 90 + (sin (deg) * radius);

// yPos = kulatý (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); // neutrální

myservo1.write (xPos);

myservo2.write (yPos);

zpoždění (timingDelay);

if (degStart> = degEnd) {

degStart = 0;

if (degGap> 180)

degGap = 180;

// degGap = 0;

jiný

degGap = degGap + 2;

degGap = degGap - 2;

// degStart = degStart +degGap;

}

degStart = degStart + degGap;

}

void spin4 () {

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

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

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

myservo1.write (j);

myservo2.write (k);

Serial.print (j);

Serial.print (",");

Serial.println (k);

zpoždění (100);

}

}

Doporučuje: