For Sewing Robot use

Dependencies:   mbed

main.cpp

Committer:
stanley1228
Date:
2018-07-13
Revision:
0:9b0f6c2eaea2

File content as of revision 0:9b0f6c2eaea2:

#include "mbed.h"

//------------------------------------
// Hyperterminal configuration
// 9600 bauds, 8-bit data, no parity
//------------------------------------

Serial pc(SERIAL_TX, SERIAL_RX);
Serial se3(PC_10,PC_11); //left top of CN7,right top of CN7(MB1136)
//DigitalOut myled(LED1);

//==pin define==//
//rotate motor
DigitalOut pin_en(D2);
DigitalOut pin_dir(D3);
DigitalOut pin_step(D4);

//gripper
PwmOut     pin_grp_pwmL(D10);
DigitalOut pin_grpL_1(D8);
DigitalOut pin_grpL_2(D9);
PwmOut     pin_grp_pwmR(D5);
DigitalOut pin_grpR_1(D7);
DigitalOut pin_grpR_2(D6);



//foot lifter
DigitalOut pin_footlifter(D12);

//spindle
AnalogOut  pin_spindle(PA_4); //A2

//trimmer
DigitalOut pin_trimmer(D13);
//================//
//==Rotate Motor==//
//================//
#define DEF_STEP_M_EN           false
#define DEF_STEP_M_DIS          true
#define DEF_CLOCK_WISE          true
#define DEF_COUNTER_CLOCK_WISE  false

//腰身圓盤72格/圈  72格/360 = 1格/5deg = 0.2格/deg
//馬達9格/圈 ->1格/40deg
//EX:轉腰90deg -> 腰轉90*0.2=18格 -> 馬達轉18*40=720degree = 720/(1.8)*16=400*16=6400 step  

#define DEF_DEG_TO_STEPS        (16/1.8)
#define DEF_WAIST_GRID_PER_DEG  0.2f
#define DEF_STEP_M_DEG_PER_GRID 40

int RotateMotor(bool dir,float deg) 
{
    int steps=deg*DEF_WAIST_GRID_PER_DEG*DEF_STEP_M_DEG_PER_GRID*DEF_DEG_TO_STEPS;
    
    //pc.printf("steps=%d\n",steps);
    
    pin_dir=dir;
    
    pin_en=DEF_STEP_M_EN;
    
    for(int i=0;i<steps;i++)
    {
        pin_step=true;  
        wait_ms(1); 
        pin_step=false;
        wait_ms(1); 
    }
   
    
    pin_en=DEF_STEP_M_DIS;
    return 0;
}   

//============//
//==Gripper==//
//============//
#define DEF_RELEASE 0
#define DEF_HOLD    1
#define DEF_RIGHT_HAND  1
#define DEF_LEFT_HAND   2

void initial_TB6612FNG_Gripper()
{
    // Set PWM
    pin_grp_pwmL.period_ms(2);
    pin_grp_pwmL.write(0.5);    
    
    pin_grp_pwmR.period_ms(2);
    pin_grp_pwmR.write(0.5);    
}
void TB6612FNG_Gripper(int rh,bool hold,int delay_ms)
{
    if(rh==DEF_RIGHT_HAND)
    {
        if(hold==true)
        {
            pin_grpR_1=1;
            pin_grpR_2=0;
            wait_ms(delay_ms); 
        }  
        else
        {
            pin_grpR_1=0;
            pin_grpR_2=1;
            wait_ms(delay_ms);    
        }  
        pin_grpR_1=0;
        pin_grpR_2=0;
        
    }
    else if(rh==DEF_LEFT_HAND)
    {
        if(hold==true)
        {
            pin_grpL_1=1;
            pin_grpL_2=0;
            wait_ms(delay_ms); 
        }  
        else
        {
            pin_grpL_1=0;
            pin_grpL_2=1;
            wait_ms(delay_ms);    
        }  
        pin_grpL_1=0;
        pin_grpL_2=0;
    }
}


//====================
//communication struct
//====================
#define DEF_CMD_ROTATE_MOTOR    0xa1
#define DEF_CMD_GRIP            0xa2
#define DEF_CMD_FL              0xa3
#define DEF_CMD_SPINDLE         0xa4
#define DEF_CMD_TRIMMER         0xa5

#define DEF_IX_PARA_DIR             0
#define DEF_IX_PARA_DEG_HIGH        1
#define DEF_IX_PARA_DEG_LOW         2
#define DEF_ECHO_ROTATE_MOTOR_DONE  3

#define DEF_IX_PARA_GRP_LR      0
#define DEF_IX_PARA_GRP_HOLD    1
#define DEF_IX_PARA_GRP_DELAY_H 2
#define DEF_IX_PARA_GRP_DELAY_L 3





int main()
{
    char para[4]={0};
    
    initial_TB6612FNG_Gripper();
    
    //pc.printf("start\n");
 
    //TB6612FNG_Gripper(DEF_LEFT_HAND,false,500);
    //RotateMotor(DEF_COUNTER_CLOCK_WISE,90);
    
    while(1) 
    {    
        if(se3.readable())
        {     
            char cmd;
            cmd=se3.getc();
         
            
            if(cmd==DEF_CMD_ROTATE_MOTOR)
            {
                //pc.printf("DEF_CMD_ROTATE_MOTOR\n");
    
                for(int i=0;i<3;i++)
                {   
                    para[i]=se3.getc();   
                }
                bool dir=(para[DEF_IX_PARA_DIR]==1)? DEF_CLOCK_WISE:DEF_COUNTER_CLOCK_WISE;
                int deg=para[DEF_IX_PARA_DEG_HIGH]<<8 | para[DEF_IX_PARA_DEG_LOW];
                
                //pc.printf("dir=%d\n",dir);
                //pc.printf("deg=%d\n",deg);
                
                RotateMotor(dir,deg);
                
                //pc.printf("after RotateMotor\n");    
                //echo to master after rotate done
                cmd=DEF_ECHO_ROTATE_MOTOR_DONE;
                se3.putc(cmd);
                
            }
            else if(cmd==DEF_CMD_GRIP)
            {
                for(int i=0;i<4;i++)
                {
                    para[i]=se3.getc();                    
                }
               
                unsigned char lr=para[DEF_IX_PARA_GRP_LR];
                bool hold=para[DEF_IX_PARA_GRP_HOLD];
                int delay_ms=para[DEF_IX_PARA_GRP_DELAY_H]<<8 | para[DEF_IX_PARA_GRP_DELAY_L];
                
                //pc.printf("lr=%d\n",lr);
                //pc.printf("hole=%d\n",hold);
                //pc.printf("delay_ms=%d\n",delay_ms);
                
                TB6612FNG_Gripper(lr,hold,delay_ms);
            }
            else if(cmd==DEF_CMD_FL)
            {
                para[0]=se3.getc(); 
                bool sw=(bool)para[0];
                
                pin_footlifter=sw;
                
                //pc.printf("pin_footlifter=%d\n",sw);
                        
            }         
            else if(cmd==DEF_CMD_SPINDLE)
            {
                para[0]=se3.getc();       
                bool sw=(bool)para[0];
                
                if(sw==true)
                    pin_spindle.write(1); //改為使用固定低速,所以直接給高低為準,但是腳位還是在類比腳位   原本的pin_spindle.write(0.378);//0.3780=1.25V minimum speed to sew
                else
                    pin_spindle.write(0);
                    
                //pc.printf("pin_spindle=%d\n",sw);
                
            }
            else if(cmd==DEF_CMD_TRIMMER)
            {
                para[0]=se3.getc();       
                bool sw=(bool)para[0];
                
                pin_trimmer=sw;
                
                //pc.printf("pin_trimmer=%d\n",sw);
            } 
        }
        wait_ms(1);    
    }
}