MMlab / Mbed 2 deprecated PING_ultrasonic

Dependencies:   USBDevice mbed

Committer:
ikuta
Date:
Tue Sep 27 12:50:45 2016 +0000
Revision:
7:ed304ba2712a
Parent:
6:28b7339892f9
Child:
8:59dd4860477f
x,y????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ikuta 0:5d1796a0f9ce 1 #include "mbed.h"
ikuta 1:5aa590d1f1bf 2 #include "stdio.h"
ikuta 1:5aa590d1f1bf 3 #include "math.h"
ikuta 4:00ac3d093b24 4 #include "USBJoystick.h"
ikuta 0:5d1796a0f9ce 5
ikuta 0:5d1796a0f9ce 6 Serial pc(USBTX,USBRX);
ikuta 4:00ac3d093b24 7 USBJoystick joystick;
ikuta 0:5d1796a0f9ce 8
ikuta 0:5d1796a0f9ce 9 DigitalInOut pingPin1(p18);
ikuta 0:5d1796a0f9ce 10 DigitalInOut pingPin2(p19);
ikuta 0:5d1796a0f9ce 11
ikuta 0:5d1796a0f9ce 12 Timer tmr1, tmr2,tmr;
ikuta 4:00ac3d093b24 13 Timeout timeouter1,timeouter2;
ikuta 0:5d1796a0f9ce 14 int flag=0;
ikuta 4:00ac3d093b24 15 float sum1=0,sum2=0,count1=0,count2=0,timecount1=0,timecount2=0,timesum1=0,timesum2=0,v,argv;
ikuta 7:ed304ba2712a 16 float avg1,avg2,timeavg1,timeavg2,deltat,a,b;
ikuta 7:ed304ba2712a 17 int16_t x=0,y=0,throttle = 0,rudder = 0,i=0,vmax,M_PI=3.14;
ikuta 5:62de7a36d3af 18 int8_t button=0,hat = 0;
ikuta 0:5d1796a0f9ce 19 long microsecondsToCentimeters(long microseconds);
ikuta 0:5d1796a0f9ce 20
ikuta 0:5d1796a0f9ce 21 void reset()
ikuta 0:5d1796a0f9ce 22 {
ikuta 0:5d1796a0f9ce 23 flag = 0;
ikuta 0:5d1796a0f9ce 24 tmr.reset();
ikuta 7:ed304ba2712a 25 sum1=0,sum2=0,count1=0,count2=0,timecount1=0,timecount2=0,timesum1=0,timesum2=0,avg1=0,avg2=0,timeavg1=0,timeavg2=0,deltat=0,a=0,b=0;
ikuta 0:5d1796a0f9ce 26 }
ikuta 0:5d1796a0f9ce 27
ikuta 4:00ac3d093b24 28 void output()
ikuta 4:00ac3d093b24 29 {
ikuta 7:ed304ba2712a 30 a=pow((avg2-avg1)/deltat*10,2);
ikuta 7:ed304ba2712a 31 b=pow(0.1/deltat*1000,2);
ikuta 7:ed304ba2712a 32 v=sqrt(a+b); //|v|を求める
ikuta 7:ed304ba2712a 33 if(deltat==0){
ikuta 7:ed304ba2712a 34 vmax=5;
ikuta 7:ed304ba2712a 35 }
ikuta 7:ed304ba2712a 36 argv=atan(10/(avg2-avg1)); //θを求める
ikuta 4:00ac3d093b24 37 printf("\n|v|: %lf theta: %lf\n",v,argv); //最終的にだすやつ
ikuta 7:ed304ba2712a 38 x = (int)argv*M_PI/60;
ikuta 7:ed304ba2712a 39 y = (int)v/5*240-120;
ikuta 5:62de7a36d3af 40 i=2;
ikuta 6:28b7339892f9 41 joystick.update(throttle, rudder, x, y, button, hat);
ikuta 5:62de7a36d3af 42 wait(1);
ikuta 6:28b7339892f9 43 button = (0x0002) & 0x0F;
ikuta 5:62de7a36d3af 44
ikuta 5:62de7a36d3af 45 joystick.update(throttle, rudder, x, y, button, hat);
ikuta 4:00ac3d093b24 46 }
ikuta 4:00ac3d093b24 47
ikuta 0:5d1796a0f9ce 48 int main()
ikuta 0:5d1796a0f9ce 49 {
ikuta 0:5d1796a0f9ce 50 pc.baud(115200);
ikuta 0:5d1796a0f9ce 51 while (1) {
ikuta 2:fed59450f2ed 52 long duration1, duration2,USSDistance1, USSDistance2, cm1, cm2, time1,time2;
ikuta 0:5d1796a0f9ce 53
ikuta 0:5d1796a0f9ce 54 pingPin1.output();
ikuta 0:5d1796a0f9ce 55 pingPin1 = 0;
ikuta 0:5d1796a0f9ce 56 wait_us(2);
ikuta 0:5d1796a0f9ce 57 pingPin1 = 1;
ikuta 0:5d1796a0f9ce 58 wait_us(5);
ikuta 0:5d1796a0f9ce 59 pingPin1 = 0;
ikuta 0:5d1796a0f9ce 60
ikuta 0:5d1796a0f9ce 61 pingPin1.input(); // pulseIn
ikuta 0:5d1796a0f9ce 62 tmr1.reset();
ikuta 0:5d1796a0f9ce 63
ikuta 0:5d1796a0f9ce 64 while (!pingPin1); // wait for high
ikuta 0:5d1796a0f9ce 65 tmr1.start();
ikuta 0:5d1796a0f9ce 66 while (pingPin1); // wait for low
ikuta 0:5d1796a0f9ce 67 tmr1.stop();
ikuta 0:5d1796a0f9ce 68 duration1 = tmr1.read_us();
ikuta 0:5d1796a0f9ce 69 USSDistance1 = duration1;// * 0.0170;
ikuta 0:5d1796a0f9ce 70
ikuta 0:5d1796a0f9ce 71 cm1 = microsecondsToCentimeters(USSDistance1);
ikuta 0:5d1796a0f9ce 72
ikuta 0:5d1796a0f9ce 73 if(15<cm1&&cm1<40) {
ikuta 0:5d1796a0f9ce 74 if(flag==0) {
ikuta 0:5d1796a0f9ce 75 flag=1;
ikuta 0:5d1796a0f9ce 76 tmr.reset();
ikuta 0:5d1796a0f9ce 77 tmr.start();
ikuta 4:00ac3d093b24 78 timeouter2.attach(&output, 1);
ikuta 4:00ac3d093b24 79 timeouter1.attach(&reset, 5);
ikuta 0:5d1796a0f9ce 80 }
ikuta 0:5d1796a0f9ce 81 if(flag==1) {
ikuta 4:00ac3d093b24 82 timeouter1.detach();
ikuta 5:62de7a36d3af 83 timeouter2.detach();
ikuta 4:00ac3d093b24 84 timeouter2.attach(&output, 1);
ikuta 4:00ac3d093b24 85 timeouter1.attach(&reset, 5);
ikuta 0:5d1796a0f9ce 86 }
ikuta 2:fed59450f2ed 87 time1=tmr.read_ms();
ikuta 6:28b7339892f9 88 printf("1: %d %d[s]", cm1,time1);
ikuta 1:5aa590d1f1bf 89
ikuta 1:5aa590d1f1bf 90 count1++;
ikuta 2:fed59450f2ed 91 timecount1++;
ikuta 1:5aa590d1f1bf 92
ikuta 1:5aa590d1f1bf 93 sum1=sum1+cm1; //cm1の値を合計する
ikuta 1:5aa590d1f1bf 94 avg1=sum1/count1; //cm1の平均
ikuta 4:00ac3d093b24 95 printf(" avg1: %f",avg1);
ikuta 4:00ac3d093b24 96
ikuta 2:fed59450f2ed 97 timesum1=timesum1+time1; //time1を合計する
ikuta 2:fed59450f2ed 98 timeavg1=timesum1/timecount1; //time1の平均
ikuta 6:28b7339892f9 99 printf(" timeavg1: %f[s]\n",timeavg1);
ikuta 0:5d1796a0f9ce 100 }
ikuta 0:5d1796a0f9ce 101
ikuta 0:5d1796a0f9ce 102 wait_ms(10);
ikuta 0:5d1796a0f9ce 103
ikuta 0:5d1796a0f9ce 104 pingPin2.output();
ikuta 0:5d1796a0f9ce 105 pingPin2 = 0;
ikuta 0:5d1796a0f9ce 106 wait_us(2);
ikuta 0:5d1796a0f9ce 107 pingPin2 = 1;
ikuta 0:5d1796a0f9ce 108 wait_us(5);
ikuta 0:5d1796a0f9ce 109 pingPin2 = 0;
ikuta 0:5d1796a0f9ce 110
ikuta 0:5d1796a0f9ce 111 pingPin2.input(); // pulseIn
ikuta 0:5d1796a0f9ce 112 tmr2.reset();
ikuta 0:5d1796a0f9ce 113
ikuta 0:5d1796a0f9ce 114 while (!pingPin2); // wait for high
ikuta 0:5d1796a0f9ce 115 tmr2.start();
ikuta 0:5d1796a0f9ce 116 while (pingPin2); // wait for low
ikuta 0:5d1796a0f9ce 117 tmr2.stop();
ikuta 0:5d1796a0f9ce 118
ikuta 0:5d1796a0f9ce 119 duration2 = tmr2.read_us();
ikuta 0:5d1796a0f9ce 120 USSDistance2 = duration2;// * 0.0170;
ikuta 0:5d1796a0f9ce 121
ikuta 0:5d1796a0f9ce 122 cm2 = microsecondsToCentimeters(USSDistance2);
ikuta 0:5d1796a0f9ce 123 if(15<cm2&&cm2<40) {
ikuta 2:fed59450f2ed 124 time2=tmr.read_ms();
ikuta 6:28b7339892f9 125 printf(" 2: %d %d[s]",cm2,time2);
ikuta 1:5aa590d1f1bf 126
ikuta 1:5aa590d1f1bf 127 count2++;
ikuta 2:fed59450f2ed 128 timecount2++;
ikuta 4:00ac3d093b24 129
ikuta 1:5aa590d1f1bf 130 sum2=sum2+cm2; //cm2の値を合計する
ikuta 1:5aa590d1f1bf 131 avg2=sum2/count2; //cm2の平均
ikuta 4:00ac3d093b24 132 printf(" avg2: %f",avg2);
ikuta 4:00ac3d093b24 133
ikuta 2:fed59450f2ed 134 timesum2=timesum2+time2; //time2を合計する
ikuta 2:fed59450f2ed 135 timeavg2=timesum2/timecount2; //time2の平均
ikuta 6:28b7339892f9 136 printf(" timeavg2:%f[s]\n",timeavg2);
ikuta 4:00ac3d093b24 137
ikuta 3:814cb36d0f90 138 deltat=timeavg2-timeavg1; //Δtを求める
ikuta 4:00ac3d093b24 139 printf("\ndeltat: %f\n",deltat);
ikuta 4:00ac3d093b24 140
ikuta 7:ed304ba2712a 141
ikuta 0:5d1796a0f9ce 142 }
ikuta 0:5d1796a0f9ce 143 wait_ms(10);
ikuta 1:5aa590d1f1bf 144 }
ikuta 4:00ac3d093b24 145
ikuta 0:5d1796a0f9ce 146 }
ikuta 0:5d1796a0f9ce 147
ikuta 0:5d1796a0f9ce 148 long microsecondsToInches(long microseconds)
ikuta 0:5d1796a0f9ce 149 {
ikuta 0:5d1796a0f9ce 150 return microseconds / 74 / 2;
ikuta 0:5d1796a0f9ce 151 }
ikuta 0:5d1796a0f9ce 152
ikuta 0:5d1796a0f9ce 153 long microsecondsToCentimeters(long microseconds)
ikuta 0:5d1796a0f9ce 154 {
ikuta 0:5d1796a0f9ce 155 return microseconds / 29 / 2;
ikuta 7:ed304ba2712a 156 }