フィジカルコンピューティングデバイス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 を使用して接続を試みます。
Promise<AkaDako> — 接続された AkaDako インスタンスconst board = await AkaDako.connect();
board.disconnect()ボードを切断します。
board.disconnect();
board.isConnectedボードが接続中かどうかを返すプロパティです。
booleanif (board.isConnected) {
// 接続中
}
board.onDisconnected(handler)AkaDako.connect() で取得したインスタンスに対して、切断時のコールバックを登録します。setInterval の解除など、後片付け処理をここで行います。
function(): voidconst 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) で距離を測定します。ノイズ除去 (メディアンフィルタ) が適用されます。
Promise<number> — 距離 (cm)、10〜200 の範囲const distance = await board.fetchOpticalDistance();
console.log(distance + "cm");
board.fetchBrightness()光センサー (LTR303) で明るさを測定します。
Promise<number> — 明るさ (lx)、最大 64000const lux = await board.fetchBrightness();
board.fetchTemperature()環境センサー (BME280) で温度を測定します。
Promise<number> — 温度 (°C)const temp = await board.fetchTemperature();
board.fetchPressure()環境センサー (BME280) で気圧を測定します。
Promise<number> — 気圧 (hPa)const pressure = await board.fetchPressure();
board.fetchHumidity()環境センサー (BME280) で湿度を測定します。
Promise<number> — 湿度 (%)const humidity = await board.fetchHumidity();
board.fetchWaterTemperatureA()デジタル A に接続した水温センサーで温度を測定します。
Promise<number> — 温度 (°C)const waterTemp = await board.fetchWaterTemperatureA();
board.fetchAccelerationX() / Y() / Z()加速度センサー (KXTJ3 または ADXL345) で各軸の加速度を取得します。
Promise<number> — 加速度 (m/s²)const x = await board.fetchAccelerationX();
const y = await board.fetchAccelerationY();
const z = await board.fetchAccelerationZ();
board.fetchAccelerationMagnitude()加速度の絶対値 (3軸の合成) を取得します。
Promise<number> — 加速度の絶対値 (m/s²)const magnitude = await board.fetchAccelerationMagnitude();
board.fetchPitch()ピッチ角を取得します。
Promise<number> — ピッチ (度)const pitch = await board.fetchPitch();
board.fetchRoll()ロール角を取得します。
Promise<number> — ロール (度)const roll = await board.fetchRoll();
board.fetchVersion()ボードのファームウェアバージョンを取得します。
Promise<string>const version = await board.fetchVersion();
board.fetchUid()ボードの一意な識別子を取得します。
Promise<string> — 16進数文字列const uid = await board.fetchUid();
board.analog(target)指定コネクターのアナログ値を読み取ります。
AkaDako.AnalogRead.[A1|A2|B1|B2]number — 0〜100 のスケール値const value = board.analog(AkaDako.AnalogRead.A1);
board.digital(target)指定コネクターのデジタル値を読み取ります。
AkaDako.DigitalRead.[A1|A2|B1|B2|ButtonA|ButtonB|MotionSensor]boolean — HIGH なら trueconst isHigh = board.digital(AkaDako.DigitalRead.A1);
board.runServoTurn(target, speed, angle)サーボモーターを指定の速度と角度で動かします。
AkaDako.DigitalWrite.[A1|A2|B1|B2]number — 速度 0〜100 (%)number — 角度 (度)await board.runServoTurn(AkaDako.DigitalWrite.A1, 50, 90);
board.runColorLedSetStrip(target, length)LED ストリップの長さを設定します (最大 60)。
AkaDako.ColorLed.[A1|A2|B1|B2|OnBoard]number — LED の数 (最大 60)await board.runColorLedSetStrip(AkaDako.ColorLed.A1, 10);
board.runColorLedSetColor(target, position, color)指定位置の LED の色を設定します。
AkaDako.ColorLed.[A1|A2|B1|B2|OnBoard]number — LED の位置 (1 から開始)AkaDako.Color または AkaDako.Rainbowawait board.runColorLedSetColor(AkaDako.ColorLed.OnBoard, 1, AkaDako.Color.Red);
board.runColorLedFillColor(target, color)全 LED を指定色で塗りつぶします。
AkaDako.ColorLed.[A1|A2|B1|B2|OnBoard]AkaDako.Color または AkaDako.Rainbowawait board.runColorLedFillColor(AkaDako.ColorLed.OnBoard, AkaDako.Color.Blue);
board.runColorLedShiftColor(target, n, loop)LED の色を n 個分シフトします。
AkaDako.ColorLed.[A1|A2|B1|B2|OnBoard]number — シフト量 (整数)boolean — ループするかawait board.runColorLedShiftColor(AkaDako.ColorLed.A1, 1, true);
board.runColorLedShow()LED の変更を反映 (表示) します。色を設定した後に呼び出してください。
await board.runColorLedShow();
board.runColorLedClear(target)LED を消灯します。
AkaDako.ColorLed.[A1|A2|B1|B2|OnBoard]await board.runColorLedClear(AkaDako.ColorLed.OnBoard);
board.runDigitalSet(target, level)デジタルピンを HIGH または LOW に設定します。
AkaDako.DigitalWrite.[A1|A2|B1|B2|RelayOnBoard]boolean — true で HIGH、false で LOWawait board.runDigitalSet(AkaDako.DigitalWrite.A1, true); // HIGH
await board.runDigitalSet(AkaDako.DigitalWrite.A1, false); // LOW
board.runPwmSet(target, level, minInterval?)PWM のデューティー比を設定します。振動モーターやファンの制御に使用します。
AkaDako.PwmWrite.[A1|A2|B1|B2|VibrationMotorOnBoard]number — デューティー比 0〜100 (%)number (省略可) — 前回の書き込みからの最小間隔 (ms)await board.runPwmSet(AkaDako.PwmWrite.VibrationMotorOnBoard, 50);
board.runPinBiasSet(pin, bias)ピンのプルアップ抵抗を設定します。
AkaDako.DigitalReadPin.[A1|A2|B1|B2]AkaDako.PinBias.None または AkaDako.PinBias.PullUpawait board.runPinBiasSet(AkaDako.DigitalReadPin.A1, AkaDako.PinBias.PullUp);
board.runIrRemoteSend(target, command)赤外線リモコンのコマンドを送信します。
AkaDako.IrRemoteWrite.[A1|OnBoard]number — コマンド番号 (1〜9)await board.runIrRemoteSend(AkaDako.IrRemoteWrite.A1, 1);
任意の I2C デバイスと直接通信するための汎用メソッドです。
board.runI2cWrite(address, register, data)I2C デバイスにデータを書き込みます。
number — I2C アドレス (7bit、例: 0x76)number — レジスタアドレスnumber | number[] — 書き込むバイト値またはバイト配列// BME280 のレジスタに書き込む例
await board.runI2cWrite(0x76, 0xF4, [0x4F]);
board.fetchI2cRead(address, register, length)I2C デバイスからデータを読み取ります。通信に失敗すると undefined を返すことがあるため、必ず戻り値の存在を確認してからデータ処理を行ってください。
number — I2C アドレス (7bit)number — レジスタアドレスnumber — 読み取るバイト数 (1 以上)Promise<number[] | undefined> — 読み取ったバイト配列。通信失敗時は undefined// BME280 のチップIDを読む例
const data = await board.fetchI2cRead(0x76, 0xD0, 1);
if (data) {
console.log(data); // [96] (0x60 = BME280)
}
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 読み取りに失敗しました");
}
AkaDako の「探究ツール」「タコラッチ」には I2C デバイスが内蔵されています。外部 I2C センサーを接続する際、内蔵デバイスとアドレスが衝突すると全てのレジスタが 0 を返し、正常に通信できません。
| 内蔵デバイス | アドレス |
|---|---|
| VL53L0X (距離センサー) | 0x08 |
| BME280 (温湿度・気圧) | 0x76 |
| LTR303 (光センサー) | 0x29 |
同じアドレスの外部センサー(例: TCS3472 = 0x29)は使用できません。
AkaDako の通信サーバー (ws.akadako.com) を介して、複数のデバイス間でデータをやり取りできます。同じグループ ID を指定したデバイス同士でデータが共有されます。
board.runShareConnect(groupId)通信サーバーに接続します。
string — グループ ID(半角英数字)await board.runShareConnect("myGroup123");
board.runShareSend(label, data)通信サーバーにデータを送信します。送信間隔は最低 1 秒です。
string — データのラベルstring | number — 送信するデータawait board.runShareSend("temperature", 25.3);
await board.runShareSend("message", "hello");
board.sharedData(label)通信サーバーから受信したデータを取得します。同期メソッドで、受信済みのキャッシュから値を返します。
string — データのラベルstring — 受信したデータ。未受信の場合は空文字const temp = board.sharedData("temperature"); // "25.3"
const msg = board.sharedData("message"); // "hello"
board.isShareServerConnected通信サーバーに接続中かどうかを返すプロパティです。
booleanif (board.isShareServerConnected) {
await board.runShareSend("status", "online");
}
AkaDako.ColorRGB 値から色を作成します。
// 定義済みの色
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虹色のグラデーションを生成します。runColorLedFillColor や runColorLedSetColor で使用します。
number — 明るさ 0〜100const 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("ボードが切断されています");
}
}
<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>