arduinoのプログラムについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
white255

arduinoのプログラムについて

#1

投稿記事 by white255 » 8年前

Arduinoを利用して工作を始めました。
本を見ながら、LEDが点滅できる様になりました。

やってみたいことは、タイマー動作です。
電源を入れると3分でカウントスタートして、プッシュスイッチを押した時は、1、3分と切り替える様にしたいです。
どちらのモードで動いているのか、わかる様にLEDで表示したい。
タイマー終了30秒前にブザーを鳴らしたい。

よろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: arduinoのプログラムについて

#2

投稿記事 by みけCAT » 8年前

なるほど、目標を持つことはいいことです。
しかし、ここは質問掲示板です。
雑談をする場合は、タイトルの最後に[雑談]と入れてください。
また、ユーザー登録をしてログインしていただけると、日記が書けるようになります。

ここにはあなたのやりたいことは書かれていますが、質問も「条件を満たすコードをくれ」という(あまり歓迎されない)お願いも見当たりません。
質問をする場合は、フォーラムルール、特にそこに書かれている以下のテンプレを参考にするといいでしょう。
[1] 質問文
[1.1] 自分が今行いたい事は何か
[1.2] どのように取り組んだか(プログラムコードがある場合記載)
[1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
[1.4] 今何がわからないのか、知りたいのか

[2] 環境
[2.1] OS : Windows, Linux等々
[2.2] コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々

[3] その他
・どの程度C言語を理解しているか
・ライブラリを使っている場合は何を使っているか
環境はArduinoとありますが、ArduinoにはUNO、MEGAなど多くの種類があります。どれでしょうか?
また、[1] 質問文のうち[1.1]は「タイマー動作」と書かれていますが、それ以外が見当たらないようです。
そのため、自分にとってこの投稿は質問であるとはみなせません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

white255

Re: arduinoのプログラムについて

#3

投稿記事 by white255 » 8年前

プログラムの記載方法がよく理解できていませんが、少しづつ進めて完成を目指しています。
ブザー、ベルはリレーを駆動して鳴らすようにしています。

[1.2] どのように取り組んだか(プログラムコードがある場合記載)

コード:


void setup()
  // put your setup code here, to run once:
{
  pinMode(8, OUTPUT);  // LED1 1分
  pinMode(9, OUTPUT); // LED2 3分
  pinMode(10, OUTPUT); // ブザー
  pinMode(11, OUTPUT); // ベル

  pinMode(2,INPUT); // プッシュスイッチ
  pinMode(3,INPUT); // 予備
  pinMode(4,INPUT); // 予備
  pinMode(5,INPUT);  // 予備
  pinMode(6,INPUT);  // 予備
  
}

void loop()
{
  // put your main code here, to run repeatedly:

if(digitalRead(2)==LOW)
  digitalWrite(8),HIGH);
  digitalWrite(9),LOW);

  delay (30000)
  digitalWrite(10),HIGH);
  delay (1000)
  digitalWrite(10),LOW);
  delay (30000)
  digitalWrite(11),HIGH);
  delay (2)
  digitalWrite(11),LOW);
else 

  digitalWrite(8),LOW); 
  digitalWrite(9),HIGH);
  delay (150000)
  digitalWrite(10),HIGH);
  delay (1000)
  digitalWrite(10),LOW);
  delay (30000)
  digitalWrite(11),HIGH);
  delay (2)
  digitalWrite(11),LOW);

}



タイマーを動作させるにあたり、どのようにプログラムを書けば良いのかわかりません。
delay を使うと処理が止まって、ボタンを押しても反応しない。

タイマー動作がクリア出来して先に進むことができれば、トグルスイッチを追加して、時間を選択できる様にしていきたいです。
スイッチにはプルアップまたは、プルダウン抵抗は必要ですか?

[2] 環境
[2.1] OS : Windows10
[2.2] コンパイラ名 : sketch_nov18a arduion1.7.11

現状はこんな感じです。よろしくお願いします、ご教授ください。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: arduinoのプログラムについて

#4

投稿記事 by みけCAT » 8年前

white255 さんが書きました:タイマーを動作させるにあたり、どのようにプログラムを書けば良いのかわかりません。
delay を使うと処理が止まって、ボタンを押しても反応しない。
millis()で時刻を求め、今の時刻-開始時刻で時間がわかるので、時間が条件を満たしたらアクションを起こすようにプログラムを書けばいいです。
white255 さんが書きました:タイマー動作がクリア出来して先に進むことができれば、トグルスイッチを追加して、時間を選択できる様にしていきたいです。
スイッチにはプルアップまたは、プルダウン抵抗は必要ですか?
Arduinoの機能でプルアップできるので、外部の抵抗は必要ないはずです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

white255

Re: arduinoのプログラムについて

#5

投稿記事 by white255 » 8年前

millis() を使って時間で点滅させる事はできました。
下記のプログラムで設定時間された時間の予告時間前になったら(5秒くらいの出力)をして設定時間まで処理しその後繰り返すには、どのようにすれば出来ますか?
(15秒の設定ならば終了5秒前に予告出力させたいです)
うまく説明出来ずすみません

コード:

long beforetime = 0; 
#define LEDA 13
#define LEDB 12 // 予告用出力
unsigned long time; //設定時間
unsigned long yokoku; //予告時間


void setup() 
{ 
   pinMode(LEDA, OUTPUT);     
   
}                                        

void loop()                            
  {                          
    time = 15000 ; //設定時間
    unsigned long yokoku = 5000; //予告時間
    
    
    if (millis() - beforetime > time) {  
       beforetime = millis();                  
           if (digitalRead(13) == LOW)      
                   digitalWrite(13, HIGH);          
           else
                   digitalWrite(13, LOW);            
  }                                           
                           
} 

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: arduinoのプログラムについて

#6

投稿記事 by みけCAT » 8年前

white255 さんが書きました:下記のプログラムで設定時間された時間の予告時間前になったら(5秒くらいの出力)をして設定時間まで処理しその後繰り返すには、どのようにすれば出来ますか?
予告時間前になったら出力をするように改造すればできるでしょう。
例えばこんな感じで。

コード:

long beforetime = 0;
#define LEDA 13
#define LEDB 12 // 予告用出力
unsigned long time; // 設定時間
unsigned long yokoku; // 予告時間
boolean didYokoku = false;

void setup()
{ 
  pinMode(LEDA, OUTPUT);
  pinMode(LEDB, OUTPUT);

}

void loop()
{
  time = 15000; // 設定時間
  unsigned long yokoku = 5000; // 予告時間

  if (millis() - beforetime > time) {
    beforetime = millis();
    digitalWrite(LEDB, LOW);
    didYokoku = false;
    if (digitalRead(LEDA) == LOW)
      digitalWrite(LEDA, HIGH);
    else
      digitalWrite(LEDA, LOW);
  } else if (!didYokoku && millis() - beforetime > time - yokoku) {
    digitalWrite(LEDB, HIGH);
    didYokoku = true;
  }

} 
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

white255

Re: arduinoのプログラムについて

#7

投稿記事 by white255 » 8年前

みけCAT さん ありがとうございます。

早速試してみました。
時間前に予告出力させる事ができました。
出力を短めにしたくて、以下のように(unsigned long yokoku2; // 予告鳴動時間)追加変更し”delay”を利用しましたが、
もっと適切な方法はあるのでしょうか?
(動作確認のためにシリアルで出力し確認しています)

コード:


long beforetime = 0;
#define LEDA 13
#define LEDB 12 // 予告用出力
#define BL 10
unsigned long time; // 設定時間
unsigned long yokoku; // 予告時間
unsigned long yokoku2; // 予告鳴動時間
boolean didYokoku = false;
 
void setup()
{ 
  pinMode(LEDA, OUTPUT);
  pinMode(LEDB, OUTPUT);
  Serial.begin(9600);
}
 
void loop()
{
  time = 15000; // 設定時間
  yokoku2 = 1500; // 設定時間
  unsigned long yokoku = 5000; // 予告時間
 
  if (millis() - beforetime > time) {
    beforetime = millis();
    digitalWrite(LEDB, LOW);
    didYokoku = false;
    if (digitalRead(LEDA) == LOW)
      digitalWrite(LEDA, HIGH);
    else
      digitalWrite(LEDA, LOW);
      Serial.println("BELL ON"); //digitalWrite(BL, HIGH);
      delay(yokoku2);
      Serial.println("BELL OFF"); //digitalWrite(BL, OFF);
  } else if (!didYokoku && millis() - beforetime > time - yokoku) {
    digitalWrite(LEDB, HIGH);
    Serial.println("BZ ON"); //digitalWrite(BZ, HIGH);
    delay(yokoku2);
    digitalWrite(LEDB, LOW);
    Serial.println("BZ OFF"); //digitalWrite(BZ, OFF);
    didYokoku = true;
  }
 
}

white255

Re: arduinoのプログラムについて

#8

投稿記事 by white255 » 8年前

IF文について、下記のように記載しているのですが、うまく動作しません。

LEDA,LEDBは同時に出力(点灯)しないように、記載しているつもりですが同時に出力されます
コンパイルエラーが出たのでIFの部分に”[” ”]”を追加して回避したのですが...

前回のdelayの部分はforを使ってみました。
数日間わからないなりに試行錯誤しましたが、解決できません。ご教授をおねがいします。

コード:


/*
起動時は自動でBOX時間を開始し時間経過後にINT時間に移行する、この動作を繰り返す。
予告時間にはブザーを設定時間鳴動
各時間終了時にはベルを設定時間鳴動
スイッチにより、時間を選択。

*/


long beforetime = 0;

#define LEDA 12 //BOX LED
#define LEDB 11 //INT LED

#define BUTTONBOX 5 //BOX TIME 120  or 180(秒)
#define BUTTONINT 6 //INT TIME 30 or 60(秒)
#define BUTTONRUSHA 7 //RUSH  15秒前に予告ベルを鳴らす
#define BUTTONRUSHB 8 //RUSH  30秒前に予告ベルを鳴らす
#define BUTTON 2 //START RESET

#define BZ 9 //予告ブザー
#define BL 10 //終了ベル

volatile int state=LOW; // 動作セレクタ LOW=INT Time

unsigned long time; // 設定時間
unsigned long yokoku; // 予告時間
unsigned long yokoku2; // 予告鳴動時間
boolean didYokoku = false;

unsigned long i;
 
void setup()
{ 
pinMode(LEDA, OUTPUT); //BOX LED
pinMode(LEDB, OUTPUT); //INT LED
  
pinMode(BUTTONBOX, INPUT_PULLUP); //BOX TIME 120  or 180(トグルスイッチ
pinMode(BUTTONINT, INPUT_PULLUP); //INT TIME 30 or 60(トグルスイッチ)
pinMode(BUTTONRUSHA,INPUT_PULLUP); //RUSH  15(トグルスイッチ)
pinMode(BUTTONRUSHB,INPUT_PULLUP); //RUSH  30(トグルスイッチ)
pinMode(BUTTON,INPUT_PULLUP); //START RESET(プッシュスイッチ)

pinMode(BZ,OUTPUT); //予告用ブザー
pinMode(BL,OUTPUT); //  終了ベル
  
  attachInterrupt(0,kirikae,FALLING);  //プッシュスイッチでのINT,BOX時間設定切り替え
  
  Serial.begin(9600);
    time = 18000; // 設定時間 テスト用の仮設定
  yokoku2 = 150; // 設定時間
 yokoku = 5000; // 予告時間
 digitalWrite(LEDA, HIGH);
 
}
 
void loop()
{
  
  
running()              ;  // サブルーチンを呼び出す
 
}
 
 
void running()
{
/*  TEST
  Serial.println("-----");
  Serial.println(time);
  Serial.println(yokoku);
  Serial.println(digitalRead(BUTTONBOX));
  Serial.println(digitalRead(BUTTONINT));
  Serial.println(digitalRead(BUTTONRUSHA)); 
  Serial.println(digitalRead(BUTTONRUSHB));
  Serial.println("-----");
delay (1000);
*/
  
  if (millis() - beforetime > time) {
    beforetime = millis();
    digitalWrite(BL, LOW);
    didYokoku = false;
    if (digitalRead(LEDA) == LOW){
    digitalWrite(LEDB, LOW);
      digitalWrite(LEDA, HIGH);
      Serial.println("BELL ON-box");}
    else
      {digitalWrite(LEDA, LOW);
      digitalWrite(LEDB, HIGH);
      Serial.println("BELL ON-int");} //digitalWrite(BL, HIGH);
      
      
      
    {
  for (int i=0; i<yokoku2; i++){ 
    
    delay(1);     //待つ。
    
  }//For 文の終わりの位置。
   delay(1); //待つ。
}  
      
      //delay(yokoku2);
      Serial.println("BELL OFF"); 
  } else if (!didYokoku && millis() - beforetime > time - yokoku) {
    digitalWrite(BL, HIGH);
    Serial.println("BZ ON"); 
  
    
  
    

{
  for (int i=0; i<yokoku2; i++){ 
    
    
    delay(1);     
   
  }
   delay(1); 
}
       
    
    digitalWrite(BL, LOW);
    Serial.println("BZ OFF"); //digitalWrite(BZ, OFF);
    didYokoku = true;
  }
 


}

  


void kirikae(){
  
  if(state==LOW){
  state=HIGH;
   
     if (digitalRead(BUTTONBOX) == HIGH) {     
          time = 18000;   //digitalWrite(13,HIGH) ;      
     } else {
          time = 12000;    //digitalWrite(13,LOW) ;       
     }

     if (digitalRead(BUTTONINT) == HIGH) {     
          yokoku = 3000;//digitalWrite(13,HIGH) ;      
     } else {
         yokoku = 0;// digitalWrite(13,LOW) ;       
     }
     
    if (digitalRead(BUTTONRUSHA) == HIGH) {     
          yokoku = 15000;//digitalWrite(13,HIGH) ;      
     } else {
         yokoku = 0;// digitalWrite(13,LOW) ;       
     }
     

delay(100);
}


else{
  state=LOW;
  
     if (digitalRead(BUTTONBOX) == HIGH) {     
          time = 60000;   //digitalWrite(13,HIGH) ;     
     } else {
          time = 30000;    //digitalWrite(13,LOW) ;       
     }

     if (digitalRead(BUTTONINT) == HIGH) {     
          yokoku = 3000;//digitalWrite(13,HIGH) ;      
     } else {
         yokoku = 0;// digitalWrite(13,LOW) ;       
     }
     
    if (digitalRead(BUTTONRUSHB) == HIGH) {     
          yokoku = 1500;//digitalWrite(13,HIGH) ;      
     } else {
         yokoku = 0;// digitalWrite(13,LOW) ;       
     }
     
 
delay(100);  
 }

 Serial.println("切り替えました");
 // Serial.println(state);
 // Serial.println(yokoku);
 // Serial.println(time);
 
 //digitalWrite(LEDA, HIGH);
 //digitalWrite(LEDB, HIGH);
 //digitalWrite(BZ, HIGH);
 //digitalWrite(BL, HIGH);
  
delay(1000);
}




アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: arduinoのプログラムについて

#9

投稿記事 by みけCAT » 8年前

まずはインデントをきれいに整えることをおすすめします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: arduinoのプログラムについて

#10

投稿記事 by みけCAT » 8年前

white255 さんが書きました:LEDA,LEDBは同時に出力(点灯)しないように、記載しているつもりですが同時に出力されます
手元のArduino UNOで動かしてみましたが、再現できませんでした。
どのような操作をしたらそうなりましたか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

white255

Re: arduinoのプログラムについて

#11

投稿記事 by white255 » 8年前

みけCAT さんが書きました:
white255 さんが書きました:LEDA,LEDBは同時に出力(点灯)しないように、記載しているつもりですが同時に出力されます
手元のArduino UNOで動かしてみましたが、再現できませんでした。
どのような操作をしたらそうなりましたか?
みけCATさん、動作確認ありがとうございます。

正常とのことで、私も再度確認をしました。
調べた所リレーボードが壊れていることが分かりました、LEDAの入力一度があるとそのままONとなっていました。
電圧等の確認をせず、プログラムの不具合だとばかり考えて対処しようとしたところが失敗でした。
申し訳ありませんでした。

まだまだ、考慮しないといけない部分があり、割り込みの部分でチャタリングしてしまいます。
delayをいろいろ入れてみましたが、良い結果は得られません。
うまく切り替わらないです。
どのようにすれば良いでしょうか?

”attachInterrupt(0,kirikae,FALLING); //プッシュスイッチでのINT,BOX時間設定切り替え”

本来ならば、スイッチを押した時に時間をリセットして切り替えをしたいのですが、現状は
設定時間だけ変えています。

ご教授をおねがいします。

閉鎖

“C言語何でも質問掲示板” へ戻る