in src/app.cpp [57:216]
void main_task(intptr_t unused)
{
signed char forward; /* 前後進命令 */
signed char turn; /* 旋回命令 */
signed char pwm_L, pwm_R; /* 左右モータPWM出力 */
char msg[32];
int brightness; /* 地面の明るさ */
/* センサー入力ポートの設定 */
ev3_sensor_config(sonar_sensor, ULTRASONIC_SENSOR);
ev3_sensor_config(color_sensor, COLOR_SENSOR);
ev3_color_sensor_get_reflect(color_sensor); /* 反射率モード */
ev3_sensor_config(touch_sensor, TOUCH_SENSOR);
ev3_sensor_config(gyro_sensor, GYRO_SENSOR);
/* モーター出力ポートの設定 */
ev3_motor_config(left_motor, LARGE_MOTOR);
ev3_motor_config(right_motor, LARGE_MOTOR);
ev3_motor_config(tail_motor, LARGE_MOTOR);
ev3_motor_reset_counts(tail_motor);
/* Open Bluetooth file */
bt = ev3_serial_open_file(EV3_SERIAL_BT);
assert(bt != NULL);
/* Bluetooth通信タスクの起動 */
act_tsk(BT_TASK);
#if 1 /* 片山先生がいなければ0にする */
/* 片山先生のお顔 */
memfile_t memfile_img;
ev3_memfile_load("/ev3rt/res/katayama.bmp", &memfile_img);
memfile_t memfile_wav;
ev3_memfile_load("/ev3rt/res/nogi.wav", &memfile_wav);
//ev3_memfile_load("/ev3rt/res/dorakue.wav", &memfile_wav);
image_t image;
ev3_image_load(&memfile_img, &image);
ev3_lcd_draw_image(&image, 0, 0);
ev3_speaker_set_volume(10);
ev3_speaker_play_file(&memfile_wav, SOUND_MANUAL_STOP);
#endif
ev3_led_set_color(LED_ORANGE); /* 初期化完了通知 */
int buff = 0;
/* スタート待機 */
while(1)
{
tail_control(TAIL_ANGLE_STAND_UP + buff); /* 完全停止用角度に制御 */
brightness = ev3_color_sensor_get_reflect(color_sensor); /* 光センサの値取得 */
/* LCDにしっぽの角度と光センサの値を出力する */
sprintf(msg, "Tail_Angle: %d, Brightness: %d", TAIL_ANGLE_STAND_UP + buff, brightness);
msg_f(msg, 0);
if(ev3_button_is_pressed(LEFT_BUTTON)){
buff--;
tslp_tsk(500); /* 500msecウェイト */
}
if(ev3_button_is_pressed(RIGHT_BUTTON)){
buff++;
tslp_tsk(500); /* 500msecウェイト */
}
if (bt_cmd == 1)
{
break; /* リモートスタート */
}
if (ev3_touch_sensor_is_pressed(touch_sensor) == 1)
{
break; /* タッチセンサが押された */
}
tslp_tsk(10); /* 10msecウェイト */
}
/* 走行モーターエンコーダーリセット */
ev3_motor_reset_counts(left_motor);
ev3_motor_reset_counts(right_motor);
/* ジャイロセンサーリセット */
ev3_gyro_sensor_reset(gyro_sensor);
balancer.init(GYRO_OFFSET); // <1>
ev3_led_set_color(LED_GREEN); /* スタート通知 */
/**
* Main loop for the self-balance control algorithm
*/
bool isSonerAlert = false;
while(1)
{
int32_t motor_ang_l, motor_ang_r;
int gyro, volt;
if (ev3_button_is_pressed(BACK_BUTTON)) break;
tail_control(TAIL_ANGLE_DRIVE); /* バランス走行用角度に制御 */
if (sonar_alert() == 1) /* 障害物検知 */
{
//if(isSonerAlert == false)ev3_speaker_play_tone (NOTE_FS6, 100);
isSonerAlert = true;
forward = turn = 0; /* 障害物を検知したら停止 */
}
else
{
brightness = ev3_color_sensor_get_reflect(color_sensor);
setLineTracePwm(brightness, forward, turn); /* 前後進命令, 旋回命令の設定 */
//if(isSonerAlert == true)ev3_speaker_play_tone (NOTE_GS6, 100);
isSonerAlert = false;
/* LCDに光センサの明るさ値を出力する */
//sprintf(msg, "Brightness: %d", brightness);
//msg_f(msg, 3);
}
/* 倒立振子制御API に渡すパラメータを取得する */
motor_ang_l = ev3_motor_get_counts(left_motor);
motor_ang_r = ev3_motor_get_counts(right_motor);
gyro = ev3_gyro_sensor_get_rate(gyro_sensor);
volt = ev3_battery_voltage_mV();
/* 倒立振子制御APIを呼び出し、倒立走行するための */
/* 左右モータ出力値を得る */
balancer.setCommand(forward, turn); // <1>
balancer.update(gyro, motor_ang_r, motor_ang_l, volt); // <2>
pwm_L = balancer.getPwmRight(); // <3>
pwm_R = balancer.getPwmLeft(); // <3>
/* EV3ではモーター停止時のブレーキ設定が事前にできないため */
/* 出力0時に、その都度設定する */
if (pwm_L == 0)
{
ev3_motor_stop(left_motor, true);
}
else
{
ev3_motor_set_power(left_motor, (int)pwm_L);
}
if (pwm_R == 0)
{
ev3_motor_stop(right_motor, true);
}
else
{
ev3_motor_set_power(right_motor, (int)pwm_R);
}
tslp_tsk(4); /* 4msec周期起動 */
}
ev3_motor_stop(left_motor, false);
ev3_motor_stop(right_motor, false);
ter_tsk(BT_TASK);
fclose(bt);
ext_tsk();
}