Tabla de contenido:

Rodillo de bolas automatizado con Arduino y un servo: 3 pasos
Rodillo de bolas automatizado con Arduino y un servo: 3 pasos

Video: Rodillo de bolas automatizado con Arduino y un servo: 3 pasos

Video: Rodillo de bolas automatizado con Arduino y un servo: 3 pasos
Video: ¿Cómo funciona un ENCODER? Lineal y Rotativo, Incremental y Absoluto 2024, Noviembre
Anonim
Image
Image

Este es un pequeño proyecto simple de Arduino y servo que tarda unas dos horas en completarse. Utiliza un servo para levantar un extremo de la tapa de un frasco y hacer girar una bola de acero alrededor de la circunferencia interior. Se inicia automáticamente, puede cambiar de velocidad y puede girar dos (¿o más?) Bolas a la vez. Divertido de construir y empezar a trabajar. Los parámetros de tiempo se pueden reproducir para velocidades probablemente incluso más rápidas. Se podrían usar algunos sensores de efecto hall con una bola magnética para convertirla en una máquina más inteligente que pueda descubrir los mejores parámetros.

Debo mencionar que alguien aquí en instructables.com tiene una máquina de rodillos de bolas más sofisticada:

Materiales necesitados:

Arduino Uno (o cualquier Arduino)

Servo escudo (opcional)

Servo de 9g

tapa del frasco

bola de acero

un poco de madera de desecho

Paso 1: Haga la base y el soporte de la tapa con bisagras

Hacer base y soporte de tapa con bisagras
Hacer base y soporte de tapa con bisagras

La base es solo un trozo de madera para montar la pieza de madera con bisagras. La madera con bisagras debe ser más grande que la tapa de un frasco que usarás y tener suficiente espacio para las bisagras y para montar el servo.

Usé pequeñas bisagras de plástico rc para aviones y las pegué a la madera con bisagras y a la base.

Paso 2: Haga un brazo servo más largo y conecte el servo

Haga un brazo servo más largo y conecte el servo
Haga un brazo servo más largo y conecte el servo
Haga un brazo servo más largo y conecte el servo
Haga un brazo servo más largo y conecte el servo

Para hacer un brazo de servo más largo, simplemente adjunté una pieza de madera de 5 centímetros al brazo del servo con un par de pequeños tornillos y tuercas. El brazo del servo debe estar a 90 grados en el servo cuando está horizontal a la base.

Acabo de pegar en caliente el servo al soporte de madera con bisagras, pero descubrí que si lo dejas funcionar por más de unos minutos, el servo calentará el pegamento caliente y se soltará de la madera. Por lo tanto, se justifica un mejor método de apego.

Paso 3: Cargue y ejecute el croquis

Cargar y ejecutar croquis
Cargar y ejecutar croquis

Conecté mi servo al pin 7 usando un escudo porque es conveniente y solo cuestan unos pocos dólares. Si no tiene un escudo, conecte el cable de señal del servo al pin 7 en el Arduino, el cable rojo a 5v en el Arduino y el cable de tierra a GND en el Arduino. El arduino debe proporcionar suficiente corriente para operar el servo. Utilizo el escudo porque es fácil usar un voltaje externo solo para el servo.

Aquí está el boceto. Escribí una rutina del controlador de velocidad del servo para alterar la velocidad del servo porque probablemente no funcionará bien a toda velocidad.

Puede modificar el timingDelay para obtener diferentes velocidades de rodadura de la bola. También puede modificar el tercer parámetro de la función myServo () para cambiar la velocidad.

//////////////////////////////////////////////////// //////////////////////////////////////////////////// ////////////// // creado por Jim Demello, Universidad Shangluo, 2017

// eres libre de usar, manipular, hacer lo que quieras con este código, mi nombre no es obligatorio

// Esta rutina permite interpolar cualquier número de servos, solo agregue nuevas líneas si el número de servos excede 4

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

#incluir

Servo myservo1, myservo2; // crea un objeto servo para controlar un servo

int servoRead (int servoNumber) {

int servoCurrent;

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

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

return 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 ángulo = curAngle; angle <newAngle; angle + = angleInc) {

if (servoNum == 1) myservo1.write (ángulo);

if (servoNum == 2) myservo2.write (ángulo);

delay (incDelay); }

}

else if (curAngle> newAngle) {

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

if (servoNum == 1) myservo1.write (ángulo);

if (servoNum == 2) myservo2.write (ángulo);

delay (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 y Actual"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Current);

// Serial.print ("Servo4Pos y Actual"); Serial.print (servo4Position); Serial.print (""); Serial.println (servo4Current);

// Serial.print ("Servo5Pos y Actual"); Serial.print (servo5Position); Serial.print (""); Serial.println (servo5Current);

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

para (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 ("Desplazamiento ayb"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); retraso (10);

delay (timeDelay);

} // final para

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

// cuidar los restos de módulo //

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

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

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

}

int timingDelay = 100;

int servoDelay = 100;

int degGap = 10;

// Este es el grado inicial (debe ser menor que el grado final)

int degStart = 0;

// Estos son los grados finales (deben ser mayores que el grado inicial)

int degEnd = 360;

// Este es el radio del círculo

int radio = 8;

configuración vacía ()

{

Serial.begin (9600);

retraso (100);

myservo1.attach (7); // conecta el servo en el pin 7 al objeto servo

myservo1.write (90);

myservo2.attach (8); // conecta el servo en el pin 8 al objeto servo

myservo2.write (90);

retraso (1000); // espera a que llegue el servo

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

retraso (1000);

}

bucle vacío () {

timingDelay = 15; // funciona a las 10

servoDelay = 4;

spin4 ();

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

// retraso (1000);

// salir (0); // pausar el programa - presione reiniciar para continuar

}

void spin3 () {

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

delay (timingDelay);

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

delay (timingDelay);

}

void spin2 () {

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

delay (timingDelay);

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

delay (timingDelay);

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

delay (timingDelay);

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

delay (timingDelay);

}

void spin1 () {

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

flotar grados = (gradosStart * 3.141592 / 180); // convertir grados a radianes

flotar xPos = 90 + (cos (grados) * radio);

// xPos = round (xPos);

flotar yPos = 90 + (sin (grados) * radio);

// yPos = round (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.print ("y ="); Serial. println (yPos);

// interpolate2Servos (1, xPos, 2, yPos, 1, servoDelay); // neutral

myservo1.write (xPos);

myservo2.write (yPos);

delay (timingDelay);

if (degStart> = degEnd) {

degStart = 0;

si (degGap> 180)

degGap = 180;

// degGap = 0;

demás

degGap = degGap + 2;

degGap = degGap - 2;

// degStart = degStart + degGap;

}

degStart = degStart + degGap;

}

void spin4 () {

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

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

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

myservo1.write (j);

myservo2.write (k);

Serial.print (j);

Serial.print (",");

Serial.println (k);

retraso (100);

}

}

Recomendado: