福井の会社、アフレルより発売された「
C言語でレゴ SPIKEプライムを制御できる教材」を使ってLEGO SPIKE PrimeをC言語で開発。公式の対応環境は、WindowsとUbuntuですが、書き込み用のPythonプログラムをにちょっと手を入れ、Macでも開発できました。
「A robot by LEGO SPIKE Prime in C on Mac」
本体(Hub)のBluetoothボタンを押しながらUSBケーブルを接続して書き込みモード(DFU)に。Macで作ったプログラムをビルド(build.sh)して、書き込み(write.sh)すると動き出します。
モーター2つ、圧力センサー、距離センターを使ってロボット組み立て。テクニックシリーズは工具も接着剤も不要で簡単組み立てがいい感じ。ハードウェアができたらソフトウェア。圧力センサーを押したら動き出し障害物で曲がり、また押されたら止まるプログラムを作ってみました。デバッグ用も兼ねて、背中の5x5のディスプレイで文字も表示しています。
#include "test1.h"
void Main(intptr_t exinf) {
//dly_tsk(3000000);
pup_motor_t* motorA = pup_motor_init(PBIO_PORT_ID_A, PUP_DIRECTION_COUNTERCLOCKWISE);
pup_motor_t* motorB = pup_motor_init(PBIO_PORT_ID_B, PUP_DIRECTION_CLOCKWISE);
//pup_device_t* colorSensor = pup_color_sensor_get_device(PBIO_PORT_ID_C);
pup_device_t* forceSensor = pup_force_sensor_get_device(PBIO_PORT_ID_D);
pup_device_t* ultraSonicSensor = pup_ultrasonic_sensor_get_device(PBIO_PORT_ID_E);
//while (pup_color_sensor_reflection(ColorSensor) > 30) {
for (;;) {
hub_display_text("PUSH TO START", 200, 200);
while (!pup_force_sensor_touched(forceSensor));
hub_display_text("GO", 200, 200);
dly_tsk(500000); // .5sec
int power = 400;
pup_motor_set_speed(motorA, power);
pup_motor_set_speed(motorB, power);
for (;;) {
int32_t res = pup_ultrasonic_sensor_distance(ultraSonicSensor);
if (res >= 0 && res < 70) {
hub_display_char('!');
pup_motor_stop(motorA);
pup_motor_stop(motorB);
dly_tsk(500000); // .5sec
pup_motor_set_speed(motorA, power);
dly_tsk(800000); // .8sec
pup_motor_stop(motorA);
hub_display_text("GO", 200, 200);
dly_tsk(500000); // .5sec
pup_motor_set_speed(motorA, power);
pup_motor_set_speed(motorB, power);
}
if (pup_force_sensor_touched(forceSensor)) {
hub_display_char('?');
pup_motor_stop(motorA);
pup_motor_stop(motorB);
dly_tsk(500000); // .5sec
break;
}
}
}
}
まずはほぼサンプル通りの実装ですが、関数名と変数が被って冗長なのが気になりますね。自由に設計できるのがC言語のいいところ。使いやすいライブラリを考えて実装してみましょう!
SPIKE Primeについてくるパーツ。いろいろ組み合わせてプロトタイピングにちょうど良さそうなセットです。