今回は、スイッチ等に用いられているDigitalIn
を使い方について解説します。その例として、「スイッチを押すとLEDが光る装置」を作ってみましょう。
プログラムを書く前に、回路を作ってみましょう。
アイテム名 | 個数 |
---|---|
Nucleo F303K8 | 1つ |
LED 好きな色 | 1つ |
抵抗 200 Ω | 1つ |
抵抗 10 kΩ | 1つ |
タクトスイッチ | 1つ |
ジャンパーピン | 適量 |
以下の画像を参考にしてください
電子工作初心者の人には、タクトスイッチの配線がやや奇妙に見えるかもしれません(筆者は初めて見たときそう思いました)。タクトスイッチの配線についている抵抗は、「プルアップ抵抗」と呼ばれています。これの働きについて、もう一つの方式であるプルダウン抵抗と併せて理解する必要があります。 外部サイトにとても詳しい説明があるので、今回はそれにお任せしようと思います。 リンクはこちら
適当な名前のプロジェクトを作り、以下のソースコードを打ち込んでください。プロジェクトの作り方は前回紹介済みなので、忘れた人は確認してください。
#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が光るはずです。
前回と同じようにソースコードの解説をしていきます。前回説明した分は飛ばします。
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:
}
}
「スイッチが押されていない」という条件での無限ループを点滅の処理の前にはさめば、スイッチが押されるまで待機させることができます。