micropythonをpyboardで試してみる

2017.08.16

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Pythonは、サーバ、データ分析や機械学習などいろいろな場面で活用されています。小型マイコンボード向けにmicropythonという実装があります。micropython向けのマイコンボードpyboard(の互換機)を入手したので、試してみました。pyboardとmicropythonのご紹介です。

pyboard-photo2

はじめに

micropythonは、OS無しで動かす小型マイコンボード用のPython実装です。少ないメモリでも動作するよう最適化されています。 普通のPythonと比べて、利用することのできるモジュールが少ないという違いがありますが、言語仕様としては、ほぼ同じように使えます。

micropythonのターゲットはArduinoと似ています。どちらも小型マイコンで動作します。Arduinoでは専用の開発環境を使って、C++ベースのコードを記述、コンパイルして書き込みます。一方、micropythonの場合は、テキストエディタでスクリプトを書けばそのまま動かせます。

micropythonの良い点は、REPL(Read Eval Print Loop)が動いているので、直接コンソールを開き、Pythonの式を入力、評価して動作確認できることです。試しながら開発を進めることができます。

pyboard

pyboardは、micropythonの標準ボードです。ArduinoのようにGPIO端子がたくさん用意されているので、センサやアクチュエータなど、さまざまなデバイスを繋いで動かすことが可能です。

PYBv1.0

PYBv1.0

USBケーブルでPCと接続し、コードを書き込むことができます。micro SDスロットもあるので、カードからスクリプトを実行することもできるようです。

pyboard-photo

接続してみる

さっそくUSBでPC(Mac)と接続してみます。接続すると、外部ストレージとして認識されます。

pyboard-msd

この中には、READMEやスクリプトなどいくつかファイルが入っています。

pyboard-storage

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でも動作します。こちらは、ネットに直結できますので活用できるシーンは多そうです。また紹介したいと思います。

参考