機能拡張ボードを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:詳細はこちらのページを参照しましょう。
【board:Board specific pin names】
ボードベース(XIAO)ピン名の共通コンテナ。
これらはボードごとに異なる為、このモジュールを使用する時に移植性を期待しないでください。
警告
ボードモジュールはボードによって異なります。
ここに記載されているAPIは、特定のボードで使用できる場合とできない場合があります。
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]を
押してみます。
こんな感じで"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.