Brazo_robotico
Page last updated 04 Jun 2019, by
3
replies
.
Brazo-robotico
#include "mbed.h" #include "scolor_TCS3200.h" /*** Este archivo es una modificacion al ejercicio propuesta por el ingeniero Ferney alberto Beltran molina. generar un programa que controle por el puerto serial el grado de 4 servo motores. por medio de la comunicacion serial el comando es | | | | | | INITCMD | Tipo_Comando | Parametro_1 | Funcion | | 0xff | 0x01 | 0x01 | Pos. Home | | 0xff | 0x01 | 0x02 | Pos. Material | | 0xff | 0x01 | 0x03 | Pos. Celda 1 | | 0xff | 0x01 | 0x04 | Pos. Celda 2 | | 0xff | 0x01 | 0x05 | Pos. Celda 3 | | 0xff | 0x01 | 0x06 | Pos. Celda 4 | | 0xff | 0x02 | 0x01 | Abre Pinza | | 0xff | 0x02 | 0x02 | Cierra Pinza | | 0xff | 0x03 | 0x00 - 0xb4 | Mueve Motor 1 | | 0xff | 0x04 | 0x00 - 0xb4 | Mueve Motor 2 | | 0xff | 0x05 | 0x00 - 0xb4 | Mueve Motor 3 | | 0xff | 0x06 | 0x00 - 0xb4 | Mueve Motor 4 | | 0xff | 0x07 | 0x00 - 0x03 | Mueve Motor 1 | | 0xff | 0x08 | 0x00 - 0xb4 | Mueve Motor 2 | | 0xff | 0x09 | 0x00 - 0xb4 | Mueve Motor 3 | para enviar los comandos usar el programa Coolterm http://freeware.the-meiers.org/ # para el servo motor se debe modificar el ciclo util del PWM SEGUN: # _ _ # | || |__ # <-width-> # <-------period 20ms---> # period = 20 ms # width = 1000us y 2000us # 1000us para 0 grados # 2000us para 180 grados ___ SO | S1 | OUTPUT FREQUENCY SCALING | | S2 | S3 | PHOTODIODE TYPE | 0 | 0 | power down | | 0 | 0 | Red | 0 | 1 | 2% | | 0 | 1 | Blue | 1 | 0 | 20% | | 1 | 0 | Clear (no filter) | 1 | 1 | 100% | | 1 | 1 | Green | ***/ // configuracion comunicación serial Serial command(USBTX, USBRX); // seleccion de los pines a usar en la stm32f411re PwmOut myservo1(PB_4); PwmOut myservo2(PB_3); PwmOut myservo3(PB_10); PwmOut myservo4(PC_7); scolor_TCS3200 scolor(PA_8, PA_9, PB_6, PA_7, PA_6); AnalogIn analog_value1(A1); AnalogIn analog_value2(A2); AnalogIn analog_value3(A3); InterruptIn abrir(PA_10); InterruptIn cerrar(PB_5); Ticker tk1; Timer timer2; #define INITCMD 0xFF #define INITELE 0xFE #define DEGREES_MAX 180 #define CMD 0x01 // definición de las variables globales uint8_t Tipo_Comando; // varable que almacena el numero de seleccion de comando uint8_t Parametro_1; // varable que almacena el parametro a ejecutar uint8_t velociraptor =10 ; uint32_t dpulse=0; // definición de las funciones void setup_uart(); void setup_servo(); void leer_datos(); void leer_color(); void servo(uint8_t T_C, uint8_t Par_1); uint32_t degrees2usec(uint8_t grados); uint8_t cmd; void cerrarpinza(); void abrirpinza(); int main() { setup_servo(); setup_uart(); abrir.mode(PullUp); cerrar.mode(PullUp); timer2.start(); abrir.fall(&abrirpinza); cerrar.fall(&cerrarpinza); tk1.attach(&leer_color,0.2); command.printf("inicio de programa"); while(1){ if (timer2.read_ms()>=2000) // read time in ms { leer_datos(); servo(Tipo_Comando, Parametro_1); timer2.reset(); // reset timer } } } void leer_color() { long red; long green; long blue; long clear; red = scolor.ReadRed(); green = scolor.ReadGreen(); blue = scolor.ReadBlue(); clear = scolor.ReadClear(); clear=100/clear ; red=(10000/red)/clear ; green=(10000/green)/clear ; blue=(10000/blue)/clear ; clear=100*clear/clear ; //printf("RED: %5d GREEN: %5d BLUE: %5d CLEAR: %5d \n ", red, green, blue, clear); if (red < 40 && red > 30 && green < 45 && green > 35 && blue < 35 && blue > 23) { printf("0xFE 0x01 \n"); //printf("VERDE "); } else { if (red < 60 && red > 32 && green < 40 && green > 25 && blue < 23 && blue > 10) { printf("0xFE 0x02 \n"); //printf("AMARILLO "); } else { if (red < 80 && red > 60 && green < 38 && green > 15 && blue < 28 && blue > 20) { printf("0xFE 0x03 \n"); //printf("ROJO "); } else{ if (red < 30 && red > 13 && green < 32 && green > 20 && blue < 67 && blue > 32) { printf("0xFE 0x04 \n"); //printf("AZUL "); } else { printf("0xFE 0x00 \n"); //printf("NINGUNO "); } } } } } void cerrarpinza() { myservo4.pulsewidth_us(1900); wait(0.1); } void abrirpinza(){ myservo4.pulsewidth_us(1550); wait(0.1); } void setup_uart(){ command.baud(115200); } void setup_servo(){ myservo1.period_ms(20); myservo1.pulsewidth_us(1350); myservo2.period_ms(20); myservo2.pulsewidth_us(900); myservo3.period_ms(20); myservo3.pulsewidth_us(1900); myservo4.period_ms(20); myservo4.pulsewidth_us(1550); } // funcion leer_datos obtiene los comandos enviados desde cool Terminal void leer_datos(){ while(command.getc()!= INITCMD); Tipo_Comando=command.getc(); Parametro_1=command.getc(); } //Esta funcion convierte de grados a microsengudos, segun el ancho de pulso del servomotor uint32_t degrees2usec(uint8_t grados){ if(grados <= DEGREES_MAX) return float(440+grados*17.33/2);// u6 return 440; } void servo(uint8_t T_C, uint8_t Par_1){ dpulse=degrees2usec(Par_1); switch(T_C){ case 1: if (Par_1==1){//posicion home myservo3.pulsewidth_us(degrees2usec(180)); wait(1); myservo2.pulsewidth_us(degrees2usec(50)); wait(1); myservo1.pulsewidth_us(degrees2usec(110)); command.printf("posicion home"); } if (Par_1==2){//posicion material myservo3.pulsewidth_us(degrees2usec(180)); wait(1); myservo2.pulsewidth_us(degrees2usec(50)); wait(1); myservo1.pulsewidth_us(degrees2usec(90)); wait(1); myservo2.pulsewidth_us(degrees2usec(50)); wait(1); myservo1.pulsewidth_us(degrees2usec(190)); wait(1); myservo3.pulsewidth_us(degrees2usec(70)); wait(1); myservo2.pulsewidth_us(degrees2usec(90)); wait(1); command.printf("pos material"); } if (Par_1==3){//posicion celda 1 myservo3.pulsewidth_us(degrees2usec(180)); wait(1); myservo2.pulsewidth_us(degrees2usec(50)); wait(1); myservo1.pulsewidth_us(degrees2usec(90)); wait(1); myservo1.pulsewidth_us(degrees2usec(64)); wait(1); myservo2.pulsewidth_us(degrees2usec(70)); wait(1); myservo3.pulsewidth_us(degrees2usec(150)); wait(1); } if (Par_1==4){//posicion celda 2 myservo3.pulsewidth_us(degrees2usec(180)); wait(1); myservo2.pulsewidth_us(degrees2usec(50)); wait(1); myservo1.pulsewidth_us(degrees2usec(90)); wait(1); myservo1.pulsewidth_us(degrees2usec(80)); wait(1); myservo2.pulsewidth_us(degrees2usec(50)); wait(1); myservo3.pulsewidth_us(degrees2usec(150)); wait(1); } if (Par_1==5){//posicion celda 3 myservo3.pulsewidth_us(degrees2usec(180)); wait(1); myservo2.pulsewidth_us(degrees2usec(50)); wait(1); myservo1.pulsewidth_us(degrees2usec(90)); wait(1); myservo1.pulsewidth_us(degrees2usec(140)); wait(1); myservo2.pulsewidth_us(degrees2usec(50)); wait(1); myservo3.pulsewidth_us(degrees2usec(150)); wait(1); } if (Par_1==6){//posicion celda 4 myservo3.pulsewidth_us(degrees2usec(180)); wait(1); myservo2.pulsewidth_us(degrees2usec(50)); wait(1); myservo1.pulsewidth_us(degrees2usec(90)); wait(1); myservo1.pulsewidth_us(degrees2usec(162)); wait(1); myservo2.pulsewidth_us(degrees2usec(70)); wait(1); myservo3.pulsewidth_us(degrees2usec(150)); wait(1); } break; case 2: if (Par_1==1){//abrir pinza myservo4.pulsewidth_us(degrees2usec(100)); } if (Par_1==2){//cerrar pinza myservo4.pulsewidth_us(degrees2usec(170)); } break; case 3: myservo1.pulsewidth_us(dpulse); command.printf("M1"); break; case 4: myservo2.pulsewidth_us(dpulse); command.printf("M2"); break; case 5: myservo3.pulsewidth_us(dpulse); command.printf("M3"); break; case 6: if(Par_1>=120) myservo4.pulsewidth_us(dpulse); command.printf("M4"); break; case 7: if(Par_1==1){//velocida baja myservo1.period_ms(40); myservo1.pulsewidth_us(1350); myservo2.period_ms(40); myservo2.pulsewidth_us(900); myservo3.period_ms(40); myservo3.pulsewidth_us(1900); myservo4.period_ms(40); myservo4.pulsewidth_us(1550); } else if(Par_1==2){//velocidad media myservo1.period_ms(20); myservo1.pulsewidth_us(1350); myservo2.period_ms(20); myservo2.pulsewidth_us(900); myservo3.period_ms(20); myservo3.pulsewidth_us(1900); myservo4.period_ms(20); myservo4.pulsewidth_us(1550); } else{ //velocidad alta myservo1.period_ms(10); myservo1.pulsewidth_us(1350); myservo2.period_ms(10); myservo2.pulsewidth_us(900); myservo3.period_ms(10); myservo3.pulsewidth_us(1900); myservo4.period_ms(10); myservo4.pulsewidth_us(1550); } break; case 8: float meas_r1,meas_r2,meas_r3; float meas_m1,meas_m2, meas_m3; float grado1, grado2 , grado3; bool x=0; command.printf("entro"); while(x==0){ meas_r1 = analog_value1.read(); // Read the analog input value (value from 0.0 to 1.0 = full ADC conversion range) meas_r2 = analog_value2.read(); meas_r3 = analog_value3.read(); meas_m1 = (meas_r1 * 180) ; // Converts value in the 0V-3.3V range meas_m2 = (meas_r2 * 180) ; meas_m3 = (meas_r3 * 180) ; if(meas_m1<= 180){ grado1=(440+(meas_m1+20)*20.33/2);// u6 myservo1.pulsewidth_us(grado1);} else{ myservo1.pulsewidth_us(440);} if(meas_m2>55){ grado2=(440+(meas_m2-40)*20.33/2);// u6 command.printf("%f",grado2); myservo2.pulsewidth_us(grado2); } else{ myservo2.pulsewidth_us(1300);} if(meas_m3<= 55){ grado3=(440+(meas_m3+30)*20.33/2);// u6 command.printf("%f",grado3); myservo3.pulsewidth_us(grado3);} else{ myservo3.pulsewidth_us(1900);} if(!abrir){myservo4.pulsewidth_us(degrees2usec(120));} if(!cerrar){myservo4.pulsewidth_us(degrees2usec(170));} x=command.readable(); wait(0.05); // 1 second } break; } }
3 comments on Brazo_robotico:
Please log in to post comments.
Diagrama de Flujo