2017年6月30日金曜日

n進数の話(変換機作る?)

2進数、私は指折り数える事が出来ますが友人は「無理」と。
まぁそうでしょう、いきなりは難しいでしょうね。
しかも16進数だったりすると足の指まで使わないと数えられません!
これは私でも無理です。

そこで「2進10進16進変換器を作っみようかなー」なんて考え始めました。

お得意の「Arduinoのシールド」で作ればいいかな?
と思ったのですが、Arduinoは高いのでプレゼントしたくありません。
でもArduinoの開発環境の手軽さで作りたい……。

そんな事からArduinoで作ってCPU(ATMEGA328P)を引っこ抜いて
実装する方法でプレゼントを作る事にしました。

1.仕様を考えよう!
 たしか2進数を10進数にしたいって言ってたような…
 脳内で考えましたw
 スイッチを8個(8bitまで計算できるように)。
 確認用のLEDを8個(明示的にどのbitが立ってるか見せる為)。
 7セグメントLEDを3個(255まで表示する為)。
 更に7セグメントLEDを2個(16進数の0xFFまで表示する為)。
CPUはATMEGA328Pで。
 あとは適当にLED用の抵抗とかCPU用のコンデンサかな。
 電源は…USB給電で良いかなー。
2.回路を考えよう!
 みんなのラボにはEagleの安いライセンスがあります。
 私はEagleでイキナリ部品を並べます。
 そして配線をします。
 最初はCPUとスイッチとLEDと7セグ。
 次に必要に応じたて抗やコンデンサ。
 できました!
3.基板図を引こう!
 いい具合に部品を配置します。
 この時点で基板の外寸が決まります。
 次に配線です。
 私は配線が大好きです、だってパズルみたいじゃないですか!
 配線が出来たら仲間(みんなのラボのメンバー)に見てもらいます。
 #仲間がいるって良い事ですよ!
4.試作します
 実寸大の基板図をプリンタで刷ります(表と裏を別々に)。
 段ボール紙に印刷したものを貼ります(表裏ずれないように)。
 段ボールにリード部品用の足穴開けます(キリとかで)。
 段ボールに部品を乗せてみます(部品どうしがぶつからないか)。
できました!

抵抗とコンデンサは未実装だけど、なんとなく部品同士の干渉はナシ!


















でも…違う角度から見るとスイッチの裏にLEDが隠れちゃってるな。

こういう部分は実際に組み上げてみないと気が付かない部分ですね。

今日は疲れた、続きはまた今度にします。

2017年6月9日金曜日

n進数の話(続き)

今度は違う人から質問が来ました。
その人は「16進数」が知りたいらしいです。

「いやいや2進数と同じでしょ!」と思うのですが、わからない気持ちも理解でします。

前回のBLOGにも書いたように
10進数は「じゅう」って言ったら負け。
2進数は「に」って言ったら負け。
同じように考えれば16進数は「じゅうろく」って言ったら負けなだけなのです。

その人曰く
 人間界には0~9の10個の数字しか存在しない。
 2進数の場合0と1を使えば良い。
 8進数の場合0~7を使えば良い。
 ところが16進数の場合0~9では表現できない!
 0~15だと、既に2桁になってるし!
 ってかAとかBとか英文字でてきて意味わかんないし!
との事。

Aは一文字、つまり一桁ですよね。
B、C、D、E、Fも一桁ですよね。
16進数の場合0~F迄で16個の数字を表現します。
0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F
16個あるでしょ?

Fの次は?
Gではありません。
16個目の次は桁上がりです。
つまり10です。

下記、左が10進数で右が16進数の数字です。
0=0  1=1  2=2  3=3  4=4  5=5
6=6  7=7  8=8  9=9 10=A 11=B
12=C 13=D 14=E 15=F 16=10
16の所で桁上がりして10になりました。
念の為、もう少し途中経過を書きますね。
43=2B
94=5E
ですね。

こんなのどうやって計算するの!?

落ち着いて下さい、簡単です。

まず16進数を10進数に直す方法を書きます。
例として16進数の5Eを10進数にしてみましょう。
まず上の桁が5ですね、つまり16が5個集まっているのですよ。
まず16進数の50を10進数に直すと「16×5」で80です。
あとは下の桁のEですが…これは数えるしかないですね。
9、A、B、C、D、E = 9、10、11、12、13、14
16進数のEは10進数の14ですね。
さっきの80(50の10進数)と、今の14(Eの10進数)を足すと94です。
なので16進数の5Eを10進数に直すと94という事です。

A~Fを英文字として認識するのではなく、9以上の一桁の「数字」として認識すれば良いのですよ。
応用すると「20進数の場合は0~J迄を使えば良い」感じですね。

わかりましたか?
これで10進数以上も対応できますね!