LEGO® MINDSTORMS™でつくる二足歩行ロボット


専攻科 A05107 小野田 晃久

1.製作にあたって

このロボットは、NQCチュートリアルの二足歩行ロボットをベースに作られている。図面はNQCチュートリアルの画像をPNGに変換したものを掲載している。また、要所要所わかりにくいところを写真付で説明する。もし、ソフトウェアを自由にインストールできる環境であるなら cad.zip をダウンロードし、MLCADをインストールすることをお勧めする。CADのデータを発見することができたので、CADのデータを見ながらのほうがわかりやすい点もあるだろうと思われるので、同時に公開しておく。

上へ戻る
2.MLCAD構築法

元の情報ソース

1.LDRAW をインストールする

  (1) Cドライブに「LEGO」というフォルダを作成する
  (2) コマンドプロンプト(MS-DOSプロンプト)で、C:\LEGOに移動する。
  (3) 以下のように入力し、Enter キーで実行する。
      C:\LEGO>ldraw027.exe -y
      解凍に成功すると最終行が次のようになります。
      808 file(s) 
      C:\LEGO>

  (4) 以下のように入力し、Enter キーで実行する。
      C:\LEGO>complete.exe -y
      解凍に成功するとプロンプトに戻ります。
      C:\LEGO> 

  (5) LEGO 配下に「Ldraw」というフォルダが出来ているので、移動する。
      C:\LEGO>cd ldraw
  
  (6) 以下のように入力し、パーツリストを作成する。
      C:\LEGO\Ldraw>mklist.exe
      sort by [N]umber or [D]escription:
      という表示がでたら、d を入力し、enterキーで実行します。

2. MLCADをインストールする。
  (1) mlcad210.zip ファイルを解凍します。
      Ldraw フォルダ配下に解凍したファイルがあるように移動するか、
      コピーするかしてください。
  
3. MLCADを起動する
  (1) MLCAD.exe をダブルクリックして、画面が表示されれば正常です。
			

上へ戻る
3.図面

腰、足以外は、飾りなので写真を見て適当に作成する。
また、腰や足は図面通りに作成すると強度が足りないので、写真を見て適宜補強すること。
結合のページはNQCチュートリアルのページにリンクしてある。
CAD図面はNQCチュートリアルの2足歩行ロボットの図面のままなので注意すること。(足と腰の構造は同じである)
よくわからないときは、NQCチュートリアルここのページを参考にすること。

  1. その他
  2. 結合
  3. 写真のダウンロード
  4. CAD図面のダウンロード

上へ戻る
4.ソース

**ファームウェアはbrickos-0.9.0を使用しています。**
本体用プログラム --- biped_walker2.c

#include<dmotor.h>
#include<dsensor.h>
#include<dsound.h>
#include<unistd.h>
#include<conio.h>

#define EYE_MOVE 200 // EYE MOVE TIME
#define LEG 300 // LEG MOVE TIME
#define ANKLE 1200 // ANKEL MOVE TIME

tid_t t_stop,t_walk,t_eye;

int stop();
int walk();
void leg_move_right();
void ankle_move_right();
void leg_move_left();
void ankle_move_left();
int eye();

wakeup_t ts1_wakeup(wakeup_t data);
wakeup_t ts2_wakeup(wakeup_t data);
wakeup_t ts3_wakeup(wakeup_t data);

int main(int argc,char **argv){
	t_stop=execi(&stop,0,NULL,100,DEFAULT_STACK_SIZE); // make stop task
	t_walk=execi(&walk,0,NULL,90,DEFAULT_STACK_SIZE); // make walk task
//	t_eye=execi(&eye,0,NULL,10,DEFAULT_STACK_SIZE); // make eye task
	return 0;
}

int stop(){ // rcx stop function
	int stopchar;
	stopchar=getchar();
	if(stopchar==KEY_RUN || stopchar==KEY_ONOFF){
		motor_a_speed(0);
		motor_b_speed(0);
		motor_c_speed(0);
		shutdown_task(t_walk);
		kill(t_walk);
		cls();
		cputs("stop");
		killall(100);
		msleep(5000);
	}
	return 0;
}

int walk(){ // Walk function
	motor_a_speed(MAX_SPEED);
	motor_b_speed(MAX_SPEED);
	
	motor_b_dir(rev);
	msleep(1500);
	//org//msleep(1500);
	motor_b_dir(brake);
	while(1){
		leg_move_right(); // right leg move function
		ankle_move_right(); // right ankle move function
		leg_move_left(); // left leg move function
		ankle_move_left(); // left ankle move function
	}
	return 0;
}

void leg_move_right(){ // right leg move function
	motor_a_dir(fwd);
	msleep(LEG);
	motor_b_dir(rev);
	msleep(ANKLE);
	motor_b_dir(brake);
	wait_event(&ts1_wakeup,0);
	motor_a_dir(brake);
}

void leg_move_left(){ // left leg move function
	motor_a_dir(rev);
	msleep(LEG);
	motor_b_dir(fwd);
	msleep(ANKLE);
	motor_b_dir(brake);
	wait_event(&ts1_wakeup,0);
	motor_a_dir(brake);
}

void ankle_move_right(){ // right ankle move function
	motor_b_dir(fwd);
	msleep(1500);
	wait_event(&ts3_wakeup,0);
	dsound_system(DSOUND_BEEP);
	msleep(3000);
	//org//msleep(1500);
	motor_b_dir(brake);
}

void ankle_move_left(){ // left ankle move function
	motor_b_dir(rev);
	msleep(1500);
	wait_event(&ts2_wakeup,0);
	dsound_system(DSOUND_BEEP);
	msleep(3200);
	//org//msleep(1500);
	motor_b_dir(brake);
}

wakeup_t ts1_wakeup(wakeup_t data){
	return SENSOR_1<0xf000;
}

wakeup_t ts2_wakeup(wakeup_t data){
	return SENSOR_2>0xf000;
}

wakeup_t ts3_wakeup(wakeup_t data){
	return SENSOR_3>0xf000;
}

/*
int eye(){ // Move eye function
	motor_c_speed(MAX_SPEED);

	while(1){
		motor_c_dir(fwd);
		msleep(EYE_MOVE);
		motor_c_dir(brake);
		msleep(EYE_MOVE);

		motor_c_dir(rev);
		msleep(EYE_MOVE);
		motor_c_dir(brake);
		msleep(EYE_MOVE);

		motor_c_dir(rev);
		msleep(EYE_MOVE);
		motor_c_dir(brake);
		msleep(EYE_MOVE);

		motor_c_dir(fwd);
		msleep(EYE_MOVE);
		motor_c_dir(brake);
		msleep(EYE_MOVE);
	}
	return 0;
}
*/

上へ戻る
5.動画

実際に動かしている様子です。

動画

上へ戻る