Tabla de contenido:
2025 Autor: John Day | [email protected]. Última modificación: 2025-01-13 06:57
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
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
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
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);
}
}