このページは、satoshiのノートです。

目次

最初のプログラム

// 最初のプログラム
//
//    作成者:satoshi
//    作成日:2005-10-14

task main()
{
    OnFwd(OUT_A+OUT_);//  AのモータとCのモータを正回転
    Wait(300);        //  プログラムの実行を3秒待つ
    Off(OUT_A+OUT_C); //  AとCのモータを止める
}

左という字を書くプログラム(課題1)

//書道プログラム
//  作成者 satoshi
//  作成日 2005-11-2
void straight(int t){
	OnFwd(OUT_A+OUT_C);
	Wait(t);
	Off(OUT_A+OUT_C);
	}
void turn_right(int t){
	OnFwd(OUT_A);
	OnRev(OUT_C);
	Wait(t);
	Off(OUT_A+OUT_C);
	}
void turn_left(int t){
	OnRev(OUT_A);
	OnFwd(OUT_C);
	Wait(t);
	Off(OUT_A+OUT_C);
	}
void back(int t){
	OnRev(OUT_A+OUT_C);
	Wait(t);
	Off(OUT_A+OUT_C);
	}
void up(int t){
	OnRev(OUT_B);
	Wait(t);
	Off(OUT_B);
	}
void down(int t){
	OnFwd(OUT_B);
	Wait(t);
	Off(OUT_B);
	}
	task main(){
	int turn_90=88,turn_180=180,go_15c=120,u=7,go_12c=90;
	straight(go_15c);
	up(u);
	straight(go_12c);
	turn_left(turn_90);
	straight(go_15c/4);
	turn_left(turn_90);
	straight(go_15c/2);
	turn_left(2*turn_90/3);
	back(go_12c);
	down(u);
	straight(go_15c);
	up(u);
	straight(go_12c-15);
	turn_left(turn_90+35);
	back(65);
	down(u);
	straight(go_12c);
	up(u);
	straight(go_12c/2-10);
	turn_right(turn_90);
	back(go_12c);
	down(u);
	straight(go_12c/2);
	up(u);
	straight(go_12c-10);
	turn_right(turn_90+20);
	back(30);
	down(u);
	back(go_12c+30);
	up(u);	
	}
  •  関数が多いので展開が遅い気がする。
  •  関数なしで書いた方が早いのだろうか?
  •  角度とかの時間を微調整してるので
  •  あんまり変数にした意味がなかったかも
  • NQCの関数はコンパイル時に展開されてしまうので、プログラムが大きくなってしまいます。転送に時間がかかり過ぎるのがストレスになるようでしたら、サブルーチンを使ってみてください。 -- 松本(教員)? 2006-02-02 (木) 10:51:28

タッチセンサーの最初のプログラム

// touch_sample
// 作成者 satoshi
//
task main(){
	SetSenser(SENSOR_2,SENSOR_TOUCH);
	OnFwd(OUT_A+OUT_C);
	until(SENSOR_2==1);//センサーがあたるまで前進
	Off(OUT_A+OUT_C);
	}

机の周りを壁にそって走るプログラム(試作)

// touch_trace_sample
// 作成者 satoshi
//
sub straight(){
	OnFwd(OUT_A+OUT_C);
	}
sub turn_right(){
	OnFwd(OUT_C);
	}
sub turn_left(){
	OnFwd(OUT_A);
	}
void back(int t){
	OnRev(OUT_A+OUT_C);
	Wait(t);
	Off(OUT_A+OUT_C);
	}	
	
task main(){
	SetSensor(SENSOR_1,SENSOR_TOUCH);
	SetSensor(SENSOR_3,SENSOR_TOUCH);
	
	while(true){
	
	if(SENSOR_3==1&&SENSOR_1!=1){//右が触れていたら
	straight();//前進
	}
	if(SENSOR_3==1&&SENSOR_1==1){//両方触れていたら
	turn_left();//右側のセンサーが壁に触れるまで左回転
	until(SENSOR_3==1&&SENSOR_1!=1);
	}
	if(SENSOR_3!=1&&SENSOR_1==1){//左が触れていたら
	turn_right();//右側のセンサーが壁に触れるまで右回転
	until(SENSOR_3==1&&SENSOR_1!=1);
	}
	if(SENSOR_3!=1&&SENSOR_1!=1){//両方触れてなかったら
	turn_right();//触れるまで右回転(ここを改良した方がよい)
	until(SENSOR_3==1&&SENSOR_1!=1);
	}
	}
	}
  • うまく動かなかった。
  • 両方触れてなかったとき前進もさせなければ触れないので改良してみたい

光センサーの最初のプログラム

// light_sample
// 作成者 satoshi
//
task main(){
	SetSensor(SENSOR_2,SENSOR_LIGHT);
	while(true){
	if(SENSOR_2<45){
	OnFwd(OUT_A);
	Off(OUT_C);
	}
	else{
	OnFwd(OUT_C);
	Off(OUT_A);
		}
	}
}

一番明るいところを探すプログラム(試作品)

// 一番明るいところを探すプログラム(試作品)
// 作成者 satoshi
//
#define THRESHOLD 
#define turn 26
task main(){
	int max_right,time_max;
	SetSensor(SENSOR_1,SENSOR_LIGHT);
		ClearTimer(0);
	while(Timer(0)<=turn){//360度回転する。
		OnFwd(OUT_A);
		OnRev(OUT_C);
	if(SENSOR_1>THRESHOLD){//普通より明るかったら
	if(max_right<SENSOR_1){//今までで一番明るいかの判断
	max_right=SENSOR_1;
	time_max=Timer(0);
}}}
	ClearTimer(1);
	while(Timer(1)<=time_max){//さっき一番明るかったところまで回転
		OnFwd(OUT_A);
		OnRev(OUT_C);
	}
	Off(OUT_A+OUT_C);
}
  • 探せるときと探せないときの誤差がある。
  • まだまだ改良が必要。

課題4(光の方について行くプログラム(試作))

//課題4(光の方について行くプログラム(試作))
//
//
#define THRESHOLD 40 
task main(){
	int max_right,time_max;
	SetSensor(SENSOR_1,SENSOR_LIGHT);
	SetSensor(SENSOR_3,SENSOR_LIGHT);
	while(true){
	if(SENSOR_1>THRESHOLD&&SENSOR_3<THRESHOLD){
		OnFwd(OUT_C);
}
	if(SENSOR_1<THRESHOLD&&SENSOR_3>THRESHOLD){
		OnFwd(OUT_A);
}
	if(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD){
		OnFwd(OUT_A);
}
	if(SENSOR_1>THRESHOLD&&SENSOR_3<THRESHOLD){
		OnFwd(OUT_A+OUT_C);
	}
}
  • 普通の所より明るいを見つけて進むプログラム
  • とりあえず失敗しましたがここから改良です。
  • ぶっちゃけタッチセンサーの光バージョン。
  • (このプログラムはWaitがないので動かなかった模様、原因が分かったので
  • 一応記述します。)

課題4(光の方について行くプログラム(改良))

//right_trace
// 作成者 やらー&すなお&satoshi
//
#define THRESHOLD 40 
task main(){
	SetSensor(SENSOR_1,SENSOR_LIGHT);
	SetSensor(SENSOR_3,SENSOR_LIGHT);
	while(true){
	if(SENSOR_1>THRESHOLD&&SENSOR_3<THRESHOLD){//左のセンサーのみ感知         
               OnFwd(OUT_C);//左回転
		OnRev(OUT_A);
	        Wait(10);
}
	if(SENSOR_1<THRESHOLD&&SENSOR_3>THRESHOLD){//右のセンサーのみ感知		
               OnFwd(OUT_A);//右回転
		OnRev(OUT_C);
		Wait(10);
}
	if(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD){//両方感知してなかったら     
             while(SENSOR_1<THRESHOLD||SENSOR_3<THRESHOLD){//どちらかが反応するまで
             OnFwd(OUT_C);//左回転
             OnRev(OUT_A);
		Wait(10);
		until(SENSOR_1>THRESHOLD||SENSOR_3>THRESHOLD);//もしかしたらいらないかも…
		}
}
	if(SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD){//両方感知していたら
		OnFwd(OUT_A+OUT_C);//前進
	}
}
}
  • 改良前のとちがうのはWaitをいれて刻んでる所です。
  • センサーが反応してなければひたすら左回りなので少し遅い。
  • ロボは前タイヤを大きくしてセンサーが光を感知しやすくした。

課題5(音に合わせて指揮、ダンスをするプログラム)

//課題5(最初に指揮をする側)
//
//
#define Do 523
#define Do_s 554
#define Re 587
#define Re_s 622
#define Mi 659
#define Fa 698
#define Fa_s 740
#define Sol 784
#define Sol_s 831
#define La 880
#define La_s 932
#define Si 988
#define Do_up 1047
#define Re_up 1175
task Move(){//ダンスのタスク
ClearMessage();//次に受信するためにメッセージクリア
while(Message()==0){//音楽がおわるまで踊り続ける
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(120);
OnFwd(OUT_C);
OnRev(OUT_A);
Wait(120);
OnFwd(OUT_C);
OnRev(OUT_A);
Wait(120);
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(120);
}
SendMessage(1);//相手が踊るように送信
}
task play_music(){//音を鳴らしながら指揮をするタスク
while(true){//音楽は大塚愛の「さくらんぼ」
	ClearMessage();//メッセージクリア
	PlayTone(La,15);OnFwd(OUT_B);Wait(20);//指揮と音
	PlayTone(Si,15);OnRev(OUT_B);Wait(20);
	PlayTone(La,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Sol,15);OnRev(OUT_B);Wait(20);
	PlayTone(Sol,50);OnFwd(OUT_B);Wait(60);
	PlayTone(Si,25);OnRev(OUT_B);Wait(30);
	
	PlayTone(Re_up,25);OnFwd(OUT_B);Wait(30);
	PlayTone(Fa_s,15);OnRev(OUT_B);Wait(20);
	PlayTone(Fa_s,50);OnFwd(OUT_B);Wait(55);
	PlayTone(Sol,50);OnRev(OUT_B);Wait(55);
	OnFwd(OUT_B);Wait(15);
	PlayTone(Sol,15);OnRev(OUT_B);Wait(20);
	
	PlayTone(Fa_s,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Sol,15);OnRev(OUT_B);Wait(20);
	PlayTone(Si,25);OnFwd(OUT_B);Wait(30);
	PlayTone(Re,15);OnRev(OUT_B);Wait(20);
	PlayTone(Re,50);OnFwd(OUT_B);Wait(55);
	PlayTone(Mi,25);OnRev(OUT_B);Wait(30);
	
	PlayTone(Sol,25);OnFwd(OUT_B);Wait(30);
	PlayTone(Fa_s,15);OnRev(OUT_B);Wait(20);
	PlayTone(Sol,15);OnFwd(OUT_B);Wait(20);
	PlayTone(La,15);OnRev(OUT_B);Wait(20);
	PlayTone(Re,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Si,25);OnRev(OUT_B);Wait(30);
	
	PlayTone(Fa_s,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Sol,25);OnRev(OUT_B);Wait(30);
	PlayTone(Re,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Do,25);OnRev(OUT_B);Wait(30);
	PlayTone(Re,25);OnFwd(OUT_B);Wait(30);
	PlayTone(Mi,25);OnRev(OUT_B);Wait(30);
	
	PlayTone(Sol,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Sol,15);OnRev(OUT_B);Wait(20);
	PlayTone(Fa_s,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Sol,15);OnRev(OUT_B);Wait(20);
	PlayTone(La,15);OnFwd(OUT_B);Wait(20);
	PlayTone(La,15);OnRev(OUT_B);Wait(20);
	
	PlayTone(La,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Si,15);OnRev(OUT_B);Wait(20);
	PlayTone(La,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Sol,15);OnRev(OUT_B);Wait(20);
	PlayTone(Sol,50);OnFwd(OUT_B);Wait(55);
	PlayTone(Si,15);OnRev(OUT_B);Wait(20); 
	
	PlayTone(Re_up,25);OnFwd(OUT_B);Wait(30);
	PlayTone(Fa_s,15);OnRev(OUT_B);Wait(20);
	PlayTone(Fa_s,50);OnFwd(OUT_B);Wait(55);
	PlayTone(Sol,50);OnRev(OUT_B);Wait(55);
	OnFwd(OUT_B);Wait(15);
	PlayTone(Sol,15);OnRev(OUT_B);Wait(20);
	
	PlayTone(Fa_s,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Sol,15);OnRev(OUT_B);Wait(20);
	PlayTone(Si,25);OnFwd(OUT_B);Wait(30);
	PlayTone(Re,15);OnRev(OUT_B);Wait(20);
	PlayTone(Re,50);OnFwd(OUT_B);Wait(55);
	PlayTone(Mi,25);OnRev(OUT_B);Wait(30);
	
	PlayTone(Sol,25);OnFwd(OUT_B);Wait(30);
	PlayTone(Fa_s,15);OnRev(OUT_B);Wait(20);
	PlayTone(Sol,15);OnFwd(OUT_B);Wait(20);
	PlayTone(La,15);OnRev(OUT_B);Wait(20);
	PlayTone(Re,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Si,25);OnRev(OUT_B);Wait(30);
	
	PlayTone(Do_up,25);OnFwd(OUT_B);Wait(30);
	PlayTone(Si,25);OnRev(OUT_B);Wait(30);
	PlayTone(La,25);OnFwd(OUT_B);Wait(30);
	PlayTone(Mi,25);OnRev(OUT_B);Wait(30);
	PlayTone(Sol,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Sol,15);OnRev(OUT_B);Wait(20);
	
	PlayTone(Fa_s,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Sol,15);OnRev(OUT_B);Wait(20);
	PlayTone(La,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Fa_s,15);OnRev(OUT_B);Wait(20);
	PlayTone(Sol,25);OnFwd(OUT_B);Wait(30);
	Off(OUT_B);Wait(25);
	ClearTimer(0);
	while(Timer(0)<=50){SendMessage(2);}
       break;
	
	}
	}
	
	task main(){
	
	SendMessage(1);//最初に相手を踊らすためにSend
	start play_music;//音楽スタート
	
	
	while(true){//交代しながら永久に動く
	until(Message()!=0);//メッセージがくるまで待つ
	if(Message()==1){//1なら踊る
	start Move;}
	if(Message()==2){//2なら指揮
	start play_music;
	}
	}
	}
  • 音符の入力が疲れた。
  • 音を鳴らしながらモーターを動かせたのでそこはやりやすかった。
  • 交代の部分が難しかった。

課題5-2

//Sound_kadai5_2(最初に踊る)
// 
//
 #define Do 523
#define Do_s 554
#define Re 587
#define Re_s 622
#define Mi 659
#define Fa 698
#define Fa_s 740
#define Sol 784
#define Sol_s 831
#define La 880
#define La_s 932
#define Si 988
#define Do_up 1047
#define Re_up 1175
task Move(){
ClearMessage();
while(Message()==0){
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(120);
OnFwd(OUT_C);
OnRev(OUT_A);
Wait(120);
OnFwd(OUT_C);
OnRev(OUT_A);
Wait(120);
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(120);
}
SendMessage(1);
}

task play_music(){
while(true){
	
	PlayTone(La,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Si,15);OnRev(OUT_B);Wait(20);
	PlayTone(La,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Sol,15);OnRev(OUT_B);Wait(20);
	PlayTone(Sol,50);OnFwd(OUT_B);Wait(60);
	PlayTone(Si,25);OnRev(OUT_B);Wait(30);
	
	PlayTone(Re_up,25);OnFwd(OUT_B);Wait(30);
	PlayTone(Fa_s,15);OnRev(OUT_B);Wait(20);
	PlayTone(Fa_s,50);OnFwd(OUT_B);Wait(55);
	PlayTone(Sol,50);OnRev(OUT_B);Wait(55);
	OnFwd(OUT_B);Wait(15);
	PlayTone(Sol,15);OnRev(OUT_B);Wait(20);
	
	PlayTone(Fa_s,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Sol,15);OnRev(OUT_B);Wait(20);
	PlayTone(Si,25);OnFwd(OUT_B);Wait(30);
	PlayTone(Re,15);OnRev(OUT_B);Wait(20);
	PlayTone(Re,50);OnFwd(OUT_B);Wait(55);
	PlayTone(Mi,25);OnRev(OUT_B);Wait(30);
	
	PlayTone(Sol,25);OnFwd(OUT_B);Wait(30);
	PlayTone(Fa_s,15);OnRev(OUT_B);Wait(20);
	PlayTone(Sol,15);OnFwd(OUT_B);Wait(20);
	PlayTone(La,15);OnRev(OUT_B);Wait(20);
	PlayTone(Re,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Si,25);OnRev(OUT_B);Wait(30);
	
	PlayTone(Fa_s,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Sol,25);OnRev(OUT_B);Wait(30);
	PlayTone(Re,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Do,25);OnRev(OUT_B);Wait(30);
	PlayTone(Re,25);OnFwd(OUT_B);Wait(30);
	PlayTone(Mi,25);OnRev(OUT_B);Wait(30);
	
	PlayTone(Sol,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Sol,15);OnRev(OUT_B);Wait(20);
	PlayTone(Fa_s,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Sol,15);OnRev(OUT_B);Wait(20);
	PlayTone(La,15);OnFwd(OUT_B);Wait(20);
	PlayTone(La,15);OnRev(OUT_B);Wait(20);
	
	PlayTone(La,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Si,15);OnRev(OUT_B);Wait(20);
	PlayTone(La,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Sol,15);OnRev(OUT_B);Wait(20);
	PlayTone(Sol,50);OnFwd(OUT_B);Wait(55);
	PlayTone(Si,15);OnRev(OUT_B);Wait(20); 
	
	PlayTone(Re_up,25);OnFwd(OUT_B);Wait(30);
	PlayTone(Fa_s,15);OnRev(OUT_B);Wait(20);
	PlayTone(Fa_s,50);OnFwd(OUT_B);Wait(55);
	PlayTone(Sol,50);OnRev(OUT_B);Wait(55);
	OnFwd(OUT_B);Wait(15);
	PlayTone(Sol,15);OnRev(OUT_B);Wait(20);
	
	PlayTone(Fa_s,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Sol,15);OnRev(OUT_B);Wait(20);
	PlayTone(Si,25);OnFwd(OUT_B);Wait(30);
	PlayTone(Re,15);OnRev(OUT_B);Wait(20);
	PlayTone(Re,50);OnFwd(OUT_B);Wait(55);
	PlayTone(Mi,25);OnRev(OUT_B);Wait(30);
	
	PlayTone(Sol,25);OnFwd(OUT_B);Wait(30);
	PlayTone(Fa_s,15);OnRev(OUT_B);Wait(20);
	PlayTone(Sol,15);OnFwd(OUT_B);Wait(20);
	PlayTone(La,15);OnRev(OUT_B);Wait(20);
	PlayTone(Re,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Si,25);OnRev(OUT_B);Wait(30);
	
	PlayTone(Do_up,25);OnFwd(OUT_B);Wait(30);
	PlayTone(Si,25);OnRev(OUT_B);Wait(30);
	PlayTone(La,25);OnFwd(OUT_B);Wait(30);
	PlayTone(Mi,25);OnRev(OUT_B);Wait(30);
	PlayTone(Sol,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Sol,15);OnRev(OUT_B);Wait(20);
	
	PlayTone(Fa_s,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Sol,15);OnRev(OUT_B);Wait(20);
	PlayTone(La,15);OnFwd(OUT_B);Wait(20);
	PlayTone(Fa_s,15);OnRev(OUT_B);Wait(20);
	PlayTone(Sol,25);OnFwd(OUT_B);Wait(30);
	Off(OUT_B);Wait(25);
	 ClearTimer(0);
	while(Timer(0)<=50){SendMessage(2);}
       break;
	
	}
	}
	
	task main(){
	
	while(true){
	until(Message()!=0);
	if(Message()==1){
	start Move;}
	if(Message()==2){
	start play_music;
	}
	}
	}
  • コメントは前のプログラム参照
  • 2つ以上の条件式を組み合わせる場合、つまり論理和や論理積を作る場合には、それぞれの条件式を ( ) で囲んでおきましょう。 -- 松本(教員)? 2006-02-02 (木) 10:53:30


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-02-02 (木) 10:53:30