Closed19

DeviceScript 入門

Shinya FujinoShinya Fujino

VS Code のコマンドパレットから DeviceScript: Create New Project... を実行し、作成するプロジェクトのディレクトリを選びプロジェクト名を入力する。

Shinya FujinoShinya Fujino

初期化処理が実行されたが、yarn が見つからないというエラーが発生する。yarn が必要だという記述はドキュメントには見つからないが、仕方がないので yarn をインストールし初期化コマンドを再実行する:

npx --yes @devicescript/cli@latest init --quiet
Shinya FujinoShinya Fujino

作成されたプロジェクトにある main.ts や package.json の scripts は以下のようになっていた:

main.ts
import * as ds from "@devicescript/core"

setInterval(() => {
    console.log(":)")
}, 1000)
package.json
    "scripts": {
        "setup": "devicescript build --quiet",
        "postinstall": "devicescript build",
        "build:devicescript": "devicescript build src/main.ts",
        "build": "yarn build:devicescript",
        "watch:devicescript": "devicescript devtools src/main.ts",
        "watch": "yarn watch:devicescript",
        "test:devicescript": "devicescript run src/main.ts --test --test-self-exit",
        "test": "yarn test:devicescript",
        "start": "yarn watch"
    }
Shinya FujinoShinya Fujino

DeviceScript の拡張から Start Simluator をクリックしてみると UM 37 というシミュレータが立ち上がった。これは DeviceScript のバイトコードを実行する WASM シミュレータらしいが、何が起こっているのか、どうすればいいのかはよくわからない。

Shinya FujinoShinya Fujino

ブレークポイントを設定し、DeviceScript のデバッグコマンドを

をクリックして呼び出してみると、問題なくブレークポイントは動作している。

Shinya FujinoShinya Fujino

動画内ではこのあと

import * as ds from "@devicescript/core"

const lightBulb = new ds.LightBulb()
setInterval(async () => {
    const brightness = await lightBulb.brightness.read()
    await lightBulb.brightness.write(brightness > 0 ? 0 : 1)
}, 1000)

というコードをシミュレータ上で実行し、シミュレータ上で動作確認をおこなっているが、手元では lightBulb.brightness という API が存在しないようで、実行できない。

Shinya FujinoShinya Fujino

続いていよいよハードウェアを用いていく。まずはファームウェアを Pico に flash する。そのためには、まず Pico をブートローダーモードで接続する。これは基板上の BOOTSEL を押しながら Pico に電源を供給すればいいらしい。そして DeviceScript 拡張のメニューから Connect > Flash Firmware > Raspberry Pi Pico > yes と進んでいく。すると、以下のようなコマンドが実行される:

$ node ./node_modules/.bin/devicescript flash --board pico
using devs: v2.9.13, runtime: v2.9.13, node: v18.16.0 from /home/foo/dev/devicescript-blinky/devicescript-blinky/node_modules/@devicescript/cli/built
using drive /media/foo/RPI-RP2/
fetch https://github.com/microsoft/devicescript-pico/releases/latest/download/devicescript-rp2040-pico.uf2
saved .devicescript/cache/devicescript-rp2040-pico.uf2 387072 bytes
cp .devicescript/cache/devicescript-rp2040-pico.uf2 /media/foo/RPI-RP2/
OK
Shinya FujinoShinya Fujino

Connect > Serial を実行したが、adding serial transport (requires "serialport" package) とだけ表示されて失敗しているように見える。

Shinya FujinoShinya Fujino

よくわからないため Linux マシンから Mac mini に変えてやり直したところシリアルポートから接続することができた。

Shinya FujinoShinya Fujino

最終的に https://microsoft.github.io/devicescript/getting-started/samples/blinky にある以下のサンプルコードを main.ts へとコピーし、Debug から実行して L チカさせることに成功した:

import { pins } from "@dsboard/pico"
import { startLightBulb } from "@devicescript/servers"

// start a lightbulb server on pin GP1
// and store client in `led` variable
const led = startLightBulb({
    pin: pins.P1,
})

// start interval timer every 1000ms
setInterval(async () => {
    // read current brightness
    const brightness = await led.intensity.read()
    // toggle on/off
    const newbrightness = brightness > 0 ? 0 : 1
    // apply new brightness
    await led.intensity.write(newbrightness)
}, 1000)

Shinya FujinoShinya Fujino

L チカさせるだけで結構時間が掛かってしまった... たくさんの API が生えているようなので、次はもう少し複雑なことに挑戦したいが、一旦はガチャガチャ触ってみて大まかな使用感がわかったので良かった。

このスクラップは2023/05/28にクローズされました