12進数による webアナログ時計 を作りました。「CreateJS でアナログ時計の開発に挑戦しよう」を参考にしました。(一応、IE 、google clrome 、Opera、Firefox で確認。)
12進数を表すに0~9とA及びBを用いました。 アナログ時計の文字盤には、10時→A、11時→B、正午→1012進を置いています。
一日は12進数で20時間、1時間は50分、1分は50秒です。(訂正:1時間は60分、1分は60秒に訂正します。もの凄く混乱します。)文字盤がAとBと10に置き換わっただけで一見、何の変哲もないアナログ時計に見えます。 しかし、よく見ると秒刻みが”6”刻みだとわかります。例えば3時から4時までの間に6の刻みがあって、秒針はPCなどからの時刻をとってきますので5秒刻みです。ですから、赤い秒針の進みと文字盤の刻みとの間にずれができています。
時間は、10進数を用いた12の倍数で表現しています。時間を本当に12進数にするには「1秒の定義を変更しなければならない」ということです。
現段階では、12進数による時計の必要性を具体的に述べることはできません。ただ、これまでの考察から云えるのは、物質的自然は距離ではなくて角度がより重要であるだろうというという事です。基本物理量である「長さと質量」は10進数ですが、時間だけは10進数による12の倍数です。時間を10進数に改めることは不可能に近いです。 むしろ長さも質量もその他の物理量も12進数に統一すべきだとの考えです。webアナログ時計はその一つです。
時間は角度から作ります。地球上において、1日の長さ(運動)は変えられません。というか、人は1日を基準に活動している以上、これを基準にするしかありません。ですから、時間を作る際には、1日(昼夜)の長さを無視して時間を作れません。
数学者岡潔は、「自然科学は間違っている」として時間が一番の問題だと指摘しました。「【 2】 自然科学者の時間空間」 考察を続ける内に、岡の云ったように時間は物理量ではありませんけれども、むしろ長さや質量より角度が重要ではないかと思うようになりました。「【6】 数学の使えない世界」
2016年2月18日「なぜ1年は12ヶ月なのか? フトマニ図とホツマツタエから分かること」に掲載しました。 12進数による分度器についてです。
図1
当時、円周を12進数で100度に分割しました。どうも200度か300度が適当ではないかと感じます。円周は360度ですから、12進数だと300度になります。 何故、1年(365日4分の1)を8あるいは16に分割せず12(月)としたのか、その辺りと関係するのかも知れません。1日は24に、角度は360度です。なぜだろう?
余談です。2016年4月「自作CNCの調整とプリント基板試作(暖房ヒーター用タイマー)」の記事にご紹介した暖房ヒーター用タイマーについてです。
写真1
冬にトイレが寒いので暖房用に、もう一つタイマーを作りました。あり合わせの材料ですので表示は3桁しかありませんし、余分な穴の跡があります。
写真2
写真3
で、ふと思ったのは写真1のタイマーを12進数表示に変えるというものです。これができない。本当に難しいです。
製作の元記事は「arduinoで遊ぶブログ」さんによる記事で、「タイマー -第5回:スイッチでタイマー操作(開始と停止)」にあるスケッチ「4桁タイマー(Sw機能付き).txt」を参考に「設定ボタンは5分刻みにする。パイロットランプとともにSSR(ソリッドステーリレー)をONにする。」よう変更しているだけです。
マイコンの内部時計「timeNow = millis(); //現在時刻の取得」のmillis()は変えられません。わかるのはスケッチの末尾にある表示部分です。7セグLEDの制御の部分の「default://0」の前に次を付け加えます。
case 10:
digitalWrite(pin7segA , HIGH );
digitalWrite(pin7segB , HIGH );
digitalWrite(pin7segC , HIGH );
digitalWrite(pin7segD , LOW );
digitalWrite(pin7segE , HIGH );
digitalWrite(pin7segF , HIGH );
digitalWrite(pin7segG , HIGH );
break;
case 11:
digitalWrite(pin7segA , LOW );
digitalWrite(pin7segB , LOW );
digitalWrite(pin7segC , HIGH );
digitalWrite(pin7segD , HIGH );
digitalWrite(pin7segE , HIGH );
digitalWrite(pin7segF , HIGH );
digitalWrite(pin7segG , HIGH );
break;
やっていることは、7セグLEDについて、引数が”10”なら「A」を、”11”なら「b」を表示するということです。それ以外の変更は(管理人にとって)不可能です。当然スケッチでは10進で計算しています。 millis()から秒、分を求めています。多分、 millis()から(12進に換算した)数を求めればよいような気がします。アナログ時計では秒針にズレがあるのですから・・・?
頭が混乱して、とにかくムリです。 新しいタイマーは部品(20mhzのセラロックしかない)の関係でいくつか問題がありますが、一応回路図です。
図2
12進数について考える様になった切っ掛けは、ある科学者の次の言葉でした。
我々の算数はいくつかの重要な関係で君たちのものと違っているからなんだ。我々の祖先は君たちと同様に最初に計算法を学んだときに十本の指を使ったんだ。
我々が君たちがやっているのと同じ十進法を基礎とした計算システムを開発したのはおきまりの結果だった。長い習慣から、その後数世代の間このシステムが使用され続けたが、十二進法を基礎としたシステムがもっとかんたんで有用で、本質的により可分性があるとわかったんだ、知ってのとおり十二は、二、三、四、六で割り切れるが十〇は二と五でしか割れないんだ。
結局、我々の人類はどうあっても昔の習慣を破ろうと決定し、十二進法による数体系を法律としてきめた。数世代の間は数学的混乱の時代だった。これは、新しいものを受け入れることによって得られる利益をわかっていながらも、古い計算の仕方を放棄するのを拒否したり能力不足だったりすることに起因するものであった。結局、十進法による数学の教科書を廃止し、その後の出版を禁止することが必要になった。この法律は異常で多くの人によって手厳しいものだと考えられたが、それによって十二進法への転換は完遂されたんだ。
なぜ十二進法が重要なのか現在のところ、はっきりとわかっていません。さらにその先にとんでもない困難が待ち受けていることは何となくわかります。
追記1/19 例えば12進数の計算、3b-16=? この簡単な引き算に即座に答えられる人は、恐らく地球上に居ないでしょう。それほどに頭が拒絶します。この困難さが複雑さ故でのことではないところが興味深いです。 言い換えますと、現在の文明において、「物質的自然は複雑に見えるから、その仕組みも複雑に違いない」との目論見で文化は発達してきました。だから、行き着くところ、自然科学は複雑になりすぎてしまいました。 しかしながら、管理人の予想では、今後の発達は「複雑さの追求ではない」方向に向かうと確信しています。それが12進数というこれまでと全く質の異なる困難さだということです。 卑近な例として巷には予言や預言が溢れています。これらに云われる終末は天変地異もありましょうけど、上記のようなことを含むと考えます。本当によい方向に向かうには、現在を破壊して進む困難がつきものだということです。
追記1/20 写真2と3に示した新しい暖房ヒーター用タイマーについて、2点備忘としてメモします。新しいタイマーは、あり合わせで作ったので標準の16Mhz水晶がなく、セラロック20Mhzを使いました。普通に書き込みしたのでは正しく動きません。
1.スケッチはマイコンが16Mhzで動いている前提でmillis()を返してきます。実際は20Mhzですので、早くカウントが(20/16倍)進んでしまいます。ですのでスケッチ「4桁タイマー(Sw機能付き).txt」にある「現在時刻の取得」の後に2行書き加えます。
timeNow = millis(); //現在時刻の取得
timeNow *= 4; //セラロック20Mhzなので16/20倍する
timeNow /= 5;
2.20mhzのセラロックを取り付けたマイコンにスケッチを書き込んでも動きません。AVRマイコン(Atmega328P)のヒューズビットを書き換えます。「AVRのシステムクロックを20MHzに変更」やそのリンク先を参考にしました。具体的にはAtmel Studio 7のDevice Programmingを使いました。
図3
通常の使い方ではありませんので、自己責任です。他にも不具合があるかも知れませんが、実用上問題ありませんので、これで使っています。
追記1/21 間違いに気付き一部訂正します。ただし、以下は本当に正しいのか確信が持てません。
1年は365日と4分の1あまりです。これは変えようがありません。 この1日を如何に分割して時間を作るかと云うことです。それに 12進数 を用います。前提として1秒の定義を変える必要があると考えます。
- 1日は、2012時間。
- 1時間は、6012分。
- 2時間は、10012分
- 1分は、6012秒。
- 2分は10012秒。
- 1012分は60012秒。
- 2012分は、100012秒。
1.はまず間違いありません。2.もたぶん正しいような気がします。しかし、12進数で1時間は何分か、あるいは何秒か考えると混乱します。ともすると1時間は3600秒に思えてきます。もう大混乱です。 よく考えると2時間は100分だと思えます。うーん、わからないです。
仮に12進法による数学が有用・有効であることがわかった場合、大変な混乱が予想されます。12進数の有用・有効性は、現段階では不明ですけれども、混乱するということをご理解ください。
さらに、暖房用デジタルタイマー(写真2、3)についてです。16Mhz水晶がないのでやむなく20mhzのセラロックで代用しました。その際マイコン内部時計の動きとスケッチ(AVRのプログラム)のずれをmillis()に(5/4=1.25倍)することで補正しました。 同様に写真1の4桁デジタルタイマーの12進数化についてです。マイコン内部時計の動き「millis()」に(5/6=0.83倍)して表示すればよいのではないかと考えます。他に演算で合わせるべき箇所があるようですけれど何とかなるかも知れません。
追記1/22 以前、暖房用に作った4桁デジタルタイマー(写真1)のスケッチ(プログラム)を変更して12進数のデジタルタイマーにしました。
GIF1 タイマー設定の様子 6→10→16→20→26→6の繰り返し
初期値は612分で時間設定のボタンを押す度に1012分、1612分、2012分、2612分と増えていき、もう一度押すと初期値である612分に戻ります。 入/停止のボタンを押すと06:00から05:5b、05:5A、05:59、05:58・・・、という具合にダウンカウンターとして機能します。
写真4
写真5
因みに1012分からのカウントダウンだと、10:00→0b:5b→0b:5A→0b:59・・・です。 スケッチの考え方は、以下です。
1月20日の追記 1.を元にmillis()の次を書き換えます。内部時計は、開始から1000分の1秒での経過時間を返してきますので、これを6分の5にします。約0.833倍します。
timeNow = millis(); //現在時刻の取得
timeNow *= 5; //12進の秒に合わせるため(5/6)倍する
timeNow /= 6;
次いで内部は10進ですので、これを”12”括りにするとともに、12進数での桁上がりにします。12秒で桁上がり、72秒で分12の桁上がり、864秒で1012分の桁上がりになります。
//表示時刻を7セグメントLED用に変換
numDisp[0] = timeDisp % 12; //1秒単位
numDisp[1] = (timeDisp % 72)/12; //10秒単位
numDisp[2] = (timeDisp/72) % 12; //1分単位
numDisp[3] = (timeDisp/864) % 12; //10分単位
あと、元の初期値の510分について、12進では612分ですから、10進数に戻すと432秒になるので該当箇所を変更します。
int setTime = 432; //設定時刻(秒単位)
他の関係するところもあります。
void up_time_disp()
{
if( timeDisp == 2160 )
timeDisp = 432;
else
timeDisp += 432;
7セグLEDの表示部分は、10→11から12で桁上がりしていたものを、10→b、11→Aに置き換えます。
case 10: //12進数の"A"を表示する
digitalWrite(pin7segA , HIGH );
digitalWrite(pin7segB , HIGH );
digitalWrite(pin7segC , HIGH );
digitalWrite(pin7segD , LOW );
digitalWrite(pin7segE , HIGH );
digitalWrite(pin7segF , HIGH );
digitalWrite(pin7segG , HIGH );
break;
case 11: //12進数の"A"を表示する
digitalWrite(pin7segA , LOW );
digitalWrite(pin7segB , LOW );
digitalWrite(pin7segC , HIGH );
digitalWrite(pin7segD , HIGH );
digitalWrite(pin7segE , HIGH );
digitalWrite(pin7segF , HIGH );
digitalWrite(pin7segG , HIGH );
break;
10進の12倍数である時間を0.833倍した上で、12進数の時間に直しています。10進数と12進数の変換にはWolframAlpha知能計算を使いました。
写真6
写真7
参考に「arduinoで遊ぶブログ」さんによるタイマーのスケッチを12進数に変更したものをこちらに掲載します。(12進タイマースケッチ.txt)arduinoによるデバッグの為のシリアル通信がそのままであったりします。気にしないでください。元の製作記事に感謝します。
詰まるところ、4桁12進数タイマーの1秒は通常の1秒より短いです。(約0.833秒) その分カウント数は多いということです。冒頭に示した12進数のwebアナログ時計と見比べてみると面白いです。(パニクります。) 普通、これだけの内容からすれば、別記事にすべきでしょうけれど面倒で。それと記事のタイトルを変更しました。
もう一つ余談です。
世は「宇宙時代に入った」とかなり昔から云われます。地球の標準時はフランスにある国際度量衡局が決定しています。協定世界時(UTC)といいます。9時間を足せば日本時間になります。(関連する過去記事があります。)
一方、太陽系内の各惑星の1日(自転時間)はまちまちです。例えば、水星は59日、金星 243日地球 23時間56分4秒、火星 24時間37分23秒 、木星9時間50分30秒、土星 10時間14分、天王星 11時間、海王星 16時間、 冥王星 6日9時間だとされます。(太陽系の惑星一覧)を参照ください。
2016年2月18日「なぜ1年は12ヶ月なのか? フトマニ図とホツマツタエから分かること」に書いたように、古代の縄文人は1年が365日4分の1余りだと知っており、その上で方角は2,4,8,16分割しましたが、”月”は(4×3)=12分割しました。何故、彼らは「ヨツミツワケテ」1年を12ヶ月にしたのでしょう?
云いたいこと。もし人類が他の惑星に住むならば、縄文人と同じ思考をするはずです。その惑星の1日を元に現地で使用する時間を作るはずです。そこでも12分割・24分割を基準にするだろうことは想像できます。 協定世界時(10進数による12の倍数)は、地球のローカルルールに過ぎないということです。本当に「人類が宇宙時代に入る」というのならば、12進数がグローバル・ルールになるだろうと考えます。ある科学者が「地球人類は人工惑星(永久宇宙船)を作るべき」かつ「12進数の数学システムが有効」と云ったのは、人類の夢想を促すことでなく、具体的なアドバイスだと感じます。
追記 2/15 Arduinoベースのデジタル時計を作りました。atmega328pにはRTC(リアルタイムクロック)がありませんので、RTC IC DS1307を使いました。無駄な部分もありますが、こんなものでしょう。
写真8
2行表示で、上の行に西暦の年・月・日と曜日を表示します。下の行に時・分・秒とアラームの時刻です。アラームを設定した場合は”AL”が表示されます。高級言語は便利です。RTCを呼ぶだけで曜日の計算から全部やってくれます。
ところで、これを12進数表示にするか迷っています。あまりインパクトがない。因みに西暦2019年は、12進数の西暦で120312年です。今日は212月1312日です。これに時・分・秒を考えるとほんとややこしいです。
写真9
ブログランキングの応援と広告のクリックをお願いします。