Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
You are viewing an older revision! See the latest version
CUADRUPEDO_SERVOS
ARAÑA CUADRUPEDA LINKI El presente proyecto consiste en el diseño, fabricación y control del robot cuadrúpedo imprimible llamado LINKI. Ha sido realizado en el departamento de Ingeniería mecatrónica de la Universidad colombiana de carreras industriales (ECCI) como Trabajo de fin de semestre. OBJETIVOS 1. Estudio y aplicaciones de los distintos robots ‘n-podos’ (robots andadores de ‘n’ patas) para la elección del modelo físico óptimo sobre el que se ha basado el desarrollo de todo el proyecto. 2. Diseño del robot cuadrúpedo LINKI. 3. Impresión de las piezas diseñadas en plástico gracias a impresoras 3D. 4. Montaje de la estructura física del robot e instalación de la electrónica necesaria para su control. 5. Control remoto por medio de un tarjeta núcleo F446ZE conectado al PC. 6. Implementación y evaluación del diseño Programación de movimientos básicos El LINKI es un proyecto de robot eficiente, porque con pocos recursos técnicos y económicos se ha conseguido una base útil y completa de robot andador. Además, es un proyecto de robot flexible ya que su diseño está abierto a muchas posibilidades de evolución para trabajos futuros. FABRICACION Y MONTAJE En este apartado se dan detalles y pasos de cómo se han montado todos los elementos que componen el LINKI, tanto las piezas impresas y servomotores que forman la estructura física como las conexiones eléctricas necesarias para el funcionamiento completo del robot. Para la ejecución de este robot cuadrúpedo tipo araña hemos dispuesto de diferentes componentes y materiales así: • 8 servomotores • tarjeta nucleo- 446ZE • estructura en acrílico de 3mm de espesor. • 40 tornillos m3 x 10 • 16 tornillos m3 x 12 • 56 tuercas m3 • JOYSTICK Manual de ensamble de robot /media/uploads/Yances64/manual_ensamblaje_cuadrupedo.pdf
MOVIMIENTOS: Cada color sera sensado y genera un movimiento adicional. AZUL VERDE ROJO AMARILLO servo1.pulsewidth_us(1025); wait (0.5); Servo2.pulsewidth_us(1711); wait (0.5); Servo1.pulsewidth_us(1412); wait (0.5); Servo7.pulsewidth_us(1025); wait (0.5); Servo8.pulsewidth_us(1319); wait (0.5); Servo7.pulsewidth_us(1417); wait (0.5); Servo2.pulsewidth_us(1515); Servo8.pulsewidth_us(1515); wait (0.5); Servo3.pulsewidth_us(1221); wait (0.5);
Servo1.pulsewidth_us(700); wait (1); Servo3.pulsewidth_us(700); wait (1); Servo5.pulsewidth_us(700); wait (1); Servo7.pulsewidth_us(700); wait (1); Servo3.pulsewidth_us(700); wait (1); Servo1.pulsewidth_us(1500); wait (1); Servo3.pulsewidth_us(1500); wait (1); Servo5.pulsewidth_us(1500); wait (1); Servo7.pulsewidth_us(1500); wait (1); Servo1.pulsewidth_us(1025); wait (0.5); Servo2.pulsewidth_us(1319); wait (0.5); Servo1.pulsewidth_us(1412); wait (0.5); Servo7.pulsewidth_us(1025); wait (0.5); Servo8.pulsewidth_us(1809); wait (0.5); Servo7.pulsewidth_us(1417); wait (0.5); Servo2.pulsewidth_us(1515); Servo8.pulsewidth_us(1515); wait (0.5); Servo3.pulsewidth_us(1221); wait (0.5);
Servo1.pulsewidth_us(700); wait (1); Servo3.pulsewidth_us(700); wait (1); Servo5.pulsewidth_us(700); wait (1); Servo7.pulsewidth_us(700); wait (1); Servo3.pulsewidth_us(700); wait (1); Servo1.pulsewidth_us(1500); wait (1); Servo3.pulsewidth_us(1500); wait (1); Servo5.pulsewidth_us(1500); wait (1); Servo7.pulsewidth_us(1500); wait (1);
El ingreso para la programación del LINKI inicia con unos omandos establecidos estos “comandos” deben estar en código ascii el cual nos ayudara a configurar los movimientos que deseamos
FF= INICIALIZA EL ROBOT 01= LLAMA LA VARIABLE PARA MOVER UN SOLO MOTOR 00= LOS GRADOS PARA MOVER EL SERVOMOTOR FD= FINALIZAR NUESTRA FUNCION
PROGRAMACION main.cpp:
- include "mbed.h"
- include "main.h"
int Conf_Servos(); int ConfTransmi(); int RutColor(); void MoverMotor (uint8_t motor, uint8_t grados); void MoverConjunto(uint8_t motores, uint8_t posicion);
DigitalIn entrada (PE_15); DigitalOut S3 (PB_0); DigitalOut S2 (PE_0);
PwmOut Servo1(PB_11); PwmOut Servo2(PB_10); PwmOut Servo3(PA_0); PwmOut Servo4(PE_14); PwmOut Servo5(PE_12); PwmOut Servo6(PE_10); PwmOut Servo7(PD_12); PwmOut Servo8(PD_13);
Serial Transmi(USBTX, USBRX); Timer tiempo;
int inicio; char funcion; uint8_t motor_es; uint8_t grados_posicion; int cierre; float AnchoPulso; int valor; int color=0; int rojo=0; int azul=0; int verde=0; int Detectar(); int tme=0;
int main() {
while (1){
Conf_Servos(); ConfTransmi();
Transmi.printf("\n Inicio. \n");
inicio=Transmi.getc(); if (inicio==0xFF) { funcion=Transmi.getc(); motor_es=Transmi.getc(); grados_posicion=Transmi.getc(); cierre=Transmi.getc();
if (cierre==0xFD){
switch (funcion){ case 0x01:{
MoverMotor(motor_es,grados_posicion); break; } case 0x02:{ MoverConjunto(motor_es,grados_posicion); break; } case 0x03:{ while (funcion==0x03){ RutColor(); } }
default:{ Transmi.printf("Funcion no definida. \n"); } } }
else { Transmi.printf("Error de codigo de cierre \n"); } }
else { Transmi.printf("Error de codigo de inicio. \n"); } }
}
void MoverMotor(uint8_t motor, uint8_t grados){
Transmi.printf("Se movera solo un motor. \n"); if (grados <= 180){
AnchoPulso=((grados*9.8)+535);
switch (motor){
case 0x01:{ Servo1.pulsewidth_us(AnchoPulso); Transmi.printf("Se mueve el motor 1.\n"); break;
}
case 0x02:{ Servo2.pulsewidth_us(AnchoPulso); Transmi.printf("Se mueve el motor 2.\n"); break; }
case 0x03:{ Servo3.pulsewidth_us(AnchoPulso); Transmi.printf("Se mueve el motor 3.\n"); break; }
case 0x04:{ Servo4.pulsewidth_us(AnchoPulso); Transmi.printf("Se mueve el motor 4.\n"); break; }
case 0x05:{ Servo5.pulsewidth_us(AnchoPulso); Transmi.printf("Se mueve el motor 5.\n"); break; } case 0x06:{ Servo6.pulsewidth_us(AnchoPulso); Transmi.printf("Se mueve el motor 6.\n"); break; }
case 0x07:{ Servo7.pulsewidth_us(AnchoPulso); Transmi.printf("Se mueve el motor 7.\n"); break; }
case 0x08:{ Servo8.pulsewidth_us(AnchoPulso); Transmi.printf("Se mueve el motor 8.\n"); break; }
default:{ Transmi.printf("Motor no cargado. \n"); } }
}
else { Transmi.printf("Valor de grados fuera de rango. \n"); }
}
void MoverConjunto(uint8_t motores,uint8_t posicion){ Transmi.printf("Se movera un conjunto de motores. \n");
if (posicion==0xDD){
switch(motores){ case 1:{ Servo1.pulsewidth_us(550); Servo2.pulsewidth_us(550); Transmi.printf("Mover primer conjunto, ambos cerrados. \n"); break; }
case 2:{ Servo3.pulsewidth_us(550); Servo4.pulsewidth_us(550); Transmi.printf("Mover segundo conjunto, ambos cerrados. \n"); break; }
case 3:{ Servo5.pulsewidth_us(550); Servo6.pulsewidth_us(550); Transmi.printf("Mover tercer conjunto, ambos cerrados. \n"); break; }
case 4:{ Servo7.pulsewidth_us(550); Servo8.pulsewidth_us(550); Transmi.printf("Mover cuarto conjunto, ambos cerrados. \n"); break; }
default: { Transmi.printf("Motores no definidos. \n"); } } }
else{ if (posicion==0xDA){
switch(motores){ case 1:{ Servo1.pulsewidth_us(2100); Servo2.pulsewidth_us(550); Transmi.printf("Mover primer conjunto, uno abierto, dos cerrado. \n"); break; }
case 2:{ Servo3.pulsewidth_us(2100); Servo4.pulsewidth_us(550); Transmi.printf("Mover segundo conjunto, uno abierto, dos cerrado. \n"); break; }
case 3:{ Servo5.pulsewidth_us(2100); Servo6.pulsewidth_us(550); Transmi.printf("Mover tercer conjunto, uno abierto, dos cerrado. \n"); break; }
case 4:{ Servo7.pulsewidth_us(2100); Servo8.pulsewidth_us(550); Transmi.printf("Mover cuarto conjunto, uno abierto, dos cerrado. \n"); break; }
default: { Transmi.printf("Motores no definidos. \n"); } } }
else{
if (posicion==0x1D){
switch(motores){ case 1:{ Servo1.pulsewidth_us(550); Servo2.pulsewidth_us(2100); Transmi.printf("Mover primer conjunto, uno cerrado, dos abierto. \n"); break; }
case 2:{ Servo3.pulsewidth_us(550); Servo4.pulsewidth_us(2100); Transmi.printf("Mover segundo conjunto, uno cerrado, dos abierto. \n"); break; }
case 3:{ Servo5.pulsewidth_us(550); Servo6.pulsewidth_us(2100); Transmi.printf("Mover tercer conjunto, uno cerrado, dos abierto. \n"); break; }
case 4:{ Servo7.pulsewidth_us(550); Servo8.pulsewidth_us(2100); Transmi.printf("Mover cuarto conjunto, uno cerrado, dos abierto. \n"); break; }
default: { Transmi.printf("Motores no definidos. \n"); } } } else{ if (posicion==0x1A){
switch(motores){ case 1:{ Servo1.pulsewidth_us(2100); Servo2.pulsewidth_us(2100); Transmi.printf("Mover primer conjunto, ambos abiertos. \n"); break; }
case 2:{ Servo3.pulsewidth_us(2100); Servo4.pulsewidth_us(2100); Transmi.printf("Mover segundo conjunto, ambos abiertos. \n"); break; }
case 3:{ Servo5.pulsewidth_us(2100); Servo6.pulsewidth_us(2100); Transmi.printf("Mover tercer conjunto, ambos abiertos. \n"); break; }
case 4:{ Servo7.pulsewidth_us(2100); Servo8.pulsewidth_us(2100); Transmi.printf("Mover tercer conjunto, ambos abiertos. \n"); break; }
default: { Transmi.printf("Motores no definidos. \n"); } } }
else{ Transmi.printf("Movimiento no definido. \n");
} } } }
}
int Conf_Servos(){ Servo1.period_ms(20); Servo2.period_ms(20); Servo3.period_ms(20); Servo4.period_ms(20); Servo5.period_ms(20); Servo6.period_ms(20); Servo7.period_ms(20); Servo8.period_ms(20); return (0); }
int ConfTransmi(){ Transmi.baud(9600); return(0); }
int RutColor(){
S2=0; S3=0; rojo=Detectar();
S2=0; S3=1; azul=Detectar();
S2=1; S3=1; verde=Detectar();
if (rojo<azul & azul<verde){ color=rojo; RutRojo(); }
else{ if (azul<rojo & rojo<verde){ color=azul; RutAzul(); }
else{ RutVerde(); color=verde; } } }
int Detectar(){ tme=0; while (!entrada){} while (entrada) {} while (!entrada){} tiempo.start(); while (entrada) {} while (!entrada){} while (entrada) {} while (!entrada){} while (entrada) {} tiempo.stop(); tme=tiempo.read_us(); tiempo.reset(); return(tme);
}
int RutRojo(){ MoverConjunto(1,0x1A); MoverConjunto(3,0x1A); wait (2);
MoverConjunto(2,0xDD); MoverConjunto(4,0xDD); wait (2);
MoverConjunto(1,0xDD); MoverConjunto(3,0xDD); wait (2);
MoverConjunto(2,0x1A); MoverConjunto(4,0x1A); wait (2); }
int RutAzul(){
MoverConjunto(1,0x1A); MoverConjunto(3,0x1A); wait (2);
MoverConjunto(2,0x1A); MoverConjunto(4,0x1A); wait (2);
MoverConjunto(1,0xDD); MoverConjunto(3,0xDD); wait (2);
MoverConjunto(2,0xDD); MoverConjunto(4,0xDD); wait (2); }
int RutVerde(){ MoverConjunto(1,0x1A); MoverConjunto(3,0xDD); wait (2);
MoverConjunto(2,0xDD); MoverConjunto(4,0x1A); wait (2);
MoverConjunto(1,0x1A); MoverConjunto(3,0xDD); wait (2);
MoverConjunto(2,0xDD); MoverConjunto(4,0x1A); wait (2); }
main.h
- ifndef MAIN_H
- define MAIN_H
int Detectar(); int RutColor(); int RutRojo(); int RutAzul(); int RutVerde();
- endif