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

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

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

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

Q&A

2回答

1908閲覧

arduino 保持 プログラムについて

swxpiz

総合スコア6

Arduino

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

0グッド

0クリップ

投稿2018/04/20 14:42

arduinoに関する質問です

リレー1はモーターのオンオフ、
リレー2はモーターの正転を制御しているスイッチです。

1.右方向に移動
2.右端のリミットスイッチに当たると、一旦停止(2秒)、その後左に移動
3.左方向に移動
4.左側のリミットスイッチに当たると、一旦停止(2秒)、その後左に移動
を繰り返すようなプログラムを作りたいです。

いまのところ、押すと正逆を繰り返すプログラムはできたのですが、
押した後一旦停止して、と言うものが何故かできません、
stateが切り替わった後で一旦停止してあげても良いのですが、これをやるとおそらくこのdelayが何度も繰り返され続けてしまい、正確にスイッチを監視し続けることができないようです。

この場合、どのようにすればイメージ通りの動作ができるでしょうか。
今のところ作ったスケッチは以下のとおりです。
アドバイスお願いします…!

int val = 0;
int val2 = 0;
int state = 0;

int RELAY1 = 11;
int RELAY2 = 10;
int RELAY3 = 9;
int RELAY4 = 8;
int SW1 = 13;
int SW2 = 12;
//3端子スイッチのコモン端子をピンに接続。ほかはそれぞれgndとvccに接続

void setup() {
pinMode(RELAY1, OUTPUT);//オンオフ1
pinMode(RELAY2, OUTPUT);//正逆1
pinMode(SW1, INPUT);
pinMode(SW2, INPUT);
}

void loop() {
val = digitalRead(SW1);
val2 = digitalRead(SW2);
if ((val == HIGH) && (state == 0)) { //SW1が高い値を取ったら
state = 1 - state ;
}
if ((val2 == HIGH) && (state == 1)) {//SW2が高い値を取ったら
state = 1 - state ;
}

if (state == 1) {
digitalWrite(RELAY1, LOW);
delay(2000);
digitalWrite(RELAY1, HIGH);
digitalWrite(RELAY2, HIGH);

} else {
digitalWrite(RELAY1, LOW);
delay(2000);

digitalWrite(RELAY1, HIGH);
digitalWrite(RELAY2, HIGH);
}
}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

スイッチ入力のレベルを見て動作を切り替えてますが、レベルだけではいろいろとややこしくなってしまいます

ここは、考えを改めて、スイッチ入力がOFFからONになったときだけ、動作の切り替えを行うようにします
逆に言えば、スイッチ入力が変化しない間はなにもしないってことですねー

また、スイッチ入力はチャタリング対策が必要となりますね

投稿2018/04/20 22:20

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

1.右方向に移動

2.右端のリミットスイッチに当たると、一旦停止(2秒)、その後左に移動
3.左方向に移動
4.左側のリミットスイッチに当たると、一旦停止(2秒)、その後左に移動
を繰り返すようなプログラムを作りたいです。

恐らく

4.左側のリミットスイッチに当たると、一旦停止(2秒)、その後左に移動

は右側に移動の間違いかと。(他にも色々と間違いと無駄な表記が有りますのでシンプルに)
では実際に簡単なプログラムでは。

arduino

1#define RELAY1 11 2#define RELAY2 10 3#define SW1 13 4#define SW2 12 5 6void setup(){ 7 pinMode(RELAY1,OUTPUT); 8 digitalWrite(RELAY1,LOW); 9 pinMode(RELAY2,OUTPUT); 10 digitalWrite(RELAY2,LOW); 11 12 pinMode(SW1,INPUT); 13 pinMode(SW2,INPUT); 14} 15 16void loop(){ 17 if(digitalRead(SW1)) // 恐らく右左のどちらかだけど動作次第で入れ替える 18 { 19 digitalWrite(RELAY2,LOW); // 正逆の方向 20 digitalWrite(RELAY1,LOW); 21 sleep(2000); 22 digitalWrite(RELAY1,HIGH); // 動作開始 23 sleep(5); // リミットスイッチが離れるインターバルとして 24  } 25 if(digitalRead(SW2)) 26 { 27 digitalWrite(RELAY2,HIGH); // 正逆の方向 28 digitalWrite(RELAY1,LOW); 29 sleep(2000); 30 digitalWrite(RELAY1,HIGH); // 動作開始 31 sleep(5); // リミットスイッチが離れるインターバルとして 32 } 33}

これで一応動作するかと。

投稿2018/04/21 02:39

MasahikoHirata

総合スコア3747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問