to takasou

Dependencies:   SerialMultiByte QEI chatteringremoval omni_wheel prototype01 towelest PID ikarashiMDC_2byte_ver air2 OmniPosition PS3

main.cpp

Committer:
piroro4560
Date:
2019-09-27
Revision:
2:d01bc3dcb247
Parent:
1:e7413a7b013b

File content as of revision 2:d01bc3dcb247:

//#include "mbed.h"             //Red court
//#include "ikarashiMDC.h"    
//#include "omni_wheel.h"
//#include "proto01.h"
//#include "OmniPosition.h"
//#include "SerialMultiByte.h"
//#include "PID.h"
//#include "PS3.h"
//#include "air.h"
//#include "towelest.h"
//#include "chatteringremoval.h"
//#include "pinconfig_main.h"
//
//PID angle(10.0,0.2,0.000095,0.01);
//OmniWheel omni(4);
//OmniPosition posi(main_0TX,main_0RX);
//Serial serial(mdTX, mdRX, 115200);
//RawSerial pc(USBTX, USBRX, 115200);
//SerialMultiByte sensor(main_1TX,main_1RX);
//towelest towel(&serial,2,schmitt_trigger_0,schmitt_trigger_1,schmitt_trigger_2);
//air air;
//PS3 ps3(FEPTX,FEPRX);
//chatteringremoval button1(1.0);
//DigitalOut sw1(hijoteisi);
//DigitalOut LED(LED1);
//Timer timer;
//
//int num = 0, X, Y, b[12], stick[4], trigger[2], loli[3], b+[12];
//int X0,Y0,X1,Y1;
//double valueX, valueY, value[4],mecha_power[4],spin_power=0, IRdistance[2],TFdistance[2],x2, y2;
//
//union UnionBytes{
//    uint8_t bytes[28];
//    float IRdist[7];    //0~1
//    int32_t TFdist[7];  //2~3
//    int32_t pulses[7];  //4~6 
//};
//
//ikarashiMDC motor[]=
//{
//    ikarashiMDC(0,0,SM,&serial),
//    ikarashiMDC(0,1,SM,&serial),
//    ikarashiMDC(0,2,SM,&serial),
//    ikarashiMDC(0,3,SM,&serial),
//    ikarashiMDC(1,0,SM,&serial),
//    ikarashiMDC(1,1,SM,&serial),
//    ikarashiMDC(1,2,SM,&serial),
//    ikarashiMDC(1,3,SM,&serial)
//};
//
//Proto1 proto(500, 700, 0.4, 0.14);
//
//
//void getSensorData()       //Receive sensor value 
//{
//    UnionBytes bytedata;
//    sensor.getData(bytedata.bytes);
//    for(int i=0; i<2; i++){
//        IRdistance[i] = bytedata.IRdist[i];
//    }
//    for(int i=0; i<2; i++){
//        TFdistance[i] = bytedata.TFdist[i+2];
//    }
//    for(int i=0; i<3; i++){
//        loli[i] = bytedata.pulses[i+4];
//    }
//}
//
//void clossmove0()       //Adjustment,Airfront
//{
//    if(b[0]==1 && b[1]==0 && b[2]==0 && b[3]==0){
//        x2=0;
//        y2=0.3;
//    }else if(b[0]==0 && b[1]==1 && b[2]==0 && b[3]==0){
//        x2=0;
//        y2=-0.3;
//    }else if(b[0]==0 && b[1]==0 && b[2]==1 && b[3]==0){
//        x2=-0.3;
//        y2=0;
//    }else if(b[0]==0 && b[1]==0 && b[2]==0 && b[3]==1){
//        x2=0.3;
//        y2=0;
//    }else{
//        x2=0;
//        y2=0;
//    }
//}
//
//void clossmove1()       //Adjustment,Recoveryfront
//{
//    if(b[0]==1 && b[1]==0 && b[2]==0 && b[3]==0){
//        x2=0.3;
//        y2=0;
//    }else if(b[0]==0 && b[1]==1 && b[2]==0 && b[3]==0){
//        x2=-0.3;
//        y2=0;
//    }else if(b[0]==0 && b[1]==0 && b[2]==1 && b[3]==0){
//        x2=0;
//        y2=0.3;
//    }else if(b[0]==0 && b[1]==0 && b[2]==0 && b[3]==1){
//        x2=0;
//        y2=-0.3;
//    }else{
//        x2=0;
//        y2=0;
//    }
//}
//
//void clossmove2()       //Adjustment,Dropfront
//{
//    if(b[0]==1 && b[1]==0 && b[2]==0 && b[3]==0){
//        x2=0;
//        y2=-0.3;
//    }else if(b[0]==0 && b[1]==1 && b[2]==0 && b[3]==0){
//        x2=0;
//        y2=0.3;
//    }else if(b[0]==0 && b[1]==0 && b[2]==1 && b[3]==0){
//        x2=0.3;
//        y2=0;
//    }else if(b[0]==0 && b[1]==0 && b[2]==0 && b[3]==1){
//        x2=-0.3;
//        y2=0;
//    }else{
//        x2=0;
//        y2=0;
//    }
//}
//
//void clossmove3()       //Adjustment,Towelfront
//{
//    if(b[0]==1 && b[1]==0 && b[2]==0 && b[3]==0){
//        x2=-0.3;
//        y2=0;
//    }else if(b[0]==0 && b[1]==1 && b[2]==0 && b[3]==0){
//        x2=0.3;
//        y2=0;
//    }else if(b[0]==0 && b[1]==0 && b[2]==1 && b[3]==0){
//        x2=0;
//        y2=-0.3;
//    }else if(b[0]==0 && b[1]==0 && b[2]==0 && b[3]==1){
//        x2=0;
//        y2=0.3;
//    }else{
//        x2=0;
//        y2=0;
//    }
//}
//
//void Recovery()             //Recovery mechanism
//{
//    /* 洗濯物を挟む機構 */
//    if((X0 > 170)&&(Y0 > 50 && Y0 < 200)) {
//        mecha_power[1] = 0.6;
//    }else if((X0 < 100)&&(Y0 > 50 && Y0 < 200)) {
//        mecha_power[1] = -0.6;
//    }else{
//        mecha_power[1] = 0;
//    }
//    if((X1 > 170)&&(Y1 > 50 && Y1 < 200)) {
//        mecha_power[2] = 0.6;
//    }else if((X1 < 100)&&(Y1 > 50 && Y1 < 200)) {
//        mecha_power[2] = -0.6;
//    }else{
//        mecha_power[2] = 0;
//    }
//    /* 洗濯物を挟む機構の首 */
//    if (b[10] == 1 && b[11] == 0) {
//        mecha_power[0] = 0.3;
//    } else if (b[10] == 0 && b[11] == 1) {
//        mecha_power[0] = -0.3;
//    } else {
//        mecha_power[0] =0.0;
//    }
//    mecha_power[3] = 0;
//    
//    motor[4].setSpeed(mecha_power[0]);
//    motor[5].setSpeed(mecha_power[1]);
//    motor[6].setSpeed(mecha_power[2]);
//    motor[7].setSpeed(mecha_power[3]);
//}
//
//void stop()
//{
//    for(int i=4;i<8;i++) motor[i].setSpeed(0);
//}
//
//void Drop()
//{
//    if(b[4] == 1 && b[5] == 0){              
//        mecha_power[3] = 0.5;
//    }else if(b[4] == 0 && b[5] == 1) {
//        mecha_power[3] = -0.5;
//    }else{
//        mecha_power[3] = 0;
//    }
//    motor[7].setSpeed(mecha_power[3]);
//}
//
//int main()
//{
//    sw1 = 1;
//    double nowX,nowY,t;
//    
//    for(int i=0;i<4;i++)motor[i].braking = false;
//    omni.wheel[0].setRadian(PI * 1 / 4);
//    omni.wheel[1].setRadian(PI * 3 / 4);
//    omni.wheel[2].setRadian(PI * 5 / 4);
//    omni.wheel[3].setRadian(PI * 7 / 4);
//    angle.setInputLimits(-6.28,6.28);
//    angle.setOutputLimits(-0.4,0.4);
//    angle.setBias(0);
//    angle.setMode(1);
//    angle.setSetPoint(0);
//    
//    button1.countreset();
//    
//    sensor.startReceive(28);
//    
//    while(1){
//        LED = !LED;
//        
//        towel.setPulse(loli[2]);
//        
////      PS3 value
//        for(int i = 0; i < 12; i++) {
//            b[i] = ps3.getButton(i);
//            pc.printf("%2d", b[i] );
//        }
//        for(int i = 0; i < 4; i++) {
//            stick[i] = ps3.getStick(i);
//            pc.printf("%4d", stick[i] );
//        }
//        X0 = stick[0];
//        Y0 = stick[1];
//        X1 = stick[2];
//        Y1 = stick[3];
//        
//        for(int i = 0; i < 2; i++) {
//            trigger[i] = ps3.getTrigger(i);
////            pc.printf("%4d",trigger[i]);
//        }
//
//        //Sensor value
//        getSensorData();
//
//        //Count
//        button1.assignvalue(b[9]);
//        num = button1.getCount();
//        
//        /*【Action】*/
//        switch(num){       
//            case 0: angle.setSetPoint(0);
//                    clossmove0();
//                    Recovery();
//                    towel.open();
//                    air.solenoid1_open();
//                    nowX = posi.getX();
//                    nowY = posi.getY();
//                    break;
//            case 1: proto.targetXY(-3000, 0, nowX ,nowY);
//                    towel.allstop();
//                    stop();
//                    break;
//            case 2: angle.setSetPoint(1.57);
//                    Drop();
//                    clossmove3();
//                    towel.allstop();
//                    stop();
//                    nowX = posi.getX();
//                    nowY = posi.getY();
//                    break;
//            case 3: proto.targetXY(-2000, 3000, nowX ,nowY);
//                    towel.allstop();
//                    stop();
//                    if((posi.getX()>-2200 && posi.getX()<-1800) && (posi.getY()>2800 && posi.getY()<3200)){
//                        num = 4;
//                        angle.setSetPoint(0);
//                    }
//                    break;
//            case 4: clossmove0();
////                    Recovery();
////                    nowX = posi.getX();
////                    nowY = posi.getY();
////                    break;
////            case 5: proto.targetXY(-3000, 0, nowX ,nowY);
////                    break;
////            case 6: angle.setSetPoint(1.57);
////                    Drop();
////                    clossmove3();
////                    nowX = posi.getX();
////                    nowY = posi.getY();
////                    break;
////            case 7: proto.targetXY(-3000,2600,-3000,0);
////                    if(posi.getX()>-3200 && posi.getX()<-2800 && posi.getY()>2400 && posi.getY()<2800){
////                        num = 8;
////                    }
////                    break;
////            case 8: angle.setSetPoint(1.57);
////                    clossmove3();
////                    nowX = posi.getX();
////                    nowY = posi.getY();
////                    
////                    towel.drop();
////                    t = timer.read();
////                    if(b[4] == 1 && b[5] == 1){
////                        timer.start();
////                    }
////                    if(t > 5){
////                        towel.close();
////                    }else if(t > 20){
////                        angle.setSetPoint(0);
////                        air.solenoid2_open();
////                    }
////                    break;      
////            case 9: angle.setSetPoint(0);
////                    proto.targetXY(0, 0,nowX ,nowY);
////                    break;
//            default: motor[0].setSpeed(0);
//                     motor[1].setSpeed(0);
//                     motor[2].setSpeed(0);
//                     motor[3].setSpeed(0); 
//                     
//                     air.solenoid1_close();
//                     air.solenoid2_close();
//                              
//        }
//        
//        angle.setProcessValue(posi.getTheta());
//        spin_power = -angle.compute();
//
//        if(num == 0 || num == 2 || num == 4 || num == 6 || num == 8){
//            omni.computeXY(x2,y2,spin_power);
//        }else{
//            proto.Input_nowXY(posi.getX(),posi.getY());
//            proto.calculate();
//            omni.computeXY(proto.getvalue_x(), proto.getvalue_y(), spin_power);
//        }
//        /*
//        omni.conputeCircular(proto.getValue(), proto.gettheta(), spin_power);
//        */
//        
//        for(int i = 0; i < 4; i++){
//            value[i] = omni.wheel[i];
//            motor[i].setSpeed(value[i]);
////            pc.printf("%f ", value[i]);
//        }
//        
////        wait(0.001);
//        pc.printf(" loli:%d case:%d",loli[2],num);
//        
//         //Wheel value
////        pc.printf(" vector:%f  pid:%.2f",proto.vector,spin_power);
//         //Odmetry
////        pc.printf("x:%d y:%d θ:%f now:%f",posi.getX(),posi.getY(),posi.getTheta(),proto.nowDis);
//        
//        pc.printf("\r\n");
//        for(int i = 0; i < 12; i++) {
//            b+[i] = ps3.getButton(i);
//        }
//    }
//}
#include "mbed.h"          //たかそうのロボット
#include "ikarashiMDC.h"
#include "omni_wheel.h"
#include "proto01.h"
#include "OmniPosition.h"
#include "PID.h"
#include "pinconfig_main.h"

PID angle(20.0,5.0,0.0000001,0.01);
OmniWheel omni(4);
OmniPosition posi(main_0TX, main_0RX);
Serial serial(mdTX, mdRX, 115200);
DigitalOut serialcontrol(D10);
RawSerial pc(USBTX, USBRX, 115200);
DigitalOut sw1(PB_1);
DigitalOut sw2();

ikarashiMDC motor[]=
{
    ikarashiMDC(0,0,SM,&serial),
    ikarashiMDC(0,1,SM,&serial),
    ikarashiMDC(0,2,SM,&serial),
    ikarashiMDC(0,3,SM,&serial)
};

Proto1 proto(500, 500, 0.4, 0.14);

int main()
{
    sw1 = 1;
    int cnt=0;
    motor[0].braking = true;
    double valueX, valueY, value[4];
    omni.wheel[0].setRadian(PI * 1 / 4);
    omni.wheel[1].setRadian(PI * 3 / 4);
    omni.wheel[2].setRadian(PI * 5 / 4);
    omni.wheel[3].setRadian(PI * 7 / 4);
    angle.setInputLimits(-3.14,3.14);
    angle.setOutputLimits(-0.4,0.4);
    angle.setBias(0);
    angle.setMode(1);
    angle.setSetPoint(0);
    while(1){
        angle.setProcessValue(posi.getTheta());
        double spin_power = -angle.compute();
        /*ここから*/
        if  (cnt==700) proto.targetXY(2000, 3000, posi.getX(), -posi.getY());
        if (cnt==1400) proto.targetXY(2000, 6000, posi.getX(), -posi.getY());
        if (cnt==2100) proto.targetXY(0, 6000, posi.getX(), -posi.getY());
        if (cnt==2800) proto.targetXY(0, 3000, posi.getX(), -posi.getY());
        if (cnt==3500) proto.targetXY(0, 0, posi.getX(), -posi.getY());
//        if (cnt==3000) proto.targetXY(0, 0, posi.getX(), posi.getY());
        proto.Input_nowXY(posi.getX(), -posi.getY());
        proto.calculate();
        omni.computeXY(proto.getvalue_x(), proto.getvalue_y(), spin_power);
        /*ここまで*/
        
        for(int i = 0; i < 4; i++){
            value[i] = omni.wheel[i];
//            pc.printf("%.2f || ",value[i]);
        }
        pc.printf("x:%d || y:%d || θ:%f || vector:%f || now:%f || c:%f"
        , posi.getX(), -posi.getY(), posi.getTheta(), proto.vector, proto.nowDis, proto.counter);
        
        for(int i = 0; i < 4; i++) {
            if (fabs(value[i]) < 0.05) value[i] = 0;
            motor[i].setSpeed(value[i]);
        }
        cnt++;
        pc.printf("||pid:%.2f\r\n",spin_power);
    }
}