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

質問編集履歴

3

意見をいただき、試したこと

2020/09/15 12:59

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -108,4 +108,116 @@
108
108
 
109
109
  setup内に書かれている、ファイルの読み取りコードこれを1行ずつvalに値入れたらその都度回せるようにしたいです。
110
110
  スケッチの改善点あれば教えていただきたいです
111
- よろしくお願いします
111
+ よろしくお願いします
112
+
113
+ ご意見を頂き、ファイル内容を配列に格納してみるやり方でやってみました。まだ動作を見た感じ、最後の値のみでしか回転させていなかったです。
114
+ ```
115
+ #include<SD.h>
116
+ #include<SPI.h>
117
+
118
+ int APHASE=2; //AIN1へ接続
119
+ int AENBL=3; //AIN2へ接続
120
+ int BPHASE=6; //BIN1へ接続
121
+ int BENBL=7; //BIN2へ接続
122
+ volatile int count=0; //LED用のカウンター
123
+ volatile int RotCounter=0; //現在の回転角(0,1,2,3)
124
+ volatile int TimeDivCounter=0; //割り込みのカウンター用
125
+ volatile int datacount=0; //データ用のカウンター
126
+ volatile int num[5];
127
+
128
+ ISR(TIMER1_COMPA_vect){ //1ms(0.001s)で読みだす
129
+ //18度回転の処理
130
+ int i=0;
131
+ if(TimeDivCounter==0){//==のあとの数字はSDの値
132
+ switch(RotCounter){
133
+ case 0:
134
+ digitalWrite(APHASE, LOW);
135
+ digitalWrite(AENBL, HIGH);
136
+ digitalWrite(BPHASE, LOW);
137
+ digitalWrite(BENBL, HIGH);
138
+ break;
139
+ case 1:
140
+ digitalWrite(APHASE, HIGH);
141
+ digitalWrite(AENBL, HIGH);
142
+ digitalWrite(BPHASE, LOW);
143
+ digitalWrite(BENBL, HIGH);
144
+ break;
145
+ case 2:
146
+ digitalWrite(APHASE, HIGH);
147
+ digitalWrite(AENBL, HIGH);
148
+ digitalWrite(BPHASE, HIGH);
149
+ digitalWrite(BENBL, HIGH);
150
+ break;
151
+ case 3:
152
+ digitalWrite(APHASE, LOW);
153
+ digitalWrite(AENBL, HIGH);
154
+ digitalWrite(BPHASE, HIGH);
155
+ digitalWrite(BENBL, HIGH);
156
+ break;
157
+ }
158
+ RotCounter++;
159
+
160
+ if(RotCounter>=4){
161
+ RotCounter=0;
162
+ }
163
+ TimeDivCounter=0;
164
+ i++;
165
+ if(i>=6){
166
+ i=5;
167
+ }
168
+ }else{
169
+ TimeDivCounter++;
170
+ }
171
+ }
172
+
173
+ void setup() {
174
+ pinMode(APHASE,OUTPUT);
175
+ pinMode(AENBL,OUTPUT);
176
+ pinMode(BPHASE,OUTPUT);
177
+ pinMode(BENBL,OUTPUT);
178
+ digitalWrite(AENBL,HIGH);
179
+ digitalWrite(BENBL,HIGH);
180
+
181
+ Serial.begin(9600);
182
+ while (!Serial) {
183
+ ;
184
+ }
185
+ Serial.println("SDカードの初期化");
186
+
187
+ if (!SD.begin(4)) {
188
+ Serial.println("初期化に失敗");
189
+ while(1);
190
+ }
191
+ Serial.println("初期化完了");
192
+
193
+ File dataFile = SD.open("data.txt");
194
+ if(dataFile){
195
+ char s;
196
+ String d;
197
+ int i=0;
198
+ while(dataFile.available()){
199
+ s=dataFile.read();
200
+ if(s=='\r'){//もし改行が来たら
201
+ d.trim(); //空白文字を取り除く
202
+ num[i]=d.toInt(); //整数に変換
203
+ Serial.println(num[i]);
204
+ i++;
205
+ d="";
206
+ }else{
207
+ d+=s;
208
+ }
209
+ }
210
+ dataFile.close();
211
+ }else{
212
+ Serial.println(F("error opening data.txt"));
213
+ }
214
+
215
+ TCCR1A = 0b00000010;
216
+ TCCR1B = 0b00000011;
217
+ TIMSK1 = 0b00000010;
218
+ OCR1A = 24;
219
+ }
220
+
221
+ void loop(){
222
+ }
223
+ ```

2

2020/09/15 12:59

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,107 @@
1
+ ```
2
+ #include<SD.h>
1
- https://writening.net/page?Z7GaGU
3
+ #include<SPI.h>
2
4
 
5
+ int APHASE=2;
6
+ int AENBL=3;
7
+ int BPHASE=6;
8
+ int BENBL=7;
9
+ volatile int count=0; //LED用のカウンター
10
+ volatile int RotCounter=0; //現在の回転角(0,1,2,3)
11
+ volatile int TimeDivCounter=0; //割り込みのカウンター用
12
+ volatile int datacount=0; //データ用のカウンター
13
+ volatile int val;
14
+
15
+ ISR(TIMER1_COMPA_vect){ //1ms(0.001s)で読みだす
16
+ //18度回転の処理
17
+ if(TimeDivCounter==val){//==のあとの数字はSDの値
18
+ switch(RotCounter){
19
+ case 0:
20
+ digitalWrite(APHASE, LOW);
21
+ digitalWrite(AENBL, HIGH);
22
+ digitalWrite(BPHASE, LOW);
23
+ digitalWrite(BENBL, HIGH);
24
+ break;
25
+ case 1:
26
+ digitalWrite(APHASE, HIGH);
27
+ digitalWrite(AENBL, HIGH);
28
+ digitalWrite(BPHASE, LOW);
29
+ digitalWrite(BENBL, HIGH);
30
+ break;
31
+ case 2:
32
+ digitalWrite(APHASE, HIGH);
33
+ digitalWrite(AENBL, HIGH);
34
+ digitalWrite(BPHASE, HIGH);
35
+ digitalWrite(BENBL, HIGH);
36
+ break;
37
+ case 3:
38
+ digitalWrite(APHASE, LOW);
39
+ digitalWrite(AENBL, HIGH);
40
+ digitalWrite(BPHASE, HIGH);
41
+ digitalWrite(BENBL, HIGH);
42
+ break;
43
+ }
44
+ RotCounter++;
45
+
46
+ if(RotCounter>=4){
47
+ RotCounter=0;
48
+ }
49
+ TimeDivCounter=0;
50
+ }else{
51
+ TimeDivCounter++;
52
+ }
53
+ }
54
+
55
+ void setup() {
56
+ pinMode(APHASE,OUTPUT);
57
+ pinMode(AENBL,OUTPUT);
58
+ pinMode(BPHASE,OUTPUT);
59
+ pinMode(BENBL,OUTPUT);
60
+ digitalWrite(AENBL,HIGH);
61
+ digitalWrite(BENBL,HIGH);
62
+
63
+ Serial.begin(9600);
64
+ while (!Serial) {
65
+ ;
66
+ }
67
+ Serial.println("SDカードの初期化");
68
+
69
+ if (!SD.begin(4)) {
70
+ Serial.println("初期化に失敗");
71
+ while(1);
72
+ }
73
+ Serial.println("初期化完了");
74
+
75
+ File dataFile = SD.open("data.txt");
76
+ if(dataFile){
77
+ char buffer[65];
78
+ while(dataFile.available()){
79
+ int length=dataFile.available();
80
+ if(length>64){
81
+ length=64;
82
+ }
83
+ dataFile.read(buffer,length);
84
+ buffer[length]='\0';
85
+ Serial.write(buffer,length);
86
+ val=atoi(buffer);
87
+ }
88
+ dataFile.close();
89
+ }else{
90
+ Serial.println(F("error opening data.txt"));
91
+ }
92
+
93
+ DDRB=0b00000100;
94
+ TCCR1A = 0b00000010;
95
+ TCCR1B = 0b00000011;
96
+ TIMSK1 = 0b00000010;
97
+ OCR1A = 249;
98
+ }
99
+
100
+ void loop(){
101
+ }
102
+
103
+ ```
104
+
3
105
  上記にコードがあります。
4
106
  今SDカードにあるファイルには1行ずつ値が入っており、その値を割り込み関数内にあるvalに代入してモータを回転させたいです。
5
107
  ファイルには1500,2500,500...と1行ずつ入っていてvalに代入されるとそれぞれ1.5s,2.5s,0.5s...おきにモーターを回転させます。今の動きというのがファイルにある最後の数1500がvalに入って1.5sおきに回転してしまいます。

1

実際の動きの修正

2020/09/14 12:16

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -2,8 +2,8 @@
2
2
 
3
3
  上記にコードがあります。
4
4
  今SDカードにあるファイルには1行ずつ値が入っており、その値を割り込み関数内にあるvalに代入してモータを回転させたいです。
5
- ファイルには1500,500,2500...と1行ずつ入っていてvalに代入されるとそれぞれ1.5s,0.5s,2.5s...おきにモーターを回転させます。今の動きというのがマーでおおよそで測りました、3s毎に回転しているのです。
5
+ ファイルには1500,2500,500...と1行ずつ入っていてvalに代入されるとそれぞれ1.5s,2.5s,0.5s...おきにモーターを回転させます。今の動きというのがファルにある最後の数1500val入って1.5sおきに回転してします。
6
6
 
7
- setup内に書かれている、ファイルの読み取りコードこれ1行ずつ値入れられていないでしょか?
7
+ setup内に書かれている、ファイルの読み取りコードこれ1行ずつvalに値入れ都度回せるよにしたいです。
8
8
  スケッチの改善点あれば教えていただきたいです
9
9
  よろしくお願いします