Spresense SDKで開発してみる その1(環境構築、サンプルアプリケーションの実行)
はじめに
今回はSpresense SDKを利用して、Spresenseにプログラムを書きこんでみました。
Spresenseを使ってハードウェアを開発するならArduino IDEでプログラムを書く方が情報も多くて楽なのですが、なぜSpresense SDKを試すのかというとソフトウェアを開発してみたいからです。
Node-RED MCUではESP32系のマイコンが主にサポートされていて、内部的にはESP-IDF、Moddable SDKが使われているのですが、Spresenseはサポートされていません。そこで、Node-REDのプラグインとして開発できないかなと考え中です。いろんな壁がありそうですが、趣味的にのんびり開発しようと思っています。
▼以前の記事はこちら
関連情報
▼SpresenseのGitHub上のリポジトリはこちら
https://github.com/sonydevworld/spresense
▼Spresense SDKの開発ガイドはこちら
https://developer.sony.com/spresense/development-guides/sdk_developer_guide_ja.html
▼Spresense SDKのIDE版のスタートガイドはこちら。VS Code用の拡張機能があるようです。今回は利用しません。
https://developer.sony.com/spresense/development-guides/sdk_set_up_ide_ja.html
▼CLI版のスタートガイドはこちら。今回はこちらを参照しています。
https://developer.sony.com/spresense/development-guides/sdk_set_up_ja.html
なお、Windows 10だとMSYS2でも環境を構築できるそうですが、私はうまくいかなかったので今回は触れていません。kconfig-conf not foundというエラーが出て、解決できませんでした。
Spresenseをビジュアルプログラミングで開発できる環境は無いか調べてみたのですが、Scratchならありました。
▼こちらの記事ではScratchでSpresenseにプログラムを書きこんでいます。
https://spresense.livedoor.blog/archives/32578726.html
▼SpresenseのAmazonでの販売ページはこちら。今回はメインボードだけ使います。
WSL2のUbuntu 20.04で実行してみる
WSL2の環境はROSを利用していたときに構築済みです。インストール方法はそのときの記事をご覧ください。
▼以前Windows 10のWSL2で環境を構築した、Ubuntu 20.04で実行しています。
ビルドに必要なツールをインストールします。
wget https://raw.githubusercontent.com/sonydevworld/spresense/master/install-tools.sh
bash install-tools.sh
インストールしたツールを使用可能にします。毎回実行する必要があります。
source ~/spresenseenv/setup
リポジトリをcloneします。
git clone --recursive https://github.com/sonydevworld/spresense.git
SpresesnseとUSBシリアルで接続するために、シリアルドライバをインストールする必要があります。
▼以下のリンクをクリックすると、ドライバがインストールされます。
解凍後、インストールを実行します。
▼infファイルを右クリックすると、インストールされます。

WSL2環境とUSBデバイスを接続する
スタートガイドには書かれていなかったのですが、WSL2上のLinux環境でUSBデバイスにアクセスするには少し作業が必要です。
▼WSL2のUbuntuでlsusbを実行しても、CP210xのデバイスは表示されていません。

WindowsのPowerShellを管理者権限で実行し、usbipd listで接続されているデバイスを確認します。
▼今回はCP210xのBUSIDが1-2になっています。

以下のコマンドを入力して、USBデバイスを共有しました。
usbipd bind --busid 1-2
usbipd attach --wsl --busid 1-2
▼ちなみに、管理者権限で実行しないと、以下のようなエラーが表示されます。

その後、WSL2のLinux環境でlsusbを実行すると、CP210xが表示されます。
▼デバイスが認識されています。

この状態で、Linux上でのシリアルポートを確認しました。
dmesg | grep "cp21.*attached"
▼ttyUSB0になっています。

今回のポート名は/dev/ttyUSB0になります。
次にコンフィグレーションを実行します。
cd spresense/sdk
tools/config.py examples/hello
このとき警告が表示されて実行できませんでした。
▼WARNING: New loader v3.2.0 is requiredと表示されています。

▼ブートローダーのインストールのページに、この場合の対処方法が書かれていました。
表示されていたダウンロードURL先のZIPファイルをダウンロードし、コマンドを実行しました。
▼Download URLとして表示されていたものがこちら。Windowsのダウンロードフォルダにダウンロードしました。
https://developer.sony.com/file/download/download-spresense-firmware-v3-2-0
ダウンロード先のURLでAgreementにAcceptする必要があります。
▼その影響で、wgetでダウンロードしても必要なZIPファイルではありませんでした。

▼HTMLドキュメントがダウンロードされていたみたいです。

ブラウザならAcceptを押せばいいのですが、私はWSL2のデスクトップ環境を用意していません。
今回は以下のコマンドでWindows環境でダウンロードしたZIPファイルを、WSL2上のUbuntu環境にコピーしました。
cp /mnt/c/Users/mgs_1/Downloads/spresense-binaries-v3.2.0.zip ~/spresense/sdk/
▼ZIPファイルをコピーできました。

以下のコマンドでZIPファイルを展開し、Spresenseメインボードにロードしました。その後、先程実行できなかったコマンドを実行しました。
./tools/flash.sh -e <<ダウンロードしたzipファイル>>
./tools/flash.sh -l /home/user/spresense/firmware/spresense -c /dev/ttyUSB0
tools/config.py examples/hello
▼正常に実行されました。

サンプルアプリケーションを実行する
Spresense SDKのビルドを行い、ボードに書き込みます。
make
tools/flash.sh -c /dev/ttyUSB0 nuttx.spk
▼問題なく実行できました。


シリアルターミナルで動作を確認します。
sudo apt install screen
screen /dev/ttyUSB0 115200
▼Nutt Shellが表示されました。helloと入力すると、Hello, World!と返ってきます。

screenを終了させる場合、Ctrlキー+Aキーの後にKキーを押してから、yを入力すると終了します。
▼ウィンドウの下の方で、本当に終了するかどうかを聞かれます。

ミニPCのUbuntu 20.04で実行してみる
以前Ubuntu 20.04のデスクトップ環境をインストールしたミニPCで試してみました。WSL2の場合とほとんど同じ手順でした。
▼こちらの記事でインストールしました。
▼こんな感じで挿しています。

まずは以下のコマンドでシリアル通信の設定を行い、再起動する必要があるようです。
sudo usermod -a -G dialout <user-name>
sudo reboot
ビルドに必要なツールのインストールを行います。
wget https://raw.githubusercontent.com/sonydevworld/spresense/master/install-tools.sh
bash install-tools.sh
▼一度ダウンロードに失敗していたのですが、もう一度実行するとうまくいきました。

インストールしたツールを使用可能にします。毎回実行する必要があります。
source ~/spresenseenv/setup
シリアルポートは、WSL2の場合と同じttyUSB0でした。
dmesg | grep "cp21.*attached"
コンフィグレーションを実行します。
cd spresense/sdk
tools/config.py examples/hello
▼今回もブートローダーの設定が必要でした。

▼Download URLとして表示されていたものがこちら。
https://developer.sony.com/file/download/download-spresense-firmware-v3-2-0
デスクトップ環境だったのでブラウザでDownload URLにアクセスし、AgreementにAcceptしてダウンロードしました。
その後、表示されていたコマンドを実行し、先程実行できなかったコマンドを実行しました。
./tools/flash.sh -e <<ダウンロードしたzipファイル>>
./tools/flash.sh -l /home/user/spresense/firmware/spresense -c /dev/ttyUSB0
tools/config.py examples/hello
Spresense SDKのビルドを行い、ボードに書き込み、シリアルターミナルで動作を確認しました。
make
tools/flash.sh -c /dev/ttyUSB0 nuttx.spk
sudo apt install screen
screen /dev/ttyUSB0 115200
NuttShellが表示されました。
▼helloと入力すると、Hello, World!!と表示されました。

screenを終了させる場合は、Ctrlキー+Aキーの後にKキーを押してから、yを入力してください。
最後に
Windowsでは環境を構築できなかったのですが、Linuxではできました。WSL2はデバイスにアクセスするために共有する必要があります。
Node-RED MCUの環境を構築したときと同様に、Raspberry Pi 400でも構築を試したのですが、エラーが出ていました。対応策はあるみたいで、アーキテクチャの違いが原因のようです。
▼こちらの記事で紹介されていました。
https://qiita.com/cmm614/items/c96788d48c0b9148c335
Spresense SDKのExamplesに関するチュートリアルがあったので、次はその内容を試してみようと思っています。当面の間はLinux環境で試します。
▼GNSSやAudio、Cameraなどのサンプルがいろいろあります。
https://developer.sony.com/spresense/development-guides/sdk_tutorials_ja.html