micropythonをpyboardで試してみる
Pythonは、サーバ、データ分析や機械学習などいろいろな場面で活用されています。小型マイコンボード向けにmicropythonという実装があります。micropython向けのマイコンボードpyboard(の互換機)を入手したので、試してみました。pyboardとmicropythonのご紹介です。
はじめに
micropythonは、OS無しで動かす小型マイコンボード用のPython実装です。少ないメモリでも動作するよう最適化されています。 普通のPythonと比べて、利用することのできるモジュールが少ないという違いがありますが、言語仕様としては、ほぼ同じように使えます。
micropythonのターゲットはArduinoと似ています。どちらも小型マイコンで動作します。Arduinoでは専用の開発環境を使って、C++ベースのコードを記述、コンパイルして書き込みます。一方、micropythonの場合は、テキストエディタでスクリプトを書けばそのまま動かせます。
micropythonの良い点は、REPL(Read Eval Print Loop)が動いているので、直接コンソールを開き、Pythonの式を入力、評価して動作確認できることです。試しながら開発を進めることができます。
pyboard
pyboardは、micropythonの標準ボードです。ArduinoのようにGPIO端子がたくさん用意されているので、センサやアクチュエータなど、さまざまなデバイスを繋いで動かすことが可能です。
USBケーブルでPCと接続し、コードを書き込むことができます。micro SDスロットもあるので、カードからスクリプトを実行することもできるようです。
接続してみる
さっそくUSBでPC(Mac)と接続してみます。接続すると、外部ストレージとして認識されます。
この中には、READMEやスクリプトなどいくつかファイルが入っています。
boot.pyは初期化スクリプトのようで、内容をみてみると、MSC(Mass Storage Class)のほか、HID(Human Interface Device)として動作させることができるようです。
# boot.py -- run on boot-up # can run arbitrary Python, but best to keep it minimal import machine import pyb #pyb.main('main.py') # main script to run after this one #pyb.usb_mode('VCP+MSC') # act as a serial and a storage device #pyb.usb_mode('VCP+HID') # act as a serial device and a mouse
main.pyは、こちらも起動時に実行されるスクリプトのようです。 デフォルトでは空(コメントのみ)です。
REPL
外部ストレージとして認識されると同時に、USB Serialとしても認識されていますので、ターミナルツールを使って接続することができます。ここではscreenを使います。
$ screen /dev/cu.usbmodem1422 MicroPython v1.8.7-333-ged81574 on 2017-02-28; PYBv1.1 with STM32F405RG Type "help()" for more information. >>>
グリーティングメッセージと、見慣れたPythonのプロンプトが表示されます。STM32F405RGとは、使われているMCUの名前です。STM32というARM Cortex-Mアーキテクチャのチップです。
ヘルプがあるようですので、help()と入力します。
>>> help() Welcome to MicroPython! For online help please visit http://micropython.org/help/. Quick overview of commands for the board: pyb.info() -- print some general information pyb.delay(n) -- wait for n milliseconds pyb.millis() -- get number of milliseconds since hard reset pyb.Switch() -- create a switch object Switch methods: (), callback(f) pyb.LED(n) -- create an LED object for LED n (n=1,2,3,4) LED methods: on(), off(), toggle(), intensity(<n>) pyb.Pin(pin) -- get a pin, eg pyb.Pin('X1') pyb.Pin(pin, m, [p]) -- get a pin and configure it for IO mode m, pull mode p Pin methods: init(..), value([v]), high(), low() pyb.ExtInt(pin, m, p, callback) -- create an external interrupt object pyb.ADC(pin) -- make an analog object from a pin ADC methods: read(), read_timed(buf, freq) pyb.DAC(port) -- make a DAC object DAC methods: triangle(freq), write(n), write_timed(buf, freq) pyb.RTC() -- make an RTC object; methods: datetime([val]) pyb.rng() -- get a 30-bit hardware random number pyb.Servo(n) -- create Servo object for servo n (n=1,2,3,4) Servo methods: calibration(..), angle([x, [t]]), speed([x, [t]]) pyb.Accel() -- create an Accelerometer object Accelerometer methods: x(), y(), z(), tilt(), filtered_xyz() Pins are numbered X1-X12, X17-X22, Y1-Y12, or by their MCU name Pin IO modes are: pyb.Pin.IN, pyb.Pin.OUT_PP, pyb.Pin.OUT_OD Pin pull modes are: pyb.Pin.PULL_NONE, pyb.Pin.PULL_UP, pyb.Pin.PULL_DOWN Additional serial bus objects: pyb.I2C(n), pyb.SPI(n), pyb.UART(n) 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')
GPIOのほか、アナログの入出力も可能なようです。ボタンの入力に対してコールバックも使えるようです。
何が驚きかといえば、こんな小さなボードなのに、readlineのようなヒストリや、コンプリーションが効くことです。例えば、pyb.
と入力してタブキーを押せば、ipythonのようにシンボルの候補一覧が表示されます。
>>> pyb. __name__ fault_debug bootloader hard_reset info unique_id freq repl_info wfi disable_irq enable_irq stop standby main repl_uart usb_mode hid_mouse hid_keyboard USB_VCP USB_HID have_cdc hid millis elapsed_millis micros elapsed_micros delay udelay sync mount Timer rng RTC Pin ExtInt pwm servo Servo Switch Flash SD SDCard LED I2C SPI UART CAN ADC ADCAll DAC Accel LCD
Lチカしてみる
ハードウェアの"Hello World"であるLチカを試してみます。LEDを点滅させるという小さなタスクを通じて、作法やツールについての知見を得るのが目的です。
pyboardには、Green, Red, Orange, Blue の4つのLEDが用意されています。専用のAPIpyb.LED(n)
があり、順番に1~4の番号が振られています。
REPLから以下のコードを入力すればLEDが点灯。
>>> pyb.LED(1).on()
以下のコードを入力すればLEDが消灯します。
>>> pyb.LED(1).off()
そして、REPLの上でwhileループを書けばLチカします。
>>> while True: ... pyb.LED(1).on() ... pyb.delay(250) ... pyb.LED(1).off() ... pyb.delay(250)
Ctrl-Cで止まります。こんな感じでREPL上でなんでも試せるようです。
スクリプトを書き込む
pyboardを接続したときに見える外部ストレージに、main.py がありますので、これをエディタで開き、スクリプトを書き込みます。
# main.py -- put your code here! while True: pyb.LED(1).on() pyb.delay(250) pyb.LED(1).off() pyb.delay(250)
この状態で、リセットボタンを押すか、またはUSBコネクタを抜き差しすると、自動的にスクリプトが動作して、Lチカすることが確認できます。
まとめ
micropython用のマイコンボードpyboardを試してみました。手慣れたPythonでコードが書けるだけでもグッドですが、高機能なREPLが想像以上に便利です。
今回はLEDしか紹介しませんでしたが、pyboardには3軸加速度センサや、RTCが搭載されています。データはmicro SDカードにも書き込めますので、シンプルなデータロガー程度であれば簡単に作れそうです。
pyboardは、公式サイトの他、ebay等でコピー品が売られています。micropythonは、pyboardの他にもSTM32F4が動く多くのマイコンボードをはじめ、WiFiが使えるマイコンとして普及しているESP8266や、ESP32でも動作します。こちらは、ネットに直結できますので活用できるシーンは多そうです。また紹介したいと思います。
参考
- micropython公式サイト: http://micropython.org/
- micropython github (MIT License)
- pyboard github (Creative Commons Attribution 3.0 Unported License)