candy grabber

Integrantes

Diego Casas
Felipe Cantillo
Felipe Rodriguez
Julian Camilo Celis


Descripción del Proyecto

aprovechando la versatilidad de los micro controladores decidimos implementar usando máximo 2 micro controladores una maquina llamada candy grabber similar a las que se pueden encontrar en los centros comerciales, la idea con esto es aprovechar las diferentes opciones que tienen los micro controladores para hacerla mas pequeña de modo que sea facil de desplazar si fuera necesario.


Diseño Mecanico


Diseño del control y selección de motores.

Si se mira detalladamente este sistema necesita de 4 motores para su optimo funcionamiento de modo que se opto por usar 4 servomotores ya que si bien el movimiento es muy controlado para este tipo de aplicación, la relación entre el peso del motor y la fuerza que tiene nos permite tener un poco mas de tranquilidad al momento de implementar el sistema ya que podemos estar seguro de que estos motores tendrán la fuerza suficiente para mover las partes del mecanismo que sean necesarias, eso a su vez nos permite usar los módulos de temporizador en modo PWM para poder controlar los motores sin necesidad de un puente H.

Selección del controlador

teniendo en cuenta lo anterior nos pusimos en la tarea de mirar que micro controlador se adaptaba mejor a nuestras necesidades en el momento de tomar la decisión estábamos entre 2 micro controladores por un lado teníamos la opción de escoger el Atmega 16 ya que este cuenta con 4 puertos de entrada y salida lo cual nos permite tener mas espacio para las conexiones, por otra parte teníamos el Atmega168 que si bien este solo tiene 3 puertos de salida, en la definición de estos puertos existen 6 puntos de salida de los módulos de temporizador lo cual nos facilitó de gran manera el diseño de control para los motores, esto debido a que usando estas 6 salidas de timer nos hacia contar con 3 temporizadores que fácilmente podíamos manejar en caso de ser necesario.

Diseño del código

el código para esta aplicación el código se dividió en 2 bloques principales, por un lado esta el bloque de control de los motores para el que se presenta el código a continuación, este Codigó lo que hace es que activa los temporizadores de para el control de pwm y hace que los motores 1 y 2 se muevan y cambien de direccion dependiendo de una entrada , para la cual es necesario usar pulsadores, esto se diseña de esta manera ya que el joystick que se va a usar en el montaje se compone por 4 pulsadores.

 #define F_CPU 1000000
 #include <avr/io.h>
 #include <avr/interrupt.h>
 #include <util/delay.h>
 
 double dutyCycle1 = 100; //definicion de ciclo de trabajo inicial 100 = quieto
 double dutyCycle2 = 100;//definicion de ciclo de trabajo inicial 100 = quieto
 double dutyCycle3 = 10;//definicion de ciclo de trabajo inicial 100 = quieto
 double dutyCycle4 = 100;//definicion de ciclo de trabajo inicial 100 = quieto
 void servo_init(){//funcion para inicializar el pwm
    TCCR0A = (1 << COM0A1)|(1 << COM0B1) | (1 << WGM00) | (1 << WGM01); //se activa el timer 0 , los canales a y b y el modo fast pwm
    TCCR2A = (1 << COM2A1)|(1 << COM2B1) | (1 << WGM20) | (1 << WGM21); //se activa el timer 2 , los canales a y b y el modo fast pwm
    TIMSK0 = (1 << TOIE0);// se define la interrupcion del timer0
    TIMSK2 = (1 << TOIE2);// se define la interrupcion del timer2     
    sei();
    OCR0A = (dutyCycle1/100.0)*255.0;
    OCR0B = (dutyCycle2/100.0)*255.0;
    OCR2A = (dutyCycle3/100.0)*255.0;
    OCR2B = (dutyCycle3/100.0)*255.0;
    TCCR0B = (1<<CS00) |(1<<CS01) ; /*se define una preescala de 64*/
    TCCR2B = (1<<CS22) ;
 }
 int main(void)
 {     
     DDRD = 0xFF;
     DDRB = 0b00001000;
 
     servo_init();
     while (1){
         /*para la deteccion del joystick  se definen 4 pines de entrada uno para cada direccion*/
         if((PINB&0b00000001)==0b00000001){ //izquierda
             dutyCycle1 =10;
         }else if((PINB&0b00000010)==0b00000010){//derecha
             dutyCycle1 =0;
         }else{
             dutyCycle1 =100;
         }
         if((PINB&0b00000100)==0b00000100){//arriba
             dutyCycle2 =10;
         } else if((PINB&0b00010000)==0b00010000){//abajo
             dutyCycle2 =0;
         }else{
             dutyCycle2 =100;
         }
     }
 }
 //interrupcion del final del ciclo para cambiar el ciclo de trabajo del pwm
 ISR(TIMER0_OVF_vect) {
     OCR0A = (dutyCycle1/100)*255;
     OCR0B = (dutyCycle2/100)*255;
 }
 ISR(TIMER2_OVF_vect)
 {
     OCR2A = (dutyCycle3/100)*255;
     OCR2B = (dutyCycle4/100)*255;
 }

por otra parte esta el modulo de activación del sistema para el cual es necesario usar un pulsador y un temporizador , el pulsador activara y desactivara el sistema y el temporizador mantendrá un registro del tiempo de modo que el usuario tendrá solo 30 segundos para elegir y sacar el objeto deseado antes de que este modulo active la secuencia de final que desactivara la lectura del joystick.
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License