回答編集履歴
3
修正
answer
CHANGED
|
@@ -37,10 +37,11 @@
|
|
|
37
37
|
せっかく中身C++なので距離センサをクラスにまとめるのがいいかと思います。
|
|
38
38
|
|
|
39
39
|
以下、コンパイルは通りましたが動作チェックはしていません
|
|
40
|
+
(一部修正 HC-SR4は一つしか持ってないから順次で試したけど一応動くみたい 1/25)
|
|
40
41
|
```Arduino
|
|
41
42
|
typedef int Pin;
|
|
42
43
|
//#defineよりは型チェックの入るconstをおススメします
|
|
43
|
-
const Pin echoF =
|
|
44
|
+
const Pin echoF = 6;
|
|
44
45
|
const Pin trigF = 8;
|
|
45
46
|
const Pin echoR = 9;
|
|
46
47
|
const Pin trigR = 10;
|
|
@@ -65,9 +66,9 @@
|
|
|
65
66
|
digitalWrite(trig, HIGH);
|
|
66
67
|
delayMicroseconds(10);
|
|
67
68
|
digitalWrite(trig, LOW);
|
|
68
|
-
unsigned long dur = pulseIn(
|
|
69
|
+
unsigned long dur = pulseIn(echo, HIGH);
|
|
69
70
|
if (dur > 0) {
|
|
70
|
-
dist = dur / 2 * 340 * 100 / 1000000;
|
|
71
|
+
dist = dur / 2. * 340 * 100 / 1000000;
|
|
71
72
|
}
|
|
72
73
|
Serial.print("Dis");
|
|
73
74
|
Serial.print(label);
|
2
サンプル追加
answer
CHANGED
|
@@ -34,4 +34,97 @@
|
|
|
34
34
|
```
|
|
35
35
|
|
|
36
36
|
「同じ処理でパラメータが違うところ」をコピペで処理をしたことがプログラミングテクニックとしてはまずいところ。「コピペして違うところをなおす」行為は、間違いが紛れ込むモトです。
|
|
37
|
-
せっかくC++なので距離センサをクラスにまとめるのがいいかと思います。
|
|
37
|
+
せっかく中身C++なので距離センサをクラスにまとめるのがいいかと思います。
|
|
38
|
+
|
|
39
|
+
以下、コンパイルは通りましたが動作チェックはしていません
|
|
40
|
+
```Arduino
|
|
41
|
+
typedef int Pin;
|
|
42
|
+
//#defineよりは型チェックの入るconstをおススメします
|
|
43
|
+
const Pin echoF = 7;
|
|
44
|
+
const Pin trigF = 8;
|
|
45
|
+
const Pin echoR = 9;
|
|
46
|
+
const Pin trigR = 10;
|
|
47
|
+
const Pin echoL = 13;
|
|
48
|
+
const Pin trigL = 12;
|
|
49
|
+
const Pin buza = 7;
|
|
50
|
+
|
|
51
|
+
//距離センサクラス
|
|
52
|
+
class DistSens {
|
|
53
|
+
Pin echo, trig;
|
|
54
|
+
String label;
|
|
55
|
+
public:
|
|
56
|
+
DistSens(Pin echo, Pin trig, String label):
|
|
57
|
+
echo(echo), trig(trig), label(label) {
|
|
58
|
+
pinMode(echo, INPUT);
|
|
59
|
+
pinMode(trig, OUTPUT);
|
|
60
|
+
}
|
|
61
|
+
double getDist() {
|
|
62
|
+
double dist=0;
|
|
63
|
+
digitalWrite(trig, LOW);
|
|
64
|
+
delayMicroseconds(2);
|
|
65
|
+
digitalWrite(trig, HIGH);
|
|
66
|
+
delayMicroseconds(10);
|
|
67
|
+
digitalWrite(trig, LOW);
|
|
68
|
+
unsigned long dur = pulseIn(echoF, HIGH);
|
|
69
|
+
if (dur > 0) {
|
|
70
|
+
dist = dur / 2 * 340 * 100 / 1000000;
|
|
71
|
+
}
|
|
72
|
+
Serial.print("Dis");
|
|
73
|
+
Serial.print(label);
|
|
74
|
+
Serial.print(':');
|
|
75
|
+
Serial.println(dist);
|
|
76
|
+
delay(20);
|
|
77
|
+
return dist;
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
DistSens distF(echoF, trigF, "F");
|
|
82
|
+
DistSens distR(echoR, trigR, "R");
|
|
83
|
+
DistSens distL(echoL, trigL, "L");
|
|
84
|
+
|
|
85
|
+
void setup() {
|
|
86
|
+
Serial.begin(9600);
|
|
87
|
+
pinMode(buza, OUTPUT);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
void TurnRight() {
|
|
91
|
+
tone(buza, 262, 200);
|
|
92
|
+
delay(200);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
void TurnLeft() {
|
|
96
|
+
tone(buza, 262, 200);
|
|
97
|
+
delay(100);
|
|
98
|
+
tone(buza, 262, 200);
|
|
99
|
+
delay(100);
|
|
100
|
+
tone(buza, 262, 200);
|
|
101
|
+
delay(200);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
void loop() {
|
|
105
|
+
double DisF = distF.getDist();
|
|
106
|
+
if (DisF < 10) {
|
|
107
|
+
digitalWrite(trigF, LOW);
|
|
108
|
+
double DisL = distL.getDist();
|
|
109
|
+
double DisR = distR.getDist();
|
|
110
|
+
while (DisF > 10) {
|
|
111
|
+
if (DisR > 20) {
|
|
112
|
+
TurnRight();
|
|
113
|
+
}
|
|
114
|
+
else if (DisL > 20) {
|
|
115
|
+
TurnLeft();
|
|
116
|
+
}
|
|
117
|
+
//以下のelseに到達するのはDisR<=20かつDisL<=20だったときだけ。
|
|
118
|
+
//(DisR<20)&&(disL<20)だとDisR==20またはDisL==20のときどうなる?
|
|
119
|
+
//そもそもここでifで検査する意味はあるのか?
|
|
120
|
+
else if ((DisR < 20) && (DisL < 20)) {
|
|
121
|
+
//これ意味のある動作?
|
|
122
|
+
digitalWrite(trigF, HIGH);
|
|
123
|
+
digitalWrite(trigR, LOW);
|
|
124
|
+
digitalWrite(trigL, LOW);
|
|
125
|
+
distF.getDist();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
```
|
1
追記
answer
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
他人が見ると簡単に見つかったりするんですけどね。
|
|
2
|
-
```
|
|
2
|
+
```Arduino
|
|
3
3
|
void DistanceRight(){
|
|
4
4
|
digitalWrite(trigR,LOW);
|
|
5
5
|
delayMicroseconds(2);
|
|
@@ -31,4 +31,7 @@
|
|
|
31
31
|
Serial.println(DisL);
|
|
32
32
|
delay(20);
|
|
33
33
|
}
|
|
34
|
-
```
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
「同じ処理でパラメータが違うところ」をコピペで処理をしたことがプログラミングテクニックとしてはまずいところ。「コピペして違うところをなおす」行為は、間違いが紛れ込むモトです。
|
|
37
|
+
せっかくC++なので距離センサをクラスにまとめるのがいいかと思います。
|