mother
Dependencies: PS3 i2cmaster mbed
main.cpp
- Committer:
- sgrsn
- Date:
- 2016-09-30
- Revision:
- 1:755d8977d4a3
- Parent:
- 0:a6b6c585a378
File content as of revision 1:755d8977d4a3:
#include "mbed.h" #include "PS3.h" #include "i2cmaster.h" #include "define.h" #define Enter 13 #define BackSpace 8 #define Space 32 i2c myi2c(p28, p27); int i2ccheck[4] = {}; int timer = 0; void check() { timer++; /*Slave puted data first by mother cause error*/ myi2c.WriteSomeData(0xFE, check_reg, 0, 1); //0xFE is imaginary address /*then, I puted imaginary address yhe!*/ myi2c.WriteSomeData(MD1_addr, check_reg, 0, 1); myi2c.WriteSomeData(MD2_addr, check_reg, 0, 1); myi2c.WriteSomeData(MD3_addr, check_reg, 0, 1); myi2c.WriteSomeData(MD4_addr, check_reg, 0, 1); myi2c.WriteSomeData(MD5_addr, check_reg, 0, 1); myi2c.WriteSomeData(MD6_addr, check_reg, 0, 1); myi2c.WriteSomeData(MD7_addr, check_reg, 0, 1); myi2c.WriteSomeData(MD8_addr, check_reg, 0, 1); myi2c.WriteSomeData(MD9_addr, check_reg, 0, 1); myi2c.WriteSomeData(MD10_addr, check_reg, 0, 1); myi2c.WriteSomeData(SE1_addr, check_reg, 0, 1); myi2c.WriteSomeData(SE2_addr, check_reg, 0, 1); myi2c.WriteSomeData(CY1_addr, check_reg, 0, 1); myi2c.WriteSomeData(SERVO1_addr, check_reg, 0, 1); myi2c.WriteSomeData(0xFE, check_reg, 0, 1); } union UNION { int integer; char character[4]; }; UNION PM_target[4]; UNION PM_ofset[4]; UNION RE_target[4]; UNION gain; Serial pc(USBTX, USBRX); int pcdata = 0; int prev_pcdata = 0; void getpc(); DigitalOut sbdbt_battery(p21); DigitalOut xbee_battery(p5); int main() { BusOut leds(LED1, LED2, LED3, LED4); NVIC_SetPriority(TIMER0_IRQn, 20); NVIC_SetPriority(TIMER1_IRQn, 20); NVIC_SetPriority(TIMER2_IRQn, 20); NVIC_SetPriority(TIMER3_IRQn, 20); NVIC_SetPriority(UART0_IRQn, 10); NVIC_SetPriority(UART1_IRQn, 10); NVIC_SetPriority(UART2_IRQn, 10); NVIC_SetPriority(UART3_IRQn, 10); PS3 sbdbt(p13, p14); PS3 xbee(p9, p10); sbdbt_battery = 1; sbdbt.baud(9600); xbee_battery = 1; xbee.baud(9600); //xbee.addattach(sbdbt_to_xbee); //sbdbt.addattach(xbee_to_sbdbt); pc.attach(getpc); myi2c.frequency(1000000); Ticker t; t.attach(check, 0.1); int prev_PM_target[4] = {}; char sensor1 = 0; char sensors[8] = {}; char sensorsflag[8] = {}; char sensor2 = 0; int gainup = 0; int Dpad_deg = 0; bool Dpadctrl_flag = 1; //0, ue, sita int Dpad_table[3][3] = {{ 0, 0, 180}, //0 { 90, 45, 135}, //migi {-90, -45, -135}};//hidari int wheel[4] = {}; int torikomi_taosu_motor = 0; int modechange = 0; int modechangeflag = 1; bool counterwheel = 0; bool l1 = 0; bool r1 = 0; bool l2 = 0; bool r2 = 0; bool Maru = 0; bool Batu = 0; bool Sankaku = 0; int sankakuflag = 0; bool Sikaku = 0; bool Ue = 0; bool Sita = 0; bool Migi = 0; bool Hidari = 0; int RightY = 0; int LeftY = 0; int LeftX = 0; wait_ms(500); for(int address = 0; address < 4; address++) { while(PM_ofset[address].integer < 1750 || PM_ofset[address].integer > 1850) { for(int i = 0; i < 4; i++) { myi2c.getSlaveRegistarData(MD1_addr + (0x02*address), PM_ofset_reg + i, &PM_ofset[address].character[i], 1); wait_ms(20); } } PM_target[address].integer = PM_ofset[address].integer; } while(1) { leds = modechange; if( modechangeflag && ( sbdbt.getSELECTState() | xbee.getSELECTState() ) ) { modechange++; if(modechange == 4)modechange = 0; modechangeflag = 0; wait_ms(500); } modechangeflag = !( sbdbt.getSELECTState() | xbee.getSELECTState() ); Maru = sbdbt.getButtonState(maru) | xbee.getButtonState(maru); Batu = sbdbt.getButtonState(batu) | xbee.getButtonState(batu); Sankaku = (sbdbt.getButtonState(sankaku) | xbee.getButtonState(sankaku)) & modechangeflag; Sikaku = (sbdbt.getButtonState(sikaku) | xbee.getButtonState(sikaku)) & modechangeflag; l1 = sbdbt.getButtonState(L1) | xbee.getButtonState(L1); r1 = sbdbt.getButtonState(R1) | xbee.getButtonState(R1); l2 = sbdbt.getButtonState(L2) | xbee.getButtonState(L2); r2 = sbdbt.getButtonState(R2) | xbee.getButtonState(R2); Ue = sbdbt.getButtonState(ue) | xbee.getButtonState(ue); Sita = sbdbt.getButtonState(sita) | xbee.getButtonState(sita); Migi = sbdbt.getButtonState(migi) | xbee.getButtonState(migi); Hidari = sbdbt.getButtonState(hidari) | xbee.getButtonState(hidari); RightY = sbdbt.getRightJoystickYaxis(); LeftY = sbdbt.getLeftJoystickYaxis(); LeftX = sbdbt.getLeftJoystickXaxis(); for(int i = 0; i < 8; i++) sensors[i] = (sensor1>>i) & 1; switch(modechange) { case 0: //start to area1 clear /*LeftY : tukamuyatu spin**********************************/ if(LeftY > 0) { myi2c.WriteSomeData(MD5_addr, motor1_state, 5, 1); } else if(LeftY < 0) { myi2c.WriteSomeData(MD5_addr, motor1_state, 10, 1); LeftY = LeftY * (-1); } else { myi2c.WriteSomeData(MD5_addr, motor1_state, 3, 1); } myi2c.WriteSomeData(MD5_addr, motor1_pwm, LeftY * 4-1, 1); /*RightY : rail slide***********************************/ if(RightY > 0) { myi2c.WriteSomeData(MD5_addr, motor2_state, 5, 1); } else if(RightY < 0) { myi2c.WriteSomeData(MD5_addr, motor2_state, 10, 1); RightY = RightY * (-1); } else { myi2c.WriteSomeData(MD5_addr, motor2_state, 3, 1); } myi2c.WriteSomeData(MD5_addr, motor2_pwm, RightY * 4-1, 1); /*Sikaku : cylinder*****************************************/ myi2c.WriteSomeData(CY1_addr, motor1_state, Sikaku, 1); break; case 1: //box torikomi to bridge /*Sankaku : torikomi taosu********************************************************/ myi2c.WriteSomeData(MD6_addr, motor2_pwm, 255, 1); if(Sankaku == 0) { sankakuflag = 1; } if(sankakuflag && Sankaku) { torikomi_taosu_motor++; if((torikomi_taosu_motor % 2)) { myi2c.WriteSomeData(MD6_addr, motor2_state, 5, 1); //torikomi taosu } else { myi2c.WriteSomeData(MD6_addr, motor2_state, 10, 1); //torikomi modosu } sankakuflag = 0; } if(sensors[0] == 0) { sensorsflag[0] = 1; } if((sensorsflag[0] == 1 && sensors[0] == 1) || !Sankaku) { myi2c.WriteSomeData(MD6_addr, motor2_state, 3, 1); //torikomi taosi stop sensorsflag[0] = 0; } /*LeftY : torikomi slide**********************************/ if(LeftY > 0) { myi2c.WriteSomeData(MD6_addr, motor1_state, 5, 1); } else if(LeftY < 0) { myi2c.WriteSomeData(MD6_addr, motor1_state, 10, 1); LeftY = LeftY * (-1); } else { myi2c.WriteSomeData(MD6_addr, motor1_state, 3, 1); } myi2c.WriteSomeData(MD6_addr, motor1_pwm, LeftY * 4-1, 1); /*Sikaku : cylinder*********************************************/ myi2c.WriteSomeData(CY1_addr, motor1_state, Sikaku, 1); break; case 2: //bridge to area3 myi2c.WriteSomeData(SERVO1_addr, motor1_state, (!Sankaku) | (Sankaku << 1) | ((RightY > 60) << 2) | (Sikaku << 3), 1); /*RightY : bridge1*********************************************** if(RightY > 0) { myi2c.WriteSomeData(MD7_addr, motor1_state, 5, 1); } else if(RightY < 0) { myi2c.WriteSomeData(MD7_addr, motor1_state, 10, 1); RightY = RightY * (-1); } else { myi2c.WriteSomeData(MD7_addr, motor1_state, 3, 1); } myi2c.WriteSomeData(MD7_addr, motor1_pwm, RightY * 4-1, 1); /*LeftY : bridge2****************************************************** if(LeftY > 0) { myi2c.WriteSomeData(MD7_addr, motor2_state, 5, 1); } else if(LeftY < 0) { myi2c.WriteSomeData(MD7_addr, motor2_state, 10, 1); LeftY = LeftY * (-1); } else { myi2c.WriteSomeData(MD7_addr, motor2_state, 3, 1); } myi2c.WriteSomeData(MD7_addr, motor2_pwm, LeftY * 4-1, 1);*/ break; case 3: //box pile up /*LeftX : jack move*************************************************/ if(!Sankaku) { if(LeftX > 0) { myi2c.WriteSomeData(MD8_addr, motor1_state, 5, 1); } else if(LeftX < 0) { myi2c.WriteSomeData(MD8_addr, motor1_state, 10, 1); LeftX = LeftX * (-1); } else { myi2c.WriteSomeData(MD8_addr, motor1_state, 3, 1); } myi2c.WriteSomeData(MD8_addr, motor1_pwm, LeftX * 4-1, 1); } /*Sikaku : jack up***************************************************/ myi2c.WriteSomeData(MD8_addr, motor2_state, Sikaku * 5, 1); myi2c.WriteSomeData(MD8_addr, motor2_pwm, 255, 1); /*RightY : rail up***************************************************/ if(RightY > 0) { myi2c.WriteSomeData(MD9_addr, motor1_state, 5, 1); myi2c.WriteSomeData(MD9_addr, motor2_state, 5, 1); } else if(RightY < 0) { myi2c.WriteSomeData(MD9_addr, motor1_state, 10, 1); myi2c.WriteSomeData(MD9_addr, motor2_state, 10, 1); RightY = RightY * (-1); } else { myi2c.WriteSomeData(MD9_addr, motor1_state, 3, 1); myi2c.WriteSomeData(MD9_addr, motor2_state, 3, 1); } myi2c.WriteSomeData(MD9_addr, motor1_pwm, RightY * 4-1, 1); myi2c.WriteSomeData(MD9_addr, motor2_pwm, RightY * 4-1, 1); /*Sankaku & LeftY : center slide**************************************/ if(Sankaku) { if(LeftY > 0) { myi2c.WriteSomeData(MD10_addr, motor1_state, 5, 1); } else if(LeftY < 0) { myi2c.WriteSomeData(MD10_addr, motor1_state, 10, 1); LeftY = LeftY * (-1); } else { myi2c.WriteSomeData(MD10_addr, motor1_state, 3, 1); } myi2c.WriteSomeData(MD10_addr, motor1_pwm, LeftY * 4-1, 1); } break; } /*Steering******************************************************/ Dpad_deg = Dpad_table[Migi + 2*Hidari][Ue + 2*Sita]; if(Dpad_deg < -90) { Dpad_deg += 180; counterwheel = 1; } else if(Dpad_deg > 90) { Dpad_deg -= 180; counterwheel = 1; } else { counterwheel = 0; } if(Ue | Sita | Migi | Hidari) { Dpadctrl_flag = 1; } else { Dpadctrl_flag = 0; } if(Batu) { for(int i = 2; i < 4; i++) { prev_PM_target[i] = PM_target[i].integer; if(Dpadctrl_flag) { //PM_target[i].integer = (int)((Dpad_deg > 0)? Dpad_deg + 0.5 : Dpad_deg - 0.5) + PM_ofset[i].integer; PM_target[i].integer = Dpad_deg + PM_ofset[i].integer; } RE_target[i].integer = 300 * Maru; } } else { for(int i = 0; i < 4; i++) { prev_PM_target[i] = PM_target[i].integer; if(Dpadctrl_flag) { //PM_target[i].integer = (int)((Dpad_deg > 0)? Dpad_deg + 0.5 : Dpad_deg - 0.5) + PM_ofset[i].integer; PM_target[i].integer = Dpad_deg + PM_ofset[i].integer; } RE_target[i].integer = 300 * Maru; } } if(Maru) { wheel[0] = 2 - counterwheel; wheel[1] = 1 + counterwheel; wheel[2] = 1 + counterwheel; wheel[3] = 2 - counterwheel; if(l2) { wheel[0] = 1; wheel[1] = 1; wheel[2] = 1; wheel[3] = 1; } if(r2) { wheel[0] = 2; wheel[1] = 2; wheel[2] = 2; wheel[3] = 2; } } /*else if(Batu) { wheel[0] = 1 + counterwheel; wheel[1] = 2 - counterwheel; wheel[2] = 2 - counterwheel; wheel[3] = 1 + counterwheel; }*/ else { wheel[0] = 0; wheel[1] = 0; wheel[2] = 0; wheel[3] = 0; } if(r1) { if(Batu) { for(int i = 2; i < 4; i++) PM_target[i].integer += 5; Dpadctrl_flag = 0; } else { for(int i = 0; i < 4; i++) PM_target[i].integer += 5; Dpadctrl_flag = 0; } } else if(l1) { if(Batu) { for(int i = 2; i < 4; i++) PM_target[i].integer -= 5; Dpadctrl_flag = 0; } else { for(int i = 0; i < 4; i++) PM_target[i].integer -= 5; Dpadctrl_flag = 0; } } else if(r2 | l2) { PM_target[0].integer = 45 + PM_ofset[0].integer; PM_target[1].integer = -45 + PM_ofset[1].integer; PM_target[2].integer = 45 + PM_ofset[2].integer; PM_target[3].integer = -45 + PM_ofset[3].integer; Dpadctrl_flag = 0; } /*wheel communication*************************************/ for(int address = 0; address < 4; address++) { myi2c.WriteSomeData(MD1_addr + (0x02*address), wheel_start, wheel[address], 1); if(PM_target[address].integer != prev_PM_target[address]) { myi2c.WriteSomeData(MD1_addr + (0x02*address), PM_start, 0, 1); } for(int i = 0; i < 4; i++) { myi2c.WriteSomeData(MD1_addr + (0x02*address), PM_target_reg + i, PM_target[address].character[i], 1); myi2c.WriteSomeData(MD1_addr + (0x02*address), RE_target_reg + i, RE_target[address].character[i], 1); } //myi2c.WriteSomeData(MD1_addr + (0x02*address), pid_start, 1, 1); myi2c.WriteSomeData(MD1_addr + (0x02*address), PM_start, 1, 1); } myi2c.getSlaveRegistarData(SE1_addr, 0, &sensor1, 1); wait_ms(20); myi2c.getSlaveRegistarData(SE2_addr, 0, &sensor2, 1); wait_ms(20); } } void getpc() { if(pc.readable()) { prev_pcdata = pcdata; pcdata = pc.getc(); } }