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

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

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でぐるぐる回すだけ。ほんとにそれだけです笑。

以上です。


電子工作ランキング

IchigoJam第一歩。EasierCAPビデオキャプチャで画面表示

IchigoJam第一歩。EasierCAPビデオキャプチャで画面表示

IchigoJamでプログラミング

数年前、当時小学生だった娘の夏休みの宿題に購入したIchigoJamという子供向けパソコンをまた動かしてみました。小学生のプログラミング教育の必須化を目の前に、MBAのクラスメートなどで、私の職業柄、プログラミングの先生をやったらどうかと言ってくる人がけっこういます。

最近のプログラミング学習って、ScratchみたいなGUIでプログラミングツールでお絵かきのようにするものが流行りです。コンピュータを動かす仕組みとしてのプログラミングの概念を勉強するのに、このようなツールは有効です。でも、私が思っているプログラミングとは結構違います。

私が子供の頃(30年くらい前)は、プログラミングといえば、キーボードからテキストを打ち込んで呪文のような文章をつらつらと書き上げて「RUN」と実行するようなもの。モニターも黒背景に白の文字とか緑の文字がつらつらと表示されるような代物でした。テキストを打ち込むだけなので、マウスなんてものはありません。当時はBASICというプログラミング言語が流行っていました。

IchigoJamは、そのBASICを学べる、子供の学習用の小さなコンピューターです。

Micro USBで電源を取り、キーボードを繋ぎ、モニターとしてビデオ端子のついたテレビに繋いで使います。

IchigoJamをパソコンにつなぐ
IchigoJamという小学生の学習向けコンピューター

パソコン画面に表示する為にEasierCAP購入

ビデオ端子付きテレビ、というのが曲者です。WindowsとかLinuxとか普通のパソコンにつなぐモニターはアナログのビデオ端子などはついていません。今時は4Kテレビなどでもついていないものが出てきているのではないでしょうか。

以前は、VHSの録画機とか、ビデオカメラなどでも普通についていた黄色のビデオ端子は、もはや過去の遺産になりつつあるのです。

わざわざ大画面テレビにしょぼいBASICのプログラミング画面を表示するのもナンセンス。そこで考えたのが、パソコン用のビデオキャプチャ。私は自宅ではLinux (Ubuntu 16.04)を使用しています。Linuxでも使えるビデオキャプチャを探してみました。

購入したのは、こちらの商品。Amazonで1,200円でした。


MINGCHANG EasierCap USB 2.0 dc60テレビDVD VHSビデオ S端子 キャプチャアダプタUSBビデオキャプチャ レコーディングアダプタAVI/JPG/BMP

 

 

 

USBポートにさして、黄色の端子にIchigoJamの出力を繋げば、WindowsとかLinuxなどのOSの上で、IchigoJamが使えます。

似たような商品はピンキリで色々あります。この商品は、EasyCapという商品がオリジナルであったようですが、その後海賊版が出まわり、もう何が本家なのだかわからない状態。Linuxで動くのだかどうだかもわかりませんでしたが、安いのでダメ元で購入してみました。

表示はVLC メディアプレーヤーで

EasierCapをUbuntuの本体に差し込むと、/dev/video0とか/dev/video1とか、というデバイスとして勝手に認識されました(抜き差ししたら名前が変わったよう)。

画面表示をするには、VLCメディアプレーヤーが便利そうです。

「メディア」メニューから、「キャプチャーデバイスを開く」を選択します。

VLC「メディア」メニューから「キャプチャーデバイスを開く」を選択
VLC「メディア」メニューから「キャプチャーデバイスを開く」を選択

表示されるダイアログボックスで、ビデオデバイス名のプルダウンメニューから所定のデバイスを選択します。EasierCAPが刺さって正しく認識すればここに/dev/video*というの表示され、選べるようになります。(*の部分は数字が来ますが、環境によって異なると思います)

Vlc キャプチャーデバイスの選択画面

「再生」を押すと、表示が始まります。こんな感じ。

IchigoJamをVLCで表示
IchigoJamをVLCで表示

早速BASICでプログラミング

早速BASICでプログラミングしました。上の画面キャプチャで表示されているプログラムは、IchigoJamの本体についた赤いLEDを10回点滅させるものです。

10行: 変数Aに1を代入

20行:もしAが10より大きくなったらプログラムを終了

30行:LED 1で表示

35行:30フレーム待つ。IchigoJamは60フレームで1秒なので、ここでは、0.5秒待つということになります。

40行:消す

45行:また0.5秒まつ

50行: Aに1を足す

60行: 20行目に戻る。50行に来るたびにAがひとつ増えるので、20行の実行は10回目にプログラム終了します。

で、RUNとキーボードで打って、「Enter」キーを押しますと。LEDがピカピカ光ります。

IchigoJamの画面を「レコーディング」してみました

VLCなら画面の「レコーディング」もできてしまいました。

VLCで表示しながら、レコーディングボタンを押すと、Ubuntuだと、ユーザの「Video」フォルダにaviファイルが作成されます。

 

 

電子工作ランキング

Udemyで、Kerasの機械学習を、学習する

Udemyで、Kerasの機械学習を、学習する

機械学習を学習する

一年くらい前に機械学習のUdemyのグラスを取りました。そのクラスも為にはなったのですが、8割りくらいのところで挫折しました。なぜなら、前半線があまりにもデータサイエンスしすぎていて、統計系の方法論が多いのです。高校時代から確率統計的な科目が苦手だった私からすると、簡単に言うとつまらなくらりました。
そんな中、最近のディープラーニングの流行りで気になっていたKerasを学ぶ講座を見つけました。Udemyの講座です。お安いです。
これを受けてみました。

 

機械学習の遠い想い出

20年近くも昔のことになりますが、私の大学時代の研究テーマはニューラルネットによる文字認識や、音声認識でした。
その当時は、コンピューターの計算能力が今とは比較にならないほど貧弱です。20ピクセル四方位の手書きの白黒画像(いや、2値の白黒だったかも知れません)を10クラスに分類するようなニューラルネットのシミュレーションをしてました。コンピューター業界はダウンサイジングという小型化の流れの中で、科学計算用のデスクトップタイプのワークステーションが百万円切ったとかというくらいの時期。IntelのPentiumも発売されたばかり、とかそんな感じだったと思います。

 

安くなったとは言え、3層の全接続のネットの学習(トレーニング)をするのに余裕で一晩かけてました。
それが、今や普通のパソコンで、GPUでなくとも、そして、もっと階層の数や一階層辺りのノードの数が多くとも、ものの数分でトレーニングが終わってしまいます。素晴らしいです。
code coding computer cyberspace
Photo by Pixabay on Pexels.com

この20年くらいで起きたブレークスルー

私が学生で研究していた頃のニューラルネットの研究は、基本的にはback propagationという今でも使われているアルゴリズムを使った研究がメインだったように思います。ただ、研究対象としては、飽きられていったようです。コンピュータの能力が 貧弱と言うこともありますが、トレーニング自体が上手く進まない問題や、そもそも同じ問題を別な方法でやらせた方が効率的など、実用性が見いだせなかったのだと思います。(その場合は、途中の処理を人間がやっているということになる訳ですが。。。)

 

 

しかし、時代も流れ、力業でコンピューターをぶんまわすだけで、当時はできなかった仕事ができるようになるので実用性は上がります。計算能力に合わせてニューラルネットの階層を増やすこともできます。

 

一方、階層を増やすのは、back propagationというアルゴリズム自体の問題もありました。ネットワークの出力のエラーを訂正して、入力層へ誤差の伝搬する事で学習と言うプロセスを行いますが、層が増えると学習が進まなくなるのです。特に入力に近い層の学習ができなくなります。入力に近いほどそれまでは人間様が手動でやっていたような、特徴量の抽出が認識率に大きな影響を与えますので重大です。この問題を解決するのが、deep learning、つまり、ネットワークの出力より深い層の学習をさせる方法です。このお陰で、昨今の機械学習といえば、deep learningといったトレンドになりました。例えば、auto encodingと言われる、入力に近い層であらかじめ学習させておく方法を取ることで、特徴量をネットワーク自体が見つけ出し、それを繋ぎ合わせることで、深い層の学習が進まない問題が解決されてきたようです。

私も、この世界離れてしばらく経ちますし、知識のキャッチアップも仕切れないので、週末に趣味でUdemy受講、という流れになっております。

 

Udemyの講座の内容

私が受講した、

のコースですが、内容としては、pythonの環境から始まりアプリの作成まで、実用的なポイントが押さえられています。
  • Anacondaのインストールによるpythonの準備
  • Pythonの機械学習のライブラリであるTensorflow、Kerasのインストール
  • 開発環境としてのATOMエディタやATOMの便利プラグインのインストール
  • Flickrを使った画像データの収集プログラムの作成(Flickrのアカウント作成の方法も)
  • 入力データをKerasで使えるようにするプログラム作成
  • Kerasの学習アルゴリズムの実装
  • コマンドラインからニューラルネットの学習後のモデルの実行
  • WebアプリのフレームワークFlackの使い方の説明
  • Flackで、Kerasのニューラルネットのモデルを走らせ、結果を返すアプリの作成
とても実用的な内容です。すぐにとっつきやすいと感じる方も多いと思います。(が、講師が書いているプログラムは色々間違いがあります)

 

ただ、私には物足りなすぎました。私自身はpythonもそこそこ趣味で使えますし、Webアプリも書いたことがあります、趣味ですが。一方、講義ビデオで出てくるKersaのコードはネットのチュートリアル程度で単純で、しかもビデオの中でコピペしてるだけ。私は、もう少し、こういうアルゴリズムやこういうモデルを作るのには、Kerasをこう使えばいいのだ、といった根本的な理解ができるようなものを期待していました。この値段(1,400円)では無理でした。
ですので、
  • 本当に初心者で環境構築から行う
  • チュートリアルを実行するのがそもそもどうしていいかわからない
  • 内容はともかく、動くものを触ってみたい

というぐらいの方にしかおすすめできないのではないかと思いました。

ただ、3時間程度の講義ビデオの中で全コードを打ち込みが完了してしまう程度の僅かなプログラムで、私が大学時代に夜間にコンピューターセンターのリソースを使い倒していた(大げさ)頃の機能以上のことができてしまう。これは、ある意味すごいことです。そりゃ、新しいサービスがポンポン生まれてはなくなるという社会になるよな、というくらいの進化です。改めて、そう思う体験となりました。