MANUAL USUARIO
Presentación
En este proyecto se implementa una tarjeta STM32F411 para la implementación de el robot y el cual consiste en lo siguiente:
Un sensor de color (TCS3200), un buzzer, dos motores paso a paso, drivers para los motores y un joystick.
CONEXIONES
Sensor de color
El sensor ( TCS3200) tiene 8 pines los cuales son:
- VDD: Se conecta a 5v de la tarjeta
- GND: Se conecta a GND o tierra de la tarjeta
- S0 : Se conecta en a D7 de la tarjeta
- S1 :Se conecta en a D6 de la tarjeta
- S2 :Se conecta en a D5 de la tarjeta
- S3: Se conecta en a D4 de la tarjeta
- OUT: Se conecta en a D3 de la tarjeta
Conexión del buzzer
- Positivo (+): Se conecta a D9 de la tarjeta
- Negativo (-): Se conecta a GND de la tarjeta
MOTORES PASO A PASO
Se utilizan dos motores paso a paso unipolares los cuales se conectan a dos drivers Drv8825 que son los que controlan la cantidad de pasos y dirección en las bobinas
Conexión de los drivers (dvr8825)
El driver se polariza de la siguiente forma:
Para el primer driver se conecta:
- step al D11
- Dir al D12 el motor se conectan las bobinas a las fases del motor, en este caso:
- bobinas 1 y 3 a B1 y B2 del driver.
- bobinas 4 y 6 a A1 y A2 del driver.
Para el otro driver se concta:
- step a D4
- Dir al D3 el motor se conectan las bobinas a las fases del motor, en este caso:
- bobinas 1 y 3 a B1 y B2 del driver.
- bobinas 4 y 6 a A1 y A2 del driver.
JOYSTICK
Se utiliza para el movimiento de los motores paso a paso y se crea una función principal "void mover joystick (uint16_t sentido, uint16_t num_pasos)" para el movimiento de estos según la información se compara y se le da inicio a la secuencia
Conexión del Joystick
- VDD: Se conecta a 5v de la tarjeta
- GND: Se conecta a GND o tierra de la tarjeta
- VRx : Se conecta en a A0 de la tarjeta
- VRy : Se conecta en a A1 de la tarjeta
PROGRAMACIÓN
Según la programación en la parte de comienzo se muestra como se declaran cada función en la que encontramos la velocidad que se define de forma individual también se nombran las funciones principales para el movimiento de los tele comandos y las telemetrías
include the mbed library with this snippet
#include "mbed.h" #include "scolor_TCS3200.h" Serial command(USBTX,USBRX); PwmOut mybuzzer(PC_7); DigitalOut stepper_step(PB_4); DigitalOut steppeer_dir(PB_5); DigitalOut stepper_step_1(PA_7); DigitalOut steppeer_dir_1(PA_6); AnalogIn analogX(A0); AnalogIn analogY(A1); #define INITCMD 0xFF #define CMD 0x00 #define VELOCITY1 3000 #define VELOCITY2 9000 #define VELOCITY3 15000 #define DO 130 #define RE 150 #define MI 160 #define FA 180 #define SO 200 uint16_t parametro1; // S0, S1, S2, S3, OUT scolor_TCS3200 scolor(PA_8, PB_10, PB_9, PB_8, PB_3); // definición de las funciones void setup_uart(); void leer_datos(); void leer_color(); void buzzer_on(uint16_t tono, uint16_t tiempo); void mover_steper_nema(uint16_t sentido, uint16_t num_pasos); void mover_joystick(uint16_t sentido, uint16_t num_pasos); double meas_X; double meas_Y; uint8_t cmd; uint8_t cmd1; int main() { setup_uart(); while(1) { leer_datos(); if (cmd==0x00) { leer_color(); } else if (cmd >=0x01 && cmd <=0x04) { buzzer_on(cmd, parametro1); } else if(cmd >=0x05 && cmd <=0x06) { mover_steper_nema(cmd, parametro1); } else if (cmd >=0x07 && cmd <= 0x09) { mover_steper_nema(cmd, parametro1); } else if (cmd == 0x0A) { mover_joystick(cmd, parametro1); } } } void setup_uart() { command.baud(115200); } void leer_datos(){ while(command.getc()!= INITCMD); cmd=command.getc(); parametro1=command.getc(); } void buzzer_on(uint16_t tono, uint16_t tiempo){ mybuzzer.write(0); switch(tono){ case 1: mybuzzer.period_us(DO);break; case 2: mybuzzer.period_us(RE);break; case 3: mybuzzer.period_us(MI);break; case 4: mybuzzer.period_us(FA);break; default:mybuzzer.period_us(SO); break; } mybuzzer.write(0.5); wait(tiempo); mybuzzer.write(0); } void leer_color() { long red = scolor.ReadRed(); long green = scolor.ReadGreen(); long blue = scolor.ReadBlue(); long clear = scolor.ReadClear(); // printf("RED: %5d GREEN: %5d BLUE: %5d CLEAR: %5d \n ", red, green, blue, clear); if(green >= 6 && green <=15 && blue >=15 ) { printf("green"); wait(1); } else if (blue >= 7 && blue <= 17 && green >= 20) { printf("blue"); wait(1); } else if(red >= 3 && red <=10 && clear <6 ) { printf("red"); wait(1); } else if(red >=11 && blue > 21 && green > 21) { printf("nothing"); wait(1); } else if(cmd==!CMD) { mybuzzer.write(0); mybuzzer.write(2); mybuzzer.write(0); } } void mover_steper_nema(uint16_t sentido, uint16_t num_pasos) { int i; int a; int b; /* complementar el código necesario */ if (cmd == 0x05) { steppeer_dir = 0; steppeer_dir_1 = 1; for(a=0;a<=200;a++){ for (num_pasos=0;num_pasos<=parametro1;num_pasos++){ i=num_pasos*a; stepper_step=i; stepper_step_1=i; wait_us(VELOCITY2); stepper_step=0; stepper_step_1=0; } } } else if (cmd == 0x06) { steppeer_dir = 1; steppeer_dir_1 = 0; for(b=0;b<=200;b++) { for (num_pasos=0;num_pasos<=parametro1;num_pasos++) { i=num_pasos*b; stepper_step=i; stepper_step_1=i; wait_us(VELOCITY2); stepper_step=0; stepper_step_1=0; } } } else if (cmd == 0x07 && parametro1 == 0x00) { steppeer_dir = 0; steppeer_dir_1 = 0; for(a=0;a<=100;a++) { stepper_step=i; stepper_step_1=i; wait_us(VELOCITY2); stepper_step=0; stepper_step_1=0; } } else if (cmd == 0x08 && parametro1 == 0x00) { steppeer_dir = 1; steppeer_dir_1 = 1; for(a=0;a<=100;a++) { stepper_step=i; stepper_step_1=i; wait_us(VELOCITY2); stepper_step=0; stepper_step_1=0; } } else if (cmd == 0x09 && parametro1 == 0x01) { steppeer_dir = 1; steppeer_dir_1 = 0; for(a=0;a<=200;a++) { stepper_step=i; stepper_step_1=i; wait_us(VELOCITY3); stepper_step=0; stepper_step_1=0; } } else if (cmd == 0x09 && parametro1 == 0x02) { steppeer_dir = 1; steppeer_dir_1 = 0; for(a=0;a<=200;a++) { stepper_step=i; stepper_step_1=i; wait_us(VELOCITY2); stepper_step=0; stepper_step_1=0; } } else if (cmd == 0x09 && parametro1 == 0x03) { steppeer_dir = 1; steppeer_dir_1 = 0; for(a=0;a<=200;a++) { stepper_step=i; stepper_step_1=i; wait_us(VELOCITY1); stepper_step=0; stepper_step_1=0; } } } void mover_joystick (uint16_t sentido, uint16_t num_pasos) { int i; int a; while(parametro1 != 0x02) { meas_X = analogX.read(); meas_Y = analogY.read(); wait(0.5); // 1 second printf("X = %0.3f Y = %0.3f \n", meas_X, meas_Y); if (meas_X >= 0.759) { steppeer_dir = 1; steppeer_dir_1 = 0; for(a=0;a<=200;a++) { for (num_pasos=0;num_pasos<= parametro1 ;num_pasos++) { i=num_pasos*a; stepper_step=i; stepper_step_1=i; wait_us(VELOCITY2); stepper_step=0; stepper_step_1=0; } } } else if (meas_X <= 0.021) { steppeer_dir = 0; steppeer_dir_1 = 1; for(a=0;a<=200;a++) { for (num_pasos=0;num_pasos<= parametro1 ;num_pasos++) { i=num_pasos*a; stepper_step=i; stepper_step_1=i; wait_us(VELOCITY2); stepper_step=0; stepper_step_1=0; } } } else if (meas_Y == 0.763) { steppeer_dir = 0; steppeer_dir_1 = 0; for(a=0;a<=100;a++) { for (num_pasos=0;num_pasos<= parametro1 ;num_pasos++) { i=num_pasos*a; stepper_step=i; stepper_step_1=i; wait_us(VELOCITY2); stepper_step=0; stepper_step_1=0; } } } else if (meas_Y <= 0.026) { steppeer_dir = 0; steppeer_dir_1 = 0; for(a=0;a<=100;a++) { for (num_pasos=0;num_pasos<= parametro1 ;num_pasos++) { i=num_pasos*a; stepper_step=i; stepper_step_1=i; wait_us(VELOCITY2); stepper_step=0; stepper_step_1=0; } } } } }
Please log in to post comments.