akadako (Python) マニュアル
フィジカルコンピューティングデバイス AkaDako を Python から制御するためのライブラリです。
JavaScript 版ライブラリ akadako.js もあります。
列挙・値クラス・エラーは AkaDako のメンバーとして参照できるため、from akadako import AkaDako だけで一通り使えます。たとえば AkaDako.ServoWrite.A1、AkaDako.Color.RED、AkaDako.Rainbow(50) のように書けます(本マニュアルのコード例では個別 import の形を使っていますが、どちらの書き方でも動作します)。
導入
pip install akadako
ネットワーク通信(共有サーバ)も使う場合:
pip install "akadako[share]"
ボードとは MIDI 上の Firmata プロトコルで通信します。接続には python-rtmidi(依存に含まれます)を使用します。
実行環境について
本ライブラリは同期(ブロッキング)API です。await は不要で、gpiozero などの Python フィジカルコンピューティング系ライブラリと同様にそのまま呼び出せます。
基本構造
import time
from akadako import AkaDako
board = AkaDako.connect() # 接続(ブロッキング)
# 切断時の処理を先に登録しておく
board.on_disconnected(lambda: print("切断されました"))
try:
# メインループ
while board.is_connected:
# ここにセンサー読み取りや制御を記述
time.sleep(0.1) # 負荷軽減
finally:
board.disconnect()
接続・切断
▶ AkaDako.connect(name_filter=None)
ボードに接続し、接続済みの AkaDako インスタンスを返します。MIDI ポート名に name_filter を含むデバイスを探します。見つからない場合は RuntimeError を送出します。
name_filter を省略すると、既定で STEAM BOX / MidiDako / AkaDako のいずれかを名前に含むデバイスを探します(個体によって MIDI ポート名が異なるため)。特定の名前のみを対象にしたい場合は文字列、または複数指定したい場合は文字列のリストを渡せます。
board = AkaDako.connect() # 既定の名前候補で自動検出
board = AkaDako.connect("STEAM BOX") # 名前を明示
board = AkaDako.connect(["AkaDako", "MyDev"]) # 複数候補
▶ board.disconnect()
ボードを切断します。
▶ board.is_connected
接続中かどうかを返すプロパティ(bool)。
while board.is_connected:
...
▶ board.on_disconnected(handler)
切断時に呼ばれるコールバックを登録します。
board.on_disconnected(lambda: print("切断されました"))
バージョン情報
▶ board.fetch_version()
ボードのバージョンを {"type", "major", "minor"} の辞書で返します(取得できない場合は None)。
▶ board.fetch_uid()
ボードの UID を 16 進文字列で返します。非対応のボードでは NotSupportedError。
センサー入力
いずれもボードと通信して値を取得するブロッキング呼び出しです。値は約 100ms 間キャッシュされます。
▶ board.fetch_optical_distance()
レーザー測距 I2C センサーの距離(cm, おおよそ 10〜200)。9 サンプルの中央値ノイズ除去を行います。
print(board.fetch_optical_distance()) # 例: 42.3
▶ board.fetch_brightness()
光 I2C センサーの明るさ(lx)。
▶ board.fetch_temperature()
環境 I2C センサー(BME280)の温度(°C)。
▶ board.fetch_pressure()
環境 I2C センサーの気圧(hPa)。
▶ board.fetch_humidity()
環境 I2C センサーの湿度(%)。
▶ board.fetch_water_temperature_a()
デジタル A に接続した水温センサーの温度(°C)。
▶ board.fetch_acceleration_x() / _y() / _z()
加速度 I2C センサーの各軸の加速度(m/s²)。
▶ board.fetch_acceleration_magnitude()
加速度の絶対値(m/s²)。
▶ board.fetch_pitch()
ピッチ角(度)。
▶ board.fetch_roll()
ロール角(度)。
アナログ入力(最新値・I/O 往復なし)
▶ board.analog(target)
アナログ入力の値を 0〜100(%)で返します。target は AnalogRead.A1 などのコネクター。
from akadako import AnalogRead
print(board.analog(AnalogRead.A1))
print(board.analog_a1()) # 上と同じ
print(board.analog_brightness()) # 内蔵アナログ光センサー
ショートカット: analog_a1() / analog_a2() / analog_b1() / analog_b2() / analog_brightness()。
デジタル入力(最新値・I/O 往復なし)
▶ board.digital(target)
デジタル入力が High かどうかを bool で返します。target は DigitalRead.A1 など。
from akadako import DigitalRead
print(board.digital(DigitalRead.A1))
print(board.digital_a1()) # 上と同じ
print(board.motion_sensor()) # 内蔵人感センサー
ショートカット: digital_a1() / digital_a2() / digital_b1() / digital_b2() / motion_sensor()。
サーボモーター
▶ board.run_servo_turn(target, speed, angle)
サーボ target(ServoWrite.A1 など)を、速度 speed(0〜100%)で angle 度(-90〜90、0が中央)にします。
from akadako import ServoWrite
board.run_servo_turn(ServoWrite.A1, 50, 90)
カラーLED (NeoPixel)
色は Color(単色)または Rainbow(虹色)で指定します。設定はバッファされ、run_color_led_show() で反映されます。
▶ board.run_color_led_set_strip(target, length)
カラーLED target(ColorLed.A1 / ColorLed.ON_BOARD など)の長さ(LED 個数, 0〜60)を設定します。
▶ board.run_color_led_set_color(target, position, color)
position 番目(1 始まり)の LED を color にします。
from akadako import ColorLed, Color
board.run_color_led_set_strip(ColorLed.A1, 8)
board.run_color_led_set_color(ColorLed.A1, 1, Color.RED)
board.run_color_led_show()
▶ board.run_color_led_fill_color(target, color)
すべての LED を color で塗りつぶします。Rainbow を渡すと虹色になります。
from akadako import Rainbow
board.run_color_led_fill_color(ColorLed.A1, Rainbow(50))
board.run_color_led_show()
▶ board.run_color_led_shift_color(target, n, loop)
色の並びを n 個ずらします。loop=True で端をループします。
▶ board.run_color_led_show()
設定した色を反映して点灯します。
▶ board.run_color_led_clear(target)
target の LED をすべて消します。
デジタル出力
▶ board.run_digital_set(target, level)
target(DigitalWrite.A1、DigitalWrite.RELAY_ON_BOARD など)を level(True=HIGH / False=LOW)にします。
from akadako import DigitalWrite
board.run_digital_set(DigitalWrite.A1, True)
PWM 出力
▶ board.run_pwm_set(target, level, min_interval=None)
target(PwmWrite.A1、PwmWrite.VIBRATION_MOTOR_ON_BOARD など)をデューティー比 level(0〜100%)にします。min_interval(ms)を指定すると同一ピンへの連続書き込みの最小間隔を確保します。
from akadako import PwmWrite
board.run_pwm_set(PwmWrite.VIBRATION_MOTOR_ON_BOARD, 80)
プルアップ抵抗
▶ board.run_pin_bias_set(pin, bias)
入力ピン pin(DigitalReadPin.A1 など)のプルアップを設定します。bias は PinBias.PULL_UP または PinBias.NONE。
from akadako import DigitalReadPin, PinBias
board.run_pin_bias_set(DigitalReadPin.A1, PinBias.PULL_UP)
赤外線リモコン
▶ board.run_ir_remote_send(target, command)
赤外線リモコン target(IrRemoteWrite.A1 または IrRemoteWrite.ON_BOARD)からボタン command(0〜9)を送信します。
from akadako import IrRemoteWrite
board.run_ir_remote_send(IrRemoteWrite.ON_BOARD, 1)
I2C 通信
▶ board.run_i2c_write(address, register, data)
I2C デバイス(address)の register に data(int または list[int])を書き込みます。
▶ board.fetch_i2c_read(address, register, length)
I2C デバイスから length バイト読み取り、list[int] を返します。
import time
# 温湿度センサー SHT31 (0x44) の例
board.run_i2c_write(0x44, 0x24, [0x00])
time.sleep(0.02)
data = board.fetch_i2c_read(0x44, 0x00, 6)
内蔵センサーと同じアドレスの外部デバイスは衝突するため使用できません。
ネットワーク通信(共有サーバ)
pip install "akadako[share]" が必要です。
▶ board.run_share_connect(group_id)
グループ ID(半角英数字)を指定して通信サーバに接続します。
▶ board.run_share_send(label, data)
label を付けて data を送信します。
▶ board.shared_data(label)
受信済みの label のデータを返します(未受信なら空文字)。
▶ board.is_share_server_connected
通信サーバに接続しているかを返すプロパティ。
board.run_share_connect("myroom")
board.run_share_send("temp", board.fetch_temperature())
print(board.shared_data("temp"))
色 (Color / Rainbow)
▶ Color
from akadako import Color
Color.RED # 定義済みの色
Color(255, 0, 0) # RGB から作成
Color.RED.brightness(50) # 明るさを 50% に
定義済み: RED / ORANGE / YELLOW / GREEN / BLUE / INDIGO / VIOLET / PURPLE / WHITE / BLACK。
▶ Rainbow
from akadako import Rainbow
Rainbow(50) # 明るさ 50% の虹色(LED の位置で色が変わる)
コネクター定数一覧
| 列挙 | 用途 | メンバー |
|---|---|---|
DigitalRead |
デジタル入力 | A1 A2 B1 B2 BUTTON_A BUTTON_B MOTION_SENSOR |
DigitalReadPin |
プルアップ対象 | A1 A2 B1 B2 |
DigitalWrite |
デジタル出力 | A1 A2 B1 B2 RELAY_ON_BOARD |
AnalogRead |
アナログ入力 | A1 A2 B1 B2 |
ServoWrite |
サーボ | A1 A2 B1 B2 |
PwmWrite |
PWM 出力 | A1 A2 B1 B2 VIBRATION_MOTOR_ON_BOARD |
ColorLed |
カラーLED | A1 A2 B1 B2 ON_BOARD |
IrRemoteWrite |
赤外線 | A1 ON_BOARD |
PinBias |
プルアップ設定 | NONE PULL_UP |
エラー
メソッドは状況に応じて以下の例外を送出します(すべて AkaDakoError のサブクラス)。
| 例外 | 意味 |
|---|---|
DisconnectedError |
デバイスが切断されている |
NotSupportedError |
利用できない機能 |
InvalidValueError |
使用できない値 |
InvalidConnectorError |
使用できないコネクター |
BusyError |
デバイスが使用中 |
from akadako import DisconnectedError, NotSupportedError
try:
board.fetch_temperature()
except NotSupportedError:
print("センサーが接続されていません")
except DisconnectedError:
print("ボードが切断されています")
使用例: 距離に応じて LED と振動を変化させる
import time
from akadako import AkaDako, ColorLed, Color, PwmWrite
board = AkaDako.connect()
try:
board.run_color_led_set_strip(ColorLed.ON_BOARD, 1)
while board.is_connected:
d = board.fetch_optical_distance() # cm
if d < 20:
board.run_color_led_fill_color(ColorLed.ON_BOARD, Color.RED)
board.run_pwm_set(PwmWrite.VIBRATION_MOTOR_ON_BOARD, 80)
else:
board.run_color_led_fill_color(ColorLed.ON_BOARD, Color.GREEN)
board.run_pwm_set(PwmWrite.VIBRATION_MOTOR_ON_BOARD, 0)
board.run_color_led_show()
time.sleep(0.1)
finally:
board.disconnect()