いそぷろのブログ

おもしろいことを考えていきたい

【Arduino電子工作】スイッチでサーボの回転方向を変える

目的

スイッチが押された瞬間にサーボの回転方向を変える

 

今回使うもの

過去記事と同じ

www.isopro91.com

 

設計・計算

サーボの回路は過去記事と同じ

タクトスイッチの回路は下記記事と同じ

www.isopro91.com

 

回路

実際の回路と、fritzingで描いたブレッドボード図と回路図

【Arduino電子工作】スイッチでサーボの回転方向を変える

【Arduino電子工作】スイッチでサーボの回転方向を変える

【Arduino電子工作】スイッチでサーボの回転方向を変える

 

プログラム

/*
目的:タクトスイッチが押された瞬間に回転方向を変えるサーボプログラム
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文で利用したかったために、このような処理をおこないました

 

実際の動作

 

おわり