課題1

目標

フィールド

ピンポン球を持って黒い線の上を走り、上部のゴールの手前まで運びシュートする。

ロボットの概要

全体像

全体像
  • カーブでポールと接触しないように横は短く、縦は長くした
  • コントローラの部分を後部に縦に取り付けて、前部に機能を集約させた
  • ピンポン球をどうやって持ち、シュートをするか考えた結果この形になった(下記で説明)

ドライブベース

土台
  • 前部のアームの部分が不安定なので、土台はがっちりと安定したのになった
  • 基礎土台で作っているうちに何度も変わった
    走る構造
  • 三輪車の逆バージョンで前輪駆動にしたのは、光センサーが近くて読み取りやすかったら
  • 黒くて丸い部分は支えの役割で引きずって走る

球をつかんでシュートする構造

つかむ構造 モーター つかんでる所

モーターのパワーがゴムとギアに伝わってアームを回す

  • このように球をアームを回すと本体に引っかかるので、そのまま運びゴール前で逆回転をして弾いてシュートする
  • 他のグループとかぶらないようにと考えました。最初はアームを平行にしてアームにピンポン球を乗せて運ぶ方法でしたが、不安定だったのでアームを支える2本の柱の長さを調節してアームと本体でがっちりと挟むようにして安定感をだしました。ついでに、シュートもかっこよくなりました。

プログラムの説明

#define THRESHOLD 45	// しきい値
#define go_forward OnFwd(OUT_AC);	// 直進
#define turn_left1 OnFwd(OUT_C);OnRev(OUT_A);	// 左旋回
#define turn_left0 OnFwd(OUT_C);Off(OUT_A);	   // 左折
#define turn_right1 OnFwd(OUT_A);OnRev(OUT_C);	// 右旋回
#define turn_right0 OnFwd(OUT_A);Off(OUT_C);		// 右折

task main()
{
	ClearTimer(0);
	int timer = 0;	//続けて黒になった回数
	int kado = 0;	// 走っていて左側に直角がある回数
	SetSensor(SENSOR_2,SENSOR_LIGHT);	
	SetPower(OUT_B, 2);
	OnRev(OUT_B);
	Wait(30);
	Off(OUT_B);

	while(true){
		// 黒い時
		if (SENSOR_2 < THRESHOLD -4){
			ClearTimer(0);
			while(SENSOR_2 < THRESHOLD -4){
				turn_left1;
			}
			timer = FastTimer(0);	//タイマーリセット
		// 灰色の時
		} else if (SENSOR_2 < THRESHOLD +8){
			go_forward;
		// 白い時
		} else {
			turn_right1;
		}
		
		
		if (timer >= 30) {	//0.3秒以上黒が続いたら直角とみなす
			PlayTone(440, 30);
			timer = 0;
			kado++;	//直角の回数をカウント		
			if (kado == 2) {	//2つ目の直角にきたら
				turn_right1;   //交差点で曲がったのを正
				Wait(35);   //面に向き直し交差点を通過す
				go_forward;    //る
				Wait(30);
				timer = 0;
			}
			if (kado == 3) {	//3つ目の直角にきたら
				turn_right1; //ゴールに対して正面に向くよう修正
				turn_right1;
				Wait(60);
				Off(OUT_AC);
				SetPower(OUT_B, 7);
				OnFwd(OUT_B);
				Wait(100);
				Off(OUT_B);
				break;	
			}
		}
	}
	Off(OUT_AC);
}

何度も直した所

if (timer >= 30) {		//0.3秒以上黒が続いたら
			PlayTone(440, 30);
			timer = 0;
			kado++;	//直角の回数をカウント		
			if (kado == 2) {	//2つ目の直角にきたら
				turn_right1;
				Wait(35);
				go_forward;
				Wait(30);
				timer = 0;

最初はif (timer >= 30)の外にif (kado == 2)を置いていたけど、if (kado == 2)が来たらタイマーを0にしてしまうので、次のif (kado == 3)までいけなかったのをif (timer >= 30)の中に入れることによって直角の回数を3まで数えた

感想

相方にかなりアドバイスをもらって完成しました。こんなに時間がかかると思わなかったので、次回は時間に余裕を持って完成させたい。プログラムの方は短くでき、しきい値を微調整しなくても安定してゴールまで行けたんで満足です。


添付ファイル: filegrab.jpg 136件 [詳細] filerun.jpg 145件 [詳細] filemoter.jpg 142件 [詳細] filecatch.jpg 148件 [詳細] filedodai.jpg 142件 [詳細] fileall.jpg 139件 [詳細] filefield.jpg 158件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-12-21 (金) 19:38:59