RasPike-ARTはLEGO® Education SPIKE™ PrimeとRaspberryPiをUSBで接続して、Raspberry上でSPIKE-RTのAPIを使ってSPIKEを制御することのできるライブラリです。 すでに公開されているRasPikeの後継ですが、以下の点で異なっています。
- SPIKE側のプログラムがmicro pythonではなく、SPIKE-RTを使用しており、リアルタイム性が高まっている RasPikeのデータ送信周期は30msecほどかかっていましたが、RasPike-ARTでは10msecとなっています(もう少し早くなる可能性あり)
- USB接続を用いているので、ポートがA-F全て利用可能
- RasPikeはETロボコン用として決まった構成(ポートと繋ぐもの)に限定されていましたが、任意のデバイスをつなげて利用することができます
- EV3RTのAPIではなく、SPIKE-RTのAPIを使うことができるため、SPIKEから得られる情報量が多いです ジャイロは3軸の情報が取れますし、Hubのディスプレイ、スピーカーなども利用できます
- EV3RT(ASP3)とは独立しているので、通常のLinuxプログラムで使用することができます
SPIKE ver | date | 更新内容 |
---|---|---|
0.0.6 | 2024.8.23 | 超音波センサーを初期化するとSPIKE側の周期が遅くなる問題(#10)に対応しました。これにともない、pup_ultrasonic_sensor_presence()は非サポートのAPIとなりました(必要な方がいたらお知らせください) |
RaspberryPiのUSB(ホスト)とSPIKEのUSB(デバイス)をUSBケーブルで繋ぎます。 あとは任意の構成で使用できます。 RasPikeで使用していたシリアルケーブルは不要です。
現在、動作確認はDebian version: 11 (Bullseye)32bit Legacyでのみ行っています。そのほかでも動くかもしれませんが、まだ試していません。RasPikeが動作した環境であればそのまま使えます。
RasberryPi上の任意の場所でGitHubからcloneします。
git clone https://github.com/ytoi/RasPike-ART.git
spikeディレクトリに移動します。
cd RasPike-ART/spike
必要なモジュールのインストールを行うため、セットアップのスクリプトを呼び出します。
spike_env_setup_linux.sh
このセットアップの中で、/etc/udev/rules.d/99-serial.rules を作成し、SPIKEのシリアルのデバイスを「USB_SPIKE」としてシンボリックリンクを作成して、固定するようにしています。 もし、SPIKEを繋いで
ls /dev/USB_SPIKE
が表示されない場合、こちらで確認した情報と異なるIDとなっている可能性があります。
lsusb
として、USBの情報を参照してみて下さい。確認した環境では
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 040: ID 0483:5740 STMicroelectronics Virtual COM Port
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
となっており、「STMicroelectronics Virtual COM Port」の情報を使って、/etc/udev/rules.d/99-serial.rules を作成しています。
/etc/udev/rules.d/99-serial.rules
SUBSYSTEM=="tty", ATTRS{idVendor}=="0483",ATTRS{idProduct}=="5740", SYMLINK+="USB_SPIKE",MODE="0666"
もし、IDなどが異なる場合は、ご自身の使用しているSPIKEに合わせて変更してください(同じであることを信じていますが)
ちなみに、spike_env_setup_mac.shもありますが、macでの動作はまだできていません。 RasPike-ARTの下にtooolsができているはずです。 このセットアップはSPIKEにプログラムを送るためのものです。SPIKE-RTの環境構築のSPIKEへの書き込みのところを参考にしています。
この作業は一度だけやれば良いです。ただし、SPIKE側のプログラムが更新された場合には再度焼き直しが必要になります。
RaspberryPiにUSBケーブルを繋ぎます。SPIKEは電源を切っておいてください。SPIKEのBluetooth接続ボタン(本体の右上の丸いボタン)を押しながら、USBを接続します。ボタンの色が変化するまで押し続けてください。 ボタンがカラフルに変化したらボタンから手を離してください。これでDFUモードに入ります。
その後、以下のコマンドを打ちます。
spike_update_linux.sh
メッセージが流れますが、最後に
Writing memory...
0x08008000 130600 [=========================] 100%
Exiting DFU...
Finished
+ rm -rf firmware.dfu
という表示が出て、SPIKEに「ET」の文字が出れば焼き込み終了です。
sampleディレクトリで作業を行います。まず、あらかじめ格納してあるraspike_testを動かしてみます。 コードはsample/rapike_test/raspike_test.c にあります。 デフォルトではカラーセンサーのテストをするので、Fポートにカラーセンサーをつないでおいてください。
RasPike-ARTディレクトリの直下にあるbuild/obj-raspike_testに移動してmakeします。
cd build/obj-raspike_test
make
これでraspike_testができるはずです。
実行前にSPIKE側の電源を一度切ります(センターボタンを長押しして、3x3の四角の表示がされるのを確認してください)。 再度センターボタンを押して、「ET」表示になるのを確認してください。 そうしたら、raspike_testを実行します。
./raspike_test
これで以下のようにカラーセンサーの値が取れれば成功です。
[RGB]r=18 g=21 b=21
[RGB]r=17 g=20 b=20
[RGB]r=18 g=20 b=20
[RGB]r=17 g=20 b=20
[RGB]r=3 g=4 b=3
[RGB]r=7 g=8 b=8
[RGB]r=7 g=8 b=8
[RGB]r=6 g=8 b=8
[RGB]r=6 g=8 b=8
[RGB]r=6 g=8 b=7
SPIKE-RTのAPIは以下を参照してください。 SPIKE-RT APIのページ
RasPike-ARTでは上記のAPIは一部を除いて対応しています。
非対応API
- pup_color_sensor_detectable_colors(そのうち対応予定)
- pup_ultrasonic_sensor_presence() 2024/8/23のバージョンから非対応となりました。
- Bluetooth API
対応しているが、呼ぶとSPIKE-RT側で死んでしまうもの(呼ばないよう注意)
- pup_ultrasonic_sensor_light_set
- pup_ultrasonic_sensor_light_on
- pup_ultrasonic_sensor_light_off
また、注意事項として、モーターについては pup_motor_get_device()でポートに関連づけたあと、pup_motor_setup()をしてからpup_motor_set_power()などを呼ぶようにしないと、SPIKE-RT側で死んでしまうようです。 pup_motor_setup()を同じモーターに対して複数回行うと、これも死んでしまう様です。
この辺りのエラーチェックはそのうち改善します。
先にRasberryPi側のコンソールでctrl+cを押し、プログラムを中断して下さい。その後、SPIKEのセンターボタンを長押しして電源を切って下さい。 この手順でやらないとUSBポートが変わったり、使えなくなったりします。
コードはsampleの下にディレクトリを作って、そこにファイルをおいてください。このディレクトリ名がアプリ名になります。 buildの下で以下のコマンドを打つことで、build環境を作ることができます。
./setup_app (アプリ名)
これでobj-(アプリ名)というディレクトリができます。
ソースコードは sample/(アプリ名)
の下に置くようにしてください。
ソースコードと同じディレクトリに Makefile.inc というファイルを置いて、以下の変数を定義してください。
変数名 | 説明 |
---|---|
APP_NAME | アプリの名前 |
SRCS | ソースコード一覧 |
INCLUDES | 追加するインクルードパス(-Iをつけること |
OPT | 最適化オプション(問題なければそのままで良い) |
build/obj-(アプリ名)ディレクトリに移動して
make
としてください。
RasPIke-ARTのAPIはincludeの下にあります。
raspike_com.h
RPComDescriptor *raspike_open_usb_communication(const char *device_name);
USBの通信を開通させます。device_nameにはSPIKEをUSB接続した時の名前を指定します。 通常は/dev/ttyACM0 が使用されており、これを指定すれば良いのですが、他のものを繋げたり、電源の落とし方が悪いとttyACM1になったり、/dev/ttyACMx が見えなくなったりします。
ls /dev/ttyACM*
で確認しましょう。ない場合は、RasberryPiのUSBポートを他のところにしてみるか、RaspberryPiをリブートしてみて下さい。
raspike_protocol_api.h
extern int raspike_prot_init(RPComDescriptor *desc);
extern int raspike_prot_receive(void);
extern int raspike_prot_shutdown(void);
-
raspike_prot_init() descにはraspike_open_usb_communication()で取得されたRPComDescriptorのポインタを指定します。 この中でSPIKEとのハンドシェイクが行われます。
-
raspike_prot_receive() SPIKEからのメッセージを受け取る関数です。プログラム内でこの関数を別スレッドで永久ループの中で呼び出して下さい。 raspike_test.cのコードを参考にしてみて下さい。 この関数はraspike_prot_init()の後に実行されるようにしてください。
-
raspike_prot_shutdown() SPIKEのシャットダウンを行います。
SPIKE側のプログラムで何か異常が起こった場合、2桁の数字をSPIKE上に表示して、センターボタンが赤くなります。この時の数字がわかると不具合の理由がわかるかもしれません。
SPIKEのコードはspike-rtをフォークした場所で作っています。 https://github.com/ytoi/spike-rt.git (まだコミットが不完全なので、cloneしても動作しないと思います)