- 追加された行はこの色です。
- 削除された行はこの色です。
[[2005/C1]]
**プログラムその一 [#q3b9e2e2]
#define threshold 45
#define turn_left OnRev(OUT_A);OnFwd(OUT_C);
#define turn_right OnFwd(OUT_A);OnRev(OUT_C);
#define stop_turning Off(OUT_A+OUT_C);
#define akarui 40
int cross ;
int cro ;
void go_a(int cro)
{
cross = 0 ;
while(true){
if (SENSOR_1+ SENSOR_2+ SENSOR_3 > akarui)
{
cross = cross + 1 ;
}
if (cross == cro)
{
Off(OUT_A+OUT_C) ;
}
cross = 0 ;
}
}
sub li_a()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);
setSensor(SENSOR_2, SENSOR_LIGHT);
SetSensor(SENSOR_3, SENSOR_LIGHT);
OnFwd(OUT_A); OnRev(OUT_C);
Wait(140);Off(OUT_A+ OUT_C);
OnFwd(OUT_A+OUT_C);Wait(200);Off(OUT_A+OUT_C);
OnFwd(OUT_C); OnRev(OUT_A);
Wait(100);Off(OUT_A+OUT_C);
OnFwd(OUT_A+OUT_C);Wait(200);
while (true)
{
if ((SENSOR_3> akarui )&& (SENSOR_2 <akarui )
&& (SENSOR_1> akarui))
{ OnFwd(OUT_A+OUT_C); }
if ((SENSOR_1 < akarui ) && (SENSOR_2 < akarui)
&& (SENSOR_3> akarui))
{ OnFwd(OUT_A);
OnRev(OUT_C); }
if((SENSOR_3< akarui )&& (SENSOR_2 <akarui )
&& ( SENSOR_1 > akarui) ){
OnFwd(OUT_C);
OnRev(OUT_A);}
if((SENSOR_2 < akarui) && (SENSOR_3< akarui )
&& (SENSOR_1 < akarui )){
OnFwd(OUT_A+OUT_C);
}
if ((SENSOR_1 < akarui ) &&
(SENSOR_3 < akarui )
&& (SENSOR_2 > akarui )){
OnFwd(OUT_C);
OnRev(OUT_A);
}
if((SENSOR_1>akarui)&&
(SENSOR_2>akarui)&&(SENSOR_3<akarui)){
OnFwd(OUT_C);
OnRev(OUT_A);}
if ((SENSOR_1 < akarui ) &&
(SENSOR_2 > akarui)
&& (SENSOR_3> akarui))
{ OnFwd(OUT_A);
OnRev(OUT_C); }
}
}
task main()
{ SetSensor(SENSOR_3, SENSOR_LIGHT);
SetSensor(SENSOR_2, SENSOR_LIGHT);
SetSensor(SENSOR_1, SENSOR_LIGHT);
OnFwd(OUT_A+OUT_C);Wait(50);Off(OUT_A+OUT_C); Wait
(300);
OnRev(OUT_A+OUT_C); Wait(100); Off(OUT_A+OUT_C);
ClearMessage();
until (Message() != 0);
if ( Message() == 1 ){
PlaySound(SOUND_CLICK);
li_a();
go_a(4);
OnFwd(OUT_A);OnRev(OUT_C);Wait(300);
li_a();
go_a(5);}
if ( Message() == 2 ) {
PlaySound(SOUND_CLICK);
li_a();
go_a(3);
OnFwd(OUT_A);OnRev(OUT_C);Wait(300);
li_a();
go_a(4);}
if ( Message() == 3 ) {
PlaySound(SOUND_CLICK);
li_a();
go_a(2);
OnFwd(OUT_A);OnRev(OUT_C);Wait(300);
li_a();
go_a(2);}
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(148);
OnFwd(OUT_A+OUT_C);
Wait(250);
ClearMessage();
until (Message() != 0);
if ( Message() == 1 ) {
PlaySound(SOUND_CLICK);
li_a();
go_a(5);
OnFwd(OUT_A);OnRev(OUT_C);Wait(300);
li_a();
go_a(6);}
if ( Message() == 2 ) {
PlaySound(SOUND_CLICK);
li_a();
go_a(4);
OnFwd(OUT_A);OnRev(OUT_C);Wait(300);
li_a();
go_a(5);}
if ( Message() == 3 ) {
PlaySound(SOUND_CLICK);
li_a();
go_a(3);
OnFwd(OUT_A);OnRev(OUT_C);Wait(300);
li_a();
go_a(4);}
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(148);
OnFwd(OUT_A+OUT_C);
Wait(250);
ClearMessage();
until (Message() != 0);
if ( Message() == 1 ){ turn_left;
li_a();PlaySound(SOUND_CLICK);
go_a(6);}
if ( Message() == 2 ) {turn_right;
li_a(); PlaySound(SOUND_CLICK);
go_a(5); }
if ( Message() == 3 ) { stop_turning;
li_a();PlaySound(SOUND_CLICK);
go_a(4); }
}
エビチリ版プログラムです。やたらめったら長いのが特徴。
我らがマシンはアームと車体で別々のプログラムを組んでいますが、その車体のプログラムです。
関数で十字路の数を数えて、それを目安に止まるようにプログラムしたつもりです。
実際使ったのはこれの改良版でしたが、雛形として役に立ったのなら作ったかいがあるというもの、手前味噌ですが、自慢の一品です。
**プログラムその二 [#ddd444cf]
#define akarui 45
task main()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);
SetSensor(SENSOR_2, SENSOR_LIGHT);
SetSensor(SENSOR_3, SENSOR_LIGHT);
OnFwd(OUT_A+OUT_C);Wait(50);Off(OUT_A+OUT_C);
Wait (300);
OnRev(OUT_A+OUT_C); Wait(100);
OnFwd(OUT_A); OnRev(OUT_C); Wait(120);
Off(OUT_A+OUT_C);
OnFwd(OUT_A+OUT_C);Wait(150);
Off(OUT_A+OUT_C);
OnFwd(OUT_C); OnRev(OUT_A); Wait(80);
Off(OUT_A+OUT_C);
OnFwd(OUT_A+OUT_C);Wait(230);Off(OUT_A+OUT_C);
OnFwd(OUT_A); OnRev(OUT_C); Wait(120);
OnFwd(OUT_C); OnRev(OUT_A);
while (true)
{
if ((SENSOR_3> akarui )&& (SENSOR_2 <akarui )
&& (SENSOR_1> akarui))
{ OnFwd(OUT_A+OUT_C); }
if ((SENSOR_1 < akarui ) && (SENSOR_2 < akarui)
&& (SENSOR_3> akarui))
{ OnFwd(OUT_A);
OnRev(OUT_C); }
if((SENSOR_3< akarui )&& (SENSOR_2 <akarui )
&& ( SENSOR_1 > akarui) ){
OnFwd(OUT_C);
OnRev(OUT_A);}
if((SENSOR_2 < akarui) && (SENSOR_3< akarui )
&& (SENSOR_1 < akarui )){
OnFwd(OUT_A+OUT_C);
}
if ((SENSOR_1 < akarui ) &&
(SENSOR_3 < akarui )
&& (SENSOR_2 > akarui )){
OnFwd(OUT_C);
OnRev(OUT_A);
}
if((SENSOR_1>akarui)&&(SENSOR_2>akarui)
&& (SENSOR_3<akarui)){
OnFwd(OUT_C);
OnRev(OUT_A);}
if ((SENSOR_1 < akarui ) && (SENSOR_2 > akarui)
&& (SENSOR_3> akarui))
{ OnFwd(OUT_A);
OnRev(OUT_C); }
}
}
2回目のチャレンジのために作った車体プログラムです。
チームの頑張りにより、ライントレース性能はその一よりも遥かに向上したため、チームも驚天動地の大健闘を見せてくれました。
ただアームとの連携がうまくいかず、判断、分別という行動にしばしば失敗してしまいます。残念無念。
**プログラムその三 [#qdab9974]
#define akarui 45
task main()
{ SetSensor(SENSOR_1, SENSOR_LIGHT);
SetSensor(SENSOR_2, SENSOR_LIGHT);
SetSensor(SENSOR_3, SENSOR_LIGHT);
start A;
start B;}
task A()
{
stop B;
OnFwd(OUT_A+OUT_C);Wait(50);
Off(OUT_A+OUT_C); Wait (300);
OnRev(OUT_A+OUT_C); Wait(100);
OnFwd(OUT_A); OnRev(OUT_C); Wait(120);
Off(OUT_A+OUT_C);
OnFwd(OUT_A+OUT_C);Wait(150);Off(OUT_A+OUT_C);
OnFwd(OUT_C); OnRev(OUT_A); Wait(80);
Off(OUT_A+OUT_C);
OnFwd(OUT_A+OUT_C);Wait(230);Off(OUT_A+OUT_C);
OnFwd(OUT_A); OnRev(OUT_C); Wait(120);
OnFwd(OUT_C); OnRev(OUT_A);
while (true)
{
if ((SENSOR_3> akarui )&& (SENSOR_2 <akarui )
&& (SENSOR_1> akarui))
{ OnFwd(OUT_A+OUT_C); }
if ((SENSOR_1 < akarui ) && (SENSOR_2 < akarui)
&& (SENSOR_3> akarui))
{ OnFwd(OUT_A);
OnRev(OUT_C); }
if((SENSOR_3< akarui )&& (SENSOR_2 <akarui )
&& ( SENSOR_1 > akarui) ){
OnFwd(OUT_C);
OnRev(OUT_A);}
if((SENSOR_2 < akarui) && (SENSOR_3< akarui )
&& (SENSOR_1 < akarui )){
start B;
}
if ((SENSOR_1 < akarui ) &&
(SENSOR_3 < akarui )
&& (SENSOR_2 > akarui )){
OnFwd(OUT_C);
OnRev(OUT_A);
}
if((SENSOR_1>akarui)&&(SENSOR_2>akarui)
&& (SENSOR_3<akarui)){
OnFwd(OUT_C);
OnRev(OUT_A);}
if ((SENSOR_1 < akarui ) &&
(SENSOR_2 > akarui)
&& (SENSOR_3> akarui))
{ OnFwd(OUT_A);
OnRev(OUT_C); }
}
}
task B()
if((SENSOR_2 < akarui) && (SENSOR_3< akarui )
&& (SENSOR_1 < akarui ))
{stop A;Off(OUT_A+OUT_C);SendMessage(5);
Wait (50);}
ClearMessage();
until (Message() != 0);
if ( Message() == 1 ) {OnFwd(OUT_A+OUT_C);
Wait (500);OnRev(OUT_A);Wait(150);
Off(OUT_A+ OUT_C);SendMessage(4);Wait(50);}
if ( Message() == 2 ) {OnFwd(OUT_A+OUT_C);
Wait (250);OnRev(OUT_A);Wait(150);
Off(OUT_A+ OUT_C);SendMessage(4);Wait(50);}
if ( Message() == 3 ) {OnFwd(OUT_A+OUT_C);
Wait (150);OnRev(OUT_A);Wait(150);
Off(OUT_A+ OUT_C);SendMessage(4);Wait(50);}
}
対三回目のチャレンジ用の車体プログラムです。
中川殿のタスクを分けようという新発想、1つ入れることに集中するため、大幅にその二を改良、これによって分別が可能になったのです。
しかし本番では車体が引っかかってしまい、痛恨のリタイヤ。ままならないものです、ああ世知辛い。
**アームのプログラムその一 [#y2223ed6]
task main()
{
SetSensor(SENSOR_2,SENSOR_TOUCH);
SetSensor(SENSOR_3, SENSOR_LIGHT);
ClearMessage();
while(SENSOR_2 == 1){
OnRev(OUT_C);Wait(300);
ClearMessage();
until (Message() != 0);
if(SENSOR_3< 40){
ClearTimer(0);
while ( Timer(0) <= 50 ) { SendMessage(1); }
}
if(45>SENSOR_3> 40){
ClearTimer(0);
while ( Timer(0) <= 50 ) {SendMessage(3); }
}
if(45<= SENSOR_3){
ClearTimer(0);
while ( Timer(0) <= 50 ) {SendMessage(2); }}
if( Message() == 4)
{
OnFwd(OUT_C); Wait(300);Off(OUT_C);
}
if( Message() == 7) {
OnFwd(OUT_A); Wait(300);Off(OUT_A);
}
repeat(3){
OnRev(OUT_C); Wait(200);Off(OUT_C);Wait(200);
}
}
}
}
アームの試作プログラムです。
アームの下についているタッチセンサに牛乳パックの台があたるとアームが閉じ、色を識別しその旨を通信、車体がかごの前にくるとアームを開く、、予定でした(笑)
このプログラムではなぜかアームが開いてくれないのです。摩訶不思議。
whileを二つにしてつかむ命令と識別の命令を別々にしてやるとアームは閉じますが識別、通信してくれませんでした。困った物です。
**アームのプログラムその二 [#af7605e3]
task main()
{
SetSensor(SENSOR_2,SENSOR_TOUCH);
SetSensor(SENSOR_3, SENSOR_LIGHT);
OnRev(OUT_C);Wait(300);Off(OUT_C);
ClearMessage();
until (Message() != 0);
if ( Message() == 4 ) {PlaySound(SOUND_UP) ;
OnFwd(OUT_C); }
if(Message() == 5){
if(SENSOR_3< 40){
ClearTimer(0);
while ( Timer(0) <= 50 ) { SendMessage(1); }
}
if(45>SENSOR_3> 40){
ClearTimer(0);
while ( Timer(0) <= 50 ) {SendMessage(3); }
}
if(45<= SENSOR_3){
ClearTimer(0);
while ( Timer(0) <= 50 ) {SendMessage(2);
PlaySound(SOUND_UP) ;}
} }}
対一個用車体プログラムその三のために作られた、立ち位置が自由なのを利用して開始と同時にアームを閉じ、識別するプログラムです。
その一と違ってアームはちゃんとしまります。ただアクションが早いせいか、審判の開始の合図よりも速く動いてしまいました。せっかちですね。
急ごしらえの割にはなかなか実践的なプログラムでした。うむ、秀逸。