Kazalo:

Samodejni kroglični valj z Arduinom in enim servo: 3 koraki
Samodejni kroglični valj z Arduinom in enim servo: 3 koraki

Video: Samodejni kroglični valj z Arduinom in enim servo: 3 koraki

Video: Samodejni kroglični valj z Arduinom in enim servo: 3 koraki
Video: CS50 Live, серия 003 2024, November
Anonim
Image
Image

To je preprost mali Arduino in servo projekt, ki traja približno dve uri. Uporablja servo za dvig enega konca pokrova kozarca, tako da zavrtite jekleno kroglo po notranjem obodu. Samodejno se zažene, lahko spremeni hitrost in lahko vrti dve (ali več?) Kroglici hkrati. Zabavno graditi in delati. S časovnimi parametri se je mogoče igrati za verjetno še hitrejše hitrosti. Nekaj senzorjev za efekt dvorane z magnetno kroglo bi lahko uporabili, da bi postal pametnejši stroj, ki bi lahko ugotovil najboljše parametre.

Naj omenim, da ima nekdo na spletnem mestu instructables.com bolj izpopolnjen stroj za valjanje kroglic:

Potrebni materiali:

Arduino Uno (ali kateri koli Arduino)

Servo ščit (neobvezno)

9 g servo

pokrovček za kozarec

jeklena krogla

nekaj odpadnega lesa

Korak: Naredite držalo za bazo in pokrovček

Naredite držalo za osnovno in tečajno kapico
Naredite držalo za osnovno in tečajno kapico

Osnova je le kos lesa, na katerega lahko pritrdite tečaj lesa. Les na tečajih mora biti večji od pokrova kozarca, ki ga boste uporabili, in imeti dovolj prostora za tečaje in namestitev servomotorja.

Uporabil sem majhne plastične tečaje za letalske diske in jih lepil z vlečenim lesom na tečajih in podnožjem.

2. korak: Podaljšajte servo roko in jo pritrdite

Podaljšajte servo roko in jo pritrdite
Podaljšajte servo roko in jo pritrdite
Podaljšajte servo roko in jo pritrdite
Podaljšajte servo roko in jo pritrdite

Za daljšo servo roko sem na servo roko samo z nekaj majhnimi vijaki in maticami pritrdil 5 centimetrski kos lesa. Servo ročica mora biti na servo, ko je vodoravna glede na podlago, 90 stopinj.

Pravkar sem vroče zlepil servo na tečajno držalo za les, vendar sem ugotovil, da bo servo segrel vroče lepilo in ga spustil iz lesa, če ga pustite delovati dlje kot nekaj minut. Zato je boljša metoda pritrditve upravičena.

3. korak: Naložite in zaženite skico

Naloži in zaženi skico
Naloži in zaženi skico

Svoj servo sem pritrdil na pin 7 s ščitnikom, ker je to preprosto priročno in stanejo le nekaj dolarjev. Če nimate ščita, priključite servo signalno žico na pin 7 na Arduinu, rdečo žico na 5v na Arduinu in ozemljitveno žico na GND na Arduinu. Arduino mora zagotavljati dovolj toka za delovanje servo. Ščit uporabljam, ker je enostavno uporabiti zunanjo napetost samo za servo.

Tukaj je skica. Napisal sem rutino krmilnika hitrosti servo, da bi spremenil hitrost servo, ker verjetno ne bo dobro deloval pri polni hitrosti.

Časovni zamik lahko spremenite, da dosežete različne hitrosti valjanja žoge. Za spremembo hitrosti lahko spremenite tudi tretji parameter funkcije myServo ().

//////////////////////////////////////////////////////// //////////////////////////////////////////////////////// //////////////// // ustvaril Jim Demello, Univerza Shangluo, 2017

// s to kodo lahko prosto uporabljate, manipulirate in delate karkoli želite, moje ime ni potrebno

// Ta rutina omogoča interpolacijo poljubnega števila servomotorjev, samo dodajte nove vrstice, če število servomotorjev presega 4

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

#vključi

Servo myservo1, myservo2; // ustvarite servo objekt za nadzor servo

int servoRead (int servoNumber) {

int servoCurrent;

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

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

povratni servoTok;

}

void servoWrite (int servoNumber, int offset) {

if (številka servo == 1) {myservo1.write (odmik); }

if (številka servo == 2) {myservo2.write (odmik); }

}

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 kot = curAngle; kot <newAngle; kot += angleInc) {

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

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

zakasnitev (incDelay); }

}

else if (curAngle> newAngle) {

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

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

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

zakasnitev (incDelay); }

}

}

void interpolate2Servos (int servo1, int servo1Position, int servo2, int servo2Polition, int numberSteps, int timeDelay) {

int servo1Current, servo2Current;

servo1Current = servoRead (servo1);

servo2Current = servoRead (servo2);

// Serial.print ("Servo3Pos in tok"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Current);

// Serial.print ("Servo4Pos in tok"); Serial.print (servo4Position); Serial.print (""); Serial.println (servo4Current);

// Serial.print ("Servo5Pos in tok"); Serial.print (servo5Position); Serial.print (""); Serial.println (servo5Current);

// Serial.print ("Servo6Pos in tok"); 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;

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 ("odmik a in b"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); zamuda (10);

zakasnitev (timeDelay);

} // konec za

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

// poskrbimo za modularne ostanke //

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

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

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

}

int timingDelay = 100;

int servoDelay = 100;

int degGap = 10;

// To je začetna stopnja (mora biti manjša od končne stopnje)

int degStart = 0;

// To so končne stopnje (morajo biti večje od začetne stopnje)

int degEnd = 360;

// To je polmer kroga

int polmer = 8;

void setup ()

{

Serial.begin (9600);

zamuda (100);

myservo1.attach (7); // pritrdi servo na pin 7 na servo objekt

myservo1.write (90);

myservo2.attach (8); // pritrdi servo na pin 8 na servo objekt

myservo2.write (90);

zamuda (1000); // čaka na servo, da pride tja

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

zamuda (1000);

}

void loop () {

timingDelay = 15; // deluje ob 10

servoDelay = 4;

spin4 ();

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

// zakasnitev (1000);

// izhod (0); // začasno ustavi program - za nadaljevanje pritisnite reset

}

void spin3 () {

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

zamuda (timingDelay);

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

zamuda (timingDelay);

}

void spin2 () {

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

zamuda (timingDelay);

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

zamuda (timingDelay);

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

zamuda (timingDelay);

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

zamuda (timingDelay);

}

void spin1 () {

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

float deg = (degStart * 3.141592 / 180); // pretvorimo stopinje v radiane

float xPos = 90 + (cos (stop) * polmer);

// xPos = okrogel (xPos);

float yPos = 90 + (sin (stop) * polmer);

// yPos = okrogel (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); // nevtralno

myservo1.write (xPos);

myservo2.write (yPos);

zamuda (timingDelay);

if (degStart> = degEnd) {

degStart = 0;

če (degGap> 180)

degGap = 180;

// degGap = 0;

drugače

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;

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

myservo1.write (j);

myservo2.write (k);

Serijski.tisk (j);

Serial.print (",");

Serial.println (k);

zamuda (100);

}

}

Priporočena: