PASのブログ

PASの中の人が書く雑記ブログです。

アナマル④ スイッチを使おう②

全く知識ゼロの方が対象ですので、かんたんに基礎から説明しています。 なので全然進まないですが、モチベーションを維持して完成まで持っていきます。

では前回の続き。

const int SW1 = A4;

void setup() {
  pinMode(LED_BUILTIN, OUTPUT); //LEDはとりあえず基板上のものを設定。
  pinMode(SW1,INPUT_PULLUP);//A4をデジタルポート入力でプルアップ。
}

void loop() {
 if(!digitalRead(SW1))//もしSW1がHIGHではないなら
  {
   digitalWrite(LED_BUILTIN, HIGH);   // LEDへの信号をHIGH(点灯)
  }
  else
  digitalWrite(LED_BUILTIN, LOW);    // LEDへの信号をLOW(消灯)
}

void setup() の中身

void setup() {
  pinMode(LED_BUILTIN, OUTPUT); //LEDはとりあえず基板上のものを設定。
  pinMode(SW1,INPUT_PULLUP);//A4をデジタルポート入力でプルアップ。
}

1行目は前回と同じです。基板のLEDをOUTPUTに設定しました。
2行目ですが pinMode(SW1,INPUT_PULLUP);
SW1をINPUT_PULLUPに設定しました。

INPUT_PULLUPとは

INPUT_PULLUPとは、INPUTに設定して、プルアップしなさい、という命令です。

実際に繋いだものを回路図として書くとこうなります。 f:id:pas_fx:20200603211409p:plain

スイッチがONになると、マイコンのピンがグランドと接続され、値は「0」になりますが、OFFにした場合はどうでしょうか? どこともつながっていないので、0でも1でもなくなります。 そこで、確実にスイッチOFFの時にHIGHにするために、こうやります。 f:id:pas_fx:20200603212016p:plain
こうやると、スイッチOFFのときは電源と繋がりますので必ずHIGHつまり「1」になります。 物理的に抵抗でこのように接続しても良いのですが、Arduinoでは、INPUT_PULLUPと設定することでプルアップされるわけです。

void loop()の中身

void loop() {
 if(!digitalRead(SW1))//もしSW1がHIGHではないなら
  {
   digitalWrite(LED_BUILTIN, HIGH);   // LEDへの信号をHIGH(点灯)
  }
  else
  digitalWrite(LED_BUILTIN, LOW);    // LEDへの信号をLOW(消灯)
}

digitalWrite(LED_BUILTIN, LOW);は前回使ったので省略。

digitalRead

[digitalRead](http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2075)(pin)は、指定したピンの値を読み取ります。結果は0か1ですね。 今回はSW1の値を読み取っています。

!というのは否定演算子です。 演算子についてはまとまっているサイトを発見したので貼っておきます。

http://wisdom.sakura.ne.jp/programming/perl/perldata1.html

if、elseの使い方
if(ここの条件を満たしたら)
{
ここの命令を処理しなさい
}

です。 if

は最も使う命令と言ってもよいかと思います。覚えておきましょう。

elseは、ifとセットで使います。ifで提示した条件をたさないときは個々の命令を実行しろ、です。

では次にオルタネート動作をさせたい。

前回までのスケッチはモーメンタリ動作でしたので、実際にエフェクターに使うためにはオルタネート動作をさせたいですね。

では早速書いていきます。

状態を保存してオルタネイトにチャレンジ

//SW2
//stateを使って状態保存

const int SW1 = A4;
int state = 0; //スイッチの状態を保存

void setup() {
  pinMode(LED_BUILTIN, OUTPUT); //LEDはとりあえず基板上のものを設定。
  pinMode(SW1,INPUT_PULLUP);//A4をデジタルポート入力でプルアップ。
  
}

void loop() {
  if(!digitalRead(SW1))//もしSW1がHIGHではないなら
    {
      state = 1 - state;
    }

  if(state == 1)
  {
   digitalWrite(LED_BUILTIN, HIGH);   // LEDへの信号をHIGH(点灯)
  }
  else
  digitalWrite(LED_BUILTIN, LOW);    // LEDへの信号をLOW(消灯)
}

ここで、stateという変数を作りました。
一旦スイッチが押されると、stateに状態を保存して、1なら点灯、0なら消灯、というように動作させたいわけです。

=の使い方

ここで「=」の使い方を説明します。

state = 1 - state; この場合、stateに、1-stateを「代入」しなさい。という命令になります。
stateというのは変数ですから、値を変更することが出来ることは既に説明しました。
つまり、state = 1 - state;とは、1マイナス今までのstateを計算して、新しいstateに入れなさいという事になります。

2行目でint state = 0;としていますので、計算すると1になり、1になった後、再度計算すると0になります。 これで、オルタネート動作するわけです。

if(state == 1)
ここでの「==」は、イコールです。if文ですので、 もしstateが1ならば ということを書いているのですね。

書き込んで動かそう

どうでしょうか? 「たまに成功します」ね? どこが問題なのでしょうか?

その部分、次回解説します。