投稿日: Jun 09, 2019 11:58:29 AM
ふと思いついて8080vmをSmileBASICに移植した。
もはやお家芸というか、慣れたもんです。
しかも今回はmicroPythonやPython上で動くように作ったpyeightyという実装の移植。
もともとメモリが豊富な環境でスクリプト言語にて動かすことを想定したものだから簡単に移植できた。
現状バイナリを直接打ち込んで動作させている。
で、かなりきつい。
この環境で1kbyte以上のバイナリを手打ちとか考えたくない。
そこで色々考えた。
いろいろ考えた中からUSB接続のテンキーを乗っ取って入力装置を作ることにした。
いろいろなテンキーを物色して見た目と値段とのバランスが良いエレコムのこれに決定。
すでに分解されてますが分解には道具とコツが必要。
テンキーと一言でいってもいろいろな方法で実装されていて、このテンキーはすごく素直な実装がされていてハックしやすい感じです。見た目もいいしやったね。
このちっちゃい基板がメインボードになります。テンキーとしての機能がいらないならこれだけ使ってもいいかもしれないけどわたしは普段は普通のテンキーとして使えて、外部から操作して入力を自動化も出来る。というのにしたかったので元の形は崩さないようにすることにしました。
基板の裏側にパターンが出ていたのでそこを利用させていただいて配線。
諸々考えて0と1とエンターだけ打てればいいやと、そういった割り切った感じ。
ジャンパー当てまくってどこが該当のピンになるか調べました。
結果として5つのピンが該当。ブレイクアウトします。
打鍵をコントロールするためにフォトカプラー(トライアック)を利用しました。
写真の配線ちょっと間違えていてこのあと直しました。
本当は筐体の中に仕込みたかったのですけれども薄型のスタイリッシュさ故に部品を入れる隙間がなくて断念。
詰め込めば入ったかもしれないけど無理をしないのがモットーなので。
さて普通に10キーとしても使えて、コントロール信号を送れば0と1とエンターが打てるのを確認したので実際のコントロール環境です。
Raspberry PiのGPIOを使うかmicroPython…pyBoardあるいはCircuitPythonボードしか考えられません。
いずれかですね。値段を考えるとCircuitPythonのM0ボードかなーという気はします。
とりあえずpyBoardで書いてみた。
Hello World! を送信する。
import pyb
import time
key_enter = pyb.Pin("Y3",pyb.Pin.OUT_PP)
key_zero = pyb.Pin("Y4",pyb.Pin.OUT_PP)
key_one = pyb.Pin("Y5",pyb.Pin.OUT_PP)
def type_key(key):
key.high()
time.sleep(0.0095)
key.low()
time.sleep(0.0095)
def h2b(val):
for i in range(8):
print( val , (val & (1 << (7 - i))), 1<<(7 - i) )
if val & (1<<(7 - i)) != 0:
type_key(key_one)
else:
type_key(key_zero)
type_key(key_enter)
data = "Hello World!".encode()
for d in data:
h2b(d)
type_key(key_enter)
キータイプなので、同期とかは気にする必要ありません。
ただ、やっぱり速度は出ません。速くしすぎると打鍵が追いつかずにビットが落ちてデータが化けます。
あとは単にバイナリをMSB FIRSTでデコードして送りつけるだけです。簡単。
SmileBASIC側では Input命令をつかって簡単に実装。
A = 0
INPUT A
A = STR$(A)
DATA = VAL("&B" + A )
こんな感じでバイナリに戻すんですが、ただ。
インプットに使った変数、初期化しなおさないとおかしい動きします。
あと、STR$命令ですね、ゼロサプレスしやがります。
もろもろあります。そういう障害を超えて先へ進めです。
ハードウェアのハックから、こういうものの運用まで誰の助けも借りられない茨の道です。蛇の道です。
似たような真似しようとするならそれなりに覚悟をもって自己責任でゴーです。