プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

スイッチで制御する

今日はタクトスイッチを使ってみます。

 

目的は、スイッチを押しているとき電源を供給し、なんらかの動作をする。

もしくは、その状態を検知してなにか動作をすることです。

 

タクトスイッチは何もしていないときは向かい合うpinがショートしていて、押している間はこれにプラスして、同じ面にあるPinがショートします。

 

まずは、タクトスイッチが押されたことを検知するプログラムをつくります。

 

回路は下のようになります。

f:id:s51517765:20190105113714p:plain

 

 

これは、Arduinoの回路を模式的にあらわすことができるフリーソフトです。

http://fritzing.org/home/

 

回路設計をしたり、これを画像ファイルとしてこのように共有することができます。

実物の写真よりも、分かりやすいのでおもにこちらを使っていこうと思います。

 

プログラムはこのようになります。

f:id:s51517765:20190105113739p:plain

 

書き込みをしたら、右上の虫眼鏡をクリックします。

シリアルモニタといって、

「Serial.println」で書き込んだ内容が表示されます。

ここでは、Digital7の状態を読んでいます。

スイッチを押すと、0から1に表示が変化します。

 

ちなみにプリントリン(PRINT"L"IN)です。プリントインではないようです。どういう意味でしょう?

 

ここで、シリアルモニタが文字化けしているときは、シリアルモニタの右下で通信速度を変えてみます。

f:id:s51517765:20190105113754p:plain

 

このとき、タクトスイッチ(以下スイッチ)を動作させたときどのようになっているのか考えてみます。

まず、スイッチを押していないとき。

Digital7は抵抗をはさんで、GNDに繋がっています。

このとき、Digital7はGNDと同電位、つまり0Vの電位となります。

 

次に、スイッチを押すと5VとDigital7がスイッチをはさんで繋がります。

なので、Digital7は5Vになります。

 

この変化がDigital7が受け取る変化です。

ためしに、5Vとスイッチの間に電圧計を挟んで確認してみます。

 

スイッチを押してないときは0Vでスイッチを押すと5Vが見れることが確認できました。

 

次に、このスイッチの状態に応じて、物理的な制御をします。

LEDをコントロールすることを考えます。

 

スイッチがおされたことを検知して、LEDに電圧を供給します。

f:id:s51517765:20190105113810p:plain

 

回路図はこのようになります。

GNDとDigital13に抵抗とLEDを接続します。

 

スイッチの状態に応じて、13pinに電圧を出力して、LEDを制御します。

f:id:s51517765:20190105113828p:plain

 

先ほどのプログラムに、LEDを接続する13pinの定義とif文を加えました。

 

===============

if (state == 0) {

digitalWrite(led, LOW); //LEDを消灯

}

else {

digitalWrite(led, HIGH); //LEDを点灯

}

 

===============

 

pin7の状態 = stateの状態に応じて、digitalWriteの電圧出力を変更します。

ifとelseで構成され、 if (state == 0)

が一致していれば、ifの動作、一致していなければelseの動作をします。

 

digitalWrite(led, xxx);

でLEDを接続し端子の電圧を変更します。

 

これで、LEDの状態がスイッチに対して、変化しなければ、プログラム(コード)がおかしいか、配線(回路)がおかしいかのどちらかを疑います。

チェックボタンを押して、検証(コンパイル)が成功しているなら、文法はOKなので、回路を確認します。

LEDはプラスマイナスが反対だと点灯しません。

これが一番間違いやすいのではないでしょうか?

 

私も間違ってました。

 

実物では足の長いほうが「アノード」といって、+側に接続します。

fritzingでは足の曲がっているほうが+です。

 

これで、if文が完成しました。

 

なんか、制御ができそうな気がしてきます。

 

ちなみに、これはスイッチを使って、直接LEDに入る電圧をON/OFFしているわけではありません。

わかりますか?

あくまで、スイッチの入力を受けて、13pinの制御をしています。

 

 

 

 

LEDを点灯のところのelse文を

 

==============

else {

digitalWrite(led, HIGH); //LEDを点灯

delay(100);

digitalWrite(led,LOW);

}

==============

 

のように変えると、スイッチを押したとき、点滅するようになります。

100msで変化するようにしてみましたが、点滅の速度はこのようになりませんでした。

ためしに2000(ms)にしたときは時間道理になります。

おそらく、LEDの反応(遷移)速度が遅れているのでしょう。

 

■ソース

==============

int pin7 = 7; //デジタルデータ出力pinとして7番を使いpin7という変数を定義する  (intは整数の宣言)
int state = 0; //pinから取得したデータ格納
int led = 13; //LEDをpin13に接続する

void setup() {
Serial.begin(9600); //シリアルモニタを使う(カッコ内は通信速度)
pinMode(pin7, INPUT); //pin7を入力として使う(電圧を読む)
pinMode(led, OUTPUT); //LEDを接続したpin13に電圧を印可する宣言
}
void loop() {
// put your main code here, to run repeatedly:
state = digitalRead(pin7); //データとしてpin7のdigital値を読み込む
Serial.println(state); //シリアルモニタにデータを出力

if (state == 0) {
digitalWrite(led, LOW); //LEDを消灯
}
else {
digitalWrite(led, HIGH); //LEDを点灯
delay(100);
digitalWrite(led,LOW);
}
delay(1000);//更新間隔の設定
}

==============