機能拡張ボードをCircuitPythonで開発

[概要]   [ArduinoIDEで開発] 〔Seeeduino XIAOの使い方に戻る〕


せっかくなので機能拡張ボード用のプログラムをCircuitPythonで開発&実験したいと思います。

《開発の準備》

@ ”Seeeduino XIAOでCircuitPythonを動作させます(基本編)”を見て、
  Seeeduino XIAOボードにCircuitPythonをインストールして置きましょう。

A ”CircuitPythonのエディタ(Mu-導入編)”を見てMuエディタをインストールして置きましょう。

《CircuitPython用のライブラリ準備》

こちらのページのライブラリダウンロード方法は上手く行かないので、私が行った方法を記述して置きます

@ このページを開きます、
  そこにある"adafruit-circuitpython-bundle-6.x-mpy-20210113.zip"をダウンロードしました
  このファイルはCircuitPythonの"6.x"バンドル用です。(又、20210113名は変わるでしょう)

A ダウンロードファイルを解凍させます。
  "libディレクトリ"内いからSeeeduino XIAOボード内の[CIRCUITPY]->[lib]ディレクトリへ
  下記ファイルをコピーします。
  ・adafruit_bus_device のディレクトリ
  ・adafruit_framebuf.mpy ファイル
  ・adafruit_ssd1306.mpy ファイル
  ・adafruit_sdcard.mpy ファイル
  "examplesディレクトリ"内いからSeeeduino XIAOボード内の[CIRCUITPY]ディレクトリへ
  下記ファイルをコピーします。
  ・font5x8.bin ファイル

《動作サンプル》

この例では、XIAO機能拡張ボードのボタンを使用してSeeeduinoXIAOのLEDを制御する方法を紹介します

@ Seeeduino XIAOを機能拡張ボードに取り付けてから、PCとType-Cケーブルを接続します。

A Muエディタを開き、下記コードをコピーしてXIAOの[CIRCUITPY]ディレクトリへ"main.py"として
  保存しましょう。(保存後、コードは自動的に実行されます)
------------------------------------------------------------
import board
from digitalio import DigitalInOut, Direction, Pull

# 本体のLED(D13)ピンを初期化
led = DigitalInOut(board.D13)
led.direction = Direction.OUTPUT
# 拡張ボードの押しボタンスイッチ(D1)ピンを初期化
sw = DigitalInOut(board.D1)
sw.direction = Direction.INPUT
sw.pull = Pull.UP

while True:
    if sw.value:           # 押されていない場合はHIGH(TRUE)
        led.value = True   # LED OFF
    else:
        led.value = False  # LED ON
------------------------------------------------------------

digitalio:Basic digital pin】

 digitalioモジュールには、基本的なデジタルIOへのアクセスを提供するクラスが含まれています。

 全てのクラスはハードウェアの状態を変更する為、使用後にプログラムを続行する場合は、
 不要になった時に初期化を解除する必要があります。
 これを行うには、deinit() を呼び出すか、コンテキストマネージャーを使用します。
 詳細については、Lifetime and ContextManagersを参照してください。

digitalio一覧

 digitalio:詳細はこちらのページを参照しましょう。

board:Board specific pin names】

 ボードベース(XIAO)ピン名の共通コンテナ。
 これらはボードごとに異なる為、このモジュールを使用する時に移植性を期待しないでください。

 警告
 ボードモジュールはボードによって異なります。
 ここに記載されているAPIは、特定のボードで使用できる場合とできない場合があります。

board一覧

 board:詳細はこちらのページを参照しましょう。

《OLED》

機能拡張ボードに搭載の”0.96 128x64 有機EL OLED グラフィック表示ディスプレイ(SSD1306)”を
動作させてみます。

@ Seeeduino XIAOを機能拡張ボードに取り付けてから、PCとType-Cケーブルを接続します。

A Muエディタを開き、下記コードをコピーしてXIAOの[CIRCUITPY]ディレクトリへ"main.py"として
  保存しましょう。
------------------------------------------------------------
import board
import busio
import adafruit_ssd1306

# I2Cの初期化
i2c = busio.I2C(board.SCL, board.SDA)
# OLEDの初期化
display = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c, addr=0x3c)

print("start")
display.fill(0)  # 表示をクリア
display.rect(0,0,127,63,1)           # 四角形の表示
display.text('hello world', 2, 2, 1) # テキスト(5x8)の表示
display.show()   # 表示の更新
------------------------------------------------------------

busio:Hardware accelerated external bus access】

 busioモジュールには、さまざまなシリアルプロトコルをサポートするクラスが含まれています。

 マイクロコントローラがハードウェアアクセラレーション方式の動作をサポートしていない場合、
 内部でソフトシリアルを使用する場合があります。
 但し、ハードウェアサポートがピンのサブセットで利用可能であるが、提供されている物ではない場合、
 RuntimeErrorが発生します。
 bitbangioモジュールを使用して、汎用ピンでシリアルプロトコルを明示的にソフト入出力します。

 全てのクラスはハードウェアの状態を変更する為、使用後にプログラムを続行する場合は、
 不要になった時に初期化を解除する必要があります。 これを行うには、deinit()を呼び出すか、
 コンテキストマネージャーを使用します。
 詳細については、Lifetime and ContextManagersを参照してください。

 busio:詳細はこちらのページを参照しましょう。

adafruit_ssd1306

 adafruit_ssd1306:詳細はこちらのページを参照しましょう。
 adafruit_framebuf:詳細はこちらのページを参照しましょう。

 ・display.fill(color)
  画面全体を塗りつぶします。
  color = 0は黒色、1は白色

 ・display.invert(color)
  画面全体の色を反転させます。
  color = 0は黒色地、1は白色地

 ・display.show()
  画面表示の更新。

 ・display.text(string, x, y, color)
  指定した場所からテキスト文字列を表示させます。
  string = 表示させる文字列を指定
  x   = 表示を開始する横の座標位置
  y   = 表示を開始する縦の座標位置
  color = 0は黒色、1は白色

 ・display.pixel(x, y, color)
  指定した場所に1ドットを描画します。
  x   = 1ドット表示を開始する横の座標位置
  y   = 1ドット表示を開始する縦の座標位置
  color = 0は黒色、1は白色

 ・display.line(x_0, y_0, x_1, y_1, color)
  開始座標位置から終了座標位置まで線を描画します。
  x_0  = 描画開始位置の横の座標位置
  y_0  = 描画開始位置の縦の座標位置
  x_1  = 描画終了位置の横の座標位置
  y_1  = 描画終了位置の縦の座標位置
  color = 0は黒色、1は白色

 ・display.rect(x, y, width, height, color)
  指定大きさの四角形を描画します(塗りつぶさない)。
  x   = 左上の角、描画開始位置の横の座標位置
  y   = 左上の角、描画開始位置の縦の座標位置
  width = 四角形の横の長さを指定
  height = 四角形の縦の長さを指定
  color = 0は黒色、1は白色

 ・display.fill_rect(x, y, width, height, color)
  指定大きさの四角形を描画します(塗りつぶす)。
  x   = 左上の角、描画開始位置の横の座標位置
  y   = 左上の角、描画開始位置の縦の座標位置
  width = 四角形の横の長さを指定
  height = 四角形の縦の長さを指定
  color = 0は黒色、1は白色

 ・display.circle(x, y, radius, color)
  指定された中心点の位置、半径、及び色で円を描きます。
  x   = 中心点位置の横の座標位置
  y   = 中心点位置の縦の座標位置
  radius = 円の半径の長さを指定
  color = 0は黒色、1は白色

 ・display.scroll(delta_x, delta_y)
  フレームバッファ(画面全体)を指定場所(x/y)方向にシフト(コピー)します。
  delta_x= 画面をシフトさせる横の座標位置
  delta_y= 画面をシフトさせる縦の座標位置

《MicroSDカード》

@ PCのテキストエディターで25文字程度の半角英数字文字列を8行以内程度作成し、
  "test.txt"としてMicroSDカードに保存してしましょう。

A PCのテキストエディターで下記コードをコピーして"buzzer.py"でMicroSDカードに保存して
  SDカードを機能拡張ボードにセットしましょう
------------------------------------------------------------
import time
import board
import pulseio
 
buzzer = pulseio.PWMOut(board.A3)
 
while True:
    buzzer.duty_cycle = 32767
    time.sleep(0.5)
    buzzer.duty_cycle = 0
    time.sleep(0.5)
------------------------------------------------------------
B Seeeduino XIAOを機能拡張ボードに取り付けてから、PCとType-Cケーブルを接続します。

C Muエディタを開き、下記コードをコピーしてXIAOの[CIRCUITPY]ディレクトリへ"sd.py"として
  保存しましょう。
------------------------------------------------------------
import adafruit_sdcard
import board
import busio
import digitalio
import storage
import sys

# カードに接続し、SeeeduinoXIAOのファイルシステムをマウントします。
spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
cs = digitalio.DigitalInOut(board.D2)
sdcard = adafruit_sdcard.SDCard(spi, cs)
vfs = storage.VfsFat(sdcard)
storage.mount(vfs, "/sd")
# SDカードへのパスに切り替えます
sys.path.append("/sd")
sys.path.append("/sd/lib")
------------------------------------------------------------
D 更に、下記コードをコピーしてXIAOの[CIRCUITPY]ディレクトリへ"main.py"として
  保存しましょう。
------------------------------------------------------------
import sd

fd = open("/sd/test.txt", "r")   # SDカードからファイルを読み取る
print(fd.read())                 # 内容を表示する
------------------------------------------------------------
E シリアルモニター(TerTerm等)を起動させ、[CTRL]+[c]を押して次に[CTRL]+[d]を
  押してみます。

MicroSD実行画面
こんな感じで"test.txt"の内容が表示されるでしょう。
何ともぉ拍子抜けに簡単に出来てしまいましたね。

F 次にMicroSDカードに保存した"buzzer.py"を動作させてみます。
  Muエディタで、"main.py"に"import buzzer"行を追加して「保存」ボタンをクリックします。
------------------------------------------------------------
import sd
import buzzer # この行を追加しましょう

fd = open("/sd/test.txt", "r")   # SDカードからファイルを読み取る
print(fd.read())                 # 内容を表示する
------------------------------------------------------------
H 機能拡張ボードのブザーが鳴っています、耳を近づけましょう。
  「お、音が小っせ、こんなブザーいらんわ〜」
  尚、"test.txt"内容が表示されないのは、"buzzer.py"内でプログラムがループしているので
  そこから下のコードが実行されていないからで〜すぅ。
  尚、"import buzzer"をprint行の下に持っていたら表示&ブザーが動作はしたがぁ...いいのぉ?

pulseio:Support for individual pulse based protocols】

 pulseioモジュールには、基本的なパルスIOへのアクセスを提供するクラスが含まれています。
 個々のパルスは、通常、赤外線リモコンやDHT温度センサーで使用されます。
 警告  PWMOutはpwmioに移行しており、CircuitPython7のpulseioから削除されます。

 全てのクラスはハードウェアの状態を変更する為、使用後にプログラムを続行する場合は、
 不要になった時に初期化を解除する必要があります。 これを行うには、deinit()を呼び出すか、
 コンテキストマネージャーを使用します。
 詳細については、Lifetime and ContextManagersを参照してください。

 pulseio:詳細はこちらのページを参照しましょう。

time:time and timing related functions】

 時間モジュールは、CPython時間モジュールの厳密なサブセットです。
 なのでMicroPythonで記述されたコードはCPythonで機能しますが、必ずしもその逆ではありません。

 time:詳細はこちらのページを参照しましょう。

storage:Storage management】

 ストレージは、マウントやアンマウントなどのストレージ管理機能を提供します。
 これらは通常、Pythonをホストしているオペレーティングシステムによって処理されます。
 CircuitPythonにはOSがないため、このモジュールはこの機能を直接提供します。

 storage:詳細はこちらのページを参照しましょう。

sys:system specific functions】

 sys.path - インポートされたモジュールを検索する為のディレクトリの変更可能なリスト。
       要するに、"import"したモジュールは指定のディレクトリも検索すると言う事だな。

 sys:詳細はこちらのページを参照しましょう。

adafruit_sdcard:SD card over SPI driver】

 SPIバスを使用するSDカード用のCircuitPythonドライバー。

 SPIバスとCSピンが必要です。
 デバイスをファイルシステムとしてマウント出来る様に、readblocksメソッドとwriteblocksメソッドを
 提供します。

 adafruit_sdcard:詳細はこちらのページを参照しましょう。

《その他》

CircuitPythonで開発すると取っても比較的簡単でコードも短くてすむと最初は良かったのですがぁ....
"Seeeduino XIAO"はとにかくメモリが少なすぎる、少し凝ったコードや複数の周辺機器を繋いだコードを
記述しよう物なら直ぐメモリ容量不足してしまいます。
これでは何かに組み込んだり等の作成ができない、だ、ダメだぁ諦めたArduino IDEに逆戻りですぅ。
"Seeeduino XIAO"でCircuitPythonの勉強もままならない時期尚早ですね。

空きメモリ確認	画面
使用可能なバイト数20Kバイト程と言う事の様ですぅ。

メモ1
 "xxx.py"から"xxx.mpy"の作成に[mpy-cross]が関係しておりこれをmakeするらしい?良く解らない。
 後ぉ、"mpy-tool.py"や"mpy_cross_all.py"や"mpy_bin2res.py"等が有るがぁ...解からん!
 「MinGW」インストールすればmakeファイル有るかなぁと思ったがぁ無いぞぉ!
 何方か優しく教えて欲しいですぅ。
メモ2
 RTCのPCF8563用はMicorPythonでの記述だがこちらのGitHubにある。
 CircuitPython用に変更してみたのだがぁ、"RuntimeError: Function requires lock"や
 "MemoryError: memory allocation failed, allocating 96 bytes"等が発生して止めてしまった。




【きむ茶工房ガレージハウス】
Copyright (C) 2006-2021 Shigehiro Kimura All Rights Reserved.