3 #include "kernel_id.h"
\r
4 #include "ecrobot_interface.h"
\r
6 /* OSEK declarations */
\r
7 DeclareCounter(SysTimerCnt);
\r
8 DeclareTask(TaskInitialize);
\r
9 DeclareTask(TaskControl);
\r
10 DeclareTask(TaskSonar);
\r
11 DeclareTask(TaskLCD);
\r
14 #define MOTOR_STEERING NXT_PORT_A
\r
15 #define MOTOR_LEFT NXT_PORT_B
\r
16 #define MOTOR_RIGHT NXT_PORT_C
\r
17 #define STEERING_LIMIT 40 /* degree */
\r
18 #define STEERING_P_GAIN 2 /* proportinal gain */
\r
19 #define DIFF_GAIN_MAX 0.7F /* 1.0-DIFF_GAIN_MAX: max. differential effect */
\r
20 #define NEUTRAL_DEAD_ZONE 2 /* degree */
\r
21 #define PWM_OFFSET 10 /* friction compensator */
\r
22 #define EDC_ON -1 /* Electronic Differential Control: ON */
\r
23 #define EDC_OFF 1 /* Electronic Differential Control: OFF */
\r
25 static S8 EDC_flag; /* EDC flag */
\r
28 S32 FrictionComp(S32 ratio, S32 offset);
\r
30 /* LEJOS OSEK hooks */
\r
31 void ecrobot_device_initialize()
\r
33 ecrobot_set_light_sensor_active(NXT_PORT_S1);
\r
34 ecrobot_set_light_sensor_active(NXT_PORT_S3);
\r
35 ecrobot_init_sonar_sensor(NXT_PORT_S2);
\r
36 ecrobot_init_bt_connection();
\r
39 void ecrobot_device_terminate()
\r
41 nxt_motor_set_speed(MOTOR_STEERING, 0, 1);
\r
42 nxt_motor_set_speed(MOTOR_RIGHT, 0, 1);
\r
43 nxt_motor_set_speed(MOTOR_LEFT, 0, 1);
\r
44 ecrobot_set_light_sensor_inactive(NXT_PORT_S1);
\r
45 ecrobot_set_light_sensor_inactive(NXT_PORT_S3);
\r
46 ecrobot_term_sonar_sensor(NXT_PORT_S2);
\r
47 ecrobot_term_bt_connection();
\r
50 void user_1ms_isr_type2(void)
\r
54 ercd = SignalCounter(SysTimerCnt); /* Increment OSEK Alarm Counter */
\r
61 /* TaskInitialize */
\r
62 TASK(TaskInitialize)
\r
64 nxt_motor_set_speed(MOTOR_STEERING, 0, 1);
\r
65 nxt_motor_set_speed(MOTOR_RIGHT, 0, 1);
\r
66 nxt_motor_set_speed(MOTOR_LEFT, 0, 1);
\r
67 nxt_motor_set_count(MOTOR_STEERING, 0);
\r
68 nxt_motor_set_count(MOTOR_RIGHT, 0);
\r
69 nxt_motor_set_count(MOTOR_LEFT, 0);
\r
71 EDC_flag = EDC_OFF;
\r
76 /* TaskControl executed every 10msec */
\r
79 S32 analog_stick_left; /* speed command data from GamePad */
\r
80 S32 analog_stick_right; /* steering command data from GamePad */
\r
86 static U8 touch_sensor_state = 0;
\r
87 static U8 bt_receive_buf[32]; /* buffer size is fixed as 32 */
\r
89 /* receive NXTGamePad command
\r
90 * byte0 speed_data -100(forward max.) to 100(backward max.)
\r
91 * byte1 steering_data -100(left max.) to 100(right max.)
\r
93 ecrobot_read_bt_packet(bt_receive_buf, 32);
\r
94 analog_stick_left = -(S32)(*(S8 *)(&bt_receive_buf[0])); /* reverse the direction */
\r
95 analog_stick_right = (S32)(*(S8 *)(&bt_receive_buf[1]));
\r
97 /* read Touch Sensor to switch Electronic Differential Control */
\r
98 touch_sensor = ecrobot_get_touch_sensor(NXT_PORT_S4);
\r
99 if (touch_sensor == 1 && touch_sensor_state == 0)
\r
101 EDC_flag = ~EDC_flag + 1; /* toggle */
\r
103 touch_sensor_state = touch_sensor;
\r
105 /* steering control */
\r
106 steering_angle = nxt_motor_get_count(MOTOR_STEERING);
\r
107 steering_err = (STEERING_LIMIT*analog_stick_right)/100 - steering_angle;
\r
108 steering_speed = STEERING_P_GAIN*steering_err;
\r
109 nxt_motor_set_speed(MOTOR_STEERING, FrictionComp(steering_speed,PWM_OFFSET), 1);
\r
111 /* wheel motors control with Electronic Differential Control */
\r
113 if (steering_angle > NEUTRAL_DEAD_ZONE) /* turn right */
\r
115 if (EDC_flag == EDC_ON)
\r
117 diff_gain = (S32)((1.0F - (float)steering_angle*DIFF_GAIN_MAX/STEERING_LIMIT)*10);
\r
119 nxt_motor_set_speed(MOTOR_RIGHT, FrictionComp((analog_stick_left*diff_gain)/10,PWM_OFFSET), 1);
\r
120 nxt_motor_set_speed(MOTOR_LEFT, FrictionComp(analog_stick_left,PWM_OFFSET), 1);
\r
122 else if (steering_angle < -NEUTRAL_DEAD_ZONE) /* turn left */
\r
124 if (EDC_flag == EDC_ON)
\r
126 diff_gain = (S32)((1.0F + (float)steering_angle*DIFF_GAIN_MAX/STEERING_LIMIT)*10);
\r
128 nxt_motor_set_speed(MOTOR_RIGHT, FrictionComp(analog_stick_left,PWM_OFFSET), 1);
\r
129 nxt_motor_set_speed(MOTOR_LEFT, FrictionComp((analog_stick_left*diff_gain)/10,PWM_OFFSET), 1);
\r
131 else /* go straight */
\r
133 nxt_motor_set_speed(MOTOR_RIGHT, FrictionComp(analog_stick_left,PWM_OFFSET), 1);
\r
134 nxt_motor_set_speed(MOTOR_LEFT, FrictionComp(analog_stick_left,PWM_OFFSET), 1);
\r
137 /* send NXT status data to NXT GamePad */
\r
138 ecrobot_bt_data_logger((S8)analog_stick_left, (S8)analog_stick_right);
\r
143 /* TaskSonar executed every 50msec */
\r
148 /* Sonar Sensor is invoked just for data logging */
\r
149 sonar = ecrobot_get_sonar_sensor(NXT_PORT_S2);
\r
154 /* TaskLCD executed every 500msec */
\r
157 ecrobot_status_monitor("NXT GT");
\r
162 /* Sub functions */
\r
163 S32 FrictionComp(S32 ratio, S32 offset)
\r
167 return ((100-offset)*ratio/100 + offset);
\r
169 else if (ratio < 0)
\r
171 return ((100-offset)*ratio/100 - offset);
\r