回答編集履歴

3

修正

2021/01/25 12:30

投稿

thkana
thkana

スコア7703

test CHANGED
@@ -76,13 +76,15 @@
76
76
 
77
77
  以下、コンパイルは通りましたが動作チェックはしていません
78
78
 
79
+ (一部修正 HC-SR4は一つしか持ってないから順次で試したけど一応動くみたい 1/25)
80
+
79
81
  ```Arduino
80
82
 
81
83
  typedef int Pin;
82
84
 
83
85
  //#defineよりは型チェックの入るconstをおススメします
84
86
 
85
- const Pin echoF = 7;
87
+ const Pin echoF = 6;
86
88
 
87
89
  const Pin trigF = 8;
88
90
 
@@ -132,11 +134,11 @@
132
134
 
133
135
  digitalWrite(trig, LOW);
134
136
 
135
- unsigned long dur = pulseIn(echoF, HIGH);
137
+ unsigned long dur = pulseIn(echo, HIGH);
136
138
 
137
139
  if (dur > 0) {
138
140
 
139
- dist = dur / 2 * 340 * 100 / 1000000;
141
+ dist = dur / 2. * 340 * 100 / 1000000;
140
142
 
141
143
  }
142
144
 

2

サンプル追加

2021/01/25 12:30

投稿

thkana
thkana

スコア7703

test CHANGED
@@ -70,4 +70,190 @@
70
70
 
71
71
  「同じ処理でパラメータが違うところ」をコピペで処理をしたことがプログラミングテクニックとしてはまずいところ。「コピペして違うところをなおす」行為は、間違いが紛れ込むモトです。
72
72
 
73
- せっかくC++なので距離センサをクラスにまとめるのがいいかと思います。
73
+ せっかく中身C++なので距離センサをクラスにまとめるのがいいかと思います。
74
+
75
+
76
+
77
+ 以下、コンパイルは通りましたが動作チェックはしていません
78
+
79
+ ```Arduino
80
+
81
+ typedef int Pin;
82
+
83
+ //#defineよりは型チェックの入るconstをおススメします
84
+
85
+ const Pin echoF = 7;
86
+
87
+ const Pin trigF = 8;
88
+
89
+ const Pin echoR = 9;
90
+
91
+ const Pin trigR = 10;
92
+
93
+ const Pin echoL = 13;
94
+
95
+ const Pin trigL = 12;
96
+
97
+ const Pin buza = 7;
98
+
99
+
100
+
101
+ //距離センサクラス
102
+
103
+ class DistSens {
104
+
105
+ Pin echo, trig;
106
+
107
+ String label;
108
+
109
+ public:
110
+
111
+ DistSens(Pin echo, Pin trig, String label):
112
+
113
+ echo(echo), trig(trig), label(label) {
114
+
115
+ pinMode(echo, INPUT);
116
+
117
+ pinMode(trig, OUTPUT);
118
+
119
+ }
120
+
121
+ double getDist() {
122
+
123
+ double dist=0;
124
+
125
+ digitalWrite(trig, LOW);
126
+
127
+ delayMicroseconds(2);
128
+
129
+ digitalWrite(trig, HIGH);
130
+
131
+ delayMicroseconds(10);
132
+
133
+ digitalWrite(trig, LOW);
134
+
135
+ unsigned long dur = pulseIn(echoF, HIGH);
136
+
137
+ if (dur > 0) {
138
+
139
+ dist = dur / 2 * 340 * 100 / 1000000;
140
+
141
+ }
142
+
143
+ Serial.print("Dis");
144
+
145
+ Serial.print(label);
146
+
147
+ Serial.print(':');
148
+
149
+ Serial.println(dist);
150
+
151
+ delay(20);
152
+
153
+ return dist;
154
+
155
+ }
156
+
157
+ };
158
+
159
+
160
+
161
+ DistSens distF(echoF, trigF, "F");
162
+
163
+ DistSens distR(echoR, trigR, "R");
164
+
165
+ DistSens distL(echoL, trigL, "L");
166
+
167
+
168
+
169
+ void setup() {
170
+
171
+ Serial.begin(9600);
172
+
173
+ pinMode(buza, OUTPUT);
174
+
175
+ }
176
+
177
+
178
+
179
+ void TurnRight() {
180
+
181
+ tone(buza, 262, 200);
182
+
183
+ delay(200);
184
+
185
+ }
186
+
187
+
188
+
189
+ void TurnLeft() {
190
+
191
+ tone(buza, 262, 200);
192
+
193
+ delay(100);
194
+
195
+ tone(buza, 262, 200);
196
+
197
+ delay(100);
198
+
199
+ tone(buza, 262, 200);
200
+
201
+ delay(200);
202
+
203
+ }
204
+
205
+
206
+
207
+ void loop() {
208
+
209
+ double DisF = distF.getDist();
210
+
211
+ if (DisF < 10) {
212
+
213
+ digitalWrite(trigF, LOW);
214
+
215
+ double DisL = distL.getDist();
216
+
217
+ double DisR = distR.getDist();
218
+
219
+ while (DisF > 10) {
220
+
221
+ if (DisR > 20) {
222
+
223
+ TurnRight();
224
+
225
+ }
226
+
227
+ else if (DisL > 20) {
228
+
229
+ TurnLeft();
230
+
231
+ }
232
+
233
+ //以下のelseに到達するのはDisR<=20かつDisL<=20だったときだけ。
234
+
235
+ //(DisR<20)&&(disL<20)だとDisR==20またはDisL==20のときどうなる?
236
+
237
+ //そもそもここでifで検査する意味はあるのか?
238
+
239
+ else if ((DisR < 20) && (DisL < 20)) {
240
+
241
+ //これ意味のある動作?
242
+
243
+ digitalWrite(trigF, HIGH);
244
+
245
+ digitalWrite(trigR, LOW);
246
+
247
+ digitalWrite(trigL, LOW);
248
+
249
+ distF.getDist();
250
+
251
+ }
252
+
253
+ }
254
+
255
+ }
256
+
257
+ }
258
+
259
+ ```

1

追記

2021/01/24 13:54

投稿

thkana
thkana

スコア7703

test CHANGED
@@ -1,6 +1,6 @@
1
1
  他人が見ると簡単に見つかったりするんですけどね。
2
2
 
3
- ```
3
+ ```Arduino
4
4
 
5
5
  void DistanceRight(){
6
6
 
@@ -65,3 +65,9 @@
65
65
  }
66
66
 
67
67
  ```
68
+
69
+
70
+
71
+ 「同じ処理でパラメータが違うところ」をコピペで処理をしたことがプログラミングテクニックとしてはまずいところ。「コピペして違うところをなおす」行為は、間違いが紛れ込むモトです。
72
+
73
+ せっかくC++なので距離センサをクラスにまとめるのがいいかと思います。