Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@3:814cb36d0f90, 2016-09-22 (annotated)
- Committer:
- ikuta
- Date:
- Thu Sep 22 16:18:08 2016 +0000
- Revision:
- 3:814cb36d0f90
- Parent:
- 2:fed59450f2ed
- Child:
- 4:00ac3d093b24
????????
Who changed what in which revision?
User | Revision | Line number | New 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 | 0:5d1796a0f9ce | 4 | |
ikuta | 0:5d1796a0f9ce | 5 | Serial pc(USBTX,USBRX); |
ikuta | 0:5d1796a0f9ce | 6 | |
ikuta | 0:5d1796a0f9ce | 7 | DigitalInOut pingPin1(p18); |
ikuta | 0:5d1796a0f9ce | 8 | DigitalInOut pingPin2(p19); |
ikuta | 0:5d1796a0f9ce | 9 | |
ikuta | 0:5d1796a0f9ce | 10 | Timer tmr1, tmr2,tmr; |
ikuta | 0:5d1796a0f9ce | 11 | Timeout timeouter; |
ikuta | 0:5d1796a0f9ce | 12 | int flag=0; |
ikuta | 2:fed59450f2ed | 13 | float sum1=0,sum2=0,count1=0,count2=0,timecount1=0,timecount2=0,timesum1=0,timesum2=0; |
ikuta | 0:5d1796a0f9ce | 14 | long microsecondsToCentimeters(long microseconds); |
ikuta | 0:5d1796a0f9ce | 15 | |
ikuta | 0:5d1796a0f9ce | 16 | void reset() |
ikuta | 0:5d1796a0f9ce | 17 | { |
ikuta | 0:5d1796a0f9ce | 18 | flag = 0; |
ikuta | 0:5d1796a0f9ce | 19 | tmr.reset(); |
ikuta | 2:fed59450f2ed | 20 | sum1=0,sum2=0,count1=0,count2=0,timecount1=0,timecount2=0,timesum1=0,timesum2=0; |
ikuta | 0:5d1796a0f9ce | 21 | } |
ikuta | 0:5d1796a0f9ce | 22 | |
ikuta | 0:5d1796a0f9ce | 23 | int main() |
ikuta | 0:5d1796a0f9ce | 24 | { |
ikuta | 3:814cb36d0f90 | 25 | float avg1,avg2,timeavg1,timeavg2,deltat,a,b,v,argv; |
ikuta | 0:5d1796a0f9ce | 26 | pc.baud(115200); |
ikuta | 0:5d1796a0f9ce | 27 | while (1) { |
ikuta | 2:fed59450f2ed | 28 | long duration1, duration2,USSDistance1, USSDistance2, cm1, cm2, time1,time2; |
ikuta | 0:5d1796a0f9ce | 29 | |
ikuta | 0:5d1796a0f9ce | 30 | pingPin1.output(); |
ikuta | 0:5d1796a0f9ce | 31 | pingPin1 = 0; |
ikuta | 0:5d1796a0f9ce | 32 | wait_us(2); |
ikuta | 0:5d1796a0f9ce | 33 | pingPin1 = 1; |
ikuta | 0:5d1796a0f9ce | 34 | wait_us(5); |
ikuta | 0:5d1796a0f9ce | 35 | pingPin1 = 0; |
ikuta | 0:5d1796a0f9ce | 36 | |
ikuta | 0:5d1796a0f9ce | 37 | pingPin1.input(); // pulseIn |
ikuta | 0:5d1796a0f9ce | 38 | tmr1.reset(); |
ikuta | 0:5d1796a0f9ce | 39 | |
ikuta | 0:5d1796a0f9ce | 40 | while (!pingPin1); // wait for high |
ikuta | 0:5d1796a0f9ce | 41 | tmr1.start(); |
ikuta | 0:5d1796a0f9ce | 42 | while (pingPin1); // wait for low |
ikuta | 0:5d1796a0f9ce | 43 | tmr1.stop(); |
ikuta | 0:5d1796a0f9ce | 44 | duration1 = tmr1.read_us(); |
ikuta | 0:5d1796a0f9ce | 45 | USSDistance1 = duration1;// * 0.0170; |
ikuta | 0:5d1796a0f9ce | 46 | |
ikuta | 0:5d1796a0f9ce | 47 | cm1 = microsecondsToCentimeters(USSDistance1); |
ikuta | 0:5d1796a0f9ce | 48 | |
ikuta | 0:5d1796a0f9ce | 49 | if(15<cm1&&cm1<40) { |
ikuta | 0:5d1796a0f9ce | 50 | if(flag==0) { |
ikuta | 0:5d1796a0f9ce | 51 | flag=1; |
ikuta | 0:5d1796a0f9ce | 52 | tmr.reset(); |
ikuta | 0:5d1796a0f9ce | 53 | tmr.start(); |
ikuta | 0:5d1796a0f9ce | 54 | timeouter.attach(&reset, 5); |
ikuta | 0:5d1796a0f9ce | 55 | } |
ikuta | 0:5d1796a0f9ce | 56 | if(flag==1) { |
ikuta | 0:5d1796a0f9ce | 57 | timeouter.detach(); |
ikuta | 0:5d1796a0f9ce | 58 | timeouter.attach(&reset, 5); |
ikuta | 0:5d1796a0f9ce | 59 | } |
ikuta | 2:fed59450f2ed | 60 | time1=tmr.read_ms(); |
ikuta | 2:fed59450f2ed | 61 | printf("1: %d %d[ms]", cm1,time1); |
ikuta | 1:5aa590d1f1bf | 62 | |
ikuta | 1:5aa590d1f1bf | 63 | count1++; |
ikuta | 2:fed59450f2ed | 64 | timecount1++; |
ikuta | 1:5aa590d1f1bf | 65 | |
ikuta | 1:5aa590d1f1bf | 66 | sum1=sum1+cm1; //cm1の値を合計する |
ikuta | 1:5aa590d1f1bf | 67 | avg1=sum1/count1; //cm1の平均 |
ikuta | 2:fed59450f2ed | 68 | printf(" avg1: %4.2f",avg1); |
ikuta | 2:fed59450f2ed | 69 | |
ikuta | 2:fed59450f2ed | 70 | timesum1=timesum1+time1; //time1を合計する |
ikuta | 2:fed59450f2ed | 71 | timeavg1=timesum1/timecount1; //time1の平均 |
ikuta | 2:fed59450f2ed | 72 | printf(" timeavg1: %4.2f[ms]\n",timeavg1); |
ikuta | 1:5aa590d1f1bf | 73 | |
ikuta | 0:5d1796a0f9ce | 74 | } |
ikuta | 0:5d1796a0f9ce | 75 | |
ikuta | 0:5d1796a0f9ce | 76 | wait_ms(10); |
ikuta | 0:5d1796a0f9ce | 77 | |
ikuta | 0:5d1796a0f9ce | 78 | pingPin2.output(); |
ikuta | 0:5d1796a0f9ce | 79 | pingPin2 = 0; |
ikuta | 0:5d1796a0f9ce | 80 | wait_us(2); |
ikuta | 0:5d1796a0f9ce | 81 | pingPin2 = 1; |
ikuta | 0:5d1796a0f9ce | 82 | wait_us(5); |
ikuta | 0:5d1796a0f9ce | 83 | pingPin2 = 0; |
ikuta | 0:5d1796a0f9ce | 84 | |
ikuta | 0:5d1796a0f9ce | 85 | pingPin2.input(); // pulseIn |
ikuta | 0:5d1796a0f9ce | 86 | tmr2.reset(); |
ikuta | 0:5d1796a0f9ce | 87 | |
ikuta | 0:5d1796a0f9ce | 88 | while (!pingPin2); // wait for high |
ikuta | 0:5d1796a0f9ce | 89 | tmr2.start(); |
ikuta | 0:5d1796a0f9ce | 90 | while (pingPin2); // wait for low |
ikuta | 0:5d1796a0f9ce | 91 | tmr2.stop(); |
ikuta | 0:5d1796a0f9ce | 92 | |
ikuta | 0:5d1796a0f9ce | 93 | duration2 = tmr2.read_us(); |
ikuta | 0:5d1796a0f9ce | 94 | USSDistance2 = duration2;// * 0.0170; |
ikuta | 0:5d1796a0f9ce | 95 | |
ikuta | 0:5d1796a0f9ce | 96 | cm2 = microsecondsToCentimeters(USSDistance2); |
ikuta | 0:5d1796a0f9ce | 97 | if(15<cm2&&cm2<40) { |
ikuta | 2:fed59450f2ed | 98 | time2=tmr.read_ms(); |
ikuta | 3:814cb36d0f90 | 99 | printf(" 2: %d %d[ms]",cm2,time2); |
ikuta | 1:5aa590d1f1bf | 100 | |
ikuta | 1:5aa590d1f1bf | 101 | count2++; |
ikuta | 2:fed59450f2ed | 102 | timecount2++; |
ikuta | 2:fed59450f2ed | 103 | |
ikuta | 1:5aa590d1f1bf | 104 | sum2=sum2+cm2; //cm2の値を合計する |
ikuta | 1:5aa590d1f1bf | 105 | avg2=sum2/count2; //cm2の平均 |
ikuta | 2:fed59450f2ed | 106 | printf(" avg2: %4.2f",avg2); |
ikuta | 2:fed59450f2ed | 107 | |
ikuta | 2:fed59450f2ed | 108 | timesum2=timesum2+time2; //time2を合計する |
ikuta | 2:fed59450f2ed | 109 | timeavg2=timesum2/timecount2; //time2の平均 |
ikuta | 2:fed59450f2ed | 110 | printf(" timeavg2:%4.2f[ms]\n",timeavg2); |
ikuta | 3:814cb36d0f90 | 111 | |
ikuta | 3:814cb36d0f90 | 112 | deltat=timeavg2-timeavg1; //Δtを求める |
ikuta | 3:814cb36d0f90 | 113 | printf("\ndeltat: %4.2f\n",deltat); |
ikuta | 3:814cb36d0f90 | 114 | |
ikuta | 3:814cb36d0f90 | 115 | a=pow((avg2-avg1)/deltat,2); |
ikuta | 3:814cb36d0f90 | 116 | b=pow(10/deltat,2); |
ikuta | 3:814cb36d0f90 | 117 | v=sqrt(a+b); //|v|を求める |
ikuta | 3:814cb36d0f90 | 118 | |
ikuta | 3:814cb36d0f90 | 119 | argv=atan(10/(avg2-avg1)); //θを求める |
ikuta | 3:814cb36d0f90 | 120 | |
ikuta | 3:814cb36d0f90 | 121 | printf("\n|v|: %lf theta: %lf\n",v,argv); |
ikuta | 3:814cb36d0f90 | 122 | |
ikuta | 1:5aa590d1f1bf | 123 | |
ikuta | 0:5d1796a0f9ce | 124 | } |
ikuta | 0:5d1796a0f9ce | 125 | wait_ms(10); |
ikuta | 1:5aa590d1f1bf | 126 | |
ikuta | 1:5aa590d1f1bf | 127 | |
ikuta | 1:5aa590d1f1bf | 128 | } |
ikuta | 0:5d1796a0f9ce | 129 | } |
ikuta | 0:5d1796a0f9ce | 130 | |
ikuta | 1:5aa590d1f1bf | 131 | |
ikuta | 0:5d1796a0f9ce | 132 | long microsecondsToInches(long microseconds) |
ikuta | 0:5d1796a0f9ce | 133 | { |
ikuta | 0:5d1796a0f9ce | 134 | return microseconds / 74 / 2; |
ikuta | 0:5d1796a0f9ce | 135 | } |
ikuta | 0:5d1796a0f9ce | 136 | |
ikuta | 0:5d1796a0f9ce | 137 | long microsecondsToCentimeters(long microseconds) |
ikuta | 0:5d1796a0f9ce | 138 | { |
ikuta | 0:5d1796a0f9ce | 139 | return microseconds / 29 / 2; |
ikuta | 0:5d1796a0f9ce | 140 | } |