以前書いたSORACOMさんの「ひげデバイス」ことSORACOM LTE-M Button PlusはSeeed Studio XIAOとArduino IDEを使用してコードを作成していたのですが、最近はC言語よりもPythonを使っていることのほうが増えてきていることもあるので、CircuitPythonを使用して同じコードができないかを確認してみたいと思います。
今回は以下のエントリーの内容を移植することにします。
CircuitPythonとは
簡単に言うとAdafruitさんの組み込み向けのPython処理系となります。同じ位置づけのMicroPythonもありますがCircuitPythonはMicroPythonのfolkです😅。
【(Wikipediaより参照)https://ja.wikipedia.org/wiki/CircuitPython】
CircuitPythonはMicroPythonから派生した、教育および初心者向けのオープンソースのプログラミング言語である。CircuitPythonは、Adafruit Industriesが開発を支援しており、Python3プログラミング言語のC言語によるソフトウェア実装である。数種類の現行のマイクロコントローラに移植されている。
【CircuitPythonの公式ページ】
組み込み環境での使用となるため純粋なPythonといいにくい部分もありますが、文法やREPLなどでは似た環境なので、Pythonに詳しい方にとっては導入のハードルが低いですね。またREPLがあるので、USB接続したシリアル通信を使用してコマンドラインからテストが可能になっています。
対応ハードウエアは以下のページ参照
今回使用するのはSeeed Studio XIAO SAMD21となります。切手サイズのかわいいデバイスです。
Seeed Studio XIAO SAMD21www.switch-science.com
CircuitPythonの導入
開発実行環境のダウンロードは以下が参考になります。
手順としては以下となります。
Seeed Studio XIAO SAMD21用の公式CircuitPython Bootloaderをダウンロードしてください。.uf2ファイルがダウンロードされるはずです。Seeed Studio XIAO SAMD21をUSB Type-C経由でPCに接続します。- ジャンパーを使用して
RSTピンを2回素早くショート接続することで、DFUブートローダーモードに入ります。 Arduinoという名前の外付けドライブがPCに現れます。ここでダウンロードしたCircuitPythonの.uf2ファイルをこのArduinoのドライブにドラッグしてコピーを行います。CircuitPythonブートローダーがロードしたら、PCからUSB Type-Cのケーブルを抜き、PCに再接続します。CIRCUITPYという新しい外付けドライブが現れます。- これで
CircuitPythonがSeeed Studio XIAO SAMD21にロードされました! - あとは
pythonプログラムを書き、main.pyという名前をつけてCIRCUITPYドライブにドラッグしてコピーするだけです。
作業は自体は難しくはないのですが、最後にあるRSTピンのショート作業が気を付けたいところです。ピンセットやジャンパピン付きのケーブルなどを使用するとうまくいくと思います。
ジャンパーのショートは以下のような作業です(公式ページ画像参照)

デバイスの準備
使用するデバイスは以下の通りです。
- (SORACOM LTE-M Button Plus)https://soracom.jp/store/5207/
- (Seeed Studio XIAO SAMD21)https://www.switch-science.com/products/7100
- (Seeed Studio XIAO Groveシールド)https://www.switch-science.com/products/6687
- (Grove Relay)https://www.switch-science.com/products/807
- (Grove Mech Keycap)https://www.switch-science.com/products/5352
- その他(ケーブル類)
SORACOM LTE-M Button Plusの設定に関して
SORACOM LTE-M Button Plusの設定に関しては以下の情報を参照してください。個人的なポイントとしては画面を最大化すると、ボタンなどのUIが見当たらないといった困りごとはなくなると思います。
デバイスの接続
デバイスの接続は以前と変わりません。以下のように接続を行います。

Arduinoのスケッチは以下のようになっていました。
SORACOM LTE-M Button Plus と Seeed Studio XIAO SAM…
今回は上記のコードをCircuitPythonに移植してみました。
ライブラリは以下にあるので事前にダウンロードを行います。ライブラリのバージョンはCircuitPythonのバージョンにあわせたものを選択してください。

すべてを格納するとサイズが大きくなるので、必要なものだけをZipファイルの中から導入します。ダウンロードしたライブラリアーカイブの中から以下のライブラリを選択してコピーしましょう。拡張子.mpyはプリコンパイル済みのライブラリです。
- adafruit_pixelbuf.mpy ← これを忘れやすいので注意
- neopixel.mpy


この2つのライブラリをSeeed Studio XIAO SAMD21接続時に見えるCIRCUITPYドライブのlibフォルダに格納します。

Arduino IDEのコード(.ino)とCircuitPythonのコードの違いはDigitalIOの制御がdigitalioというライブラリになっていたり、NeoPixel用のライブラリをneopixelというライブラリに変更している点が大きな違いです。また、Arduinoのコード記述ではsetup()、loop()といった決まった形がありますが、CircuitPythonのコードでは不要なので、その点も変更点になります。loop()の無限ループ処理にCPU資源の浪費を防ぐため明示的に遅延を与えている点は大きく異なっていますね。
main.py
import board import digitalio import neopixel import time # ピンの設定 out_pin = board.D0 # リレー出力の設定 button_pin = board.D2 # ボタン入力の設定 pixel_pin = board.D3 # NeoPixel出力の設定 pixel_count = 1 # NeoPixelの初期化 strip = neopixel.NeoPixel(pixel_pin, pixel_count, brightness=0.2, auto_write=False) # リレー、ボタンの初期化・設定 out = digitalio.DigitalInOut(out_pin) out.direction = digitalio.Direction.OUTPUT button = digitalio.DigitalInOut(button_pin) button.direction = digitalio.Direction.INPUT button.pull = digitalio.Pull.UP old_state = False while True: # ボタンの状態を読み取り new_state = not button.value if new_state and not old_state: time.sleep(0.02) # チャタリング防止のための遅延 new_state = not button.value # 再度確認 if new_state: # NeoPixelを赤色に設定 strip[0] = (255, 0, 0) strip.show() out.value = True # リレー出力をHIGHに設定 time.sleep(0.2) out.value = False # リレー出力をLOWに設定 time.sleep(0.15) # NeoPixelをクリア strip.fill((0, 0, 0)) strip.show() old_state = new_state time.sleep(0.01) # 無駄なCPU使用を避けるための小さな遅延
このコードをmain.pyとしてSeeed Studio XIAO SAMD21に格納すれば起動後、自動的にこのコードが実行されます。エラーがある場合には実行は停止するので、うまく動作しないときにはシリアル接続などでエラーを確認するとよいでしょう。
動作後にSORACOM Harvest Dataを確認すると、実行の様子が確認できます。

メールでもお知らせしてくれますね。

おわりに
組み込みのPython処理系の1つであるCircuitPythonを使用して、SORACOM LTE-M Button Plusのサンプルコードの移植を行ってみました。以前に比べれば組み込みデバイスのメモリも増え、スケッチレベルでもPythonなどを用いて開発することにもかなり抵抗感は減ってきているのかもしれません。
