Skip to the content.

akadako (Python) マニュアル

フィジカルコンピューティングデバイス AkaDako を Python から制御するためのライブラリです。

JavaScript 版ライブラリ akadako.js もあります。

列挙・値クラス・エラーは AkaDako のメンバーとして参照できるため、from akadako import AkaDako だけで一通り使えます。たとえば AkaDako.ServoWrite.A1AkaDako.Color.REDAkaDako.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(%)で返します。targetAnalogRead.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 で返します。targetDigitalRead.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)

サーボ targetServoWrite.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 targetColorLed.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)

targetDigitalWrite.A1DigitalWrite.RELAY_ON_BOARD など)を levelTrue=HIGH / False=LOW)にします。

from akadako import DigitalWrite
board.run_digital_set(DigitalWrite.A1, True)

PWM 出力

board.run_pwm_set(target, level, min_interval=None)

targetPwmWrite.A1PwmWrite.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)

入力ピン pinDigitalReadPin.A1 など)のプルアップを設定します。biasPinBias.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)

赤外線リモコン targetIrRemoteWrite.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)の registerdata(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()