質問編集履歴
3
似た質問を違うサイトでもしてしまったから
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
|
1
|
+
データの取得方法についてのプログラム
|
body
CHANGED
@@ -1,146 +1,2 @@
|
|
1
|
-
### 前提・実現したいこと
|
2
|
-
|
3
|
-
Arduinoで2つのエンコーダの1パルス出力された時の経過時間を計測するプログラムを考えています。
|
4
|
-
|
5
|
-
そこで考えたのが、
|
6
|
-
3周分のデータを取得⇒SDカードに保存⇒3周分のデータを取得(前のデータを書き換え)
|
7
|
-
⇒SDカードに保存(前のデータに加える)
|
8
|
-
を繰り返せば、SDカードに保存する時間分だけ遅れが生じるが、何周分のデータも取れるのではないかと考えました。
|
9
|
-
|
10
|
-
〇前提条件
|
11
|
-
|
1
|
+
わからないことは聞いて解決するもよし、自分で解決するのもよし
|
12
|
-
エンコーダの分解能は2880と3600です
|
13
|
-
一回転は約2秒
|
14
|
-
必要なデータ数は9周分のデータ(つまり3周を3回)
|
15
|
-
|
16
|
-
### 発生している問題・エラーメッセージ
|
17
|
-
|
18
|
-
Arduino Dueのメモリ容量が96KBでエンコーダの3周分のデータしか取れない
|
19
|
-
|
20
|
-
|
21
|
-
### 該当のソースコード
|
22
|
-
|
23
|
-
```ここに言語名を入力
|
24
|
-
#include <SD.h>
|
25
|
-
#define chipSelect 4
|
26
|
-
#define Pina 6 // 2 つのピンに名前を付けておく
|
27
|
-
#define Pinb 2
|
28
|
-
#define Pinc 5
|
29
|
-
const int numa = 10800; // 駆動歯車:2880
|
30
|
-
const int numb = 10800; // 被動歯車:3600
|
31
|
-
const int numc = 3; //被動歯車Z相
|
32
|
-
boolean V1a, V2a, V1b, V2b, V1c, V2c;
|
33
|
-
File dataFile;
|
34
|
-
static unsigned long startTime;
|
35
|
-
int i1,i2,i3;
|
36
|
-
void setup(){
|
37
|
-
Serial.begin (9600);
|
38
|
-
|
39
|
-
Serial.print(F("Initializing SD card..."));
|
40
|
-
pinMode(10, OUTPUT);
|
41
|
-
if (!SD.begin(chipSelect)){
|
42
|
-
Serial.println(F("Card failed, or not present"));
|
43
|
-
while(1);
|
44
|
-
}
|
45
|
-
Serial.println(F("ok."));
|
46
|
-
dataFile = SD.open("datalog.txt", FILE_WRITE);
|
47
|
-
Serial.println(F("Recored start!"));
|
48
|
-
startTime=micros();
|
49
|
-
|
50
|
-
pinMode(Pina, INPUT);//6(金属)
|
51
|
-
pinMode(Pinb, INPUT);//2(プラスチック)
|
52
|
-
pinMode(Pinc, INPUT);//Z相
|
53
|
-
pinMode(LED_BUILTIN, OUTPUT);
|
54
|
-
V1a =0;
|
55
|
-
V2a =0;
|
56
|
-
V1b =0;
|
57
|
-
V2b =0;
|
58
|
-
V1c =0;
|
59
|
-
V2c =0;
|
60
|
-
i1=0;
|
61
|
-
i2=0;
|
62
|
-
i3=0;
|
63
|
-
}
|
64
|
-
void loop(){
|
65
|
-
int j,k,l;
|
66
|
-
static unsigned long t1[numa+3]={0}, t2[numb+3]={0},t3[numc+3]={0};
|
67
|
-
V2a = digitalRead(Pina); // 2 つのピンで読んだ値を V1 と V2 に
|
68
|
-
V2b = digitalRead(Pinb);
|
69
|
-
V2c = digitalRead(Pinc);
|
70
|
-
|
71
|
-
if(g=0,g<numg,g++){
|
72
|
-
|
73
|
-
if( V1c==0 && V2c>=1 && i3<numc){
|
74
|
-
t3[i3] = micros();
|
75
|
-
i3++;
|
76
|
-
}
|
77
|
-
|
78
|
-
if(V1a==0 && V2a>=1){
|
79
|
-
t1[i1] = micros();
|
80
|
-
i1++;
|
81
|
-
}
|
82
|
-
|
83
|
-
if(V1b==0 && V2b>=1){
|
84
|
-
t2[i2] = micros();
|
85
|
-
i2++;
|
86
|
-
}
|
87
|
-
if(i2>=numb){
|
88
|
-
Serial.print("data record finished");
|
89
|
-
if(((micros()-startTime)%1000000000)<50000000){
|
90
|
-
for(l=0;l<numc;l++){
|
91
|
-
dataFile.println(t3[l]);
|
92
|
-
delay(5);
|
93
|
-
}
|
94
|
-
for(j=0,k=0;j<numa && k<numb ;j++,k++){
|
95
|
-
dataFile.print(t1[j]);
|
96
|
-
dataFile.print(" ");
|
97
|
-
dataFile.println(t2[k]);
|
98
|
-
delay(5);
|
99
|
-
}
|
100
|
-
}
|
101
|
-
for(l=0;l<numc;l++){
|
102
|
-
Serial.println(t3[l],4);
|
103
|
-
delay(20);
|
104
|
-
}
|
105
|
-
for(j=0,k=0;j<numa && k<numb ;j++,k++){
|
106
|
-
Serial.print(t1[j],4);
|
107
|
-
Serial.print(",");
|
108
|
-
Serial.println(t2[k],4);
|
109
|
-
delay(20);
|
110
|
-
}
|
111
|
-
|
112
|
-
i1=0;
|
113
|
-
i2=0;
|
114
|
-
i3=0;
|
115
|
-
if((micros()-startTime)>40000000){ // 1,000,000micros=1sec 40s
|
116
|
-
dataFile.flush();
|
117
|
-
dataFile.close();
|
118
|
-
Serial.println(F("finished"));
|
119
|
-
while(1){
|
120
|
-
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
|
121
|
-
delay(5000); // wait for a second
|
122
|
-
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
|
123
|
-
delay(5000); // wait for a second
|
124
|
-
}
|
125
|
-
}
|
126
|
-
}
|
127
|
-
|
128
|
-
V1a=V2a;
|
129
|
-
V1b=V2b;
|
130
|
-
V1c=V2c;
|
131
|
-
}
|
132
|
-
|
133
|
-
```
|
134
|
-
|
135
|
-
### 試したこと
|
136
|
-
|
137
|
-
今のプログラムを書き換えて、エンコーダのデータを9周分取得しSDカードに保存するプログラムを書きたい
|
138
|
-
|
139
|
-
➀このやり方は可能かどうか
|
140
|
-
|
2
|
+
うまいこと利用して勉強するべし
|
141
|
-
➂簡単でいいのでプログラムを書いて説明していただきたい
|
142
|
-
|
143
|
-
|
144
|
-
### 補足情報(FW/ツールのバージョンなど)
|
145
|
-
|
146
|
-
ここにより詳細な情報を記載してください。
|
2
書式の改善
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,21 +1,26 @@
|
|
1
|
-
|
1
|
+
### 前提・実現したいこと
|
2
2
|
|
3
|
+
Arduinoで2つのエンコーダの1パルス出力された時の経過時間を計測するプログラムを考えています。
|
4
|
+
|
3
5
|
そこで考えたのが、
|
4
6
|
3周分のデータを取得⇒SDカードに保存⇒3周分のデータを取得(前のデータを書き換え)
|
5
7
|
⇒SDカードに保存(前のデータに加える)
|
6
8
|
を繰り返せば、SDカードに保存する時間分だけ遅れが生じるが、何周分のデータも取れるのではないかと考えました。
|
7
9
|
|
10
|
+
〇前提条件
|
11
|
+
それぞれのエンコーダにはギアが付いていてかみ合っている状態です
|
12
|
+
エンコーダの分解能は2880と3600です
|
13
|
+
一回転は約2秒
|
8
|
-
|
14
|
+
必要なデータ数は9周分のデータ(つまり3周を3回)
|
9
|
-
例えば、if文で1周ごとにカウントし10カウントしたら終了するようにプログラムとか?
|
10
15
|
|
11
|
-
➀このやり方は可能かどうか
|
12
|
-
|
16
|
+
### 発生している問題・エラーメッセージ
|
13
|
-
➂簡単でいいのでプログラムを書いて説明していただきたい
|
14
17
|
|
15
|
-
|
18
|
+
Arduino Dueのメモリ容量が96KBでエンコーダの3周分のデータしか取れない
|
16
19
|
|
17
20
|
|
21
|
+
### 該当のソースコード
|
22
|
+
|
18
|
-
|
23
|
+
```ここに言語名を入力
|
19
24
|
#include <SD.h>
|
20
25
|
#define chipSelect 4
|
21
26
|
#define Pina 6 // 2 つのピンに名前を付けておく
|
@@ -123,4 +128,19 @@
|
|
123
128
|
V1a=V2a;
|
124
129
|
V1b=V2b;
|
125
130
|
V1c=V2c;
|
126
|
-
}
|
131
|
+
}
|
132
|
+
|
133
|
+
```
|
134
|
+
|
135
|
+
### 試したこと
|
136
|
+
|
137
|
+
今のプログラムを書き換えて、エンコーダのデータを9周分取得しSDカードに保存するプログラムを書きたい
|
138
|
+
|
139
|
+
➀このやり方は可能かどうか
|
140
|
+
➁どういうプログラムにするか
|
141
|
+
➂簡単でいいのでプログラムを書いて説明していただきたい
|
142
|
+
|
143
|
+
|
144
|
+
### 補足情報(FW/ツールのバージョンなど)
|
145
|
+
|
146
|
+
ここにより詳細な情報を記載してください。
|
1
書式の改善
title
CHANGED
File without changes
|
body
CHANGED
@@ -8,7 +8,13 @@
|
|
8
8
|
ただ、プログラムの書き方がいまいちわかりません
|
9
9
|
例えば、if文で1周ごとにカウントし10カウントしたら終了するようにプログラムとか?
|
10
10
|
|
11
|
+
➀このやり方は可能かどうか
|
12
|
+
➁どういうプログラムにするか
|
13
|
+
➂簡単でいいのでプログラムを書いて説明していただきたい
|
11
14
|
|
15
|
+
可能な範囲でよろしいので回答していただけると幸いです
|
16
|
+
|
17
|
+
|
12
18
|
**スケッチ**
|
13
19
|
#include <SD.h>
|
14
20
|
#define chipSelect 4
|