#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(){ }