Esta última actualización contiene el código funcional en las 10 funciones.
Dependencies: mbed
Fork of jc by
Diff: main.cpp
- Revision:
- 0:9aa960516df7
- Child:
- 1:a9b3fdab473e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Nov 20 04:28:42 2017 +0000 @@ -0,0 +1,477 @@ +#include "mbed.h" +#include "math.h" +#include "cstdlib" +#define MAXPOS 255 +#define SS_TIME 500 +#define POSDRAW 300 +#define BUFF_SIZE 6 +#define COMM_N 0 +#define INITPARAMETER 1 +#define DEBUG 1 +#define BUFF_POS 6 + +PwmOut myServoX(PB_3); //MOTOR EJE X +PwmOut myServoY(PB_4); //MOTOR EJE Y +PwmOut myServoZ(PB_10);//MOTOR EJE Z + +Serial command(USBTX, USBRX); //COMUNICACION SERIAL +Serial Sdebug(USBTX, USBRX); +DigitalOut led(LED1); //DECLARACION LED DE LA PLACA +InterruptIn mybutton(USER_BUTTON); + +// COMANDOS +#define LED 0 +#define PUNTO 1 +#define LINE 2 +#define RECTANGLE 3 +#define CIRCLE 4 +#define STOP 5 +#define PAUSE 6 +#define REANUDAR 7 +#define RESOLUCION 8 +#define HOME 9 +#define TIEMPO_DE_PASO 10 + +Ticker ticker1; +Timeout timeout; + +int rap; +int RSTEP = 5; +double abajo=7; +double arriba=0; +double k,l,r,tp=50,paso=0; +int p=0; + +//***************************************************************************** +// COMANDO MOVER MOTOR +// |POS 1|POS 2|POS 3|POS 4| POS 5| POS 6| POS 7| +// | < | #C | a | b | c | d | > | +// +// #C -> indica el comando +// a,b,c,d parametros del comando +// <,> -> inicio, y fin de comando +// el inicio de comando no se almacena en el buffer +//***************************************************************************** +// VARIABLES PARA DEFINIR EL COMMANDO + +uint8_t buffer_command[BUFF_SIZE]={0,0,0,0,0,0}; +float buffer_POS [BUFF_POS]= {0,0,0,0,0,0}; + +void savep(); +void interrupcion(); + +int coord2us(float coord) + { + if(0 <= coord <= MAXPOS) + return int(750+coord*1900/50);// u6 + return 750; + } + void print_num(uint8_t val) + { + if (val <10) + command.putc(val+0x30); + else + command.putc(val-9+0x40); + } +void print_bin2hex (uint8_t val) + { + command.printf(" 0x"); + print_num(val>>4); + print_num(val&0x0f); + } +void Read_command() + { + for (uint8_t i=0; i<BUFF_SIZE;i++) + { + buffer_command[i]=command.getc(); + + } + } + +void echo_command() + { + for (uint8_t i=0; i<BUFF_SIZE;i++) + { + print_bin2hex(buffer_command[i]); + } + } +uint8_t check_command() + { + if (buffer_command[BUFF_SIZE-1]== '>') + return 1; + return 0; + } +void command_led(uint8_t tm) + { + #if DEBUG + command.printf("%i, segundos", tm); + #endif + led=1; + wait(tm); + led=0; + } +void draw() + { + myServoZ.pulsewidth_us(POSDRAW); + wait(1); + } +void nodraw() + { + myServoZ.pulsewidth_us(MAXPOS); + wait(1); + } + uint8_t SSTIME = 100; +void tiempo_de_paso(int SST) + { + SSTIME=SST; + #if DEBUG + command.printf("\nTiempo en pasos definida en:%i\n",SSTIME); + #endif + } +void vertex2d(float x, float y, float z) + { + int pulseX = coord2us(x); + int pulseY = coord2us(y); + int pulseZ = coord2us(z); + myServoX.pulsewidth_us(pulseX); + myServoY.pulsewidth_us(pulseY); + myServoZ.pulsewidth_us(pulseZ); + wait_ms(SSTIME); + } + +uint8_t posx_old=0; // posición anterior del eje X +uint8_t posy_old=0; // posición anterior del eje Y +uint8_t posz_old=0; // posición anterior del eje Y +uint8_t ss_time=100; // tiempo de espera para moverse 1 mm en microsegundos + +void put_sstime(uint8_t vtime){ + ss_time=vtime; + } +void sstime(uint8_t x, uint8_t y, uint8_t z) +{ + double dx=abs(x-posx_old); + double dy=abs(y-posy_old); + double dz=abs(z-posz_old); + double dist= sqrt(dx*dx+dy*dy+dz*dz); + wait_ms((int)(ss_time*dist)); + posx_old=x; + posy_old=y; + posy_old=z; + } +void initdraw(float x, float y) + { + #if DEBUG + Sdebug.printf("inicia dibujo \n"); + #endif + vertex2d (x,y,abajo); + wait(1); + draw(); + } + +void resolucion(int res){ + RSTEP = res; + #if DEBUG + command.printf("Resolucion definida en = %i \n", RSTEP); + #endif + } +void home() + { + vertex2d(0,0,0); + wait_ms(rap); + } +void maxpos() + { + vertex2d(250,250,150); + } +void punto(uint8_t x, uint8_t y) + { + command.printf("Coord x= %i, coord y=%i \n",x,y); + vertex2d(x,y,0); + wait_ms(1000); + vertex2d(x,y,11); + wait_ms(1000); + vertex2d(x,y,0); + wait_ms(1000); + home(); + } + +void line(float xi, float xf, float yi, float yf) + { + // los parametros son coordenadas iniciales y finales de la linea en milimetros + #if DEBUG + Sdebug.printf("linea Xi= %f,Xf= %f,Yi= %f,Yf= %f \n", xi,xf,yi,yf); + #endif + float xp; float yp; + float m= (yf-yi)/(xf-xi); + float b=(yf-m*xf); + vertex2d(0,0,4); + wait(1); + vertex2d(xi,yi,abajo); + wait(1); + for (xp =xi;xp<=xf;xp+=RSTEP) + { + yp =m*xp+b; + vertex2d(xp,yp,abajo); + // savep( buffer_POS[INITPARAMETER==02]buffer_POS[INITPARAMETER+1==xp], buffer_POS[INITPARAMETER+2==xf],buffer_POS[INITPARAMETER+3==yp], buffer_POS[INITPARAMETER+4==yf]); + + #if DEBUG + Sdebug.printf("coord X = %f,coord Y = %f \n", xp,yp); + #endif + } + nodraw(); + home(); + } + void rectangle(uint8_t xi, uint8_t yi,uint8_t a, uint8_t h) +{ + int x,y; + x = a+ xi; + y = h+ yi; + + vertex2d(xi,yi,arriba); + wait_ms(600); + vertex2d(xi,yi,abajo); + wait_ms(600); + vertex2d(x,yi,abajo); + wait_ms(600); + vertex2d(x,y,abajo); + wait_ms(600); + vertex2d(xi,y,abajo); + wait_ms(600); + vertex2d(xi,yi,abajo); + wait_ms(600); + home(); + } + void circle(uint8_t x1, uint8_t y1,uint8_t r) + { + double x2,y2,i,j; + vertex2d(x1 ,y1,arriba); + wait(1); + wait_ms(rap); + + for ( x2=0;x2<=r;x2++){ + y2= pow(((r*r)-(x2*x2)),0.5); + i= x2+x1; + j=y1+y2; + vertex2d(i ,j,abajo) ; + wait_ms(30); + #if DEBUG + Sdebug.printf("coord X = %f,coord Y = %f \n", i,j); + #endif + } + + for ( x2=r;x2>=0;x2--){ + y2= pow(((r*r)-(x2*x2)),0.5); + i= x2+x1; + j= y1 - y2; + vertex2d(i ,j,abajo) ; + wait_ms(30); + #if DEBUG + Sdebug.printf("coord X = %f,coord Y = %f \n", i,j); + #endif + } + + for ( x2=0;x2<=r;x2++){ + y2= pow(((r*r)-(x2*x2)),0.5); + i= x1- x2; + j= y1 - y2; + vertex2d(i ,j,abajo) ; + wait_ms(30); + #if DEBUG + Sdebug.printf("coord X = %f,coord Y = %f \n", i,j); + #endif + } + for ( x2=r;x2>=0;x2--){ + y2= pow(((r*r)-(x2*x2)),0.5); + i= x1-x2; + j=y1+y2; + vertex2d(i ,j,abajo) ; + wait_ms(30); + #if DEBUG + Sdebug.printf("coord X = %f,coord Y = %f \n", i,j); + #endif + } + vertex2d(i ,j,arriba) ; + wait_ms(rap); + #if DEBUG + Sdebug.printf("coord X = %f,coord Y = %f \n", i,j); + #endif + + if(x2==r) + { + wait(1); + } + home(); + } + + + + void savep(float pos){ + for (uint8_t i=0; i<BUFF_POS;i++) + { + buffer_command[i]=command.getc(); + + } + + } + + void reanudar(){ + led =0; + p=0; + + + } + + +void pause(){ + p=1; + led = !led; + timeout.attach(&pause, 300); + // while(1); + + + } + +void stop() //Funcion para detener el programa + { + exit(0); + home(); + } + +void command_exe() + { + #if DEBUG + command.printf("Ejecutando comando: "); + #endif + switch (buffer_command[COMM_N]) + { + case (LED): + #if DEBUG + command.printf("LED on\n"); + #endif + command_led(buffer_command[INITPARAMETER]); + break; + + case (PUNTO): + punto(buffer_command[INITPARAMETER],buffer_command[INITPARAMETER+1]); + #if DEBUG + command.printf("Dibujando Punto"); + #endif + break; + + case LINE: + #if DEBUG + command.printf("Dibujando Linea\n"); + #endif + line(buffer_command[INITPARAMETER],buffer_command[INITPARAMETER+1],buffer_command[INITPARAMETER+2],buffer_command[INITPARAMETER+3]); + + + break; + + case RECTANGLE: + #if DEBUG + command.printf("Dibujando Rectangulo\n"); + #endif + rectangle(buffer_command[INITPARAMETER],buffer_command[INITPARAMETER+1],buffer_command[INITPARAMETER+2],buffer_command[INITPARAMETER+3]); + break; + + case (CIRCLE): + #if DEBUG + command.printf("Dibujando Circulo\n"); + #endif + circle(buffer_command[INITPARAMETER],buffer_command[INITPARAMETER+1],buffer_command[INITPARAMETER+2]); + break; + + case (STOP): + #if DEBUG + command.printf(" STOP\n"); + #endif + break; + + case (PAUSE): + #if DEBUG + command.printf("programa pausado\n"); + #endif + pause(); + break; + + case (REANUDAR): + #if DEBUG + command.printf("draw reanudar programa\n"); + #endif + reanudar(); + break; + + case (RESOLUCION): + resolucion(buffer_command[INITPARAMETER]); + #if DEBUG + command.printf("Resolucion definida"); + #endif + break; + case (HOME): + home(); + #if DEBUG + command.printf("Posicion Home"); + #endif + break; + + case (TIEMPO_DE_PASO): + #if DEBUG + command.printf("Nuevo tiempo para paso:\res"); + #endif + tiempo_de_paso(buffer_command[INITPARAMETER]); + break; + + default: + #if DEBUG + command.printf("comando no encontrado\n"); + #endif + + } +} + + + + + + + + + + +int main() { + #if DEBUG + command.printf("inicio con debug\n"); + #else + command.printf("inicio sin debug\n"); + #endif + uint8_t val; + // mybutton.rise(&stop); + while(1){ + val=command.getc(); + if (val== '<'){ + Read_command(); + // ticker1.attach(&Read_command,05); + if (check_command()){ + command_exe(); + } + else{ + #if DEBUG + command.printf("\n ERROR COMANDO -> "); + echo_command(); + #endif + } + } + else{ + #if DEBUG + command.printf("error de inicio de trama: "); + command.putc(val); + #endif + } + + } + + + //ticker1.attach(&main,05); + + +} \ No newline at end of file