image

少し前にmbedで信号機を作ったことがありました
作った信号機は自動車用と歩行者用が自動で交互に青になるというものでした。
少し改造して、押しボタン式の信号機にしてみましょう。

追加することは、
  1. スイッチを配線する
  2. スイッチの入力ピンを設定する
  3. スイッチが押させるまで待つ
です。1は電子工作、2,3はプログラムです。
それでは1から

1.スイッチを配線する
用意するものはスイッチと、ピンとジャックのジャンパワイヤー2本です。
shingo_sw

スイッチのピンをジャンパワイヤーのジャックに刺します。刺すだけだとすぐに抜けそうだったので、セロハンテープで固定しました。
shingo_swjampershingo_swjamper2

これを、ブレッドボードに刺します。
マイコンのどこのピンを、スイッチ入力にするかで、刺す場所が変わってきます。
今回は、ブザーの近くのピンでマイコンの右側の3行目のピン(dp26)にしました。
shingo_swpoint
スイッチの付いたジャンパワイヤーのピンを、3i と、赤い+の電源ラインに刺します

image
こんな感じです。これで電子工作完了。
プログラムの変更に移ります。

まずは、ここからプログラムをインポートしてください。

2.スイッチの入力ピンを設定する
マイコンに、このピンは入力設定にしてくださいとお願いをします。
8行目のDigitalOut buzz(dp28); と10行目のint main() {  の間に、
DigitalIn sw(dp26);
を追加してください。これはdp26というピンをデジタル入力にして、swという名前にしなさい
という命令です。
shingo_in

3.スイッチが押されるまで待つ
自動車用の信号が青、歩行者用の信号が赤の状態で、スイッチが押されるまで待っているプログラムを追加します。
自動車用が青、歩行者用が赤にした後に、待つので、
20行目の wait(5.0);  //5秒間 と 22行目の B = 0;  //自動車:1秒間黄色 の間に待つプログラムを入れます。

設定した条件に合っている場合{}でくくられた中のプログラムを実行し続けるという命令がwhileです。
while( 条件A )
{
  条件があっている場合に実行するプログラムB
}
というように使います。条件Aがあっている場合、プログラムBは何度も何度も実行され続けます。

今回はこれを応用して、スイッチが押されていない間、暇つぶしをしてくださいとお願いしてみます。
スイッチが押されている状態はsw=1,スイッチが押されていない状態はsw=0となります。
なので
条件A:swが0の間 プログラムB:無し
で行きます。

20行目の wait(5.0);  //5秒間 と 22行目の B = 0 //自動車:1秒間黄色 の間に
while( sw == 0 )
{
}
を追加してください。
== は条件判定に使う命令で、左側と右側が同じとき1となります。なので、swが0のとき1になり、プログラムのない{ }を何度も実行し暇をつぶします。
もし、swが押されると swは1になるので左側と右側が異なるため、結果が0となり、{ }の後の命令を実行するようになります。
shingo_while
こんな感じになっていればOKです。

これで完成。コンパイルしてダウンロードできたファイルをmbedに入れてみてください。
image
どうでしょう。ボタンを押したら自動車用の信号が赤になって、歩行者用が青になりましたか。
修正後のプログラムをここに置いておきますので、うまくいかなかったら比較してみてください。



スポンサードリンク