• 締切済み

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

お世話になります。 スケッチで質問が有ります。 これだと、1個のピンしか見ていないと思うのですが、複数のピンもしくは全部のピンをチェックして変化があるか判断したいのです。 void loop() { DateTime now = RTC.now(); val = digitalRead(); if(val != old_val) { よろしくお願い致します。

みんなの回答

  • 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; 修正して結果報告させていただきます。 本当にありがとうございます。

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

>void loop()内の >for(i=0;i<DPINMAX;i++) { >ここで >error: expected unqualified-id before 'for' >error: expected constructor, destructor, or type conversion before '<' token >error: expected constructor, destructor, or type conversion before '++' token >この3種類のエラーが発生します。 変数iが宣言されていません。 ってことで適当な場所で宣言してください。 というか…掲示されたコードだとloop()の中身は >DateTime now = RTC.now(); だけですが、よろしいので? >for(i=0;i<(sizeof(old_val)/sizeof(int));i++) { >dataFile.print(old_val[0]); >if((i % 4) == 0) >dataFile.print(" "); >dataFile.print(); /* 最後に改行追加 */ >dataFile.close(); >} 「{」と「}」の対応は意図したとおりになっていますか? 今の状態だと、i=1の時の dataFile.print(old_val[0]); で死ぬかも知れませんけど。 クローズされていますからね。 あと、[0]だとD0ピンの状態「しか」書き込まれませんよ。 スケッチがどうとかより、C言語としてもおかしな状態になっているので注意してください。 # C言語の基礎、できていますか?

dt50ax1vt250
質問者

お礼

ありがとうございます。 >スケッチがどうとかより、C言語としてもおかしな状態になっているので注意してください。 ># C言語の基礎、できていますか? 申し訳ありません。基礎から勉強していますが、まだまだ出来ていません。 いろいろ、いじくっているうちに「わけがわからなく」なってしまいました。 「{」と「}」も意図した通りにはなっていません。 変数iの宣言は old_val = [i]; こんな感じでしょうか? >というか…掲示されたコードだとloop()の中身は >>DateTime now = RTC.now(); >だけですが、よろしいので? File dataFile = SD.open("datalog.txt", FILE_WRITE); これが、要らないのでしょうか・・・ 前回、おしえていただいた for(i=0;i<(sizeof(old_val)/sizeof(int));i++) {  dataFile.print(old_val[i]);  if((i % 4) == 0)   dataFile.print(" "); これは、書き込むフォーム(形)と認識していますが、合っていますでしょうか。 それと ChgFlag = 0; /* 変化あったか確認するためのフラグをクリア */ for(i=0;i<DPINMAX;i++) {  val = digitalRead(DigitalPins[i]);  if(val != old_val[i]) {   ChgFlag = 1; /* 前回から変化あったよ~ん */   old_val[i] = val; /* 今回の値に更新しまちゅ */  } } if(ChgFlag != 0) {  /* 変化あったらからSDに書き出すよ~ */ } このスケッチは変化が有った時に状態を書き込むスケッチと認識していますが如何でしょう。 今、抱えているエラーは 1・変数 i の宣言 2・ ChgFlag = 0;/* 変化あったか確認するためのフラグをクリア */ ここで宣言していないようなエラーが発生します。 error: 'ChgFlag' was not declared in this scope 3・「{」と「}」の対応(場所) です。 もっともっと勉強します。 本当に、ありがとうございました。

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

>int DigitalPins[DPINMAX] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 14, 15, 16, 17, 18, 19}; >で、analogpinsを無くしてしまっても良いのでしょうか。 OKと思われます。 ただ、 >アナログピンをデジタルに変更する場合、14~19を使うと書いて有ったので変更してみました。 A0やA1でもOKっぽいです。 >SDカードに変化が有った時にこのデータを記録していきたいのです。 >2014/09/19 20:18:10 0000 0000 0100 0000 0000 ならば、println()使うのは間違っていますよね? 改行込みの出力になりますし。 >スペースをいれて4ピン分のブロックを4個出来るようになっています。 for(i=0;i<(sizeof(old_val)/sizeof(int));i++) {  dataFile.print(old_val[i]);  if((i % 4) == 0)   dataFile.print(" "); } dataFile.println(); /* 最後に改行追加 */ って感じで回せばよいかと。 # まぁこれだと…"0 0000 0000"みたいになるので… # (i % 4) == 3 かな? dataFile.print(old_val[i]); で"0"か"1"になる…という保証もない…のかなぁ。 まぁその辺りは実際にやってみてくださいな。 ダメだったら…… dataFile.print(old_val[i]); を if(old_val[i] == LOW) {  dataFile.print("0"); } else {  dataFile.print("1"); } とか。 三項演算子使って、 dataFile.print((old_val[i] == LOW) ? "0" : "1"); とかも行けるかな? >今回のNo.1のスケッチ内に >if(val != old_val[0]) { >  /* 前回から変化あったら */ >  old_val[0] = val; /* 今回の値に更新する */ >が、有りましたがこれは「変化が有った時」ではないのでしょうか。 「変化があったときにold_valの該当の箇所を書き換える」だけです。 ChgFlag = 0; /* 変化あったか確認するためのフラグをクリア */ for(i=0;i<DPINMAX;i++) {  val = digitalRead(DigitalPins[i]);  if(val != old_val[i]) {   ChgFlag = 1; /* 前回から変化あったよ~ん */   old_val[i] = val; /* 今回の値に更新しまちゅ */  } } if(ChgFlag != 0) {  /* 変化あったらからSDに書き出すよ~ */ } みたいに処理してください。

dt50ax1vt250
質問者

お礼

ご丁寧にありがとうございます。 SDに書き込みの所で質問ですが dataFile.print(0); dataFile.print(1); dataFile.print(2); dataFile.print(3);     :     : このブロックのスケッチを消してしまいましたが大丈夫でしょうか 何度も読み直して、訂正に訂正して1か所だけのエラーになりました。 void loop()内の for(i=0;i<DPINMAX;i++) { ここで error: expected unqualified-id before 'for' error: expected constructor, destructor, or type conversion before '<' token error: expected constructor, destructor, or type conversion before '++' token この3種類のエラーが発生します。 全体を張り付けるので、見て戴けることは可能でしょうか。 よろしくお願い致します。 #include <SPI.h> #include <SD.h> #include <Wire.h> #include <RTClib.h> // Credit: Adafruit RTC_DS1307 RTC; #define DPINMAX 16 int DigitalPins [DPINMAX] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 14, 15, 16, 17, 18, 19}; int val = 0; // 入力ピンの状態がこの変数(val)に記憶される int old_val = 0; // valの前の値を保存しておく変数 const int chipSelect = 10; void setup(){ // see if the card is present and can be initialized: if (!SD.begin(10, 11, 12, 13)) {//データロガーシールド用スケッチ Serial.println("Card failed, or not present"); // don't do anything more: return; } Serial.println("card initialized."); Serial.begin(9600); // Open serial communications and wait for port to open: // Instantiate the RTC Wire.begin(); RTC.begin(); // Check if the RTC is running. if (! RTC.isrunning()) { Serial.println("RTC is NOT running"); } // This section grabs the current datetime and compares it to // the compilation time. If necessary, the RTC is updated. DateTime now = RTC.now(); DateTime compiled = DateTime(__DATE__, __TIME__); if (now.unixtime() < compiled.unixtime()) { Serial.println("RTC is older than compile time! Updating"); RTC.adjust(DateTime(__DATE__, __TIME__)); } Serial.println("Setup complete."); } void loop() {DateTime now = RTC.now(); } File dataFile = SD.open("datalog.txt", FILE_WRITE); for(i=0;i<DPINMAX;i++) { val = digitalRead(DigitalPins[i]); if(val != old_val[0]) { ChgFlag = 1; /* 前回から変化あったよ */ old_val[0] = val; /* 今回の値に更新 */ } if(ChgFlag != 0) /* 変化あったらからSDに書き出すよ */ } for(i=0;i<(sizeof(old_val)/sizeof(int));i++) { dataFile.print(old_val[0]); if((i % 4) == 0) dataFile.print(" "); dataFile.print(); /* 最後に改行追加 */ dataFile.close(); }

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

>質問ですがanalogpinをDigitalに変更する事も可能なのでしょうか。 意図が不明です。 Analogピンに対して、digitalRead()が使えるのか? ということですか? http://arduino.cc/en/pmwiki.php?n=Reference/digitalRead に >The analog input pins can be used as digital pins, referred to as A0, A1, etc. と書かれていますが…。 >ただ、setup()内のold_val[]が良くわかりません。setupの中にold_valを入れるのでしょうか。 >理解できず申し訳ありません。 値が設定されていない(不定)から、setup()内でold_val[]に初期値として代入してください。 ってコトです。 # アナログのスペル間違っていたので修正すると… /* loop()に入る前に以前の値として現在の状況をセットするぜぇ */ for(i=0;i<DPINMAX;i++) {  old_val[i] = digitalRead(DigitalPins[i]); } for(i=0;i<APINMAX;i++) {  old_val[DPINMAX+i] = analogRead(AnalogPins[i]): } みたいな感じですね。 まぁ、普通のC言語ならグローバル変数は全Bitが0になっていた…はずですが、Arduinoでもそうなるのかは不明…ですしねぇ。 >dataFile.println(DigitalPins 0); >dataFile.println(DigitalPins 1); この書き方って通りましたか??? DigitalPinsとだけ書くと、DigitalPins[]の先頭要素のアドレス…になるかと思われますが……。 とりあえず、old_val[]に現在の状態が入っている…ハズですけど……。 # あと、上記の書き方だと区切りがなくてファイルを見た時に読みづらいんじゃないですか? # 特にアナログピンの値の出力とか。2364とか出力されていたとして区切りはどこになります? さらに、「変化があったときに記録」ではなく「常に記録」なので、ちょっと悲惨なことになりそうですけど…。 >old_val = val; ここでもエラーになりそうですねぇ…。

dt50ax1vt250
質問者

お礼

ありがとうございます。 >Analogピンに対して、digitalRead()が使えるのか? 説明不足スミマセン その通りです、アナログだと0か1023になるのですがデジタル表示で0か1に指定したいのです。 アナログピンをデジタルに変更する場合、14~19を使うと書いて有ったので変更してみました。 この場合 元 int analogpins[APINMAX] = {0, 1, 2, 3, 4, 5}; 変更後  int analogpins[APINMAX] = {14, 15, 16, 17, 18, 19}; にしましたが、 int DigitalPins[DPINMAX] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 14, 15, 16, 17, 18, 19}; で、analogpinsを無くしてしまっても良いのでしょうか。 そうすると下の方のスケッチも変わってくると思うのですが。 old_valはいろんなスケッチを見ますが、0がほとんどです。 入力します。 >dataFile.println(DigitalPins 0); >dataFile.println(DigitalPins 1); エラーリストを確認するとエラーになっています。数字だけにしてみました。 スペースをいれて4ピン分のブロックを4個出来るようになっています。 dataFile.println(" ");//スペースを入れてあります。 SDカードに変化が有った時にこのデータを記録していきたいのです。 2014/09/19 20:18:10 0000 0000 0100 0000 0000 「常に記録」ではなく「変化があったときに記録」にしたいのですが。 今回のNo.1のスケッチ内に if(val != old_val[0]) {   /* 前回から変化あったら */   old_val[0] = val; /* 今回の値に更新する */ が、有りましたがこれは「変化が有った時」ではないのでしょうか。 もしくは if((val == HIGH) && (old_val== LOW)) これが、必要になるのですか。 質問ばかりで申し訳ありません。 本当にありがとうございます。

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

配列って知ってますかね? #define DPINMAX 14 #define APINMAX 6 int DigitalPins[DPINMAX] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; int AnaloguePins[APINMAX] = {0, 1, 2, 3, 4, 5}; int old_val[DPINMAX+APINMAX]; setup()内でold_val[]は適当(適切)に初期値入れてください。 # そこら辺は以前回答したと思いますが。 こっから実際の取得。 for(i=0;i<DPINMAX;i++) {  val = digitalRead(DigitalPins[i]);  if(val != old_val[i]) {   /* 前回から変化あったです */   old_val[i] = val; /* 今回の値に更新しまちゅ */  } } for(i=0;i<APINMAX;i++) {  val = analogRead(AnaloguePins[i]):  if(val != old_val[DPINMAX+i]) {   /* 前回から変化あったみたいでしゅ */   old_val[DPINMAX+i] = val; /* 今回の値に更新するなり */  } } こんな感じですかね。 ただし、各ピンが他の用途に使用されていたら動作は保証しかねますが。 RTCつないでいるピンに対してdigitalRead()やanalogRead()しちゃって問題ないのか? とか、そういうところは。 # 読み込みだけなら平気なんかなぁ…わからんけど。

dt50ax1vt250
質問者

お礼

Wr5様 おせわになっております。 お礼、遅くなり申し訳ありませんでした。 「配列」大まかな流れは理解していますが、確実に理解はしていないです。 何度も参考書を読んだりやインターネットで調べて勉強しています。 現在「Leonardo」+「Adafruit Data Logger Shield」を使っています。 この組み合わせだと専用のSD.hが必要になりデジタルピンの10, 11, 12, 13がSDカードで使用するそうです。 その他のピンはまだ検証中で分かりません。 とりあえずMAXでは有りませんがスケッチを下記のように変更してみましたがいかがでしょう。 int DigitalPins[DPINMAX] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 質問ですがanalogpinをDigitalに変更する事も可能なのでしょうか。 Wr5様の教えていただいたスケッチを組み合わせてみました。 ただ、setup()内のold_val[]が良くわかりません。setupの中にold_valを入れるのでしょうか。 理解できず申し訳ありません。 反則かも知れませんが現時点でのスケッチを張り付けてみました。 本当にありがとうございました。 #include <SPI.h> #include <SD.h> #include <Wire.h> #include <RTClib.h> // Credit: Adafruit RTC_DS1307 RTC; #define DPINMAX 10 #define APINMAX 6 int DigitalPins[DPINMAX] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int analogpins[APINMAX] = {0, 1, 2, 3, 4, 5}; int old_val[DPINMAX+APINMAX]; const int chipSelect = 10; void setup(){ // see if the card is present and can be initialized: if (!SD.begin(10, 11, 12, 13)) {//データロガーシールド用スケッチ Serial.println("Card failed, or not present"); // don't do anything more: return; } Serial.println("card initialized."); { // Open serial communications and wait for port to open: Serial.begin(9600); // Instantiate the RTC Wire.begin(); RTC.begin(); // Check if the RTC is running. if (! RTC.isrunning()) { Serial.println("RTC is NOT running"); } // This section grabs the current datetime and compares it to // the compilation time. If necessary, the RTC is updated. DateTime now = RTC.now(); DateTime compiled = DateTime(__DATE__, __TIME__); if (now.unixtime() < compiled.unixtime()) { Serial.println("RTC is older than compile time! Updating"); RTC.adjust(DateTime(__DATE__, __TIME__)); } Serial.println("Setup complete."); } } void loop() { DateTime now = RTC.now(); for(i=0;i<DPINMAX;i++) {  val = digitalRead(DigitalPins[i]);  if(val != old_val[i]) {   /* 前回から変化あったら */   old_val[i] = val; /* 今回の値に更新する */  } } for(i=0;i<APINMAX;i++) {  val = analogRead(AnalogPins[i]):  if(val != old_val[DPINMAX+i]) {   /* 前回から変化あったら */   old_val[DPINMAX+i] = val; /* 今回の値に更新する */  } } { File dataFile = SD.open("datalog.txt", FILE_WRITE); dataFile.print(" "); dataFile.println(now.year); dataFile.println("/"); dataFile.println(now.month); dataFile.println("/"); dataFile.println(now.day); dataFile.print(" "); dataFile.println(now.hour); dataFile.println(":"); dataFile.println(now.minute); dataFile.println(":"); dataFile.println(now.second); dataFile.println(" "); dataFile.println(DigitalPins 0); dataFile.println(DigitalPins 1); dataFile.println(DigitalPins 2); dataFile.println(DigitalPins 3); dataFile.println(" "); dataFile.println(DigitalPins 4); dataFile.println(DigitalPins 5); dataFile.println(DigitalPins 6); dataFile.println(DigitalPins 7); dataFile.println(" "); dataFile.println(DigitalPins 8); dataFile.println(DigitalPins 9); dataFile.println(AnaloguePins 0); dataFile.println(AnaloguePins 1); dataFile.println(" "); dataFile.println(AnaloguePins 2); dataFile.println(AnaloguePins 3); dataFile.println(AnaloguePins 4); dataFile.println(AnaloguePins 5); dataFile.close(); old_val = val; } }

関連する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); }

専門家に質問してみよう