以前書いた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などを用いて開発することにもかなり抵抗感は減ってきているのかもしれません。