示教机械臂

Dependencies:   MQTT SDFileSystem WIZnet_Library mbed

Fork of wmx_laser_copy by w mx

mainwmx.cpp

Committer:
xmwmx
Date:
2018-08-03
Revision:
14:350e03215b0e
Parent:
13:56063ceac462

File content as of revision 14:350e03215b0e:

/************************************************************************************************
File name:          main.cpp
Description:        项目激光部分客户端代码
Author:             秦智
Date:               June 4, 2018
Others:             本程序编写在mbed平台(https://os.mbed.com/)上

*************************************************************************************************/

#include "mbed.h"
#include <math.h>
#include <cstring>
#include <stdlib.h>
#include "SDFileSystem.h"
#include "networking.h"



typedef enum {
    PointerS,PointerW,PointerX,PointerY,PointerZ,PointerA,PointerL,PointerWW,PointerP
} STATE;                     //定义结构体枚举类型STATE


#define run 32000
#define rad 360
#define turn 1

/////调试
Serial pc(PA_9, PA_10);
Serial bt(PB_10, PB_11);
DigitalOut LED(PB_8);
/////

//硬件接口
// mosi, miso, sclk, cs, name
SDFileSystem sd(PB_15, PB_14, PB_13, PB_12, "sd");
//步进电机
DigitalOut step[3] = {DigitalOut(PC_5), DigitalOut(PA_5),DigitalOut(PC_3)}; //0--x P9,1--y P17
DigitalOut dir[3] = {DigitalOut(PC_4), DigitalOut(PA_4),DigitalOut(PC_2)}; //0--x,1--y
DigitalOut en[3] = {DigitalOut(PD_2), DigitalOut(PA_2),DigitalOut(PC_13)}; //0--x,1--y
//电子开关,激光开关
DigitalOut switch_GS(PC_15);
//行程开关
 DigitalIn switch_pos1(PC_8);  //P25
 DigitalIn switch_pos2(PA_6);  //P26
 DigitalIn switch_pos3(PC_6);  //P27
 
 InterruptIn switch_posx(PC_8);  //P25
 InterruptIn switch_posy(PA_6);  //P26
 InterruptIn switch_posz(PC_6);  //P27

//运行中的全局变量
volatile bool Working, Getawork, Isend, Dataused, Getdata;
//FILE *fp_drawing;// 存储图案的文件
int status = 0; //0: 初始化;  1:建立通信;  2:等候任务;  3:等待数据    4:正在执行一个任务
int now_x, now_y,now_z;
int Endoffile = 0;

// float thedata[50][3];
// char sdata[1024];
int Nofdata;
bool ifreceive;

//与实际有关参数
float Lenoflattice = 1 ;//mm  取1mm为xy单元  unit_xy/Lenoflattice=100
int unit_xy = 100;  //单位长度(xy移动一格)对应unit_xy转   大约10cm/3圈/9600step 约96mm/9600step=0.1mm/10step
int unit_x = 103;  //单位长度(xy移动一格)对应unit_x转   大约10cm/3圈/9600step 约96mm/9600step=0.1mm/10step
int unit_y = 103;  //单位长度(xy移动一格)对应unit_y转   大约10cm/3圈/9600step 约96mm/9600step=0.1mm/10step
///Ticker ticker_step;
float step_halfperiod = 0.0001;//0.0002;
int max_x, max_y;
int dir_x = 1;///调试时调整
int dir_y = 1;///调试时调整
int dir_z = 1;///调试时调整

bool ready = 0;
bool start = 0;
bool done = 0;

char buf[256];
int cur;
bool received;
bool flagx, flagy , flagz , flaga , flagw , flagp;
float X1 , X2 , Y1 , Y2 , Z , A;              // 定义浮点数值用以储存返回给机械臂的执行步数

void rotate(int id ,int pix);
void init_zero();


void beginning()
{
                                 //                 x    
                                //                ##  
    pc.printf("y\n");           //                ||    
    while(switch_pos2.read())  //    |====||=====|||#y
    {                           //                ||
    rotate(1,-5);               //                ##
    }                           //                 z
                                //  
    pc.printf("z\n");           // 
    while(switch_pos3.read())  // 
    {                           // 
    rotate(2,-5);               //   
    }                           //
                                //  
    pc.printf("x\n");           //  
    while(switch_pos1.read())  // 
    {                           //
    rotate(0,-5);                //
    }          
    init_zero();
}

void init_zero()
{
    now_x = 0;
    now_y = 0;
    now_z = 0;
    strcpy(buf,"");
//  step[0] = 0;
//  step[1] = 0;
//  step[2] = 0;
}

void rotate(int id, int pix) //id= 0--x,1--y ,2--z pix=32000为一圈
{
    if (pix >= 0) 
    {
        dir[0] = dir_x;
        dir[1] = dir_y;
        dir[2] = dir_z;
    } 
    else 
    {
        pix = -pix;
        dir[0] = 1 - dir_x;
        dir[1] = 1 - dir_y;
        dir[2] = 1 - dir_z;
    }
    for (int i = 0; i < pix; i++) 
    {
        step[id] = 1;
        wait(step_halfperiod);
        step[id] = 0;
        wait(step_halfperiod);
    }
}

void moveto(float x, float y,float z)
{
    if((x>(z-40))&&(x<(z+70))&&x>=0&&z>=0)//机械干涉限定条件
    {
        rotate(0, (x - now_x)*run/rad);
        rotate(1, (y - now_y)*run/rad);
        rotate(2, (z - now_z)*run/rad);
        now_x = x;
        now_y = y;
        now_z = z;
    }
    else
    {
        pc.printf("limited\r\n");
    }
}



void draw()
{
    //unit_xy=unit_xy*k;
    float x, y, z,a;
    FILE *fp_drawing = fopen("/sd/write.txt", "r");
    pc.printf("reading\r\n");
    flagp=0;
    for (int i = 0; fscanf(fp_drawing, "(%f %f %f %f)", &x, &y, &z,&a) == 4&&flagp==0; i++) 
    {
        pc.printf("(%f,%f,%f)|%d\r\n", x, y, z,i);
        moveto(x, y,z);
        // moveto(thedata[i][0],thedata[i][1]);
        // markd??>ot(thedata[i][2]);
    }
    fclose(fp_drawing);
    flagw = false;
    flagp = false;
    pc.printf("Here4!\r\n");
}

void btInterrupt()    //中断接收函数
{
    if(!bt.readable())
        return;
    char strRe1;                          //定义字符串
    static STATE State = PointerS;        // 初始状态待检查
    strRe1 = bt.getc();                   //读取一个byte数据

    switch(State) 
    {
        case PointerS:
            if (strRe1 == (char)'S') 
            {
                State = PointerW;        //准备跳转至数据选择
                cur = 0;
            } 
            else
                State = PointerS;
            break;
        case PointerW:
            switch (strRe1) 
            {
                case (char)'X':
                    State = PointerX;
                    break;
                case (char)'Y':
                    State = PointerY;
                    break;
                case (char)'Z':
                    State = PointerZ;
                    break;
                case (char)'S':
                    State = PointerS;
                    break;
                case (char)'L':
                    State = PointerL;
                    break;
                case (char)'A':
                    State = PointerA;
                    break;
                case (char)'W':
                    State = PointerWW;
                    break;
                case (char)'P':
                    State = PointerP;
                    break;
                case (char)'K':
                    State = PointerS;
                    pc.printf("beginning\r\n");
                    beginning();
                    break;
                
            }
        //case PointerX:
//            if (strRe1 == (char)'\n') {
//                buf[cur]='\0';
//                pc.printf("%s\n",buf);
//                X = atof(buf+1);
//                State = PointerS;
//                pc.printf("%f\n",X);
//            } else {
//                buf[cur++]=strRe1;
//            }
//            break;
//        case PointerY:
//            if (strRe1 == (char)'\n') {
//                buf[cur]='\0';
//                pc.printf("%s\n",buf);
//                Y = atof(buf+1);
//                State = PointerS;
//                pc.printf("%f\n",Y);
//            } else {
//                buf[cur++]=strRe1;
//            }
//            break;
//        case PointerZ:
//            if (strRe1 == (char)'\n') {
//                buf[cur]='\0';
//                pc.printf("%s\n",buf);
//                Z = atof(buf+1);
//                State = PointerS;
//                pc.printf("%f\n",Z);
//            } else {
//                buf[cur++]=strRe1;
//            }
//            break;
        case PointerX:
            if (strRe1 == (char)'\n') 
            {
                buf[cur]='\0';
                pc.printf("%s\r\n",buf);
                X1 = atof(buf+1);
                State = PointerS;
                pc.printf("%f\r\n",X1);      //32000bu = 360du
                flagx = true;
            } 
            else 
            {
                buf[cur++]=strRe1;
            }
            break;
        case PointerY:
            if (strRe1 == (char)'\n') 
            {
                buf[cur]='\0';
                pc.printf("%s\r\n",buf);
                Y1 = atof(buf+1);
                //Y2 = Y1;
//                Y1 = Y2 - Y1;
                State = PointerS;
                pc.printf("%f\r\n",Y1);
                flagy = true;
            } 
            else 
            {
                buf[cur++]=strRe1;
            }
            break;
        case PointerZ:
            if (strRe1 == (char)'\n') 
            {
                buf[cur]='\0';
                pc.printf("%s\r\n",buf);
                Z = atof(buf+1);
                State = PointerS;
                pc.printf("%f\r\n",Z);
                flagz = true;
            } 
            else 
            {
                buf[cur++]=strRe1;
            }
            break;
        case PointerA:
            if (strRe1 == (char)'\n') 
            {
                buf[cur]='\0';
                pc.printf("%s\n",buf);
                A = atof(buf+1);
                State = PointerS;
                pc.printf("%f\n",A);
            } 
            else 
            {
                buf[cur++]=strRe1;
            }
            break;
        case PointerL:
            if (strRe1 == (char)'\n') 
            {
                buf[cur]='\0';
                State = PointerS;
                received = true;
                pc.printf("received\r\n");
            } 
            else 
            {
                buf[cur++]=strRe1;
            }
            break;
        case PointerWW:
            flagw = true; 
            State = PointerS;         
            break; 
        case PointerP:
            flagp = true;
            State = PointerS;
            break;  
    }
}

void on_control_cmd(const char* actuator_name, const char* control_value)
{

    if (strcmp(actuator_name, "command") == 0) 
    {
        int the_command = atoi(control_value);
        //
        if(the_command==1)
        {
            ready=1;
            pc.printf("get ready\r\n");
        }
        else if(the_command==2)
        {
            start=1;
            pc.printf("get start\r\n");
        }
        else if(the_command==3)
        {
            done=1;
            pc.printf("get done\r\n");
        }
        //
        
    }
}


int main()
{
    init_zero();     //初始化
    
    bt.attach(btInterrupt);
    pc.printf("beginning\r\n");
    beginning();
    pc.printf("finish\r\n");
    
    MQTTSocket sock;
    MClient client(sock);
    //声明所有的传感器,每行一个,每个由名字、单位两部分组成,最后一行必须为空指针作为结尾
    const char* sensors[][2] = {
        "report", "",
        NULL, NULL //最后一行以空指针作为结束标记
    };

    //声明所有的执行器,每行一个,每个由名字、参数类型两部分组成,最后一行必须为空指针作为结尾
    const char* actuators[][2] = {
        "command", "",
        NULL, NULL //最后一行以空指针作为结束标记
    };
    pc.printf("connecting...\r\n");

    networking_init(sock, client, "192.168.1.100", sensors, actuators, on_control_cmd);

    pc.printf("Initialization done.\r\n");
    pc.printf("laser printer send ready.haha\r\n");
    ready=0;
    start=0;
    done=0;

    while(1) 
    {   
        if(!ready)
        {
            publish_value(client, "report", "ready.");
            //pc.printf("send ready.%d\r\n",flagw);
            pc.printf("x%d|y%d|z%d\r\n",now_x,now_y,now_z);
            
        }
        if(!start&&ready)
        {
            pc.printf("send start.%d\r\n",flagw);
            publish_value(client, "report", "wait to start.");
            
        }
//        btInterrupt();
        //wait(0.1);
        //if (sw.read() == 0)
        //{
        // pc.printf("%s.\r\n", strX);
        // pc.printf("%s.\r\n", strY);
        // pc.printf("%s.\r\n", strZ);
        // pc.printf("%s.\r\n", strA);
        //}
        
        if (flagx)
        {
            moveto(X1,now_y,now_z);
            flagx = false;
        }
        if (flagy)
        {
            moveto(now_x,Y1,now_z);
            flagy = false;
        }
        if (flagz)
        {
            moveto(now_x,now_y,Z);
            flagz = false;
        }
        if(flagw||start)
        {
            pc.printf("openning %d\r\n",flagw);
         
            FILE *fp = fopen("/sd/write.txt", "r"); //打开文件,路径以“/sd/”开头
        
            if (fp == NULL) //打开失败,原因可能是文件不存在,或卡没有连接好
            {
                printf("open error!!\r\n");
                return 1;
            }
            fgets(buf, sizeof(buf), fp); //读入一行的C函数
            pc.printf("read\r\n");
            fclose(fp);  //关闭文件,释放资源
    
            pc.printf("%s\r\n",buf);
            char *p = buf;
            float a,x,y,z;
            while(true)
            {
                p = strchr(p, '(');
                if(!p) break;
                p++;
                sscanf(p, "%f%f%f%f",&x,&y,&z,&a);
                pc.printf("%f %f %f %f\r\n",x,y,z,a);
                moveto(x,y,z);
                wait(0.5);
            }
            flagw = false;
            pc.printf("%d\r\n",flagw);
            if(!done)
            {
                publish_value(client, "report", "done.");
                pc.printf("send done.%d\r\n",flagw);
                
            }
            ready=0;
            start=0;
            done=0;
        }
        /*if (flagw)
        {
            //if (Arr[][] != 
            //{
            pc.printf("Here1!\r\n");  

            pc.printf("Here2!\r\n");    
            init_zero();
            beginning();
            draw(); 
            pc.printf("Here3!\r\n");   
            //} 
        }    */      
        if(received) 
        {
            pc.printf("%s\r\n",buf);
            FILE *fp_drawing = fopen("/sd/write.txt", "w");
            pc.printf("opening\r\n");
            if (fp_drawing == NULL)
            {
                printf("open error2!!\r\n");
                return 1;
            }
            fprintf(fp_drawing, "%s",buf);
            pc.printf("close\r\n");
            fclose(fp_drawing);
            pc.printf("write end");
            received = false;
        }
        client.yield(1000);
    } 
}