faces向けREPLのmicroPythonはちょっと残念だった

とても楽しかったのだけれど外部のi2cデバイスなどを使いたい場合など、facesもi2cデバイスなのでバッティングするのか何なのかわからないけれどスクリプトは動いたり動かなかったり。
雰囲気を楽しむにはいいけど実用にはちょっと…。

そこでM5Cloudの方のmicroPythonをアップロードして使ってみます。
ファームウェアはオフラインじゃない方。
ampyを使えばm5stackへのファイルの転送は出来るのですがコンソールでREPLを使っていたりするとシリアルポートの奪い合いになってしまって面倒なので落ち着くまでクラウドのIDEを使いましょう。という狙いです。

m5cloudのファームウェアを書き込んでm5cloudのideを使うHowToはあちこちにあると思うので割愛します。

m5cloudファームウェアだけどオフラインを基本にする

2018-04-01-012713_1024x568_scrot.png

クラウドのIDEでboot.pyを編集します。
ifブロックを入れ替えます。
通常ならボタンBを押しながら起動するとオフラインモードになるのですが、逆に何もせず起動すればオフライン、ボタンBを押しながら起動するとオンラインモードになるという動作になります。

これで持ち歩いて使うときに面倒な事になりませんね。?

m5cloud版microPythonファームウェアの様子を伺う

FacesのREPL版と同じようなことをします。

ヘルプ

>>> help()
Welcome to LoBo MicroPython on the ESP32!

For online documentation please visit:
https://github.com/loboris/MicroPython_ESP32_psRAM_LoBo/wiki

For access to the hardware use the 'machine' module:

import machine
pin12 = machine.Pin(12, machine.Pin.OUT)
pin12.value(1)
pin13 = machine.Pin(13, machine.Pin.IN, machine.Pin.PULL_UP)
print(pin13.value())
i2c = machine.I2C(scl=machine.Pin(21), sda=machine.Pin(22))
i2c.scan()
i2c.writeto(addr, b'1234')
i2c.readfrom(addr, 4)

Basic WiFi configuration:

import network
sta_if = network.WLAN(network.STA_IF); sta_if.active(True)
sta_if.scan()                             # Scan for available access points
sta_if.connect("<AP_name>", "<password>") # Connect to an AP
sta_if.isconnected()                      # Check for successful connection

Control commands:
  CTRL-A        -- on a blank line, enter raw REPL mode
  CTRL-B        -- on a blank line, enter normal REPL mode
  CTRL-C        -- interrupt a running program
  CTRL-D        -- on a blank line, do a soft reset of the board
  CTRL-E        -- on a blank line, enter paste mode

For further help on a specific object, type help(obj)
For a list of available modules, type help('modules')

モジュールたち

>>> help('modules')
__main__          heapq             re                upip_utarfile
_boot             inisetup          select            upysh
_thread           io                socket            urandom
ak8963            json              ssd1306           ure
array             logging           ssh               urequests
binascii          m5cloud           ssl               uselect
btree             m5stack           struct            usocket
builtins          machine           sys               ussl
chunk             math              time              ustruct
cmath             microWebSocket    tpcalib           utils
collections       microWebSrv       ubinascii         utime
curl              microWebTemplate  ucollections      utimeq
display           micropython       uctypes           uzlib
errno             mpu6500           uerrno            wave
framebuf          mpu9250           uhashlib          websocket
freesans20        mtftp             uheapq            wificonfig
functools         network           uio               wifisetup
gc                os                ujson             writer
gsm               pye               uos               ymodem
hashlib           random            upip              zlib
Plus any modules on the filesystem

ストレージの様子…IDEで既に見ちゃってますけど。

>>> dir()
['sys', 'buttonA', '__name__', 'lcd', '_boot', 'wifisetup', 'm5cloud', 'os', 'gc', 'buttonB']
>>> dir(os)
['__name__', 'uname', 'urandom', 'dupterm', 'dupterm_notify', 'ilistdir', 'listdir', 'mkdir', 'rmdir', 'chdir', 'getcwd', 'getdrive', 'remove', 'rename', 'stat', 'statvfs', 'mountsd', 'umountsd', 'sdconfig', 'SDMODE_SPI', 'SDMODE_1LINE', 'SDMODE_4LINE']
>>> os.listdir()
['boot.py', 'main.py', 'config.json']

しっかりとm5stackモジュールもあるし9軸IMU、mpu9250のモジュールも見えてます。
よしよし、じゃあちょっとお試し。

>>> import machine as m
>>> i2c = m.I2C(scl=m.Pin(22),sda=m.Pin(21))
>>> i2c.scan()
[8, 104]

ヘルプには scl21sda22 と書いてあるんですが逆です。
まともに動かなくてしばらく悩みましたが逆なんです。気をつけましょう。

で、i2c scanの結果は2つほどデバイスが見つかります。
8face184mpu9250ですね。

お試しでfaceからデータを受け取ってみます。

>>> import time
>>> while True:
...     print(i2c.readfrom(8,1))
...     time.sleep(0.5)
... 
b'q'
b'w'
b'e'
b'r'

キーボードを打つとそのまま文字が入ってくるようです。
faceのREPL版でこれを試すとエラーで止まっちゃうんですがこちらはしっかり動くようですねー。安心安心。

気になるのはキーボードfaceにはCTRLキーがなくて、逆にALTキーはあるのに何も動作してない風なあたり。 facesはAVRのATMega328で動いてるのでフツーのArduinoなんですが。どうなってるのか一度みないといけなさそうですね。気に入らなければ書き換えられるあたりとてもよい感じです。

SDも使いたいじゃん?

せっかく付いてるんだから使いたいですよねぇ。
使い方を探ります。
m5cloud版microPythonのチュートリアルはここにあるので眺めるとありますねー、SD Card

なんか無闇に簡単なサンプルプログラムですがそのまま動かしてみます。

>>> import uos
>>> uos.mountsd()
W (1965945) sdspi_host: spi bus changed (1 -> 2)
---------------------
 Mode: SPI
 Name: 12042
 Type: SDHC/SDXC
Speed: default speed (25 MHz)
 Size: 3830 MB
  CSD: ver=1, sector_size=512, capacity=7843840 read_bl_len=9
  SCR: sd_spec=2, bus_width=5
>>> uos.listdir('/sd')
[]

SDカードには何も入っていないので結果は空なんですが動作はしているようです。
じゃあちょっと書いてみましょうかぁ。

>>> with open("/sd/test","w") as f:
...     f.write("hello")
... 
5
>>> f.close()
>>> uos.listdir('/sd')
['test']
>>> with open("/sd/test") as f:
...     c=f.read()
... 
>>> f.close()
>>> print(c)
hello

動いてますねーうれしいですねー。
いろんな使い方があると思いますけども読み込んだあとexecすれば実行もできますし、このあたりはさすがpythonってとこですかね。いい感じです。

ボリュームが異様に大きいというアレ

m5stackユーザーの間では有名な話で本体を改造したりっていう話も散見されるのですがあんまり互換性を失いたくない。のでどうするのかちょいとやってみましょう。

>>> from m5stack import *
>>> speaker.volume(0.01)
>>> speaker.tone(freq=440, timeout=200)

こんな感じ。0.01でも十分なボリュームです一体なにがあったんでしょうね。

グラフィックもためしとく。

>>> lcd.pixel(100,100,lcd.RED)

画面の微妙な位置に赤い点が出ました。グラフィックも大丈夫そうです。

とりあえず〆

face向けREPL版microPythonはおそらくmicroPythonをとりあえず動くようにしたバージョンで今後良くなるのかもしれませんしタダのデモなのかもしれません。
m5cloud版を使うことですべての機能を快適に使えそうですね?
何らかの参考になれば幸いです。

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