2026年7月31日

024-2.SPIKE-RT入門 第5回目 「テーブルジャンプを使う」

この記事では「レゴ エデュケーションSPIKEプライム(以下、SPIKE)」で動作する「SPIKE-RT」の使い方を紹介します。
ここではアフレルが販売している教材「レゴ エデュケーションSPIKEプライム C言語プログラミングブック」で配布しているSPIKE-RTの開発環境を使っています。同製品の紹介ページは次の通りです。
https://afrel.co.jp/product/spike/c-language/
(文/松原拓也)

◆ テーブルジャンプとは

SPIKE-RTはC言語でプログラムを記述しますが、「せっかくならC言語のメリットを活かしたい」と考えて、思い付いたのが「テーブルジャンプ」です。テーブルジャンプというのは、テーブルを参照して処理を飛ぶ技術のことです。
テーブルジャンプを使った実験プログラム、その1です(tablejump1)。 プログラムをビルドして、ラージハブに書き込むと実行されます。実行すると、ラージハブのライトマトリクスに「1」~「3」の数字が表示されます。数字は一定時間おきに切り替わります。 ライトマトリクスの表示は3つの関数で行っています。呼び出す関数の名前はテーブル(func_table)に書き込んでいます。これを参照して、関数を呼び出しています。
テーブルジャンプを使うと、書式がややこしくなってしまいますが、番号で関数を呼び出すことができます。似たようなことはif文やswitch文でも出来ますが、分岐が多くて規則性がある場合なら、テーブルジャンプを使った方が効率的です。

SPIKE-RT入門の第3回目で「簡易マルチタスク」を紹介しました。SPIKE-RTはマルチタスクに対応していますが、使い方が(個人的に)難しいので、その代わりとして作ってみました。処理を細切れにしているだけなので、厳密にはマルチタスクではありませんが、一応、マルチタスクっぽく動いています。
画像はそのプログラムの一部ですが、タスクの処理をif文で分岐していました。タスクが少ないうちは問題ないのですが、タスクが増えると、プログラムが見づらくなってしまいます。
そこで、if文ではなく、テーブルジャンプで処理を分岐させてみたいと思います。

◆ 構造体を使う

テーブルジャンプの実験プログラム、その2です(tablejump2)。実行すると、ロボットがジャイロセンサーを検出しながら、その場旋回を繰り返します。
プログラムが長いので3つに分割して紹介します。 まず、1つ目のプログラムです。
ここでは構造体の型を宣言したり、関数を定義しています。構造体は複雑なデータ形式を扱うことができるC言語特有の機能です。 今回、構造体はタスクの時間や周期を管理するために使います。
現在時刻を取得する関数(time_get)とモーターペアを制御する関数(motor_pair)は第3回目で作ったものと全く同じです。

2つ目のプログラムです。 ここでは3種類のタスクを定義しています。タスクをそれぞれ独立した関数にしました。
ジャイロセンサーを検出するタスク(タスク1)は10ミリ秒周期で実行します。ヨー軸の角速度を累積して、「degree」というグローバル変数に格納します。これが絶対的な角度となります。
その場旋回するタスク(タスク2)は100ミリ秒周期で実行します。変数seqでシーケンスを管理しています。
ライトマトリクスを表示するタスク(タスク3)は100ミリ秒周期で実行します。degreeの角度を一個の点で表現します。

3つ目のプログラムです。
ここではテーブルの宣言とメイン関数(main)の定義を行っています。タスクのテーブル(func_table)には関数名を格納します。タスクの周期のテーブル(cycle_table)にはタスクの呼び出し周期を格納します。単位はマイクロ秒です。
main関数では最初にタスクの初期化を行います。それからタスクの実行を繰り返します。

プログラムをビルドしてラージハブに書き込みます。ラージハブのポートA~Bにモーターとタイヤを接続して、これをロボットとします。ラージハブにプログラムを書き込むと実行されます。
プログラムが実行されると、ロボットは時計方向にその場旋回(180度)→3秒待つ→反時計方向にその場旋回(180度)→3秒待つという動きを繰り返します。
タスクを増やしていけば、通信処理をさせたり、距離センサーやカラーセンサーを入力することも可能です。

今回作成したプログラムはGitHubで公開しています。

プログラムを実行中の様子

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