Taula de continguts:

Corró de boles automatitzat amb Arduino i un servo: 3 passos
Corró de boles automatitzat amb Arduino i un servo: 3 passos

Vídeo: Corró de boles automatitzat amb Arduino i un servo: 3 passos

Vídeo: Corró de boles automatitzat amb Arduino i un servo: 3 passos
Vídeo: CS50 2015 - Week 4 2024, De novembre
Anonim
Image
Image

Es tracta d’un petit projecte Arduino i servo que dura aproximadament dues hores per completar-se. Utilitza un servo per aixecar un extrem d’una tapa de gerra per fer girar una bola d’acer al voltant de la circumferència interior. S'inicia automàticament, pot canviar de velocitat i pot girar dues (o més?) Boles alhora. Diversió per construir i treballar. Els paràmetres de temps es poden jugar amb probablement velocitats encara més ràpides. Es podrien utilitzar uns quants sensors d’efecte de sala amb una bola magnètica per convertir-la en una màquina més intel·ligent que pugui esbrinar els millors paràmetres.

He d’esmentar que algú d’aquí a instructables.com té una màquina de rodets de boles més sofisticada:

Materials necessaris:

Arduino Uno (o qualsevol Arduino)

Escut servo (opcional)

Servo de 9 g

gorra de pot

bola d'acer

una mica de ferralla

Pas 1: Feu el suport de la base i el tap taponat

Feu el suport de la base i el tap taponat
Feu el suport de la base i el tap taponat

La base és només un tros de fusta per muntar-hi el tros articulat. La fusta articulada hauria de ser més gran que una tapa de pot que utilitzeu i tenir prou espai per a les frontisses i per muntar el servo.

Vaig utilitzar petites frontisses d'avió RC de plàstic i les vaig encolar a la fusta articulada i a la base.

Pas 2: feu més llarg el braç de servo i connecteu el servo

Feu un braç de servo més llarg i fixeu-lo
Feu un braç de servo més llarg i fixeu-lo
Feu un braç de servo més llarg i fixeu-lo
Feu un braç de servo més llarg i fixeu-lo

Per fer un servo braç més llarg, acabo d’adherir un tros de fusta de 5 centímetres al braç servo amb un parell de petits cargols i femelles. El braç del servo ha d’estar a 90 graus del servo quan estigui horitzontal a la base.

Acabo d’enganxar el servo al suport de fusta articulada, però he descobert que, si el deixeu funcionar durant més de pocs minuts, el servo escalfarà la cola calenta i deixarà anar la fusta. Per tant, es garanteix un millor mètode d’adjunt.

Pas 3: carregueu i executeu Sketch

Carrega i executa l'esbós
Carrega i executa l'esbós

Vaig connectar el servo al pin 7 mitjançant un escut perquè és convenient i només costen uns quants dòlars. Si no teniu cap blindatge, connecteu el cable de senyal del servo al pin 7 de l'Arduino, el cable vermell a 5v a l'Arduino i el cable de terra a GND a l'Arduino. L'arduino ha de proporcionar prou corrent per fer funcionar el servo. Faig servir el blindatge perquè és fàcil utilitzar un voltatge extern només per al servo.

Aquí teniu l’esbós. Vaig escriure una rutina de control de velocitat del servo per alterar la velocitat del servo perquè probablement no funcionarà bé a tota velocitat.

Podeu alterar el timingDelay per obtenir diferents velocitats de rodament de boles. També podeu modificar el tercer paràmetre de la funció myServo () per canviar la velocitat també.

////////////////////////////////////////////////////// ////////////////////////////////////////////////////// ////////////// // creat per Jim Demello, Universitat de Shangluo, 2017

// Ets lliure d'utilitzar, manipular, fer el que vulguis amb aquest codi, el meu nom no és obligatori

// Aquesta rutina permet interpolar qualsevol nombre de servos, només cal afegir línies noves si el nombre de servos supera 4

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

#incloure

Servo myservo1, myservo2; // crear un objecte servo per controlar un servo

int servoRead (int servoNumber) {

int servoCurrent;

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

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

tornar 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 (angle);

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

endarreriment (incDelay); }

}

else if (curAngle> newAngle) {

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

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

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

endarreriment (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 i actual"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Current);

// Serial.print ("Servo4Pos i actual"); Serial.print (servo4Position); Serial.print (""); Serial.println (servo4Current);

// Serial.print ("Servo5Pos i actual"); Serial.print (servo5Position); Serial.print (""); Serial.println (servo5Current);

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

per a (int x = 0; x

if (servo1Posició> 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 ("Offset a i b"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); retard (10);

retard (timeDelay);

} // finalitzar per

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

// tenir cura de les restes del mòdul //

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

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

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

}

int timingDelay = 100;

int servoDelay = 100;

int degGap = 10;

// Aquest és el grau inicial (ha de ser inferior al grau final)

int degStart = 0;

// Aquest és el grau final (ha de ser superior al grau inicial)

int degEnd = 360;

// Aquest és el radi del cercle

radi int = 8;

configuració nul·la ()

{

Serial.begin (9600);

retard (100);

myservo1.attach (7); // fixa el servo al pin 7 a l'objecte servo

myservo1.write (90);

myservo2.attach (8); // fixa el servo al pin 8 a l'objecte servo

myservo2.write (90);

retard (1000); // espera que arribi el servo

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

retard (1000);

}

bucle buit () {

timingDelay = 15; // funciona a les 10

servoDelay = 4;

spin4 ();

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

// demora (1000);

// sortir (0); // pausa programa: prem restablir per continuar

}

buit spin3 () {

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

endarreriment (timingDelay);

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

endarreriment (timingDelay);

}

buit spin2 () {

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

endarreriment (timingDelay);

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

endarreriment (timingDelay);

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

endarreriment (timingDelay);

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

endarreriment (timingDelay);

}

buit spin1 () {

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

float deg = (degStart * 3.141592 / 180); // converteix els graus en radians

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

// xPos = rodó (xPos);

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

// yPos = rodó (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); // neutre

myservo1.write (xPos);

myservo2.write (yPos);

endarreriment (timingDelay);

if (degStart> = degEnd) {

degStart = 0;

si (degGap> 180)

degGap = 180;

// degGap = 0;

en cas contrari

degGap = degGap + 2;

degGap = degGap - 2;

// degStart = degStart + degGap;

}

degStart = degStart + degGap;

}

void spin4 () {

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

flotador j = 20 * (cos ((3.14 * i) / 180)) + 90;

flotador k = 20 * (sin ((3.14 * i) / 180)) + 90;

myservo1.write (j);

myservo2.write (k);

Serial.print (j);

Serial.print (",");

Serial.println (k);

retard (100);

}

}

Recomanat: