/これが大嶋のロボットのプリグラムソースです。/
このプログラムは Jiro J. Etoさんのプログラムeto-rover.cを少しだけ変更しています。
// Kosei Demura 2001-5-14
// プログラムを実行する前に光センサが2番ポートへ、モータがA,Cポートに接続されている
// ことを確認してください。
#include "conio.h"
#include "unistd.h"
#include "direct-button.h"
#include "direct-sensor.h"
#include "direct-motor.h"
#include "sys/tm.h"
#define NORM_SPEED 255
pid_t mytask1, mytask2;
// ウエイクアップ評価関数 on-offボタンが押されていることを調べる関数
// ボタンが押されるとき働く
wakeup_t button_press_wakeup(wakeup_t data)
{
return PRESSED(button_state(),data);
}
// ボタンが離されたとき働く
wakeup_t button_release_wakeup(wakeup_t data)
{
return RELEASED(button_state(),data);
}
// 黒線をトレースする関数
static int go_trail(int argc, char **argv)
{
int th = 20; // 照明の明るさによりこの値を変更してください。 ここのthを20に設定することでセンサーの反応を良くした
ds_active(&SENSOR_2); // アクティブモードで光センサ使用(ポート2番)
motor_a_speed(NORM_SPEED); // モータ速度指定(Aポート)
motor_c_speed(NORM_SPEED);
motor_c_dir(fwd); // モータ回転方向指定(逆回転 Cポート)
motor_a_dir(fwd);
while (1) {
lcd_int(LIGHT_2); // センサの値を液晶パネルに10進数で表示
lcd_refresh(); // 液晶パネル表示更新
if ( LIGHT_2 <= th ){ // 暗いとき
motor_c_dir(fwd);
motor_c_speed(250); 暗い時はトラックの直線の時なのでc,aポート共にspeed250にしたけどスピードがめちゃくちゃ遅
motor_a_speed(250); かった。どうしてかな?
}else{ // 明るいとき
motor_c_dir(rev); ここに注目、ここでcポートにrevを加えることで右タイヤをリバースさせ、トレースしやすくした
motor_a_speed(40);
motor_c_speed(250);
}
}
}
// RUNボタンを押すとタスクをとめる関数
static int rover_stopper(int argc, char **argv)
{
wait_event(&button_release_wakeup,BUTTON_RUN);
msleep(200);
wait_event(&button_press_wakeup,BUTTON_RUN);
kill(mytask1); // トレースタスクgo_trailを殺す
wait_event(&button_release_wakeup, BUTTON_RUN);
return 0;
}
int main(void)
{
// legOS解析P10のサンプルプログラムとは以下の2行は順番が違う
// 何故かこの順番でないとプログラムがうまく動かない
mytask2 = execi(&rover_stopper,0, NULL,
2,DEFAULT_STACK_SIZE);
mytask1 = execi(&go_trail , 0, NULL,
1,DEFAULT_STACK_SIZE);
tm_start(); // タスクスケジューラー起動 mytask1,mytask2が同時に走る
return 0;
}
以下のプログラム文が吉田のロボットのプログラムソース
// このプログラムは Jiro J. Etoさんのプログラムeto-rover.cを少しだけ変更しています。
// Kosei Demura 2001-5-14
// プログラムを実行する前に光センサが2番ポートへ、モータがA,Cポートに接続されている
// ことを確認してください。
#include "conio.h"
#include "unistd.h"
#include "direct-button.h"
#include "direct-sensor.h"
#include "direct-motor.h"
#include "sys/tm.h"
#define NORM_SPEED 255
pid_t mytask1, mytask2;
// ウエイクアップ評価関数 on-offボタンが押されていることを調べる関数
// ボタンが押されるとき働く
wakeup_t button_press_wakeup(wakeup_t data)
{
return PRESSED(button_state(),data);
}
// ボタンが離されたとき働く
wakeup_t button_release_wakeup(wakeup_t data)
{
return RELEASED(button_state(),data);
}
// 黒線をトレースする関数
static int go_trail(int argc, char **argv)
{
int th = 30; // 照明の明るさによりこの値を変更してください。
ds_active(&SENSOR_2); // アクティブモードで光センサ使用(ポート2番)
motor_a_speed(NORM_SPEED); // モータ速度指定(Aポート)
motor_c_speed(NORM_SPEED);
motor_c_dir(fwd); // モータ回転方向指定(逆回転 Cポート)
motor_a_dir(fwd);
while (1) {
lcd_int(LIGHT_2); // センサの値を液晶パネルに10進数で表示
lcd_refresh(); // 液晶パネル表示更新
if ( LIGHT_2 <= th ){ // 暗いとき
motor_a_dir(fwd);
motor_c_dir(rev); 大嶋のと同じくcポートにrevを加えることによりトーレスをしやすくした
motor_c_speed(40);
motor_a_speed(255);
}else{ // 明るいとき
motor_c_dir(fwd);
motor_a_dir(fwd);
motor_a_speed(255);
motor_c_speed(255);
}
}
}
// RUNボタンを押すとタスクをとめる関数
static int rover_stopper(int argc, char **argv)
{
wait_event(&button_release_wakeup,BUTTON_RUN);
msleep(200);
wait_event(&button_press_wakeup,BUTTON_RUN);
kill(mytask1); // トレースタスクgo_trailを殺す
wait_event(&button_release_wakeup, BUTTON_RUN);
return 0;
}
int main(void)
{
// legOS解析P10のサンプルプログラムとは以下の2行は順番が違う
// 何故かこの順番でないとプログラムがうまく動かない
mytask2 = execi(&rover_stopper,0, NULL,
2,DEFAULT_STACK_SIZE);
mytask1 = execi(&go_trail , 0, NULL,
1,DEFAULT_STACK_SIZE);
tm_start(); // タスクスケジューラー起動 mytask1,mytask2が同時に走る
return 0;
}
/ソースについて/
私達の班はrevをcポート側に加えることにより、左回りのトレースをしやすくしようと考えた。また、大嶋、吉田それぞれのスピードを早くしたつもりでしたが、車体が重いのかとても動きが鈍かった。また、教室は明るいためthを変えることによりセンサーの反応を良くしようとした。それにより既存のプログラムより大嶋はth=20,吉田はth=30にすることによりセンサーの反応が良くなった。