CircuitPythonをつかってみた
Adafruitが提唱するCircuitPythonなるものをつかってマイコンのコーディングをしてみましたのでご報告いたします。
マイコン向けのPython環境であるMicroPythonをAdafruit社のマイコン用に派生させたのがCircuitPythonです。Pythonのように少ない記述で高い機能を実現できて、当然コンパイルの必要もなく書き込みも簡単にできました♪
目次
CircuitPython対象マイコン
以下にサポートされているマイコンの一覧が記載されています。
https://github.com/adafruit/circuitpython
ここではAdafruit ItsyBitsy M0 Express を使用しました。
マイコンセットアップ
CircuitPythonで生成したコードを書きこむための設定をします。マイコンボードをUSBでPCに接続します。接続時に新しいディスクとして”CIRCUITPY”と表示されていれば特に何もしなくでOKです。
“ITSYBOOT”(マイコンによって違う名前)などと表示される場合はCircuitPythonをインストールします。各ボードのインストーラは以下にあります。
https://circuitpython.org/downloads
ここではAdafruit ItsyBitsy M0 Expressのインストーラをダウンロードします。
https://circuitpython.org/board/itsybitsy_m0_express/
“DOWNLOAD.UF2 NOW”でインストーラであるUF2ファイルをダウンロードし、”ITSYBOOT”フォルダにドラッグします。以後は”CIRCUITPY”と表示されるようになり以上でCircuitPythonを使用するマイコン環境が整いました。
マイコンをつなげても何も表示されない場合はRESETボタンをダブルクリックしてLEDが緑色になるとPCにディスクとして表示されます。
エディタ
コーディングのエディタとしてMuを使用しました。以下でダウンロードしてインストールします。
https://codewith.mu/en/download
Mu起動後モードはAdafruit CircutPythonを選択します。
マイコンを接続して”CIRCUITPY”として認識されていればMuからコード書き込みやシリアルコンソールでの表示を確認することが可能です。
コーディング
Muエディタで以下のLチカコードを書いてみます。
1 2 3 4 5 6 7 8 9 10 11 12 |
import board import digitalio import time led = digitalio.DigitalInOut(board.D13) led.direction = digitalio.Direction.OUTPUT while True: led.value = True time.sleep(0.5) led.value = False time.sleep(0.5) |
コード記載後に”保存”クリックでmain.pyとして書き込みます。するとすぐに書き込まれ動作します。
簡単!
コードも記述少なくて楽ですね。さすがPython!
バーサライタやってみた
さっそくCircutPythonでバーサライタを試してみました。
構成
LED回転部への給電はワイヤレスチャージでおこない、フォトリフレクタセンサで回転検知します。
部品
- マイコン Adafruit Itsy Bitsy M0 Express
- フォトリフレクタ QTR-1A
- LEDテープ Dotstar
- ワイヤレスチャージモジュール
- マブチモーター RS-540SH
- 単3電池×1 ケース
- 単3電池×3 ケース
-
ミニスライドスイッチ
-
モーター シャフトカップリング ジョイント
CircuitPythonコード
CircuitPython用のSPIやDotstar LED用のライブラリを予めダウンロードして”CIRCUITPY”のライブラリフォルダlibに保存します。
- https://github.com/adafruit/Adafruit_CircuitPython_BusDevice
- https://github.com/adafruit/Adafruit_CircuitPython_DotStar
フォトリフレクタで1周する時間を測定して、1周を36分割して赤、緑、青、水色を表示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
import board import time import adafruit_dotstar as dotstar from digitalio import DigitalInOut, Direction intR = DigitalInOut(board.D7) intR.direction = Direction.INPUT Div = 36 NUMPIXELS = 24 pixel = dotstar.DotStar(board.APA102_SCK, board.APA102_MOSI, 1) pixel[0] = (0, 0, 0) dots = dotstar.DotStar(board.SCK, board.MOSI, NUMPIXELS, brightness=1, auto_write=False, pixel_order=dotstar.BGR,baudrate=30000000) d = [bytearray(b'\xff\x00\x00\x0a\xff\x00\x00\x0a\xff\x00\x00\x0a\xff\x00\x00\x0a\xff\x00\x00\x0a\xff\x00\x00\x0a\xff\x00\x00\x0a\xff\x00\x00\x0a\xff\x00\x00\x0a\xff\x00\x00\x0a\xff\x00\x00\x0a\xff\x00\x00\x0a\xff\x00\x00\x0a\xff\x00\x00\x0a\xff\x00\x00\x0a\xff\x00\x00\x0a\xff\x00\x00\x0a\xff\x00\x00\x0a\xff\x00\x00\x0a\xff\x00\x00\x0a\xff\x00\x00\x0a\xff\x00\x00\x0a\xff\x00\x00\x0a\xff\x00\x00\x0a'), bytearray(b'\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00\xff\x00\x0a\x00'), bytearray(b'\xff\x0b\x00\x00\xff\x0b\x00\x00\xff\x0b\x00\x00\xff\x0b\x00\x00\xff\x0b\x00\x00\xff\x0b\x00\x00\xff\x0b\x00\x00\xff\x0b\x00\x00\xff\x0b\x00\x00\xff\x0b\x00\x00\xff\x0b\x00\x00\xff\x0b\x00\x00\xff\x0b\x00\x00\xff\x0b\x00\x00\xff\x0b\x00\x00\xff\x0b\x00\x00\xff\x0b\x00\x00\xff\x0b\x00\x00\xff\x0b\x00\x00\xff\x0b\x00\x00\xff\x0b\x00\x00\xff\x0b\x00\x00\xff\x0b\x00\x00\xff\x0b\x00\x00'), bytearray(b'\xff\x0a\x0a\x00\xff\x0a\x0a\x00\xff\x0a\x0a\x00\xff\x0a\x0a\x00\xff\x0a\x0a\x00\xff\x0a\x0a\x00\xff\x0a\x0a\x00\xff\x0a\x0a\x00\xff\x0a\x0a\x00\xff\x0a\x0a\x00\xff\x0a\x0a\x00\xff\x0a\x0a\x00\xff\x0a\x0a\x00\xff\x0a\x0a\x00\xff\x0a\x0a\x00\xff\x0a\x0a\x00\xff\x0a\x0a\x00\xff\x0a\x0a\x00\xff\x0a\x0a\x00\xff\x0a\x0a\x00\xff\x0a\x0a\x00\xff\x0a\x0a\x00\xff\x0a\x0a\x00\xff\x0a\x0a\x00')] rotState = 0 oldTime = 0 numRot = 0 rotTime = 0 divState = 0 numDiv = 0 # MAIN LOOP while True: if intR.value and rotState == 1: rotState = 0 elif intR.value == 0 and rotState == 0: nowTime = time.monotonic() rotTime = nowTime - oldTime oldTime = nowTime print(rotTime) rotState = 1 numRot += 1 if divState == 1 and (time.monotonic() - oldTime) > (rotTime / Div * numDiv): divState = 0 elif divState == 0 and (time.monotonic() - oldTime) < (rotTime / Div * (numDiv + 1)): divState = 1 dots._buf[4:4+4*24] = d[numDiv % 4] dots.show() numDiv += 1 if numDiv >= Div: numDiv = 0 |
動作
#Adafruit ItsyBitsy M0 Expressマイコン #circuitPython でコーディング。SPI入力のLEDテープでバーサライタ。割り込みが実現できず現状36分割。。。circuitPythonは書き込み早くて便利だからどうにかしたい。#進捗牛歩 #環境変わるとゼロから #直感的にできない #調べながら pic.twitter.com/cDuu0xuq8z
— HomeMadeGarbage (@H0meMadeGarbage) 2019年3月24日
考察
結論から言いますとCircuitPythonはArduino IDEでのコーディングと比較すると処理は遅いです。ただコード記述は少なくて済みますし何より書き込みが非常に早くて簡単です。コンパイルないので当然ですが。
CircuitPythonでちょっと痛いのが割り込みをサポートしておりません。
https://learn.adafruit.com/introducing-itsy-bitsy-m0/frequently-asked-questions
ちょっとバーサライタには適応は厳しいと感じましたが、通常使用時にはPythonでサクサク記述して素早く色々できそうです。