MMlab / Mbed 2 deprecated PING_ultrasonic

Dependencies:   USBDevice mbed

Committer:
ikuta
Date:
Tue Sep 27 07:57:15 2016 +0000
Revision:
6:28b7339892f9
Parent:
5:62de7a36d3af
Child:
7:ed304ba2712a
???????????????????????

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