CircuitPythonでSORACOM LTE-M Button Plusのコード移植に挑戦!

以前書いたSORACOMさんの「ひげデバイス」ことSORACOM LTE-M Button PlusSeeed Studio XIAOArduino IDEを使用してコードを作成していたのですが、最近はC言語よりもPythonを使っていることのほうが増えてきていることもあるので、CircuitPythonを使用して同じコードができないかを確認してみたいと思います。

今回は以下のエントリーの内容を移植することにします。

uepon.hatenadiary.com

CircuitPythonとは

簡単に言うとAdafruitさんの組み込み向けのPython処理系となります。同じ位置づけのMicroPythonもありますがCircuitPythonMicroPythonのfolkです😅。

【(Wikipediaより参照)https://ja.wikipedia.org/wiki/CircuitPython

CircuitPythonはMicroPythonから派生した、教育および初心者向けのオープンソースプログラミング言語である。CircuitPythonは、Adafruit Industriesが開発を支援しており、Python3プログラミング言語C言語によるソフトウェア実装である。数種類の現行のマイクロコントローラに移植されている。

【CircuitPythonの公式ページ】

circuitpython.org

組み込み環境での使用となるため純粋なPythonといいにくい部分もありますが、文法やREPLなどでは似た環境なので、Pythonに詳しい方にとっては導入のハードルが低いですね。またREPLがあるので、USB接続したシリアル通信を使用してコマンドラインからテストが可能になっています。

対応ハードウエアは以下のページ参照

circuitpython.org

今回使用するのはSeeed Studio XIAO SAMD21となります。切手サイズのかわいいデバイスです。

Seeed Studio XIAO SAMD21www.switch-science.com

CircuitPythonの導入

開発実行環境のダウンロードは以下が参考になります。

circuitpython.org

手順としては以下となります。

  1. Seeed Studio XIAO SAMD21用の公式CircuitPython Bootloaderをダウンロードしてください。.uf2ファイルがダウンロードされるはずです。
  2. Seeed Studio XIAO SAMD21USB Type-C経由でPCに接続します。
  3. ジャンパーを使用してRSTピンを2回素早くショート接続することで、DFUブートローダーモードに入ります。
  4. Arduinoという名前の外付けドライブがPCに現れます。ここでダウンロードしたCircuitPython.uf2ファイルをこのArduinoのドライブにドラッグしてコピーを行います。
  5. CircuitPythonブートローダーがロードしたら、PCからUSB Type-Cのケーブルを抜き、PCに再接続します。CIRCUITPYという新しい外付けドライブが現れます。
  6. これでCircuitPythonSeeed Studio XIAO SAMD21にロードされました!
  7. あとはpythonプログラムを書き、main.pyという名前をつけてCIRCUITPYドライブにドラッグしてコピーするだけです。

作業は自体は難しくはないのですが、最後にあるRSTピンのショート作業が気を付けたいところです。ピンセットやジャンパピン付きのケーブルなどを使用するとうまくいくと思います。 ジャンパーのショートは以下のような作業です(公式ページ画像参照)

https://files.seeedstudio.com/wiki/Seeeduino-XIAO/img/XIAO-reset.gif

バイスの準備

使用するデバイスは以下の通りです。

SORACOM LTE-M Button Plusの設定に関して

SORACOM LTE-M Button Plusの設定に関しては以下の情報を参照してください。個人的なポイントとしては画面を最大化すると、ボタンなどのUIが見当たらないといった困りごとはなくなると思います。

uepon.hatenadiary.com

users.soracom.io

バイスの接続

バイスの接続は以前と変わりません。以下のように接続を行います。

Arduinoのスケッチは以下のようになっていました。

SORACOM LTE-M Button Plus と Seeed Studio XIAO SAM…

今回は上記のコードをCircuitPythonに移植してみました。

ライブラリは以下にあるので事前にダウンロードを行います。ライブラリのバージョンはCircuitPythonのバージョンにあわせたものを選択してください。

circuitpython.org

すべてを格納するとサイズが大きくなるので、必要なものだけを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などを用いて開発することにもかなり抵抗感は減ってきているのかもしれません。

/* -----codeの行番号----- */