akadako.js マニュアル

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

導入

HTML ファイルからスクリプトタグで読み込みます。

<script src="https://699.jp/src/js/akadako.js"></script>

読み込むと AkaDako がグローバルに利用可能になります。

実行環境について

セキュリティ上の理由により、HTML ファイルをダブルクリックして開く (file:// プロトコル) と、AkaDako.connect() が動作しない場合があります。VSCode の Live Server 拡張機能や、Web サーバー上での実行を推奨します。

基本構造

akadako.js は非同期処理 (async/await) を中心に設計されています。以下の構造で記述することを推奨します。

<script src="https://699.jp/src/js/akadako.js"></script>
<script>
(async () => {
  try {
    const board = await AkaDako.connect(); // 接続待ち

    // 切断時の処理を先に登録しておく
    board.onDisconnected(() => {
      console.log("切断されました");
    });

    // メインループ
    while (board.isConnected) {
      // ここにセンサー読み取りや制御を記述
      await new Promise(resolve => setTimeout(resolve, 100)); // 負荷軽減
    }
  } catch (e) {
    console.error("エラー:", e);
  }
})();
</script>

接続・切断

AkaDako.connect()

ボードに接続します。Web MIDI API を使用して接続を試みます。

const board = await AkaDako.connect();

board.disconnect()

ボードを切断します。

board.disconnect();

board.isConnected

ボードが接続中かどうかを返すプロパティです。

if (board.isConnected) {
  // 接続中
}

board.onDisconnected(handler)

AkaDako.connect() で取得したインスタンスに対して、切断時のコールバックを登録します。setInterval の解除など、後片付け処理をここで行います。

const board = await AkaDako.connect();

const interval = setInterval(async () => {
  const value = board.analog(AkaDako.AnalogRead.A1);
  console.log(value);
}, 200);

board.onDisconnected(() => {
  clearInterval(interval);
  console.log("ボードが切断されました");
});

センサー入力

board.fetchOpticalDistance()

レーザー距離センサー (VL53L0X) で距離を測定します。ノイズ除去 (メディアンフィルタ) が適用されます。

const distance = await board.fetchOpticalDistance();
console.log(distance + "cm");

board.fetchBrightness()

光センサー (LTR303) で明るさを測定します。

const lux = await board.fetchBrightness();

board.fetchTemperature()

環境センサー (BME280) で温度を測定します。

const temp = await board.fetchTemperature();

board.fetchPressure()

環境センサー (BME280) で気圧を測定します。

const pressure = await board.fetchPressure();

board.fetchHumidity()

環境センサー (BME280) で湿度を測定します。

const humidity = await board.fetchHumidity();

board.fetchWaterTemperatureA()

デジタル A に接続した水温センサーで温度を測定します。

const waterTemp = await board.fetchWaterTemperatureA();

board.fetchAccelerationX() / Y() / Z()

加速度センサー (KXTJ3 または ADXL345) で各軸の加速度を取得します。

const x = await board.fetchAccelerationX();
const y = await board.fetchAccelerationY();
const z = await board.fetchAccelerationZ();

board.fetchAccelerationMagnitude()

加速度の絶対値 (3軸の合成) を取得します。

const magnitude = await board.fetchAccelerationMagnitude();

board.fetchPitch()

ピッチ角を取得します。

const pitch = await board.fetchPitch();

board.fetchRoll()

ロール角を取得します。

const roll = await board.fetchRoll();

board.fetchVersion()

ボードのファームウェアバージョンを取得します。

const version = await board.fetchVersion();

board.fetchUid()

ボードの一意な識別子を取得します。

const uid = await board.fetchUid();

アナログ入力

board.analog(target)

指定コネクターのアナログ値を読み取ります。

const value = board.analog(AkaDako.AnalogRead.A1);

デジタル入力

board.digital(target)

指定コネクターのデジタル値を読み取ります。

const isHigh = board.digital(AkaDako.DigitalRead.A1);

サーボモーター

board.runServoTurn(target, speed, angle)

サーボモーターを指定の速度と角度で動かします。

await board.runServoTurn(AkaDako.DigitalWrite.A1, 50, 90);

カラーLED (NeoPixel)

board.runColorLedSetStrip(target, length)

LED ストリップの長さを設定します (最大 60)。

await board.runColorLedSetStrip(AkaDako.ColorLed.A1, 10);

board.runColorLedSetColor(target, position, color)

指定位置の LED の色を設定します。

await board.runColorLedSetColor(AkaDako.ColorLed.OnBoard, 1, AkaDako.Color.Red);

board.runColorLedFillColor(target, color)

全 LED を指定色で塗りつぶします。

await board.runColorLedFillColor(AkaDako.ColorLed.OnBoard, AkaDako.Color.Blue);

board.runColorLedShiftColor(target, n, loop)

LED の色を n 個分シフトします。

await board.runColorLedShiftColor(AkaDako.ColorLed.A1, 1, true);

board.runColorLedShow()

LED の変更を反映 (表示) します。色を設定した後に呼び出してください。

await board.runColorLedShow();

board.runColorLedClear(target)

LED を消灯します。

await board.runColorLedClear(AkaDako.ColorLed.OnBoard);

デジタル出力

board.runDigitalSet(target, level)

デジタルピンを HIGH または LOW に設定します。

await board.runDigitalSet(AkaDako.DigitalWrite.A1, true);  // HIGH
await board.runDigitalSet(AkaDako.DigitalWrite.A1, false); // LOW

PWM 出力

board.runPwmSet(target, level, minInterval?)

PWM のデューティー比を設定します。振動モーターやファンの制御に使用します。

await board.runPwmSet(AkaDako.PwmWrite.VibrationMotorOnBoard, 50);

プルアップ抵抗

board.runPinBiasSet(pin, bias)

ピンのプルアップ抵抗を設定します。

await board.runPinBiasSet(AkaDako.DigitalReadPin.A1, AkaDako.PinBias.PullUp);

赤外線リモコン

board.runIrRemoteSend(target, command)

赤外線リモコンのコマンドを送信します。

await board.runIrRemoteSend(AkaDako.IrRemoteWrite.A1, 1);

I2C 通信

任意の I2C デバイスと直接通信するための汎用メソッドです。

board.runI2cWrite(address, register, data)

I2C デバイスにデータを書き込みます。

// BME280 のレジスタに書き込む例
await board.runI2cWrite(0x76, 0xF4, [0x4F]);

board.fetchI2cRead(address, register, length)

I2C デバイスからデータを読み取ります。通信に失敗すると undefined を返すことがあるため、必ず戻り値の存在を確認してからデータ処理を行ってください。

// BME280 のチップIDを読む例
const data = await board.fetchI2cRead(0x76, 0xD0, 1);
if (data) {
  console.log(data); // [96]  (0x60 = BME280)
}

I2C 使用例: 温湿度センサー SHT31 (0x44) の読み取り

const board = await AkaDako.connect();

// 測定開始コマンド送信
await board.runI2cWrite(0x44, 0x24, [0x00]);

// 100ms 待ってからデータ読み取り
await new Promise(resolve => setTimeout(resolve, 100));
const data = await board.fetchI2cRead(0x44, 0x00, 6);

if (data) {
  // 温度の計算 (data[0]:上位, data[1]:下位)
  const rawTemp = (data[0] << 8) | data[1];
  const temperature = -45 + 175 * (rawTemp / 65535);
  console.log(`温度: ${temperature.toFixed(1)}°C`);
} else {
  console.error("I2C 読み取りに失敗しました");
}

I2C 使用時の注意: アドレスの衝突

AkaDako の「探究ツール」「タコラッチ」には I2C デバイスが内蔵されています。外部 I2C センサーを接続する際、内蔵デバイスとアドレスが衝突すると全てのレジスタが 0 を返し、正常に通信できません。

内蔵デバイスアドレス
VL53L0X (距離センサー)0x08
BME280 (温湿度・気圧)0x76
LTR303 (光センサー)0x29

同じアドレスの外部センサー(例: TCS3472 = 0x29)は使用できません。


ネットワーク通信

AkaDako の通信サーバー (ws.akadako.com) を介して、複数のデバイス間でデータをやり取りできます。同じグループ ID を指定したデバイス同士でデータが共有されます。

board.runShareConnect(groupId)

通信サーバーに接続します。

await board.runShareConnect("myGroup123");

board.runShareSend(label, data)

通信サーバーにデータを送信します。送信間隔は最低 1 秒です。

await board.runShareSend("temperature", 25.3);
await board.runShareSend("message", "hello");

board.sharedData(label)

通信サーバーから受信したデータを取得します。同期メソッドで、受信済みのキャッシュから値を返します。

const temp = board.sharedData("temperature");  // "25.3"
const msg  = board.sharedData("message");      // "hello"

board.isShareServerConnected

通信サーバーに接続中かどうかを返すプロパティです。

if (board.isShareServerConnected) {
  await board.runShareSend("status", "online");
}

色 (Color / Rainbow)

AkaDako.Color

RGB 値から色を作成します。

// 定義済みの色
AkaDako.Color.Red
AkaDako.Color.Orange
AkaDako.Color.Yellow
AkaDako.Color.Green
AkaDako.Color.Blue
AkaDako.Color.Indigo
AkaDako.Color.Violet
AkaDako.Color.Purple
AkaDako.Color.White
AkaDako.Color.Black

// カスタム色
const pink = new AkaDako.Color(255, 105, 180);

// 明るさの調整 (50%)
const dimRed = AkaDako.Color.Red.brightness(50);

AkaDako.Rainbow

虹色のグラデーションを生成します。runColorLedFillColorrunColorLedSetColor で使用します。

const rainbow = new AkaDako.Rainbow(80); // 明るさ 80%
await board.runColorLedFillColor(AkaDako.ColorLed.OnBoard, rainbow);
await board.runColorLedShow();

エラー

全てのエラーは Error を継承しています。

エラークラス説明
AkaDako.NotSupportedErrorボードが対応していない機能
AkaDako.DisconnectedErrorボード未接続
AkaDako.InvalidValueError不正な引数値
AkaDako.InvalidConnectorError不正なコネクター指定
AkaDako.BusyErrorデバイスが使用中 (サーボ等)
try {
  const distance = await board.fetchOpticalDistance();
} catch (e) {
  if (e instanceof AkaDako.DisconnectedError) {
    console.log("ボードが切断されています");
  }
}

使用例: 距離に応じて LED と振動を変化させる

<script src="https://699.jp/src/js/akadako.js"></script>
<script>
(async () => {
  const board = await AkaDako.connect();

  const interval = setInterval(async () => {
    try {
      const distance = await board.fetchOpticalDistance();
      // 距離 10〜40cm を 0〜1 にマッピング (近いほど大きい)
      const level = 1 - Math.max(0, Math.min(1, (distance - 10) / (40 - 10)));

      // 振動モーターを制御
      await board.runPwmSet(AkaDako.PwmWrite.VibrationMotorOnBoard, 100 * level);

      // LED を赤色で点灯 (明るさを距離で制御)
      await board.runColorLedFillColor(
        AkaDako.ColorLed.OnBoard,
        AkaDako.Color.Red.brightness(100 * level)
      );
      await board.runColorLedShow();
    } catch (e) {
      console.error(e);
    }
  }, 200);

  board.onDisconnected(() => {
    clearInterval(interval);
    console.log("ボードが切断されました");
  });
})();
</script>