ハセオムニのプログラム
Dependencies: vnh5019 SerialMultiByte omni_wheel PID jy901 MotorSMLAP PS3
main.cpp
- Committer:
- LVRhase01
- Date:
- 2021-07-23
- Revision:
- 26:223339e60e00
- Parent:
- 25:0e4817d84fd5
- Child:
- 27:2d7a978e70ab
File content as of revision 26:223339e60e00:
#define BEAT 140 #include "mbed.h" #include "math.h" #include "omni_wheel.h" #include "motorsmlap.h" #include "jy901.h" #include "SerialMultiByte.h" #include "PID.h" JY901 jy(PB_9, PB_8); //sda, scl PID angle(2.0,0,0,0.01); Serial pc(USBTX, USBRX, 115200); SerialMultiByte arduino(PC_12,PD_2); SerialMultiByte m5stack(PC_10,PC_11); PwmOut beep(PA_0); DigitalIn sw(PC_13); DigitalOut led1(PB_5); DigitalOut led2(LED2); DigitalOut led3(PA_1); DigitalOut led4(PA_10); motorSmLap motor[] = { motorSmLap(PC_6, PC_9, PC_8), motorSmLap(PB_6, PA_9, PC_7), motorSmLap(PA_8, PB_4, PB_7) }; const double PII = 3.14159265358979; OmniWheel omni(3); Ticker timer; int setmode=0; void tick(void) { //pc.printf(" %d\n",setmode); if(sw.read()==0)led2=1; else led2=0; } void setup(){ arduino.setHeaders(127,127); arduino.startReceive(5); m5stack.setHeaders(127,127); m5stack.startReceive(9); omni.wheel[0].setRadian(PII/2.0); omni.wheel[1].setRadian(7.0/6.0*PII); omni.wheel[2].setRadian(11.0/6.0*PII); beep.period(1.0/3136); beep.write(0.4f); wait_ms(BEAT); beep.period(1.0/2960); beep.write(0.4f); wait_ms(BEAT); beep.period(1.0/2489); beep.write(0.4f); wait_ms(BEAT); beep.period(1.0/1760); beep.write(0.4f); wait_ms(BEAT); beep.period(1.0/1661); beep.write(0.4f); wait_ms(BEAT); beep.period(1.0/2637); beep.write(0.4f); wait_ms(BEAT); beep.period(1.0/3322); beep.write(0.4f); wait_ms(BEAT); beep.period(1.0/4186); beep.write(0.4f); wait_ms(BEAT); beep.write(0.0f); wait_ms(BEAT); } int main() { setup(); int ssw=1; float x, y,now_angle; jy.calibrateAll(50); uint8_t weight[5]; uint8_t data[10]; angle.setInputLimits(-180.0,180.0); angle.setOutputLimits(-1,1); angle.setBias(0); angle.setMode(1); angle.setSetPoint(0); sw.mode(PullUp); timer.attach(&tick, 0.1); while (true) { /*青スイッチモード切り替え*/ if(sw.read()==1){ if(ssw==0){ ssw=1; } }else{ if(ssw==1){ setmode++; ssw=0; } if(setmode>=2){ setmode=0; } } switch(setmode){ /*RCWCcontrollerモード*/ case 0: led1=1; led3=0; led4=0; m5stack.getData(data); y=(data[3]-127.5)/127.5; x=(data[2]-127.5)/127.5; //誤差をなくす if(x==-1 && y==-1){// x=0; y=0; } if((x>=0&&x<=0.2)||(x<=0&&x>=-0.2)){ x=0; } if((y>=0&&y<=0.2)||(y<=0&&y>=-0.2)){ y=0; } //十字モード if(data[1]==1){ y=0.5; } if(data[1]==2){ y=-0.5; } if(data[1]==4){ x=0.5; } if(data[1]==8){ x=-0.5; } //iosジャイロモード if(data[0]==10){//L1とR1が同時に押された時の値 if(data[8]<30){ y=0.5; } if(data[8]>230){ y=-0.5; } if(data[6]<40){ x=-0.5; } if(data[6]>220){ x=0.5; } } now_angle = jy.getZaxisAngle(); if(now_angle>180 && now_angle<360){ now_angle = now_angle-360; } angle.setProcessValue(now_angle); omni.computeXY( x, y, 0, 0, angle.compute() ); for(int i=0; i<3; i++){ motor[i].setMotorSpeed(omni.wheel[i].getOutput()*0.8); } pc.printf("X = <%f>,Y = <%f>,angle= <%f>\r\n",x,y,now_angle); break; /*wii balance boardモード*/ case 1: led1=0; led3=1; led4=0; arduino.getData(weight); for (uint8_t i = 0; i < 4; i++) { pc.printf("%d",weight[i]); pc.printf("\t"); } y = weight[0] + weight[2] - weight[1] - weight[3]; x = weight[0] + weight[1] - weight[2] - weight[3]; if(y < -50){ y = -0.5; }else if(y > 50){ y = 0.5; }else{ y = 0; } if(x < -50){ x = -0.5; }else if(x > 50){ x = 0.5; }else{ x = 0; } now_angle = jy.getZaxisAngle(); if(now_angle>180 && now_angle<360){ now_angle = now_angle-360; } angle.setProcessValue(now_angle); omni.computeXY( x, y, 0, 0, angle.compute() ); for(int i=0; i<3; i++){ motor[i].setMotorSpeed(omni.wheel[i].getOutput()*0.8); } pc.printf("X = <%f>,Y = <%f>,angle= <%f>\r\n",x,y,now_angle); break; } } }