JuHwan Kim
/
20161126_cmaker2
main.cpp
- Committer:
- mcthemax
- Date:
- 2016-12-08
- Revision:
- 0:48c5db999587
File content as of revision 0:48c5db999587:
#include "mbed.h" LocalFileSystem local("local"); DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); /////////////////////////motor PwmOut rm_pwm(p21); DigitalOut rm_in1(p5); DigitalOut rm_in2(p6); DigitalOut rm_en(p7); PwmOut lm_pwm(p22); DigitalOut lm_in1(p26); DigitalOut lm_in2(p25); DigitalOut lm_en(p24); //0 : stop, 1: forward, 2: backward, 3: leftturn, 4: rightturn unsigned char moving = 0; unsigned char moving_command = '2'; unsigned char pre_moving = 0; /////////////////////////// ///////////////////////////com Serial pc(USBTX, USBRX); Serial mx(p28,p27); DigitalOut water(p14); unsigned char demostate = 0; unsigned char fire_x = 0; unsigned char fire_y = 0; unsigned char moving_state = 0; unsigned char i, i2, i3, i4; int target_x = 0, target_y = 0; int error_x = 0, error_y = 0; int pre_error_x = 0, pre_error_y = 0; unsigned char fire_camera; unsigned char demo = 1; int dy_x = 2048; int dy_y = 1748; unsigned char k; //depth_value = depth.read(); ///////////////////////////sense AnalogIn distance(p20); AnalogIn gas1(p19); AnalogIn gas2(p18); AnalogIn fire(p17); AnalogIn distance_l(p15); AnalogIn distance_r(p16); Serial mysenl(p9, p10); float distance_value = 0, gas1_value = 0, gas2_value = 0, fire_value = 0; float distance_r_value = 0; float distance_l_value = 0; int roll, pitch, yaw, temp, check, r_check; int r,p,y; unsigned char input, input2, startb; ///////////////////////// /////////////////////////////////////////////////// void mx_write(unsigned char address, int data); void bulk_write(int speed1, int position1, int speed2, int position2); ////////////////////////////////// void motor_thread(void const *args) { rm_pwm = 0.5; lm_pwm = 0.5; rm_pwm.period_ms(20); rm_pwm.pulsewidth_ms(10); lm_pwm.period_ms(20); lm_pwm.pulsewidth_ms(10); rm_in1 = 0; rm_in2 = 0; rm_en = 0; lm_in1 = 0; lm_in2 = 0; lm_en = 0; while (true) { if(pre_moving!=moving) { if(moving==0) { rm_in1 = 0; rm_in2 = 0; rm_en = 0; lm_in1 = 0; lm_in2 = 0; lm_en = 0; } else if(moving==1) { rm_pwm.period_ms(20); rm_pwm.pulsewidth_ms(10); lm_pwm.period_ms(20); lm_pwm.pulsewidth_ms(10); rm_in1 = 0; rm_in2 = 1; rm_en = 1; lm_in1 = 1; lm_in2 = 0; lm_en = 1; } else if(moving==2) { rm_pwm.period_ms(20); rm_pwm.pulsewidth_ms(10); lm_pwm.period_ms(20); lm_pwm.pulsewidth_ms(10); rm_in1 = 1; rm_in2 = 0; rm_en = 1; lm_in1 = 0; lm_in2 = 1; lm_en = 1; } else if(moving==3) { rm_pwm.period_ms(20); rm_pwm.pulsewidth_ms(10); lm_pwm.period_ms(20); lm_pwm.pulsewidth_ms(10); rm_in1 = 0; rm_in2 = 1; rm_en = 1; lm_in1 = 0; lm_in2 = 1; lm_en = 1; } else if(moving==4) { rm_pwm.period_ms(20); rm_pwm.pulsewidth_ms(10); lm_pwm.period_ms(20); lm_pwm.pulsewidth_ms(10); rm_in1 = 1; rm_in2 = 0; rm_en = 1; lm_in1 = 1; lm_in2 = 0; lm_en = 1; } else if(moving==5) { rm_pwm.period_ms(20); rm_pwm.pulsewidth_ms(7); lm_pwm.period_ms(20); lm_pwm.pulsewidth_ms(7); rm_in1 = 0; rm_in2 = 1; rm_en = 1; lm_in1 = 1; lm_in2 = 0; lm_en = 1; } else if(moving==7) { rm_pwm.period_ms(20); rm_pwm.pulsewidth_ms(7); lm_pwm.period_ms(20); lm_pwm.pulsewidth_ms(7); rm_in1 = 0; rm_in2 = 1; rm_en = 1; lm_in1 = 0; lm_in2 = 1; lm_en = 1; } else if(moving==6) { rm_pwm.period_ms(20); rm_pwm.pulsewidth_ms(7); lm_pwm.period_ms(20); lm_pwm.pulsewidth_ms(7); rm_in1 = 1; rm_in2 = 0; rm_en = 1; lm_in1 = 1; lm_in2 = 0; lm_en = 1; } } //pc.printf("%d %d %d %d %d %d %d\r\n",moving, rm_in1.read(), rm_in2.read(), rm_en.read(), lm_in1.read(), lm_in2.read(), lm_en.read()); pre_moving = moving; led2 = !led2; Thread::wait(500); } } ////////////////////////////////// void com_thread(void const *args) { bulk_write(5, 2048, 5, 2048); while (true) { if(pc.readable()) { i = pc.getc(); if(i==100) { i = pc.getc(); i = pc.getc(); i2 = pc.getc(); i3 = pc.getc(); i4 = pc.getc(); fire_camera = pc.getc(); moving_command = pc.getc(); pc.printf("%d\r\n%f\r\n%d\r\n%d\r\n%d\r\n%d\r\n",temp,gas2_value,r,p,y,fire_camera); target_x = (int)i*256+i2; target_y = (int)i3*256+i4; } if(fire_camera == 1) { error_x = 320-target_x; error_y = 240-target_y; dy_x += error_x*0.1+(pre_error_x-error_x)*0.02; dy_y += error_y*0.1+(pre_error_y-error_y)*0.02; pre_error_x = error_x; pre_error_y = error_y; bulk_write(25, dy_x, 25, dy_y); } else { //dy_x = 2048; //dy_y = 1748; //bulk_write(10, dy_x, 10, dy_y); } } led3 = !led3; Thread::wait(10); } } ////////////////////////////////// void sense_thread(void const *args) { while (true) { if(mysenl.readable()) { startb = mysenl.getc(); } if(startb==0x02) { r_check = 0; input = mysenl.getc(); input2 = mysenl.getc(); r_check+=input; r_check+=input2; roll = (input*256+input2)/100-180; input = mysenl.getc(); input2 = mysenl.getc(); r_check+=input; r_check+=input2; pitch = (input*256+input2)/100-90; input = mysenl.getc(); input2 = mysenl.getc(); r_check+=input; r_check+=input2; yaw = (input*256+input2)/100-180; input = mysenl.getc(); input2 = mysenl.getc(); temp = (input*256+input2)/100-100; r_check+=input; r_check+=input2; input = mysenl.getc(); input2 = mysenl.getc(); input = mysenl.getc(); input2 = mysenl.getc(); if(input==44&&input2==3) { r=roll; p=pitch; y=yaw; distance_value = distance.read(); distance_r_value = distance_r.read(); distance_l_value = distance_l.read(); gas1_value = gas1.read(); gas2_value = gas2.read(); fire_value = fire.read(); // pc.printf("\t%d\t%d\t%d\n\r\t%d\t%d\t%d\t%d\t%d\r\n",r, p, y, temp, r_check,check, input, input2); //pc.printf("\tdis%f\tdis_r%f\tdis_l%f\r\n\tgas %f\tgas %f\tfire %f\r\n",distance_value,distance_r_value,distance_l_value, gas1_value, gas2_value, fire_value); } } distance_value = distance.read(); distance_r_value = distance_r.read(); distance_l_value = distance_l.read(); gas1_value = gas1.read(); gas2_value = gas2.read(); fire_value = fire.read(); if(demo==1) { if(fire_camera==0&&demostate==0) { bulk_write(5, 2048, 5, 2048); moving = 1; Thread::wait(1000); moving = 2; Thread::wait(1000); } else if((distance_r_value>0.5||distance_l_value>0.5||distance_value>0.2)&&fire_camera&&demostate==1) { moving = 0; Thread::wait(2000); water = 1; Thread::wait(1300); water = 0; demostate = 0; } else if(fire_camera==1) { demostate = 1; if(dy_x>2248) { moving = 7; Thread::wait(100); } else if(dy_x<1748) { moving = 6; Thread::wait(100); } moving = 5; } } else { if(moving_command==1) { if(moving_state==0) { moving = 2; if(fire_camera==1) moving_state = 1; } else if(moving_state==1) { moving_state = 1; //moving if(distance_r_value>0.7&&distance_l_value>0.7) moving = 2; else if(distance_r_value>0.7) moving = 3; else if(distance_l_value>0.7) moving = 4; else moving = 1; if(dy_x>2148) { moving = 4; Thread::wait(500); } else if(dy_x<1948) { moving = 3; Thread::wait(500); } if(distance_value>0.5) moving_state = 2; } else if(moving_state == 2); { Thread::wait(5000); water = 1; Thread::wait(1300); water = 0; if(fire_camera==0) moving_state = 0; } } else { // moving_state = 0; //bulk_write(5, 2048, 5, 2048); //water = 0; //moving = 0; //moving = moving_command; } } led4 = !led4; Thread::wait(50); } } // main() runs in its own thread in the OS // (note the calls to Thread::wait below for delays) int main() { pc.baud(57600); mx.baud(57600); mysenl.baud(115200); Thread::wait(1000); Thread thread1(motor_thread); Thread thread2(com_thread); Thread thread3(sense_thread); while (true) { /* if(pc.readable()) { i = pc.getc(); if(i=='w') moving_command = 1; else if(i=='s') moving_command = 2; else if(i=='a') moving_command = 3; else if(i=='d') moving_command = 4; else if(i=='q') moving_command = 0; else if(i=='t') moving_command = 5; else if(i=='z') dy_x += 10; else if(i=='x') dy_x -= 10; else if(i=='c') dy_y += 10; else if(i=='v') dy_y -= 10; else if(i=='e') water = 1; else if(i=='r') water = 0; } */ led1 = !led1; Thread::wait(500); } } void mx_write(unsigned char address, int data) { unsigned char k = 0x07+0x05+0x03+address+((data&0xff00)>>8)+(data&0xff); k = 0xff-k; mx.putc(0xff); mx.putc(0xff); mx.putc(0x07); mx.putc(0x05); mx.putc(0x03); mx.putc(address); mx.putc((unsigned char)(data&0xff)); mx.putc((unsigned char)((data&0xff00)>>8)); mx.putc(k); pc.printf("%d %d %d %d %d %d %d %d %d\n\r",0xff,0xff,0x07,0x05,0x03,address,data&0xff,(data&0xff00)>>8,k); } void bulk_write(int speed1, int position1, int speed2, int position2) { k = 0xfe; k += 0x0e; k += 0x83; k += 0x1e; k += 0x04; //k = 0xfe+0x0e+0x83+0x1e+0x04; k+=0x04+((position1&0xff00)>>8)+(position1&0xff)+((speed1&0xff00)>>8)+(speed1&0xff); k+=0x08+((position2&0xff00)>>8)+(position2&0xff)+((speed2&0xff00)>>8)+(speed2&0xff); k = 0xff-k; mx.putc(0xff); mx.putc(0xff); mx.putc(0xfe); mx.putc(0x0e); mx.putc(0x83); mx.putc(0x1E); mx.putc(0x04); mx.putc(0x04); mx.putc((unsigned char)(position1&0xff)); mx.putc((unsigned char)((position1&0xff00)>>8)); mx.putc((unsigned char)(speed1&0xff)); mx.putc((unsigned char)((speed1&0xff00)>>8)); mx.putc(0x08); mx.putc((unsigned char)(position2&0xff)); mx.putc((unsigned char)((position2&0xff00)>>8)); mx.putc((unsigned char)(speed2&0xff)); mx.putc((unsigned char)((speed2&0xff00)>>8)); mx.putc(k); }