2025年2月20日

024-1.SPIKEプライムに「SPIKE-RT」を導入して、C言語で開発してみる

この記事では「レゴ エデュケーションSPIKEプライム(以下、SPIKE)」で動作する「SPIKE-RT」について簡単に紹介します。(文/松原拓也)

◆ 開発環境を準備する

「SPIKE-RT」は名古屋大学が開発したSPIKE用のリアルタイムOSのプラットフォームです。純正の開発環境には「SPIKEアプリ」があり、プログラムの実行にはMicroPythonが使われています。それに対して、SPIKE-RTにはプログラミング言語に「C言語」を採用しています。SPIKE-RTは以下のWebページで公開されていて、無償で使用することができます。
https://github.com/spike-rt/spike-rt/blob/main/README_ja.md

SPIKE-RTの大きな特徴はリアルタイムOSであることです。このため、厳密に時間を管理した制御を行うことができます。組み込み技術者向けのロボット競技会「ETロボコン」では2023年度からSPIKE-RTを採用しています。

SPIKE-RTを動かすにはラージハブのファームウェアを書き換える必要があります。その下準備として、パソコン側のデバイスドライバを変更する必要があります。手順は次の通りです。 ラージハブのBluetoothボタンを押したまま、USBケーブルでパソコンのUSBポートに接続します。 ボタンを5秒くらい押し続けていると、ファームウェアの書き込みモードになります。BluetoothのLEDがカラフルに点灯し続けます。

「Zadig」というフリーソフトを使って、USB接続時に割り当てるデバイスドライバを「libusb-win32」に変更します。表示されない場合には「Options」→「 List All Devices」をメニュー選択します。 細かい話ですが、「Replace Driver」ボタンを押しただけではデバイスドライバは有効にはならず、いったんUSBケーブルを挿し直す必要があります。

SPIKE-RTの開発環境の対応OSはUbuntu(Linux)です。Windows搭載パソコンでLinuxを使用するにはWSL(Windows Subsystem for Linux:Linux用Windowsサブシステム)という機能を使わないといけません。しかし、これがなかなかの曲者で、WSLが期待どおりに動作してくれません。筆者の場合は2台のパソコンにUbuntuをインストールしてみましたが、2台とも一発ではインストールに成功しませんでした。
この記事ではアフレルが販売している「レゴ エデュケーションSPIKEプライム C言語プログラミングブック(以下、C言語プログラミングブック)」という教材で配布しているSPIKE-RTの開発環境を使うことにします。同製品の紹介ページは以下の通りです。
https://afrel.co.jp/product/spike/c-language/

Ubuntuのインストールに成功すると、このように「Linux」という仮想ドライブが作られます。その中の「Ubuntu」フォルダにLinux用のファイルを格納されています。
この例ではユーザー名を「user」としたので、「home/user」フォルダの中にSPIKE-RTのライブラリ、サンプルプログラムなどがあります。

参考までに、Ubuntuがインストールできない場合の対策方法の1つを紹介します。 これはUbuntuのインストール中に表示されたエラーです。 エラーを読むと、BIOSの設定を変更してくださいという指示が書かれています。そこで、BIOSの設定内にあるバーチャルテクノロジーという設定を有効にすると、エラーを回避することができます。

◆ SPIKE-RT用のプログラムを作る

SPIKE-RTで動作するプログラムを作成してみましょう。
Ubuntuを起動したら、一番最初に「start.sh」というスクリプトを実行して、開発環境の準備を行います(Dockerというツールを使っています)。 続いて「create-program.sh」というスクリプトを実行して、「hello」というプログラムを新規で作成することにします。

「programs」フォルダの中に「hello」フォルダが作られ、その中にファイルが生成されました。
拡張子が「c」のファイルがC言語のソースファイルです。 プログラムの名前を「hello」としたので、ファイル名は「hello.c」となりました。

テキストエディタで「hello.c」を開いて、プログラムを入力します。筆者の場合、エディタは「TeraPad」を使っています。 最初、main関数にあるのは「3秒間待つ」処理だけなので、足りない処理を書き足します。
ここでは「ラージハブの右ボタンが押されたら、ライトマトリクスに“hello world”と表示して、ポートFから同じ内容を送信する」というプログラムを作成してみました。

SPIKE-RTの資料にはUARTの制御方法が書かれてなくて、非常に悩みましたが、動作テストプログラムの「TEST」の中にヒントがあったので、どうにか解決することができました。

build.sh」というスクリプトを実行して、ビルドします。
gccでソースコードをコンパイルして、最終的にファームウェア(asp.bin)が出来上がります。

ファームウェアを書き込みます。 SPIKEアプリの場合はBluetooth経由で書き込むことが可能でしたが、SPIKE-RTの場合は有線のみに対応しています。ラージハブのBluetoothボタンを押した状態で、パソコンのUSBポートに接続します。 「write.sh」というスクリプトを実行すると、ファームウェアを書き込むことができます。
なお、SPIKE-RT用のファームウェアを書き込むと、純正品のファームウェア(ハブOS)は消えてしまいますが、また書き込みをやり直すことで、元の状態に戻すことができます。

なお、ここまでの記事に登場した「start.sh」「create-program.sh」「build.sh」「write.sh」はC言語プログラミングブックのためにアフレルが開発した専用のスクリプトです。

書き込みが完了すると、ファームウェアが実行されます。
ラージハブの決定ボタンが青色になり、ライトマトリクスの点がぐるぐると回転します。 そして、右ボタンを押したら、LEDマトリクスに「hello world」の文字が順に表示されます。
これで実行に成功しました。

◆ UARTの送受信実験

続いて、ポートFから送信されたデータを受信してみましょう。受信する装置はUARTを扱えるなら何でも良いのですが、できるだけ安価に抑えたいので、ここでは「Raspberry Pi Pico(以下、ラズパイPico)」を使うことにしました。写真のラズパイPicoはW(無線対応版)ですが、無印でも構いません。

ラズパイPicoの他に「SPIKE用コネクタ」「ジャンパーワイヤー」「ブレッドボード」を用意します。 「SPIKE用コネクタ」はラージハブのポートに接続するコネクタです。「Power Functions2.0コネクタ」や「Wedo2.0コネクタ」とも呼ばれています。困ったことに、SPIKE用コネクタは純正品を単体で入手する方法がありません。距離センサーをトルクスドライバーで分解して流用するすることは可能ですが、ベストな方法ではありません。中国の通販サイトではコネクタの模造品が販売されていますが、なんらかの権利を侵害していると思われるのでオススメできません。 そこで、筆者の場合はプリント基板でSPIKE用コネクタを自作しました。国内の基板屋さんに発注したので、数万円の出費が生じてしまったのが難点です。プリント基板のCADデータは以下のページで公開しています。 https://github.com/Afrel-SPIKE-Prime-tec/spikeconnector

図のようにコネクタとラズパイPicoをつなぎます。 信号の電圧は約3.3Vです。

実行中の様子です。 ラズパイPicoをパソコンのUSBポートに接続します。 SPIKE用コネクタはポートFに接続します。
ラージハブの電源を入れると、プログラムが自動的に実行されます。 右ボタンを押すと、ライトマトリクスに「hello world」の文字が表示されて、その直後に同じ内容のメッセージが送信されます。

ラズパイPico側のプログラムです。開発環境には「Thonny」を使って、MicroPythonでプログラムを作成しました。わずか8行のコードです。ラズパイPicoには事前にMicroPythonのファームウェアを書き込んでおく必要があります。 UARTの通信速度は115200bpsに設定します。
プログラムの実行中、シェル画面に「hello world」と表示されたら、データの受信成功です。print関数は実行するたびに自動的に改行する仕様なので、1文字ごとに改行されて、縦書きのように表示されてしまいました。

SPIKE-RTの魅力の一つはUARTを自由に制御できることです。この機能を活かして、いろいろな面白い使い方ができるかもしれません。

当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。