【Arduino電子工作】スイッチでサーボの回転方向を変える
目的
スイッチが押された瞬間にサーボの回転方向を変える
今回使うもの
過去記事と同じ
設計・計算
サーボの回路は過去記事と同じ
タクトスイッチの回路は下記記事と同じ
回路
実際の回路と、fritzingで描いたブレッドボード図と回路図
プログラム
/*
目的:タクトスイッチが押された瞬間に回転方向を変えるサーボプログラム
http://www.isopro91.com
2015/6/4
*/
#include<Servo.h>
Servo servo1;
int sw1 = 7;
int flag = 0;
int val = 90;
void setup() {
pinMode(sw1, INPUT);
servo1.attach(4);
servo1.write(val); //最初のsetupで角度を90度にしておく
delay(100);
}
void loop() {
flag = digitalRead(sw1); //スイッチの状態を読む 押される=0 押されない=1
if(flag==1){ //先に押されていない場合の処理を書いておく
for(val=val; val<=180; val++){
servo1.write(val);
delay(10);
flag = digitalRead(sw1);
if(flag==0)break; //ループの途中でスイッチが押されたらこのループを中断する
}
//0度まで角度を戻すループ
for(val=val; val>=0; val--){
servo1.write(val);
delay(10);
}
}
}
プログラムのポイント
今回のポイントは
- if文でループの中断をする
- for文の初期化でint i=0;ではなくグローバル変数のvalを使用
の2点です
まず最初のループの中断
if(flag==0)break;
(ちなみに、if文は一行で書ける場合は{}は省略できます)
スイッチが押された場合 flagには0が入るようにしてあります
そのためスイッチが押されたときif文内の処理を行います
breakはfor文などのループを中断し抜け出す際に使用します
つまり今回の場合、for文で角度変更している間にスイッチが押された場合、そのループを抜け出す
といった処理になります
次にfor文の初期化について
通常for文でよく使われる書き方は以下の感じ
for(int i=0; i<100; i++){
}
言葉にすれば
for(初期化; 条件式; 加算){
}
となります
for文で宣言した変数はそのループ内でしか使えません
今回は二つのfor文を書き、それぞれ共通した変数を使いたかったため、グローバル変数として宣言しているvalを使用しました
for(val=val; val<=180; val++){
}
ちなみにグローバル変数とはvoid setup(){}以前に宣言している変数のことです
これらはプログラム内どこでも使える変数です
一つ目のfor文で角度変更がどこで終わるのか不明です(スイッチを押された時点でループから抜け出すため)
終った時点のvalの数値(その時のサーボの角度)を次のfor文で利用したかったために、このような処理をおこないました
実際の動作
おわり