1.あああ
受信側プログラムは、下の4つのファイルからなります。
makefile
nxt_config.h
remote_sla1.c
remote_sla1.oil
Bluetooth通信を用いているので、受信側(スレーブ)から先に起動し、画面に<BT>の表示が出てから実行してください。
送信側ロボットのタイヤを手で回してみましょう。ロボットが走ったり、曲がったりします。
タイヤが自動的に中心に戻るようにしていますが、出来が微妙です。
是非、改良しましょう。
ロータリーエンコーダだけでなく、他のセンサ(加速度センサなど)を使って操縦できるようにしてみましょう。
makefile
nxt_config.h
remote_sla1.c
remote_sla1.oil
Bluetooth通信を用いているので、受信側(スレーブ)から先に起動し、画面に<BT>の表示が出てから実行してください。
送信側ロボットのタイヤを手で回してみましょう。ロボットが走ったり、曲がったりします。
タイヤが自動的に中心に戻るようにしていますが、出来が微妙です。
是非、改良しましょう。
ロータリーエンコーダだけでなく、他のセンサ(加速度センサなど)を使って操縦できるようにしてみましょう。
※おまけ.倒立ロボットの操縦
倒立ロボットを操縦できるプログラムを以下に示します。
送信側プログラムは、上のものがそのまま使えますが、入力倍率などを変更したほうが良いかもしれません。
動作させるには以下のファイルが必要です。
makefile
balancer_param.c
nxt_config.h
remote_sla2.c
remote_sla2.oil
ソースファイルはこのようになっています。
送信側プログラムは、上のものがそのまま使えますが、入力倍率などを変更したほうが良いかもしれません。
動作させるには以下のファイルが必要です。
makefile
balancer_param.c
nxt_config.h
remote_sla2.c
remote_sla2.oil
ソースファイルはこのようになっています。
nxtway1.c
#include "kernel.h" #include "kernel_id.h" #include "ecrobot_interface.h" #include "balancer.h" #include "nxt_config.h" int forward=0,turn=0; //前進指令値、旋回値変数宣言 signed char pwm_L=0, pwm_R=0; //PWM値格納変数宣言 int gyro_offset=0; //ジャイロオフセット値格納変数宣言 DeclareCounter(SysTimerCnt); DeclareTask(Task_bg); /* Task_bgを宣言 */ DeclareTask(Task_balance); /* Task_balanceを宣言 */ void ecrobot_device_initialize(){ nxt_motor_set_speed(PORT_MOTOR_L, 0, 1); nxt_motor_set_speed(PORT_MOTOR_R, 0, 1); } void ecrobot_device_terminate(){ nxt_motor_set_speed(PORT_MOTOR_L, 0, 1); nxt_motor_set_speed(PORT_MOTOR_R, 0, 1); } void user_1ms_isr_type2(void) { StatusType ercd; ercd = SignalCounter(SysTimerCnt); if (ercd != E_OK) { ShutdownOS(ercd); } } TASK(Task_blance){ //バランスタスク balance_control( //バランサAPIの呼び出し (float)forward, (float)turn, (float)ecrobot_get_gyro_sensor(PORT_GYRO), (float)gyro_offset, (float)nxt_motor_get_count(PORT_MOTOR_L), (float)nxt_motor_get_count(PORT_MOTOR_R), (float)ecrobot_get_battery_voltage(), &pwm_L, &pwm_R ); nxt_motor_set_speed(PORT_MOTOR_L, pwm_L, 1); //モータに指令を出す nxt_motor_set_speed(PORT_MOTOR_R, pwm_R, 1); TerminateTask(); } TASK(Task_bg){ gyro_offset = ecrobot_get_gyro_sensor(PORT_GYRO); //ジャイロの初期値補正 balance_init(); //バランサAPIの初期化 nxt_motor_set_count(PORT_MOTOR_L, 0); nxt_motor_set_count(PORT_MOTOR_R, 0); TerminateTask(); } |