スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


にほんブログ村 その他趣味ブログ LEGO・ブロックへ

スト2 波動拳ロボ - プログラミング編

今回は2種類のプログラミング言語で作りました。

1つ目は、NXT 2.0を購入するとついてくる、LEGO公式のプログラミング言語でNXT-Gと呼ばれます。最後のGは恐らくGraphicalのハズです。部品をドラッグ&ドロップでキャンバス上に落としていき、適当につなげていく感じです。
こちらは楽しい反面、ちょっとややこしいことをするとつらくなります。今回の波動拳ロボなら余裕です。ただ、並列タスク(波動拳と言いながら足を動かす、など)はできないので、手足を上げる→波動拳と言う→打つ→手足を元に戻す、という順番で命令しています。2011.02.19 kobaさんのアドバイスでできることがわかりました。manualにも普通にのっていて勝手に思い込んでいました。start pointから2方向以上伸ばすときはstart pointからドラッグ&ドロップで終点でダブルクリック。途中から2方向以上に伸ばすときは、プログラミングのパーツに挟まれた部分を【Shift】キー押しながらドラッグ&ドロップで終点でダブルクリックで可能です。これでマルチタスクも可能です。

実際の波動拳ロボのプログラムは以下になります。



図の前半の1の部分はキョロキョロする部分です。サイコロを振って、半分以上で右に回転、半分以下で左に回転という具合です。また、2つ目のサイコロを振って、出た目の大きさに応じて回転する角度を増やしています。後半の2の部分は、波動拳を打つ部分です。ただし、超音波センサーで感知した獲物との距離が、40cm以内の時だけ波動拳を打ちます。あとは無視してキョロキョロを続けます。前半+後半をひたすらループで続けるというプログラムです。

2つ目は相変わらずのRobotCです。こちらはC言語というプログラム言語に似ているので、プログラミングの経験がある人ならば簡単に習得できると思います。ただ、マニュアルがよくできていないのと、ところどころ癖が強いので、はじめはNXCからはじめることをオススメします。

#pragma config(Sensor, S1, sonarSensor, sensorSONAR)
#define rotateMotorWithDegrees(port,power,degree) nMotorEncoder[port] = 0;\
                                                  wait1Msec(100);\
                                                  nMotorEncoderTarget[port] = degree;\
                                                  motor[port] = power;\
                                                  while(nMotorRunState[port] != runStateIdle && nMotorRunState[port] != runStateHoldPosition){}

task rotateObject(){
  float motorPower=75;
  float destDegree;
  while(true){
    wait1Msec(2000);
    destDegree = (random(9) - 4.5) * 80;
    rotateMotorWithDegrees(motorC, sgn(destDegree)*motorPower, abs(destDegree));
  }
}

task sayHadouken(){
  wait1Msec(1000);
  PlaySoundFile("hadouken.rso");
}

task moveFoot(){
  float motorPower=50;
  float destDegree=45;
  wait1Msec(600);
  rotateMotorWithDegrees(motorB, motorPower, destDegree);
  wait1Msec(2000);
  rotateMotorWithDegrees(motorB, -motorPower, destDegree);
}

task shootBall(){
  float motorPower=100;
  float destDegree=360;
  wait1Msec(900);
  rotateMotorWithDegrees(motorA, motorPower, destDegree);
}

task shootHadouken(){
  while(true){
    if(SensorValue[sonarSensor] < 40){
      StopTask(rotateObject);
      StartTask(moveFoot);
      StartTask(sayHadouken);
      StartTask(shootBall);
      wait1Msec(3000);
      StartTask(rotateObject);
    }
  }
}

task main(){
  StartTask(rotateObject);
  StartTask(shootHadouken);
  while(true){
    wait1Msec(300);
  }
}

2行目~6行目は禁断のマクロを使ってしまいました。本当は以下のように書ければいいのですが、最近になってinlineがサポートされなくなったみたいです。
inline void rotateMotorWithDegrees(const tMotor port, float motorPower, float destDegree){
  nMotorEncoder[port] = 0;
  wait1Msec(100);
  nMotorEncoderTarget[port] = destDegree;
  motor[port] = motorPower;
  while(nMotorRunState[port] != runStateIdle && nMotorRunState[port] != runStateHoldPosition){
  }
}

ちなみに、RobotCのfirmware 2.26 betaでinlineつけてコンパイルすると、以下のwarningが出ます。
*Warning*:'inline' not supported, changing to normal function call.
*Warning*:Use 'inline' to avoid possible simultaneous variable memory access conflicts for subroutine 'rotateMotorWithDegrees' called from multiple tasks 'rotateObject' and 'moveFoot'?

「○○行:inlineはサポートしなくなったから普通の関数として扱うね。」「△△行:マルチタスクで1つのサブルーチンを同時に呼ぶと危ないよ、inlineを使ってね」という意味です。イラッとします。まだ開発段階と言えるでしょう。ともかく、マクロを使えばサブルーチン化できてプログラムはすっきりしました。マルチタスクも簡単に使うことができました。

にほんブログ村 その他趣味ブログ LEGO・ブロックへ
スポンサーサイト

スト2 波動拳ロボ - 組み立て&動画編

大型連休以外は、製作時間が設計&組み立て20時間・プログラミング3時間ぐらいの手ごろなロボを量産する作戦に変更しました。今回はスト2の波動拳をうつロボです。世代が分かるな~(汗)

組み立てで苦労したのはモーターをどこに使うかです。波動拳をうつには(リュウを想像してください)右足・左足・右腕・左腕・波動拳・体の回転・体の移動などのモーションが必要です。NXT2.0のモーターは全部で3つなので、どれかに割り振って、残りはあきらめることになります。今回は以下のようにしました。
・右足・左足・右腕・左腕で1モーター
・波動拳で1モーター
・体の回転で1モーター

波動拳そのものはNXT2.0のリファレンスのShooterbotを参考に作りました。体の回転も難しくありません。問題は四肢の部分ですが、単純に足を45°回転させて、腕をその倍の90°回転させることにしました。これならば8歯のギアと16歯のギアでギア比1:2が作れるので簡単です。

正面から 右側から 首の裏 手をはずして左側から 足の裏

完成動画は以下になります。波動拳の速度がスト2レインボーを超えてます。下手なところにあたると痛いです。波動拳を見てから垂直ジャンプじゃよけきれません。



にほんブログ村 その他趣味ブログ LEGO・ブロックへ

テーマ : ホビー・おもちゃ
ジャンル : 趣味・実用

リンク
フリーエリア
プロフィール

tsukuba.lego

Author:tsukuba.lego
●主な登場人物
koba : 会長. RCX, WeDo, NXT1.0, NXT2.0を持つ.
matk : 副会長. 2010年夏にNXT2.0を購入, 20年来のレゴ熱復活.
●会員募集中です!小学生から歓迎. 近日月1ぐらいで集まる予定.
mail:tsukuba.lego@gmail.com
YouTube (tsukubalego)
Twitter(tsukubalego)

カテゴリ
最新記事
最新コメント
月別アーカイブ
検索フォーム
RSSリンクの表示
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
最新トラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。