• 締切済み

Arduino 全部のピンをチェックするスケッチ

Wr5の回答

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.5

>変数iの宣言は >old_val = [i]; >こんな感じでしょうか? 普通に int i; です。 ChgFlagも同様です。 >>というか…掲示されたコードだとloop()の中身は >>>DateTime now = RTC.now(); >>だけですが、よろしいので? >File dataFile = SD.open("datalog.txt", FILE_WRITE); >これが、要らないのでしょうか・・・ 「{」と「}」の対応がヘンだから、loop()の内容がそのコード「しか」ないですよ。 という指摘だったんですが…。 >これは、書き込むフォーム(形)と認識していますが、合っていますでしょうか。 一応合っていますが、空白の位置が最初の想定と違います。 まぁ、動かせば判ると思いますが。 # コンパイルエラーを直した上で。 >このスケッチは変化が有った時に状態を書き込むスケッチと認識していますが如何でしょう。 変化を検出して、書き込み用の判定をしています。 とりあえず、別の掲示板に移動したみたいなので私の回答はここまでですかね。 あちらにIDとか持っていませんし。 # あと、あちらの掲示板の書き込みルールには従いましょうね。 # 常連さんから指摘されると思いますが。

参考URL:
http://dixq.net/forum/viewtopic.php?f=3&t=15753
dt50ax1vt250
質問者

お礼

ありがとうございます。 いや、移動したというわけでは。 今日の夕方、valの宣言の方法を探していたら別サイトを初めて見つけて、別の方の意見も聞いて見たいと思いまして。 Wr5様にはものすごく感謝しています。 しかし、凄いですね。夕方投稿したばかりなのに発見したのですか。あの掲示板は有名なのでしょうか。 書き込みのルールしっかり読んでいませんでした。間違えていました・・・・ コンパイルエラーを直して実際に動かせそうな気がしてきました。 「{」と「}」 int i; int ChgFlag; 修正して結果報告させていただきます。 本当にありがとうございます。

関連するQ&A

  • Arduinoのスケッチで「変化が有った時」に変更

    お世話になります。 このスケッチを見るとHIGHの時に記録するようになっていると考えていますが、HIGHかLOWの変化の有った時に記録したいのですが、どのように変更すれば良いか教えて下さい。 また、記録上の0000 0000 0000のようにスペースを開けて記録する場合のスケッチも教えていただけますか。 参考にしたHP http://www.mauroalfieri.it/en/elettronica/data-logging-con-arduino.html 元のスケッチのチャンネル数はアナログ4chですがこれにデジタル12chを加え合計16chにしてみました。 実機では、まだ検証していませんがソフト上ではエラーは発生していません。 その他、改善点なども有りましたら、ご教授お願い致します。 皆様、よろしくお願い致します。 // Date and time functions using a DS1307 RTC connected via I2C and Wire lib #include <Wire.h> #include "RTClib.h" #include <SD.h> #define readButton 16 #define CS 10 RTC_DS1307 RTC; char buffer[40]; File myFile; void setup () { Serial.begin(57600); Serial.print("Initializing SD card..."); pinMode(CS, OUTPUT); pinMode(readButton, INPUT); if (!SD.begin(CS)) { Serial.println("initialization failed!"); return; } Serial.println("initialization done."); Wire.begin(); RTC.begin(); RTC.sqw(1); //0 Led off - 1 Freq 1Hz - 2 Freq 4096kHz - 3 Freq 8192kHz - 4 Freq 32768kHz if (! RTC.isrunning()) { Serial.println("RTC is NOT running!"); // following line sets the RTC to the date & time this sketch was compiled RTC.adjust(DateTime(__DATE__, __TIME__)); } } void loop () { DateTime now = RTC.now(); sprintf(buffer, "%02d/d/%d d:%02d:%02d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", now.day(), now.month(), now.year(), now.hour(), now.minute(), now.second(), digitalRead( A1 ), digitalRead( A2 ), digitalRead( A3 ),digitalRead( A4 ), digitalRead( A5 ), digitalRead( A6 ), digitalRead( A7 ),digitalRead( A8 ), digitalRead( A9 ), digitalRead( A10 ), digitalRead( A11 ),analogRead( A0 ), analogRead( A1 ), analogRead( A2 ), analogRead( A3 )); Serial.println( buffer ); myFile = SD.open("dati.log", FILE_WRITE); if (myFile) { myFile.println(buffer); myFile.close(); } else { Serial.println("error opening dati.log"); } if ( digitalRead( readButton ) == HIGH ) { Serial.println(" "); Serial.println("Log Reading Saved ----------- "); Serial.println(" "); myFile = SD.open("dati.log"); if (myFile) { while (myFile.available()) { Serial.write(myFile.read()); } myFile.close(); } delay( 5000 ); } delay(1000); }

  • Arduinoのスケッチでエラーがでてしまいます。

    【電子工作関連】Arduinoでボタンを押すとランダムに3つのモーターのうち一つが回転するというスケッチを書きたいのですが、エラーが出てしまいます。どこが間違っているのでしょう? Arduinoで、ボタンを押すとランダムに3つのモーターのうち一つが回転するというスケッチを書きたいのですが、コンパイル使用とすると、 「error: expected unqualified-id before numeric constant」 というエラーが出てしまいます。 どこが間違っているのでしょう? 下がそのスケッチです。 なお、モータードライバにはTA7291Pを使用。 信号ピンである5番6番ピンをArduino5~10番ピンに振り分けて、それぞれにモーターを接続、 電源やGNDは共有してます。 なお、ボタンを使わず、単純に3つのモーターのうち一つが回転するというというスケッチは出来ていて、実際にその通り動いています。 ------------------------------ //3つのモーターをランダムに動かす int val = 0 //入力ピンの状態がこの変数に記憶される void setup(){ pinMode(2,INPUT); //ボタンを入力に設定 pinMode(5,OUTPUT); //モーター(1)のドライバー5番ピンを出力に設定 pinMode(6,OUTPUT); //モーター(2)のドライバー5番ピンを出力に設定 pinMode(7,OUTPUT); //モーター(3)のドライバー5番ピンを出力に設定 pinMode(8,OUTPUT); //モーター(1)のドライバー6番ピンを出力に設定 pinMode(9,OUTPUT); //モーター(2)のドライバー6番ピンを出力に設定 pinMode(10,OUTPUT); //モーター(3)のドライバー6番ピンを出力に設定 } void loop(){ val = digitalRead(2); //入力を読み取りvalに格納 if (val == HIGH){ digitalWrite(random(5,8),HIGH);//ランダムにモーターを正回転させる } else { digitalWrite(5,LOW); digitalWrite(6,LOW); digitalWrite(7,LOW);//モータを止める } }

  • Arduino プログラミングのエラーについて

    現在、Arduino、4桁7セグメントLED(カソードコモン)、タクトスイッチ3つで、3人クイズ対決で利用する得点加算機を作成しています。 プログラムで、下記のようなエラーが出てしまいます。 invalid types 'int[int]' for array subscript このエラーに対して、何か解決策があればご教授お願い致します。 下記にプログラムを載せます。 const int first_BUTTON = 0; //プレイヤー1の得点ボタン const int second_BUTTON = 1; //プレイヤー2の得点ボタン const int third_BUTTON = 4; //プレイヤー3の得点ボタン const int anode_a = 12; //アノードに接続するArduinoのピン const int anode_b = 8; const int anode_c = 5; const int anode_d = 3; const int anode_e = 2; const int anode_f = 11; const int anode_g = 6; const int cathode_first = 7; // カソードに接続するArduinoのピン const int cathode_second = 9; const int cathode_third = 10; int val_1= 0; int val_2= 0; int val_3= 0; int old_val_1 = 0; int old_val_2 = 0; int old_val_3 = 0; // LEDの状態(0ならオフ、1ならオン) int state_first=0; int state_second=0; int state_third=0; int w; int N; // setup() は、最初に一度だけ実行される void setup () { // ピンを出力モードに設定する pinMode(first_BUTTON, INPUT); pinMode(second_BUTTON, INPUT); pinMode(third_BUTTON, INPUT); pinMode(anode_a, OUTPUT); pinMode(anode_b, OUTPUT); pinMode(anode_c, OUTPUT); pinMode(anode_d, OUTPUT); pinMode(anode_e, OUTPUT); pinMode(anode_f, OUTPUT); pinMode(anode_g, OUTPUT); pinMode(cathode_first, OUTPUT); pinMode(cathode_second, OUTPUT); pinMode(cathode_third, OUTPUT); } //LEDレイアウトを定義 boolean Num_Array[11][7]={ {1,1,1,1,1,1,0},//0 {0,1,1,0,0,0,0},//1 {1,1,0,1,1,0,1},//2 {1,1,1,1,0,0,1},//3 {0,1,1,0,0,1,1},//4 {1,0,1,1,0,1,1},//5 {1,0,1,1,1,1,1},//6 {1,1,1,0,0,1,0},//7 {1,1,1,1,1,1,1},//8 {1,1,1,1,0,1,1},//9 {0,0,0,0,0,0,0} //space }; //LED表示関数を定義 void NumPrint (int Number){ for (int w=0; w<=6; w++){ digitalWrite(w+1,Num_Array[Number][w]); } } boolean Led_Array[3][3]={ {1,0,0,}, //LED1 {0,1,0}, //LED2 {0,0,1} //LED3 }; void Led_Active(int Number){ for(w=0;w<=2;w++){ digitalWrite(w+11,Led_Array[Number][w]); } } // loop() は、setup ()実行後、無限に実行される void loop(){ for(int i=0;i<=2;i++){ NumPrint(N[i]) } Led_Active(i); delay(5); } val_1 = digitalRead(first_BUTTON); NumPrint(state_first); //変化があるかどうかチェック if((val_1 == HIGH) && (old_val_1 == LOW)) { state_first = (state_first+1) % 10; NumPrint(state_first); delay(300); } delay(100); old_val_1 = val_1; val_2 = digitalRead(second_BUTTON); NumPrint(state_second); //変化があるかどうかチェック if((val_2 == HIGH) && (old_val_2 == LOW)) { state_second = (state_second+1) % 10; NumPrint(state_second); delay(300); } delay(100); old_val_2 = val_2; val_3 = digitalRead(third_BUTTON); NumPrint(state_third); //変化があるかどうかチェック if((val_3 == HIGH) && (old_val_3 == LOW)) { state_third = (state_third+1) % 10; NumPrint(state_third); delay(300); } delay(100); old_val_3 = val_3; }

  • Arduinoでランダムにモーターを回したい

    【電子工作関連】Arduinoでボタンを押すたびに、ランダムに3つのモーターのうち一つが回転するというスケッチを書きたいのですが、ランダムになりません。どうすればランダムになるでしょう? 下がそのスケッチです。 今のところ、3つ全てのモーターが回ってしまいます。 なお、モータードライバにはTA7291Pを使用。 信号ピンである5番6番ピンをArduino5~10番ピンに振り分けて、それぞれにモーターを接続、 電源やGNDは共有してます。 なお、ボタンを使わず、単純に3つのモーターのうち一つが回転するというというスケッチは出来ていて、実際にその通り動いています。 ------------------------------ //3つのモーターをランダムに動かす int val = 0; //入力ピンの状態がこの変数に記憶される void setup(){ pinMode(2,INPUT); //ボタンを入力に設定 pinMode(5,OUTPUT); //モーター(1)のドライバー5番ピンを出力に設定 pinMode(6,OUTPUT); //モーター(2)のドライバー5番ピンを出力に設定 pinMode(7,OUTPUT); //モーター(3)のドライバー5番ピンを出力に設定 pinMode(8,OUTPUT); //モーター(1)のドライバー6番ピンを出力に設定 pinMode(9,OUTPUT); //モーター(2)のドライバー6番ピンを出力に設定 pinMode(10,OUTPUT); //モーター(3)のドライバー6番ピンを出力に設定 } void loop(){ val = digitalRead(2); //入力を読み取りvalに格納 if (val == HIGH){ digitalWrite(random(5,8),HIGH);//ランダムにモーターを正回転させる } else { digitalWrite(5,LOW); digitalWrite(6,LOW); digitalWrite(7,LOW);//モータを止める } }

  • 機器のI/OをArduinoでSDに記録したい

    皆様、お世話になります。 Arduinoでデーターロガーのスケッチを作成しています。 スケッチしてみましたが動くかどうか確認とこう直した方が良いなど改善点が有れば、お願い致します。 2番ピンに変化が有った時(ONかOFF)に時間と2番ピンの状態をSDカードに記録したいのです。 これが、うまくいけば系統を増やしていきたいです。 書いたスケッチ #include <SD.h> // この値は使用しているシールドや基板に合わせて変更すること。たとえば、 // イーサーネットシールドは 4 // Adafruit のSDシールドは 10 // Sparkfun のSDシールドは 8 const int chipSelect = 4; void setup() { // シリアルポート初期化 Serial.begin(9600); while (!Serial) { ; // USBケーブルが接続されるのを待つ。この待ちループは Leonardo のみ必要。 pinMode(2,INPUT) ; //スイッチに接続ピンをデジタル入力に設定A } Serial.print(F("Initializing SD card...")); // SSピン(Unoは10番、Megaは53番)は使わない場合でも出力にする必要があります。 // そうしないと、SPIがスレーブモードに移行し、SDライブラリが動作しなくなります。 pinMode(SS, OUTPUT); // SDライブラリを初期化 if (!SD.begin(chipSelect)) { Serial.println(F("Card failed, or not present")); // 失敗、何もしない while(1); } Serial.println(F("ok.")); // 日付と時刻を返す関数を登録 SdFile::dateTimeCallback( &dateTime ); } void loop() { // ファイルを開く File dataFile = SD.open("datalog.txt", FILE_WRITE); // もし2番ピンに変化が有れば書き込む if (digitalRead(2)==HIGH) { int value = digitalRead(2); dataFile.println(value); dataFile.close(); // シリアルポートにも出力 Serial.println(value); } if (digitalRead(2)==LOW) { int value = digitalRead(2); dataFile.println(value); dataFile.close(); // シリアルポートにも出力 Serial.println(value); } // ファイルが開けなかったらエラーを出力 else { Serial.println(F("error opening datalog.txt")); } } void dateTime(uint16_t* date, uint16_t* time) { uint16_t year = 2014; uint8_t month = 7, day = 22, hour = 14, minute = 0, second = 0; // GPSやRTCから日付と時間を取得 // FAT_DATEマクロでフィールドを埋めて日付を返す *date = FAT_DATE(year, month, day); // FAT_TIMEマクロでフィールドを埋めて時間を返す *time = FAT_TIME(hour, minute, second); } よろしくお願い致します。

  • Arduinoでコンパイルエラーについて

    お世話になります。 Arduinoで検証すると「コンパイル時にエラーが発生しました。」と出ますがスケッチ上に黄色い帯が出ません。 なにが原因なのでしょう? 参考にしたスケッチ http://www.mauroalfieri.it/en/elettronica/data-logging-con-arduino.html これに「RTClib.h」というファイルを同じ場所に置きました。 テキストファイルに以下のスケッチをコピーし「RTClib.h」を作成します。 // Code by JeeLabs http://news.jeelabs.org/code/ // Released to the public domain! Enjoy! // Simple general-purpose date/time class (no TZ / DST / leap second handling!) class DateTime { public: DateTime (uint32_t t =0); DateTime (uint16_t year, uint8_t month, uint8_t day, uint8_t hour =0, uint8_t min =0, uint8_t sec =0); DateTime (const char* date, const char* time); uint16_t year() const { return 2000 + yOff; } uint8_t month() const { return m; } uint8_t day() const { return d; } uint8_t hour() const { return hh; } uint8_t minute() const { return mm; } uint8_t second() const { return ss; } uint8_t dayOfWeek() const; // 32-bit times as seconds since 1/1/2000 long secondstime() const; // 32-bit times as seconds since 1/1/1970 uint32_t unixtime(void) const; protected: uint8_t yOff, m, d, hh, mm, ss; }; // RTC based on the DS1307 chip connected via I2C and the Wire library class RTC_DS1307 { public: static uint8_t begin(void); static void adjust(const DateTime& dt); static void sqw(int sqw); uint8_t isrunning(void); static DateTime now(); }; // RTC using the internal millis() clock, has to be initialized before use // NOTE: this clock won't be correct once the millis() timer rolls over (>49d?) class RTC_Millis { public: static void begin(const DateTime& dt) { adjust(dt); } static void adjust(const DateTime& dt); static DateTime now(); protected: static long offset; }; みなさま、どうかよろしくお願い致します。

  • arduinoで透過形フォトセンサが使えません

    arduinoで透過形フォトセンサを使いたいのですが、何度試しても反応してくれません。お礼はMAXまで出すので誰か教えてください!! プログラミングをいじったりしているもですが、digitalの値で結果を得ることができません。。 analogの値もバラバラで困っています。 なにが間違っているか教えてください。 身近に頼れる人もいなくて本当に困っています。 秋月のCNZ1023を使っています。 http://akizukidenshi.com/download/ds/panasonic/CNZ1023(ON1023).pdf 回路は写真のようなかんじで試しています。 arduino IDEで作っています。 const int d_in_photo = 2; void setup() { pinMode(d_in_photo, INPUT); Serial.begin(9600); } void loop() { int val = digitalRead(d_in_photo); Serial.println(val); delay(10); }

  • Arduino elseで止まりifへ進まない

    Nゲージ、Arduino共に初心者です。 図のようにレールは環状で列車の底にマグネット、レール上にリードスイッチを配置。スケッチは下記を試しました。 int PWMpin1 = 6; //環状レール int PWMpin2 = 5; void setup(){ pinMode(9,INPUT); //リードスイッチ } void loop() { if(digitalRead(9)==HIGH){ //スイッチ感知 //停車 analogWrite(PWMpin1, 0); analogWrite(PWMpin2, 0); delay(4000); } else { analogWrite(PWMpin1, 0); //右回り中速 analogWrite(PWMpin2, 100); delay(5000); //ifが効かなくなる? analogWrite(PWMpin1, 0); //右回り低速 analogWrite(PWMpin2, 40); } } これを試すと減速されずリードスイッチでも停車せず走り続けるだけです。 スケッチの delay(5000); を消すと減速した速度で進みリードスイッチで4秒間停車はします。 スタートしてから5秒後に減速してリードスイッチで4秒停車させたいのですがどうしたら宜しいでしょうか? 減速することが目的ではなく図にはありませんがスタート5秒後にポイントAを切替、リードスイッチに着いたらポイントBを切換えたいと思ってますがその前に上記がわからず困っています。 どなたか宜しくお願いします。

  • arduinoで7セグメントを使いたい

    arduinoで下記のスケッチを使って7セグメントledを動かしているのですが、 /////////////////////////////////////////////////////////////////////////////////////////////////////// //LED表示関数を定義 void NumPrint(int Number){ for (int w=0; w<=7; w++){ digitalWrite(w+1,Num_Array[Number][w]); } } /////////////////////////////////////////////////////////////////////////////////////////////////////// (1)この部分がどのような動作をしているのかわかりません。 (2)また、arduinoMEGAを使用して22~29番ピンを出力にして動かそうとしても上手くいきません。 (1)についての説明と(2)の解決法を知りたいです。 よろしくお願いしますm(._.)m ↓使っているスケッチ(1~8番ピンが出力のもので上手く動作します) void setup(){ //1~8番ピン デジタル出力へセット for (int i=1; i<=8; i++){ pinMode(i,OUTPUT); } } //LEDレイアウトを定義 //0,1,2,3,4,5,6,7,8,9,0,. の順。 boolean Num_Array[11][8]={ {0,0,0,1,0,0,0,1},{1,1,0,1,0,1,1,1},{0,0,1,1,0,0,1,0},{1,0,0,1,0,0,1,0}, {1,1,0,1,0,1,0,0},{1,0,0,1,1,0,0,0},{0,0,0,1,1,0,0,0},{1,1,0,1,0,0,0,1}, {0,0,0,1,0,0,0,0},{1,0,0,1,0,0,0,0},{1,1,1,0,1,1,1,1} }; //LED表示関数を定義 void NumPrint(int Number){ for (int w=0; w<=7; w++){ digitalWrite(w+1,Num_Array[Number][w]); } } void loop(){ for(int t=0;t<=10;t++){ NumPrint(t); delay(500); } }

  • アルディーノのプログラムについて

    アルディーノで現在、スイッチを押すとLEDが点灯し、センサーが、5回反応をするとLEDが消えると言うプログラムを作りました。 このプログラムにセンサーが10秒間一度も反応しなかったら、LEDが消灯すると言うプログラムを追加したいです。ご教授お願いします。 現在のプログラム #define sensor_ON 1 byte sw=2; byte sensor=3; byte led=13; byte val,last_val=!sensor_ON,num; void setup(){ pinMode(sw,INPUT_PULLUP); pinMode(led,OUTPUT); } void loop(){ if(digitalRead(sw)==LOW)digitalWrite(led,HIGH);//スイッチを押したらLED点灯 if(digitalRead(led)==HIGH){//計測状態なら val=digitalRead(sensor); if(val!=sensor_ON && last_val==sensor_ON){//通過(前回検知&今回非検知)なら num++; if(num==5){//5回通過したら digitalWrite(led,LOW);//LEDを消す num=0;//リセット } } last_val=val; } delay(20); }