teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

修正

2021/01/25 12:30

投稿

thkana
thkana

スコア7738

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 = 7;
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(echoF, HIGH);
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

サンプル追加

2021/01/25 12:30

投稿

thkana
thkana

スコア7738

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

追記

2021/01/24 13:54

投稿

thkana
thkana

スコア7738

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++なので距離センサをクラスにまとめるのがいいかと思います。