これまで抵抗とLED、ボタンを使って電子工作をしてきました。
ここでは新しい部品、7セグを使って、ストップウォッチを作りますよ!
この単元で学ぶこと
7セグ、IC、データシート、通信
完成品
1から30まで1ずつ増やしながら7セグに表示して、30になったら止めてブザーを鳴らします。
7セグとは
7セグは7つの線状のLEDを8の字にまとめたものです。
それぞれのLEDの光らせ方によって、下の図のように数字やアルファベットを表現することができます。
音や光と違って、7セグは直感的に目で見てたくさんの情報が得られるのがメリットです!
腕時計や体温計など、7セグを使った製品は身近に見かけることができます
他に何か7セグを使ったものがあればコメントを書いてみましょう!
さて、今回使うのは、7セグが4つセットになった部品になります。
表の面は7セグですね、裏の面を見てみましょう。黒い長方形型で無数の足が出ている部品がありますよね。
これをIC(Integrated Circuit: 集積回路)と言います。
ICをよく見ると、TM1637と書いてあるのが分かりますか?これがICの型番です。
ICは特定の機能を持たせたプログラムの集合体で、TM1637には7セグを簡単に光らせるためのプログラムが入っています。
ICは無数に存在します。私たち設計者は、まずICの型番を見て、そのデータシートを読みます。取扱説明書とかマニュアルとも言いますね。
↓実際のデータシート
データシートを見て、どういうプログラムを書けばよいか考える、というわけです。
部品の配線
以下のように、配線してみましょう。
今までは部品に直接配線していましたが、今回はICの特定のピンにつながるようになっていますね。
これは何をしているかと言うと、micorbitとICをつなげていて、ICが7セグを光らせる制御をしています。
microbitはICに対して、こういう光らせ方をさせてね!、というメッセージ(信号)を配線を通じて送っています。
これを通信と言います。
今後ICを使った電子工作をするときにも出てくるので、今のうちにそれぞれの言葉の意味を覚えておきましょう!
Vcc, GND, DIO, CLK
Vccは電源(3Vだったり5Vだったりモノによる)。
GNDはグラウンド(0V)。
CLKはクロックです。周期的にON/OFFが繰り返される信号です。
DIOはデータ信号です。ON/OFFを切り替えながらデータを送ったり受け取ったりします。
VccとGNDはこれまでやった中で見ましたが、クロックとデータ信号は今回初めて出てきました。
上の画像はクロック信号とデータ信号の電圧の時間変化をそれぞれ示しています。
左端に1と2の矢印がありますね。これはそれぞれのGND(=0V)です。どちらも最初は矢印より高い位置に電圧があり、ここがVccです。
途中から黄色のクロック信号が定期的に上下に動いてますね。
このクロック信号の電圧が下から上に上がる瞬間に、データ信号の電圧が上にあれば1、下にあれば0というデータを送っている、という意味になります。
今回の例でいうと、101010001というデータを送っていることが分かります。例えば101010001が7セグを5の形で光らせる、という意味だったら、7セグは5の形で点灯する、という仕組みです。
このように通信は電気信号です。0か1を送りあうことでデータのやり取りが行われています。
プログラム
さて、ではプログラムを作っていきます。
TM1637のインストール
まず、microbitで7セグICのTM1637と通信させるための機能をインストールしますよ。
makecodeを開いたら、+拡張機能を開きます。
検索欄にTM1637と入力するとTM1637機能が表示されるので、クリックします。
TM1637機能が追加されます。
初期化
TM1637との設定は変数に格納します。
まず変数を作りましょう。
変数ブロック->変数を追加する
変数名は「tm」にしておきます。
変数tmを0にするブロックを最初だけブロックに入れて、0の部分にtm1637のCLK/DIO/Intensity/LED Countブロックを入れます。
CLKとDIOは前に説明しましたね。
Intensityは強度で、7セグのLEDの明るさを設定しています。7が一番明るくて、0が一番暗いです。
LED Countは桁数で、4桁あるうちの何桁分を使うか設定します。
つづいて、
TM1637 -> turn on tm
を入れます。turn onは電源オンの意味ですね。ここでTM1637に設定情報を送信して、TM1637が起動します!
とりあえず動かしてみる
TM1637の電源を起動させただけでは、何も7セグに表示されないままです。
動作確認もふまえて、ためしに数字を表示してみましょう!
ずっとブロックの中に、tm show numberブロックを追加します。
show numberのshowは表示する、numberは数字を表す英語で、数字を表示するという意味ですね。
ためしに1234を表示してみます。
ずっと
tm show number 1234
これでmicrobitにプログラムを書きこんでみましょう、
7セグに1234と表示されれば配線と初期化のプログラムは問題なく動作しています!
ストップウォッチ
1から30まで、1秒おきに1ずつ増やしていくプログラムを作っていきましょう!
一の位だけ数字を表示する
まずは、右に1を表示してみますよ。
TM1637 -> tm show digit 5 at 0ブロックをずっとブロックに入れます。
digitは数、at 0が0番の位置に、なので、0番の位置に5を表示、という意味になります。atの数字の関係は下の画像のようになりますよ。
なので、右に1を表示したい場合、digitを5から1、at を0から3にしてやります。これで書き込んでみましょう。
ずっと
tm show digit 1 at 3
1だけ表示されましたか?
一の位の数字を1ずつ増やす
はい、では次に1と出ている数字を1秒おきに1ずつ増やしていきます。
これをプログラムに落とし込むとどうなるでしょう。
1秒おきに、というのは、1秒待つ、ということですね。
1ずつ増やす、というのは、変数を作ってその変数を1ずつ増やす、ということですね。
つまり、ずっとブロックの中に待つ、増やす、表示するの3つを入れ込めばよい、ということになりますね。
ここで作る変数はoneとでもしておきましょう。oneは1の意味で、一の位の数字を担当します。
ここまでのプログラムを作ってみましょう。。。どんな感じになりましたか?
ずっと
一時停止(ミリ秒)1000
変数oneを1だけ増やす
tm show digit one at 3
十の位の数字を表示する
1秒おきに1ずつ数字が増えたことを確認したら次にやることは、十の位を作ることです。
まず十の位の変数を作らないといけませんね。変数tenを作りましょう。tenは十の意味ですね。
さて、では十の位はどういうときに1ずつ増えますか?
一の位が10になったときですよね。
なので、これをプログラムに落とし込みます。
もし一の位が10だったら
十の位を1だけ増やす
十の位を表示する
ですから、
もし one = 10 なら
変数tenを1だけ増やす
tm show digit ten at 2
となります。いったんこれでプログラムを書きこんで動作確認してみましょう。
どうですか?一の位が途中からおかしい動きをするのが分かりましたか?
実はプログラムはこれだけでは足りません。何が足りないでしょうか。
変数oneは10を超えても1だけ増え続けているのが問題です。
10を超えると一の位には数字ではなくて、アルファベットのa, b , c, d…と表示されてしまいます(なぜアルファベットになるのかは別の時に話します)。
そのため、変数oneが10だったら、tenを1だけ増やすだけでなく、変数oneを0に戻さないといけませんね。
もし one = 10 なら
変数tenを1だけ増やす
変数oneを0にする
tm show digit ten at 2
こうすることで、oneはまた0から1ずつ増えていくというわけです。
この時点で全体としては下のようになってますよ。
ずっと
一時停止(ミリ秒)1000
変数oneを1だけ増やす
もし one = 10 なら
変数tenを1だけ増やす
変数oneを0にする
tm show digit ten at 2
tm show digit one at 3
30で止めてブザーを鳴らす
さあ、ここまで来ればあと少し!
今のプログラムは30を超えても延々と数字が増え続けていきます。
30で止めるにはどうすればいいでしょうか。
ここのポイントは十の位が3になった、ということです。
これは、もし十の位が3より小さければ1だけ増やす、という風に捉えることができます。
つまり、変数oneを増やすときに条件を付けてやればよいわけです。
もし ten < 3 なら
変数oneを1だけ増やす
こうすると変数tenが3以上だったら変数oneを増やさないので30をキープできるのです。
そして、最後に残ったブザーについては簡単です。
もし 変数tenが3より小さいなら、の、そうでなければ、の部分が30に該当することが明らかだからです。
これをプログラムに落とし込むと、
もし ten < 3 なら
変数oneを1だけ増やす
そうでなければ
鳴らす 音を鳴らす 高さ(Hz) 真ん中のド 長さ 1拍 終わるまで
となります。
全体としては下のようになりますよ。
ずっと
一時停止(ミリ秒)1000
もし ten < 3 なら
変数oneを1だけ増やす
そうでなければ
鳴らす 音を鳴らす 高さ(Hz) 真ん中のド 長さ 1拍 終わるまで
もし one = 10 なら
変数tenを1だけ増やす
変数oneを0にする
tm show digit ten at 2
tm show digit one at 3
1から30まで1ずつ増えていき、30で止まってブザーが鳴りましたか?できていれば正解です!
とても長かったですね、お疲れさまでした!!
応用問題
① 30ではなく15で止めてブザーを鳴らすプログラムを作ってください
ヒント1.もし ten < 3 ならの部分に条件を足します。
ヒント2.論理ブロックにある、<>かつ<>ブロックを使います
ヒント3.15ということは、tenは1で、oneが5です
ヒント4.tenは1以上(ten≧1)、かつoneは5より大きかったら(one>5)止まるということですね。
② 1分23秒で止めてブザーを鳴らすプログラムを作ってください
ヒント1.百の位の変数(hundred)を新たに作る必要がありますよ!
ヒント2.60を1:00と表示するところを作ってみましょう。
「oneが10になったらtenを1増やしてoneを0にリセット」したように、
「tenが6になったらhundredを1増やしてtenを0にリセット」する処理を追加するのです。
ヒント3.1分23秒ということは、hunderdは1、tenは2、oneが3です
ヒント4.応用①の考え方を参考にしましょう。
③ microbitのボタンAを押すと数字を止める、再びボタンAを押すと数字が1ずつ増えるプログラムを作ってください
ヒント1.フラグ変数stop_flagを作って、ボタンAを押したときにstop_flagを真または偽に切り替えます。
※stop=止まる、の意味ですよ。
元々flagが偽だったら真に、真だったら偽に、ボタンAを押すたびに切り替わります。
ヒント2.もしstop_flagが真なら、変数oneを1だけ増やす処理を実行します。
もしstop_flagが偽だったら、中の処理がされないということですね。
これがストップウォッチの原理です。
④microbitのボタンBを押したら1に戻るプログラムを作ってください
ヒント1.変数hundred=0、変数ten=0、変数one=1になる、ということですね。
⑤ 30からスタートして1ずつ減らし、0になったらブザーを鳴らすプログラムを作ってください
ヒント1.最初だけブロックに変数tenを3にする、変数oneを0にする、を追加します
ヒント2.1ずつ減らすには、-1だけ増やすを使うとよいでしょう。
コメント