MMlab / Mbed 2 deprecated PING_ultrasonic

Dependencies:   USBDevice mbed

Committer:
ikuta
Date:
Tue Sep 27 05:24:37 2016 +0000
Revision:
5:62de7a36d3af
Parent:
4:00ac3d093b24
Child:
6:28b7339892f9
??????

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