Obsah:

Automatizovaný valček s Arduinom a jedným servom: 3 kroky
Automatizovaný valček s Arduinom a jedným servom: 3 kroky

Video: Automatizovaný valček s Arduinom a jedným servom: 3 kroky

Video: Automatizovaný valček s Arduinom a jedným servom: 3 kroky
Video: Startovat auto se spojkou, nebo bez? Martin Vaculík vysvětlí, proč je jen jedna možnost správně 2024, Júl
Anonim
Image
Image

Jedná sa o jednoduchý malý projekt Arduino a servo, ktorého dokončenie trvá asi dve hodiny. Pomocou serva zdvihnite jeden koniec uzáveru nádoby a roztočte oceľovú guľu po vnútornom obvode. Je samočinný, môže meniť rýchlosť a môže točiť dvoma (alebo viacerými?) Loptičkami naraz. Zábava stavať a pracovať. S časovacími parametrami sa dá hrať pravdepodobne ešte vo vyšších rýchlostiach. Na to, aby bol inteligentnejší stroj, ktorý dokáže zistiť najlepšie parametre, by bolo možné použiť niekoľko senzorov s Hallovým efektom s magnetickou guľou.

Mal by som spomenúť, že niekto tu na instructables.com má sofistikovanejší stroj s valčekmi:

Potrebný materiál:

Arduino Uno (alebo akékoľvek Arduino)

Servo štít (voliteľné)

9g servo

zavárací uzáver

oceľová guľa

nejaký šrot

Krok 1: Vyrobte si základňu a sklopný držiak uzáveru

Vyrobte si základňu a sklopný držiak uzáveru
Vyrobte si základňu a sklopný držiak uzáveru

Základňa je len kus dreva, na ktorý je možné zavesiť zavesený kus dreva. Kĺbové drevo by malo byť väčšie ako uzáver nádoby, ktorý budete používať, a mal by mať dostatok miesta na pánty a montáž serva.

Použil som malé plastové závesy lietadiel na diaľkové ovládanie a len ich zalepil horným závesom k závesnému drevu a základni.

Krok 2: Predĺžte rameno servo a pripevnite servo

Predĺžte rameno serva a pripevnite servo
Predĺžte rameno serva a pripevnite servo
Predĺžte rameno serva a pripevnite servo
Predĺžte rameno serva a pripevnite servo

Aby som vyrobil dlhšie servo rameno, pripevnil som k servo ramenu 5 centimetrový kus dreva niekoľkými malými skrutkami a maticami. Rameno serva by malo byť na servo v 90 stupňoch, keď je vodorovne k základni.

Práve som za tepla nalepil servo na sklopný držiak na drevo, ale zistil som, že ak ho necháte bežať dlhšie ako niekoľko minút, servo zohreje horúce lepidlo a pustí ho z dreva. Preto je zaručená lepšia metóda pripevnenia.

Krok 3: Načítajte a spustite náčrt

Načítať a spustiť skicu
Načítať a spustiť skicu

Svoje servo som pripevnil na pin 7 pomocou štítu, pretože je to jednoducho pohodlné a stoja len pár dolárov. Ak nemáte štít, pripojte signálny vodič serva k pinu 7 na Arduino, červený vodič k 5v na Arduino a uzemňovací vodič k GND na Arduino. Arduino by malo poskytovať dostatok prúdu na obsluhu serva. Používam štít, pretože je ľahké použiť externé napätie iba pre servo.

Tu je náčrt. Napísal som rutinu regulátora rýchlosti serva, aby som zmenil rýchlosť serva, pretože pravdepodobne nebude fungovať dobre pri plnej rýchlosti.

Časovanie oneskorenia môžete zmeniť, aby ste dosiahli rôzne rýchlosti valenia lopty. Na zmenu rýchlosti môžete tiež zmeniť tretí parameter funkcie myServo ().

////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////// //////////////// // vytvoril Jim Demello, Shangluo University, 2017

// pomocou tohto kódu môžete voľne používať, manipulovať a robiť si čokoľvek, moje meno nie je povinné

// Táto rutina umožňuje interpolovať ľubovoľný počet serv, stačí pridať nové riadky, ak počet serva prekročí 4

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

#zahrnúť

Servo myservo1, myservo2; // vytvorenie objektu serva na ovládanie serva

int servoRead (int servoNumber) {

int servoCurrent;

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

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

vrátiť 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) {

pre (int uhol = curAngle; uhol <newAngle; uhol += uholInc) {

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

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

oneskorenie (vrátane oneskorenia); }

}

else if (curAngle> newAngle) {

pre (int uhol = curAngle; uhol> newAngle; uhol -= uholInc) {

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

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

oneskorenie (vrátane oneskorenia); }

}

}

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álny"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Current);

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

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

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

pre (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 ("Ofset aab" "); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); oneskorenie (10);

oneskorenie (časové oneskorenie);

} // koniec pre

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

// postarajte sa o zvyšky modula //

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

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

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

}

int timingDelay = 100;

int servoDelay = 100;

int degGap = 10;

// Toto je počiatočný stupeň (musí byť menší ako koncový stupeň)

int degStart = 0;

// Toto sú koncové stupne (musia byť väčšie ako počiatočný stupeň)

int degEnd = 360;

// Toto je polomer kruhu

vnútorný polomer = 8;

neplatné nastavenie ()

{

Serial.begin (9600);

oneskorenie (100);

myservo1.attach (7); // pripevní servo na pine 7 k objektu serva

myservo1.write (90);

myservo2.attach (8); // pripevní servo na kolíku 8 k objektu serva

myservo2.write (90);

oneskorenie (1000); // čaká, kým sa tam servo dostane

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

oneskorenie (1000);

}

prázdna slučka () {

timingDelay = 15; // funguje o 10

servoDelay = 4;

spin4 ();

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

// oneskorenie (1000);

// exit (0); // pozastavenie programu - pokračujte kliknutím na reset

}

void spin3 () {

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

oneskorenie (timingDelay);

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

oneskorenie (timingDelay);

}

void spin2 () {

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

oneskorenie (timingDelay);

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

oneskorenie (timingDelay);

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

oneskorenie (timingDelay);

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

oneskorenie (timingDelay);

}

void spin1 () {

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

float deg = (degStart * 3,141592 / 180); // prevod stupňov na radiány

plavák xPos = 90 + (cos (deg) * polomer);

// xPos = okrúhly (xPos);

plavák yPos = 90 + (sin (deg) * polomer);

// yPos = okrúhly (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álne

myservo1.write (xPos);

myservo2.write (yPos);

oneskorenie (timingDelay);

if (degStart> = degEnd) {

degStart = 0;

ak (degGap> 180)

degGap = 180;

// degGap = 0;

inak

degGap = degGap + 2;

degGap = degGap - 2;

// degStart = degStart +degGap;

}

degStart = degStart + degGap;

}

void spin4 () {

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

oneskorenie (100);

}

}

Odporúča: