INHOUDSOPGAWE:

Outomatiese balroller met Arduino en een servo: 3 stappe
Outomatiese balroller met Arduino en een servo: 3 stappe

Video: Outomatiese balroller met Arduino en een servo: 3 stappe

Video: Outomatiese balroller met Arduino en een servo: 3 stappe
Video: Bedien de servomotor met een potentiometer met Arduino 2024, November
Anonim
Image
Image

Dit is 'n eenvoudige klein Arduino- en servoprojek wat ongeveer twee uur neem om af te handel. Dit gebruik 'n servo om die een kant van die kruikdop op te lig om 'n staalbal om die binneste omtrek te draai. Dit begin self, kan spoed verander en kan twee (of meer?) Balle tegelyk draai. Lekker om te bou en aan die werk te sit. Daar kan met die tydsberekeningparameters gespeel word vir waarskynlik selfs vinniger snelhede. 'N Paar hall -effek sensors met 'n magnetiese bal kan gebruik word om 'n slimmer masjien te maak wat die beste parameters kan bepaal.

Ek moet noem dat iemand hier op instructables.com 'n meer gesofistikeerde balrolmasjien het:

Materiaal benodig:

Arduino Uno (of enige Arduino)

Servoskerm (opsioneel)

9 g servo

kruikdop

staal bal

bietjie afvalhout

Stap 1: Maak 'n voetstuk en 'n skarnierhouer

Maak voetstuk en skarnierdophouer
Maak voetstuk en skarnierdophouer

Die basis is net 'n stuk hout om die skarnierstuk op te sit. Die skarnierhout moet groter wees as 'n potdop wat u sal gebruik en moet genoeg plek hê vir die skarniere en om die servo te monteer.

Ek het klein plastiek -rc -vliegtuie -skarniere gebruik en dit net aan die skarnierhout en die basis vasgemaak.

Stap 2: Maak langer servo -arm en sit servo aan

Maak 'n langer servo -arm en sit die servo vas
Maak 'n langer servo -arm en sit die servo vas
Maak 'n langer servo -arm en sit servo vas
Maak 'n langer servo -arm en sit servo vas

Om 'n langer servo -arm te maak, het ek net 'n stuk hout van 5 sentimeter aan die servo -arm vasgemaak met 'n paar klein skroewe en moere. Die servo -arm moet 90 grade op die servo wees as dit horisontaal teenoor die basis is.

Ek het die servo net aan die skarnierhouthouer vasgeplak, maar ek het agtergekom dat as die servet langer as 'n paar minute toegedien word, die servo die warm gom sal verhit en uit die hout kan los. Dus is 'n beter hegmetode geregverdig.

Stap 3: Laai en voer skets uit

Laai en voer skets uit
Laai en voer skets uit

Ek het my servo met 'n skild aan pen 7 geheg, want dit is net gerieflik en kos slegs 'n paar dollar. As u nie 'n skild het nie, heg dan die servo seindraad aan pen 7 op die Arduino, die rooi draad na 5v op die Arduino en die gronddraad aan GND op die Arduino. Die arduino moet genoeg stroom verskaf om die servo te bestuur. Ek gebruik die skild omdat dit maklik is om 'n eksterne spanning net vir die servo te gebruik.

Hier is die skets. Ek het 'n servosnelheidsregelaarroetine geskryf om die snelheid van die servo te verander, want dit werk waarskynlik nie goed op volle spoed nie.

U kan die tydsvertraging verander om verskillende snelhede van die bal te laat rol. U kan ook die derde parameter van die myServo () -funksie verander om ook die spoed te verander.

//////////////////////////////////////////////////// //////////////////////////////////////////////////// //////////////// // geskep deur Jim Demello, Shangluo Universiteit, 2017

// jy is vry om te gebruik, te manipuleer, te doen wat jy wil met hierdie kode; my naam is nie nodig nie

// Met hierdie roetine kan enige aantal servo's geïnterpoleer word, voeg net nuwe reëls by as die aantal servo's 4 oorskry

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

#insluit

Servo myservo1, myservo2; // skep servo -voorwerp om 'n servo te beheer

int servoRead (int servoNumber) {

int servoCurrent;

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

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

stuur servoCurrent terug;

}

void servoWrite (int servoNumber, int offset) {

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

as (servoNumber == 2) {myservo2.write (offset); }

}

void myServo (int newAngle, int angleInc, int incDelay, int servoNum) {

int curAngle;

as (servoNum == 1) {curAngle = myservo1.read (); }

as (servoNum == 2) {curAngle = myservo2.read (); }

if (curAngle <newAngle) {

for (int hoek = curAngle; hoek <newAngle; hoek += hoekInc) {

as (servoNum == 1) myservo1.write (hoek);

as (servoNum == 2) myservo2.write (hoek);

vertraging (incDelay); }

}

anders as (curAngle> newAngle) {

for (int hoek = curAngle; hoek> newAngle; hoek -= hoekInc) {

as (servoNum == 1) myservo1.write (hoek);

as (servoNum == 2) myservo2.write (hoek);

vertraging (incDelay); }

}

}

leegte interpolate2Servos (int servo1, int servo1Posisie, int servo2, int servo2Posisie, int numberSteps, int timeDelay) {

int servo1Current, servo2Current;

servo1Current = servoRead (servo1);

servo2Current = servoRead (servo2);

// Serial.print ("Servo3Pos en Current"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Current);

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

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

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

vir (int x = 0; x

if (servo1Position> servo1Current) {cOffsetTotal = cOffsetTotal + cOffset; }

anders {cOffsetTotal = cOffsetTotal - cOffset; }

if (servo2Position> servo2Current) {dOffsetTotal = dOffsetTotal + dOffset; }

anders {dOffsetTotal = dOffsetTotal - dOffset; }

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

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

// Serial.print ("a en b offset"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); vertraging (10);

vertraging (timeDelay);

} // eindig vir

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

// sorg vir modulo reste //

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

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

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

}

int timingDelay = 100;

int servoDelay = 100;

int degGap = 10;

// Dit is die begingraad (moet minder as eindgraad wees)

int degStart = 0;

// Dit is die eindgrade (moet groter wees as die begingraad)

int degEnd = 360;

// Dit is die sirkelradius

int radius = 8;

leemte opstelling ()

{

Serial.begin (9600);

vertraging (100);

myservo1.aanheg (7); // plak die servo op pen 7 aan die servo -voorwerp

myservo1.write (90);

myservo2.aanheg (8); // plak die servo op pen 8 aan die servo -voorwerp

myservo2.write (90);

vertraging (1000); // wag vir die servo om daar te kom

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

vertraging (1000);

}

leemte -lus () {

tydsberekening = 15; // werk om 10

servoDelay = 4;

spin4 ();

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

// vertraging (1000);

// uitgang (0); // pouse program - druk reset om voort te gaan

}

leemte spin3 () {

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

vertraging (timingDelay);

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

vertraging (timingDelay);

}

leemte spin2 () {

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

vertraging (timingDelay);

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

vertraging (timingDelay);

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

vertraging (timingDelay);

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

vertraging (timingDelay);

}

leemte spin1 () {

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

float deg = (degStart * 3.141592 / 180); // skakel grade om in radiale

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

// xPos = rond (xPos);

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

// yPos = rond (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); // neutraal

myservo1.write (xPos);

myservo2.write (yPos);

vertraging (timingDelay);

as (degStart> = degEnd) {

degStart = 0;

as (degGap> 180)

degGap = 180;

// degGap = 0;

anders

degGap = degGap + 2;

degGap = degGap - 2;

// degStart = degStart +degGap;

}

degStart = degStart + degGap;

}

ongeldig spin4 () {

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

Reeks.afdruk (j);

Serial.print (",");

Serial.println (k);

vertraging (100);

}

}

Aanbeveel: