REPLがやっぱり恋しい。

どこでも単体でプログラミング出来る小さなコンピュータというのは悲願でありました。
ちょっと手を伸ばせば届きそうな距離にいるんです。何とかしたい。

そもそもREPLってなんだ。

Read-eval-print loopの頭文字をとってREPL
読んで、実行して表示して。これを繰り返す。

while True:
    c = input(">>>")
    exec(c)

某所で教えてもらったサイトにこの様なコードがありました。
まさに読んで、実行(表示)してループするプログラムです。
基本はこれでいいのですが考えることは多い。

  • 入力したコードにエラーがあるとこのシンプルなREPLはエラーで止まってしまう。
  • ループ処理などの複数行に渡るコードを実行(入力)できない。
  • そもそもM5stack Faceのキーボードはinput文で処理できない。

いろいろと課題はあるのですが頑張ってみましょう。

とりあえずKeyboard Faceから文字を入力

これが出来ないことには話になりません。
前のポストでちらっと触れているとおりFacesはi2cデバイスですのでコールバックさせるなりポーリングするなりして値を取らないといけません。

普段何気なく使っているキーボード、結構大変。

keyboardTest.py
from machine import *
i2c = I2C(sda=21,scl=22)

while True:
    c = i2c.readfrom(8,1)
    if c[0] != 0:
        lcd.print(c)
        print(c[0])

こんなスクリプトをPCからM5stackに接続してREPLで実行してやります。

簡単に解説。
I2CはmicroPythonのmachineモジュールの中に存在しています。
他にもいろいろとmachineモジュールには用事が多いのだけどいちいちmachine.I2Cとか打つのは面倒くさいので一気にfrom machine import *と読み込んでいます。

keyboard faceのi2cデバイスアドレスは 8 ですのでそこから1byte読み込み。
もし入力が無かった場合、b'\x00' を返します。
bなんちゃらってのはpythonではバイト列を意味します。これが結構厄介なんですが事を簡単にするために数値として取り出して比較しています。

byte列の入った変数Cは配列です。
添字を使って値を取り出してやると数値型として扱えます。
microPythoncircutPythonではよく使うので覚えておいて損は無い?

そして、入力された文字が b'0\x00'でなければ、画面に表示、ついでに数値としてコンソールに表示しています。

keyboardinput.jpg

Keyboard faceを利用しての入力テストの様子

現時点での課題。

まず最初に気づくのがバックスペースのこと。
文字コード的には入ってくるけど画面が更新されるわけではない。
文字が消せないというのはやってみると、結構きつい。
単純に表示するだけではダメだってことが解ります。

どっちにしてもexecしなきゃいけないのでバッファに格納するなりしないといけません。

つぎに気になったこと。
FN+機能キーを入力すると 255 が返ってきます。
faceのソースコードを見ないと何とも言えませんが、どういう事になってるか調査が必要。

ALTは相変わらず謎。

そんなところでしょうか。
次はバッファリングなどを追加してバックスペースで文字が消せるやつ。なんとかしたいです。
が、そこに立ちはだかるフォント問題ッ つづく

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.