IchigoJamの7セグLEDタイマーで16進数を学ぼう!

2018年10月7日プログラミング

7セグLEDとは?

IchigoJamは、プログラミング学習用の手のひらパソコンです。手のひらサイズの小さな基板でBASICのプログラミングの学習ができるすぐれものです。本日は、この手のひらパソコンに「7セグLED」をつないで、16進数の学習をしてみたいと思います。
「7セグLED」をというのは、7つのLEDがひとつのボックスに格納された電子部品です。7つあるLEDのうちどれとどれを光らせるかで、0〜9までの数字や、ABCDEFくらいまでのアルファベットを表現できる、便利な表示装置です。コンピュータが動き出した頃の初期には、いや、コンピューター以前の歴史があるかも知れません。このたった7つの独立した部品をそれぞれ個別に光らせることで、数字を表現しようなどと考えた人は、賢い人ですね。
写真では、7個の縦棒・横棒の他に右下に丸いポッチがありまして、ここも個別に光らせることができます。ですので、8個のLEDが付いていることになります。が、なぜか、7セグLEDって言います、この部品。
この「8」という数字。コンピュータの内部を語る上では、マジックワード。神秘の数字なのです。
例えば、この表示装置で、"4″という文字を表現するには、下の図で、OUT4, OUT3, OUT6, OUT5に示したLEDを光らせればいい訳です。

7セグLED PARA LIGHT C-551SRD
本日、学習に使用する7セグLED
7セグLEDで”4”を表現する
7セグLEDで"4″を表現

IchigoJamに電子部品をつなぐ

部品をつなぐには、ブレッドボードってのを使ってみました。そこに部品を並べます。IchigoJamと、LEDの間には適当に抵抗を噛ませています。
ポイントは、結線ですね。
IchigoJamの端子の仕様を見てみましょう。国野亘(Wataru KUNINO)さんという方がわかりやすいピン配置の説明をしてくださっていますので、こちらを参考にします。
IchigoJamのピン配列表
OUT端子やIN端子は設定によって、入出力の方向も変えることができますが、今回は、7個のLEDを光らせるだけなので、OUT1からOUT7を使います。
OUT7は基板に付いている赤い小さなLEDを光らるピンと共用のようです。なので、キーボードから以下のように打つと、基板のLEDが光りますが、この時、OUT7のピンもONになります。

LED 1

さて、OUT1〜OUT7をLEDにつなぐときは、どのようにつないでも構いません。後程算出する、16進数の”表示用コード”が変わってくるだけです。
つなぎ方が違っても、ソフトで光らせるパターンを簡単に変更ができる、というのはひとつのポイントです。
昔の人は「ハードウェア」、「ソフトウェア」と旨い事言ったものです。
今回はブレッドボードなので結線を間違えてもすぐに抜き差しして、入れ替えることができます。でも、本物の電気製品であれば、ハンダゴテ(古い!)で7セグLEDを本体とつないでしまいますよね。そうすると結線自体はすぐに変更できないから、ハードウェア(固い。すぐに変えられないってこと)と呼びます。一方、結線を間違えても、後でプログラムで数字を変更できます。光らせるLEDの組み合わせを後からいくらでも変更可能。これがソフトウェア(柔らかい。すぐに変えられるってこと)の仕事。
という訳で、私は、以下の図のように適当に結線してしまいました。

7_seg_ledとIchigoJamの結線
LEDのそれぞれをIchigoJamのどのOUT端子につないだかを示す

LEDをIchigoJam BASIC言語で光らせるには

IchigoJam BASICには、”OUT”というコマンドが用意されています。
OUT 数字1, 数字2
のように使います。例えば、私の場合、OUT3は真ん中の横線なので、"OUT 3,1″ で光り、"OUT 3,0″で消えます。

IchigoJamで7セグLEDの一つを表示
IchigoJamで7セグLEDの一つを表示。 OUT 3,1 を実行

これで、一つ一つのLEDをOn,Offすればいいので、OUT ○,1 とか OUT ○, 0を複数個並べて書けば、ご希望の文字を表示することができることがわかりました。
例えば、私の場合、先の"4″の表示であったように、OUT3, OUT4, OUT5, OUT6を光らせればいいので、
OUT 3,1
OUT 4,1
OUT 5,1
OUT 6,1
と、順番に実行すれば、"4″が表示されます。めでたしめでたし。
いえ、そうではありません。”4”という一つの文字を表示するのに4行もプログラムを書かないとならないのは、格好が悪いです。

複数のLEDを一発で光らせる方法

OUT 0と実行すると今まで光っていたものがすべて消えます。さっきの例だと、LEDがつながっているピンを指定して、例えば、OUT3につながっているLEDを消したい場合は、"OUT 3,0″としないと消せないのかと思います。
実は、OUTコマンドは、数字一つだけ指定して実行することができます。
OUT 3
と実行してみましょう。
あれ?LEDが2つ点灯します。一体、何が起こっているのでしょうか??

まずは"2進数"の登場

OUTコマンドは、数字が一つだけ指定すると、OUT1〜8のピンがONになる「組み合わせ」を指定していることになります。例えば、OUTの1と2をOn(光らせる)したい場合は、以下のようなオレンジ色の部分がを示したいと思います。
端子の番号
この図をちょっと数字で表してみます。一番の8の桁が0、つぎの7の桁も0、。。。2の桁が1、1の桁が1になっていればよいので、
00000011
という数字で表現できます。これがOUT端子の"2進数"表現という事になります。実は、これ、普通お金の計算などで使う数字でいうと3になります。10進数でいうと"3″です。
2進数は、0と1だけで表現された数字なので、
00000001=1
00000010=2
00000011=3

という感じになります(=の後が10進数の表現)。
なので、先ほどOUT 3というコマンドを実行すると、OUT1とOUT2の端子につながった、”2つ”のLEDが光った、ということになります。
では、"OUT 0″というコマンドは何を意味していたのでしょう?
これは2進数で言うと、
00000000
という番号を指定したことになります。つまり、ONになるLEDはひとつもない状態にしろ、ということで、7セグLEDのすべてのLEDが消灯する結果になります。
IchigoJam BASICでは、2進数は、"`"とい記号とを数字の前につけることで、表現します。
OUT `00000011
とコマンドを実行すると、OUT1とOUT2の端子につながった、2つのLEDが同時に点灯します。
一番最初の"4″を表示するためには、私の結線方法だと、OUT6,OUT5,OUT4,OUT3につながったLEDを同時に光らせればいいので、以下のパターンとなります。
7セグLEDで4を表示するパターン.png
オレンジ色のところを1にした2進数表現は00111100なので、以下のコマンドを実行するとめでたく、文字"4″が現れることになります。
OUT `00111100

いよいよ"16進数"の登場

16進数というのは、1,2,3,4,…と続いて、16個目の数字でひと桁、繰り上がるような数の表現方法です。でも、残念ながら数字は9までしかないので、9以降は、A,B,C,D,E,Fの6文字を使って表現するものです。
これが2進数と非常に相性がよく、順番にリストにしてみますと、以下のように4桁の0,1の2進数が、ちょうど16進数の1桁分に相当します。
2進数と16進数
ですので、8桁の2進数があれば、単純に、機械的に、2桁の16進数にマッピングすることができます。ちょっとやってみましょう。
先ほど、
OUT `00111100
は7セグLEDで"4″を表示させるためのコマンドでした。では、この2進数を、上位4桁と下位4桁に分けて、それぞれ上のテーブルの16進数で置き換えます。つまり、上位4桁0011→ 3、下位4桁1100→C。なので、16進数は3Cになります。
OUT #3C
は、先ほど同様、7セグLEDで"4″を表現させることができます。IchigoJam BASICの場合、16進数は頭に#記号を付けます。
さて、同様に、7セグLEDで表示させるパターンを16進数のコードで表してみましょう。わかりやすいように表にしてみました。

IchigoJamで7セグLEDを表示させるパターン
IchigoJamに送る16進数の表示用コードを計算する

例えば、私の結線では、7セグLEDで数字の"7"を光らせる為に光って欲しいのは、OUT7端子, OUT6端子, OUT5端子, OUT4端子につながったLEDです。上記の表で求めたように、16進数の表現で言うと#78です。従って、OUT #78というコマンドを実行すると、7セグLEDで”7″が現れます。
つまり、この表の、「基板に送る16進数」という列に書かれている#〇〇の16進数が、7セグLEDをどう光らせるかを表す「表示用のコード」になります。
先ほど、結線をするときに、どの端子にどのLEDをつなぐかは適当でいい、と言いました。要は、実際の結線に合せて、この表示用のコードを作りなおせば、どんな結線にしておいてもソフトを書き換えれば表示可能なのです。この柔軟性こそ、まさにソフトウェア。プログラミングで実現することなのです。

やっと、ここからプログラミングする

さて、以上が下準備です。ここからが本当のプログラミングです。
IchigoJam BASICには「配列」という変数の列が使えます。配列に入っている数字は、例えば、以下のように読み出せます。
PRINT [5]
これで、配列の5番目に入っている値が、IchigoJamの画面に表示されます。
配列に先ほどの16進数コードを、0から順番に入れておくと、例えば、先ほど表示の"7″をLEDで表現したい場合は、#78を基板に送ればいいことを説明しました(OUT #78を実行)。配列の7番目に、#78を入れておくことで、プログラムはこんな風に書けます。
OUT [7]
16進数の難しい表示コードを覚えていなくても、これならLEDに7を表示する事が一目瞭然です。わかりやすいです。ソフトウェアって素晴らしいです。
これが出来るようにするために、プログラムの最初に配列を"初期化"して置きます。以下のコードをプログラムの一番最初に実行します。
10 LET[0],#7B,#30,#67,#76,#3C,#5E,#5F,#78,#7F,#7C
最初の10はプログラムの行番号です。
RUN
と実行すると。それ以降、
OUT [7]
を打てば、7セグLEDに"7″が現れ、
OUT [3]
と打てば、7セグLEDに"3″が現れます。便利便利。


さて、ここでプログラムの初心者が混乱します。
OUT 0
と打つことと、
OUT [0]
と打つことの違いがわからなくなります。わかりますか?わかった人は混乱していない人です。
OUT 0はLEDを全部消すこと、OUT [0]は配列0番目の値を基板に送ることなので、配列の0番目に入っている#7Bを送ること、つまり LEDで “0"という文字を表示することです。

タイマーのプログラムを作る

タイマーと言ってもひとけたの数字しか表現できないので、1秒毎に数字がカウントアップして9まで言ったらゼロに戻るようなプログラムです。
Screenshot from 2018-10-07 18-13-30
For文で、0から9まで回して、OUT [I]でその数字の16進数コードを7セグLEDに送ります。
それをGotoでぐるぐる回すだけ。ほんとにそれだけです笑。
以上です。


電子工作ランキング