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

質問編集履歴

3

似た質問を違うサイトでもしてしまったから

2021/02/03 12:42

投稿

Yokkii
Yokkii

スコア2

title CHANGED
@@ -1,1 +1,1 @@
1
- Arduinoのデータ取得方法についてのプログラム
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

書式の改善

2021/02/03 12:42

投稿

Yokkii
Yokkii

スコア2

title CHANGED
File without changes
body CHANGED
@@ -1,21 +1,26 @@
1
- Arduinoで2つのエンコーダの1パルス出力された時の経過時間を計測するプログラムを考えています。前回の質問で、Arduino Dueのメモリ容量が96KBでエンコーダの3周分のデータか取れないことがわかりました。
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

書式の改善

2021/01/29 13:11

投稿

Yokkii
Yokkii

スコア2

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