DeviceScript 入門
Raspberry Pi Pico を使って DeviceScript に入門してみる。とりあえずサンプルにある
が目標。
DeviceScript の VS Code 拡張をインストールする:
VS Code のコマンドパレットから DeviceScript: Create New Project... を実行し、作成するプロジェクトのディレクトリを選びプロジェクト名を入力する。
初期化処理が実行されたが、yarn が見つからないというエラーが発生する。yarn が必要だという記述はドキュメントには見つからないが、仕方がないので yarn をインストールし初期化コマンドを再実行する:
npx --yes @devicescript/cli@latest init --quiet
作成されたプロジェクトにある main.ts や package.json の scripts は以下のようになっていた:
import * as ds from "@devicescript/core"
setInterval(() => {
console.log(":)")
}, 1000)
"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"
}
DeviceScript の拡張から Start Simluator をクリックしてみると UM 37 というシミュレータが立ち上がった。これは DeviceScript のバイトコードを実行する WASM シミュレータらしいが、何が起こっているのか、どうすればいいのかはよくわからない。
とりあえずセットアップはできたようなので、
をそのままトレースしてみる。動画の中では main.ts が最初に作成されているが、自分の場合は main.js なのはなぜなのか...
ブレークポイントを設定し、DeviceScript のデバッグコマンドを
をクリックして呼び出してみると、問題なくブレークポイントは動作している。
コンソールに
VM> :)
VM> :)
VM> :)
のような文字列が出力されている。
動画内ではこのあと
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 が存在しないようで、実行できない。
リファレンス https://microsoft.github.io/devicescript/api/clients/lightbulb を見てもなさそう。おそらく時間が経って削除されてしまったのだろう。
brightness ではなく intensity にすれば OK だった:
続いていよいよハードウェアを用いていく。まずはファームウェアを 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
Connect > Serial を実行したが、adding serial transport (requires "serialport" package)
とだけ表示されて失敗しているように見える。
yarn add serialport
を実行したが特に変わらない。
よくわからないため Linux マシンから Mac mini に変えてやり直したところシリアルポートから接続することができた。
最終的に 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)
コードは以下:
L チカさせるだけで結構時間が掛かってしまった... たくさんの API が生えているようなので、次はもう少し複雑なことに挑戦したいが、一旦はガチャガチャ触ってみて大まかな使用感がわかったので良かった。