質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

受付中

Arduinoのファイル読み取りについて

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

2回答

0リアクション

0クリップ

3053閲覧

投稿2020/09/13 20:29

編集2020/09/15 12:59
#include<SD.h> #include<SPI.h> int APHASE=2; int AENBL=3; int BPHASE=6; int BENBL=7; volatile int count=0; //LED用のカウンター volatile int RotCounter=0; //現在の回転角(0,1,2,3) volatile int TimeDivCounter=0; //割り込みのカウンター用 volatile int datacount=0; //データ用のカウンター volatile int val; ISR(TIMER1_COMPA_vect){ //1ms(0.001s)で読みだす //18度回転の処理 if(TimeDivCounter==val){//==のあとの数字はSDの値 switch(RotCounter){ case 0: digitalWrite(APHASE, LOW); digitalWrite(AENBL, HIGH); digitalWrite(BPHASE, LOW); digitalWrite(BENBL, HIGH); break; case 1: digitalWrite(APHASE, HIGH); digitalWrite(AENBL, HIGH); digitalWrite(BPHASE, LOW); digitalWrite(BENBL, HIGH); break; case 2: digitalWrite(APHASE, HIGH); digitalWrite(AENBL, HIGH); digitalWrite(BPHASE, HIGH); digitalWrite(BENBL, HIGH); break; case 3: digitalWrite(APHASE, LOW); digitalWrite(AENBL, HIGH); digitalWrite(BPHASE, HIGH); digitalWrite(BENBL, HIGH); break; } RotCounter++; if(RotCounter>=4){ RotCounter=0; } TimeDivCounter=0; }else{ TimeDivCounter++; } } void setup() { pinMode(APHASE,OUTPUT); pinMode(AENBL,OUTPUT); pinMode(BPHASE,OUTPUT); pinMode(BENBL,OUTPUT); digitalWrite(AENBL,HIGH); digitalWrite(BENBL,HIGH); Serial.begin(9600); while (!Serial) { ; } Serial.println("SDカードの初期化"); if (!SD.begin(4)) { Serial.println("初期化に失敗"); while(1); } Serial.println("初期化完了"); File dataFile = SD.open("data.txt"); if(dataFile){ char buffer[65]; while(dataFile.available()){ int length=dataFile.available(); if(length>64){ length=64; } dataFile.read(buffer,length); buffer[length]='\0'; Serial.write(buffer,length); val=atoi(buffer); } dataFile.close(); }else{ Serial.println(F("error opening data.txt")); } DDRB=0b00000100; TCCR1A = 0b00000010; TCCR1B = 0b00000011; TIMSK1 = 0b00000010; OCR1A = 249; } void loop(){ }

上記にコードがあります。
今SDカードにあるファイルには1行ずつ値が入っており、その値を割り込み関数内にあるvalに代入してモータを回転させたいです。
ファイルには1500,2500,500...と1行ずつ入っていてvalに代入されるとそれぞれ1.5s,2.5s,0.5s...おきにモーターを回転させます。今の動きというのがファイルにある最後の数1500がvalに入って1.5sおきに回転してしまいます。

setup内に書かれている、ファイルの読み取りコードこれを1行ずつvalに値入れたらその都度回せるようにしたいです。
スケッチの改善点あれば教えていただきたいです
よろしくお願いします

ご意見を頂き、ファイル内容を配列に格納してみるやり方でやってみました。まだ動作を見た感じ、最後の値のみでしか回転させていなかったです。

#include<SD.h> #include<SPI.h> int APHASE=2; //AIN1へ接続 int AENBL=3; //AIN2へ接続 int BPHASE=6; //BIN1へ接続 int BENBL=7; //BIN2へ接続 volatile int count=0; //LED用のカウンター volatile int RotCounter=0; //現在の回転角(0,1,2,3) volatile int TimeDivCounter=0; //割り込みのカウンター用 volatile int datacount=0; //データ用のカウンター volatile int num[5]; ISR(TIMER1_COMPA_vect){ //1ms(0.001s)で読みだす //18度回転の処理 int i=0; if(TimeDivCounter==0){//==のあとの数字はSDの値 switch(RotCounter){ case 0: digitalWrite(APHASE, LOW); digitalWrite(AENBL, HIGH); digitalWrite(BPHASE, LOW); digitalWrite(BENBL, HIGH); break; case 1: digitalWrite(APHASE, HIGH); digitalWrite(AENBL, HIGH); digitalWrite(BPHASE, LOW); digitalWrite(BENBL, HIGH); break; case 2: digitalWrite(APHASE, HIGH); digitalWrite(AENBL, HIGH); digitalWrite(BPHASE, HIGH); digitalWrite(BENBL, HIGH); break; case 3: digitalWrite(APHASE, LOW); digitalWrite(AENBL, HIGH); digitalWrite(BPHASE, HIGH); digitalWrite(BENBL, HIGH); break; } RotCounter++; if(RotCounter>=4){ RotCounter=0; } TimeDivCounter=0; i++; if(i>=6){ i=5; } }else{ TimeDivCounter++; } } void setup() { pinMode(APHASE,OUTPUT); pinMode(AENBL,OUTPUT); pinMode(BPHASE,OUTPUT); pinMode(BENBL,OUTPUT); digitalWrite(AENBL,HIGH); digitalWrite(BENBL,HIGH); Serial.begin(9600); while (!Serial) { ; } Serial.println("SDカードの初期化"); if (!SD.begin(4)) { Serial.println("初期化に失敗"); while(1); } Serial.println("初期化完了"); File dataFile = SD.open("data.txt"); if(dataFile){ char s; String d; int i=0; while(dataFile.available()){ s=dataFile.read(); if(s=='\r'){//もし改行が来たら d.trim(); //空白文字を取り除く num[i]=d.toInt(); //整数に変換 Serial.println(num[i]); i++; d=""; }else{ d+=s; } } dataFile.close(); }else{ Serial.println(F("error opening data.txt")); } TCCR1A = 0b00000010; TCCR1B = 0b00000011; TIMSK1 = 0b00000010; OCR1A = 24; } void loop(){ }

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

y_waiwai

2020/09/13 21:41

コードを提示しましょう で、現状のコードではどういう不具合があるんでしょうか
退会済みユーザー

退会済みユーザー

2020/09/14 12:19 編集

ファイルからvalに値は入っていますが、ファイルには1500,2500,500...と1行ずつ入っていてvalに順に代入されるんですけど、今の動きというのがファイルにある最後の数1500がvalに入って1.5sおきに回転してしまいます。結局モータ動かす際はファイルの最後の数値のみvalに入ってそれが繰り返される仕様になってしまっているので、最後の値だけではなく、valに値が入ったら回せるようにしたいです。
thkana

2020/09/14 11:56

そのぐらいのコードなら質問に貼り付けられるのではないかと思いますが、出来ませんでしたか? というか、質問内のURLに貼り付けられているコードと違いますね? 「本当のところ」を見せて下さい。
退会済みユーザー

退会済みユーザー

2020/09/14 12:11

質問してからも考えているので直近のコードがURLじゃないコードとなりそれを貼り付けました。URLのコードで修正しておきました。 URL云々よりもコードについて聞いているのですが、、そもそも登録したばかりでこれが初めての質問でURLでもいいのかなと思って貼り付けました。URLよりもコード貼り付けろってことですね
y_waiwai

2020/09/14 12:14

質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
退会済みユーザー

退会済みユーザー

2020/09/14 12:17

教えていただきありがとうございます。助かります。これで見えてますでしょうか?
thkana

2020/09/14 22:53

「そもそも登録したばかり」で書き込もうとするなら、どのようにするのか ヘルプ https://teratail.com/help には一通り目を通されたと思います。よそのサイトに貼り付けてURLを示すというようなことは出てこなくて、コードをこのように処置して提示しましょう、というような説明があったでしょう。 あなたの問題を解決することもですが、あとから同様の問題に突き当たったひとの解決に役立つ、というのもこのサイトの目的のひとつのようです。その意味で、他所のサイトに情報が分散していては、リンク切れなどで参照出来なくなるとその目的が果たせなくなってしまいます。
ozwk

2020/09/17 00:30

ファイル読み込みはひとまず置いておいて、 そもそも配列に予め定数でデータを入れておいて、そのとおり動かす、ということは出来ますか?

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。