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