REQUISITOS:
1. Servomotores CC (2)
2. Disco compacto (para base de brazo)
3. Palo de escoba (para el brazo)
4. Lápiz/Bolígrafo
5. AtMega 16 IC
DESCRIPCIÓN:
Recientemente participé en un MOOC sobre Introducción a la Robótica en la Universidad Tecnológica de Queensland, Australia. Para aquellos que no saben qué es MOOC, significa M agresivo oh pluma Oh en línea C nuestro. Profesor Peter Corke Fue el mentor al introducirme en el mundo de la robótica. Además de la parte de aprendizaje de este curso, había un proyecto opcional sobre la construcción de su propio brazo robótico que podía seguir un camino determinado proporcionado por ellos. Aquí hay un vistazo a la hoja de cálculo que necesitaba trabajo:
Fig. 1: Imagen típica de una hoja de cálculo robótica
La tarea era sencilla; el brazo robótico debe poder sostener un bolígrafo o lápiz y seguir la ruta de puntos desde las coordenadas (X1,Y1) a (X5,Y5). La base del robot debe caber dentro de la caja gris (20 mm X 20 mm), mientras que el brazo debe tener solo dos articulaciones para moverse.
Para solucionar este problema, decidí optar por los servomotores, ya que tienen movimientos de alta precisión en comparación con los motores paso a paso y los motores CC normales. En mi opinión, este proyecto involucró dos partes principales a trabajar: estructura mecánica y codificación del microcontrolador. Las siguientes fotos muestran el brazo robótico que creé:
Fig. 2: Imagen que muestra la configuración del motor de un brazo robótico simple
Figura 3: Imagen que muestra la prueba simple del brazo robótico para dibujar en la hoja de cálculo de robótica
Figura 4: Imagen que muestra el brazo robótico posicionando la herramienta Lápiz en una coordenada fija en el área de trabajo
Figura 5: Imagen que muestra el brazo robótico moviendo la herramienta Lápiz sobre la hoja de cálculo robótica
Figura 6: Imagen que muestra el movimiento del brazo robótico hasta una coordenada fija en la hoja de cálculo robótica
Figura 7: Imagen de una hoja de cálculo robótica con un brazo robótico colocado sobre ella
Figura 8: Imagen que muestra el movimiento de la herramienta Lápiz por parte del brazo robótico a una coordenada fija en la hoja de cálculo
Como puedes ver, mi brazo robótico construido contiene dos servomotores, uno para la base (negro) y otro para mover el brazo (azul) conectado al lápiz. Ahora viene la parte de codificación que puedes consultar en la sección de códigos. Para informarte sobre lo mismo, déjame decirte que he utilizado temporizadores para operar estos servomotores. Uno de 16 bits parecía una buena opción. En la MCU AtMega 16, el temporizador1 es de 16 bits y tiene dos pines PWM de salida independientes (OC1APD5 y OC1BPD4).
Sabemos que los servos necesitan un ciclo de 20 ms con un pulso alto de 1 ms a 2 ms para su funcionamiento, por lo que elegí la frecuencia de reloj de 1 MHz, lo que resulta en 1 us por cada ciclo de reloj. Por lo tanto, necesitamos un total de 20.000 incriminaciones para hacer 20 ms. Esto se puede lograr inicializando el registro ICR1 con un valor de 20.000, esto permitirá que el valor TOP sea 20.000, exactamente lo que queremos. Ahora lo que queda es simplemente actualizar los valores de OCR1A y OCR1B para un pulso alto de 1 ms -2 ms.
Simplemente te digo que me puse a trabajar investigando los valores de OCR1A y OCR1B para 5 puntos de coordenadas y todo estaba correcto y probado. Una vez que las obtuve, pasé a una transición suave entre dos coordenadas consecutivas. Seguramente podrás ver esto en mi sección de codificación.
Código fuente del proyecto
###
#incluir
#incluir
vacío principal
{int i=0,j=0,small_time=50,big_time=1000;
TCNT1=0;
TCCR1A =(1<
TCCR1B =(1<
DDRD =(1<<5) (1<<4); //inicializando los pines OC1A y OC1B como salida
ICR1=19999;
OCR1A=1050;
OCR1B=695;
_delay_ms(big_time);////////////(X1,Y1)////////////////////////
para(i=1050,j=695;i>450&&j<1425;i-=5,j+=6)
{OCR1A=yo;
OCR1B=j;
_delay_ms(small_time);
}
OCR1A=450;
OCR1B=1425;
_delay_ms(big_time);////////////(X2,Y2)/////////////////////////
para(i=450,j=1425;i<1000&&j>700;i+=10,j-=7)
{OCR1A=i;
OCR1B=j;
_delay_ms(small_time);
}
OCR1B=1050;
para(i=1000;i<1600;i+=10)
{OCR1A=yo;
_delay_ms(small_time);
}
para(j=1050;j<1200;j+=10)
{OCR1B=j;
_delay_ms(small_time);
}
para(i=1600,j=1200;i>1350&&j<1475;i-=10,j+=10)
{OCR1A=i;
OCR1B=j;
_delay_ms(small_time);
}
OCR1A=1350;
OCR1B=1475;
_delay_ms(big_time);////////////(X3,Y3)/////////////////////////
para(i=1350,j=1475;i<2300&&j>500;i+=10,j-=7)
{OCR1A=i;
OCR1B=j;
_delay_ms(small_time);
}
OCR1A=2400;
OCR1B=800;
para(i=2400;i<2650;i+=10)
{OCR1A=yo;
_delay_ms(small_time);
}
para(j=800;j<1300;j+=10)
{OCR1B=j;
_delay_ms(small_time);
}
para(i=2600,j=1300;i>1825&&j<2225;i-=10,j+=12)
{OCR1A=i;
OCR1B=j;
_delay_ms(small_time);
}
OCR1A=1825;
OCR1B=2225;
_delay_ms(big_time);////////////(X4,Y4)////////////////////////
para(i=1825,j=2225;i<2500&&j>1000;i+=7,j-=10)
{OCR1A=i;
OCR1B=j;
_delay_ms(small_time);
}
OCR1A=2550;
para(j=1200;j>1100;j-=10)
{OCR1B=j;
_delay_ms(small_time);
}
para(i=2550;i>2100;i-=10)
{OCR1A=yo;
_delay_ms(small_time);
}
para(i=2100,j=1100;i>895&&j<2125;i-=12,j+=10)
{OCR1A=yo;
OCR1B=j;
_delay_ms(small_time);
}
OCR1A=895;
OCR1B=2125;
_delay_ms(big_time);////////////(X5,Y5)/////////////////////////
}
###
Diagramas de circuito
Diagrama de circuito-AVR-ATMega16-Circuito-de-control-basado-brazo-robótico-simple |