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();
}
				 |