Skip to content

Latest commit

 

History

History
155 lines (118 loc) · 5.51 KB

B3_DigitalIn_explain.md

File metadata and controls

155 lines (118 loc) · 5.51 KB

ホームに戻る

今回は、スイッチ等に用いられているDigitalInを使い方について解説します。その例として、「スイッチを押すとLEDが光る装置」を作ってみましょう。

スイッチを含む回路を作ってみよう

プログラムを書く前に、回路を作ってみましょう。

用意するもの

アイテム名 個数
Nucleo F303K8 1つ
LED 好きな色 1つ
抵抗 200 Ω 1つ
抵抗 10 kΩ 1つ
タクトスイッチ 1つ
ジャンパーピン 適量

配線の様子

以下の画像を参考にしてください

Prj_intro

タクトスイッチに抵抗がついている理由

電子工作初心者の人には、タクトスイッチの配線がやや奇妙に見えるかもしれません(筆者は初めて見たときそう思いました)。タクトスイッチの配線についている抵抗は、「プルアップ抵抗」と呼ばれています。これの働きについて、もう一つの方式であるプルダウン抵抗と併せて理解する必要があります。 外部サイトにとても詳しい説明があるので、今回はそれにお任せしようと思います。 リンクはこちら

DigitalInでスイッチを使ってみよう

適当な名前のプロジェクトを作り、以下のソースコードを打ち込んでください。プロジェクトの作り方は前回紹介済みなので、忘れた人は確認してください。

#include <mbed.h>

DigitalIn Sw1(PA_0);
DigitalOut myled(LED1);

int main() {
  // put your setup code here, to run once:
  while(1) {
    if(Sw1.read() == 0)
    {
      myled = 1;
    }else{
      myled = 0;
    }
    wait_us(1000);
    // put your main code here, to run repeatedly:
  }
}

さっそくマイコンにプログラムを書き込んで実行しましょう。正常に動作していれば、ボタンを押している間だけLEDが光るはずです。

Prj_intro

解説:DigitalIn

前回と同じようにソースコードの解説をしていきます。前回説明した分は飛ばします。

DigitalIn Sw1(PA_1);

このコードでDigitalInのインスタンスを作成しています。書き方はDigitalOutと同じです。 DigitalInデジタル入力を司るクラスで、これを用いることでそのピンに電圧がかかっているか否かを判定できます1

if(Sw1.read() == 0) // if(!Sw1.read()){...} でも同様
{
    ...
}

DigitalInのメンバ関数であるread()は、そのピンに電圧がかかっている(= HIGH)と1を、かかっていない(= LOW)と0を返します。プルアップ抵抗の回路では、スイッチが押されると電圧が0になり、押されていないとき3.3 Vになります。ということで、これによって「スイッチを押しているときに {} 内を処理する」というプログラムになっています。1と0はそれぞれ真・偽を兼ねるので、コメントアウト以降のような略記も可能です。

while(1)
{
    ...
    wait_us(1000);
}

while文の最後にwait_usを入れてあります。これによって、1 msに一回スイッチが押されているか判定&処理を行うようにしています。このような処理を行う周期のことを制御周期といいます2。一般に制御周期は速いほど良いですが、速すぎると処理が追い付かなくなるので、そのプログラムごとに良い塩梅を見つけていくことになります。

練習問題

LEDが普段ついていて、ボタンを押している間だけLEDが消えるプログラムを作ってください。

解答例はこちら
#include <mbed.h>

DigitalIn Sw1(PA_0);
DigitalOut myled(PB_1);

int main() {
  // put your setup code here, to run once:
  while(1) {
    if(Sw1.read())
    {
      myled = 1;
    }else{
      myled = 0;
    }
    wait_us(1000);
    // put your main code here, to run repeatedly:
  }
}

先ほどの例のif文の真偽を反転させれば良いでしょう。

  

発展問題

ボタンを押すとLEDが 1 秒周期で点滅を開始するようなプログラムを作ってください。

解答例はこちら
#include <mbed.h>

DigitalIn Sw1(PA_0);
DigitalOut myled(LED1);

int main() {
  // put your setup code here, to run once:
  myled = 0;
  while(Sw1.read()){};

  while(1) {
    myled = 1;
    wait_us(500000);
    myled = 0;
    wait_us(500000);
    // put your main code here, to run repeatedly:
  }
}

「スイッチが押されていない」という条件での無限ループを点滅の処理の前にはさめば、スイッチが押されるまで待機させることができます。

← 第1話 | 第3話 →

Footnotes

  1. 具体的に何ボルトかかっているかはDigitalInでは分かりません。

  2. 逆数を取って制御周波数(Hz)として考える場合もあります。