狙って飛ばせ! ブンブン振り子 運営マニュアル 九州工業大学 OTK38 チーム
目次 1. 大会概要 1.1 競技概要 1.2 教育的効果 2. フィールドの仕様 2.1 フィールドについて 2.2 振り子について 2.3 スイッチについて 2.4 得点ゾーンについて 3. 大会運営 3.1 大会本部 3.2 審判 4. 競技の進行 4.1 競技の始め方 4.2 競技の終わり方 4.3 得点計算 5. 反則事項 6. 振り子の設計
1. 大会概要 1.1 競技概要 タイトル: 狙って飛ばせ! ブンブン振り子 主催: 九州工業大学 競技内容:2 人 1 組を 1 チームとし,2 チームごとに競技を行い勝敗を競う. この競技は, ピンポン球を回収し, 振り子を使って得点ゾーンにピンポン球を飛ばして点数を競う. 振り子はスイッチを押すことで動作する仕組みとなっている. 効率よくピンポン球を回収するためにロボットを作る必要があるため, 発想力を養うことができる. また, スイッチは振り子から離れた位置にあるため, 振り子を動かすタイミングなど声を掛け合うことでチームワークを養うこともできる. 所要時間 :1 競技 5 分 1.2 教育的効果 様々なロボットを作成できる発想力を養う今回のロボットでは, ピンポン球を回収し, 振り子の前に置く動作とスイッチを押す動作が必要となる. どんな機構が効率よくピンポン球を回収できるかなどを考えることができるため, より工夫を凝らしたロボットを作り出すことが出来る. このことから考え出す発想力を養うことが出来る. 振り子を動かすための協調性の促進振り子とスイッチは離れた位置にあるため 2 人で動かすタイミングなど声を掛け合うことでより効率良く得点を稼ぐことができる. このことから味方同士のチームワークを養うことができる. 振り子の性質を知る振り子の振り上げる高さを変えることでピンポン玉の飛距離が変わる. 従って, 効率良く点数を稼ぐには振り子の振り上げる高さを考える必要がある. このことから競技を通して振り子の性質を知ることができる.
2. フィールドの仕様 2.1 フィールドについて フィールドの寸法を図 1 に示す. 単位は全て [mm] である. 床にはビニールシートを使用する. フィールドの外枠にはプラスチックダンボール( 以下, プラダン ) を使用する. 玉ゾーン 得点ゾーン 図 1 ( 上 ) 実際のフィールド ( 下 ) フィールドの寸法
2.2 振り子について 振り子の支えの寸法を図 2, 振り子の寸法を図 3 に示す. 単位は全て [mm] である. また, 振り子の重さは 75[g] である. 振り子の支えには 20[mm] 20[mm] の角柱を使用する. 片方には軸を通すための穴, もう片方にはサーボモータを固定するための穴を開ける. サーボモータを 2 つ使用する. 片方のサーボモータで振り子の振り上げを行い, 片方のサーボモータで開放を行う. 図 2 振り子の支えの寸法
図 3 振り子の寸法 図 4 振り子の製作例
2.3 スイッチについて スイッチの寸法を図 5 に示す. 単位はすべて [mm] である. 材料についてはロボットでスイッチを押したときに動かなければ何でも良い. 真ん中に空いた穴にリミットスイッチを入れて固定する. リミットスイッチの上にさらに板をかぶせる. 製作例を図 6 に示す. スイッチの回路, ソースコードについては 6 章で述べる. 図 5 スイッチの寸法 図 6 スイッチの製作例
2.4 得点ゾーンについて 高さ 50[mm] の仕切りで 3 つに分ける. 仕切りは移動できるようにする. 図 7 得点ゾーンについて 3. 大会運営 3.1 大会本部大会の運営を取り仕切る部署. 受付係, 召集係, アナウンス係, 得点集計 成績掲示係などを配置する. 3.2 審判審判は 1 チーム 1 人の合計 2 人配置する. 審判は以下の業務を行う. 競技の司会進行( 時間計測も含む ) 競技中の判定( 反則行為の際の対処も含む ) 得点のカウント 試合結果を本部へ報告 3.3 運営の手順大会当日は以下の手順で運営を行う. 受付 出場チーム数により対戦形式を決める. -10 チーム以下の場合は, 総当たり戦にし実施順はじゃんけんで決める. -10 チーム以上の場合は, トーナメント形式にし実施順はトーナメント表の左からとする. 開会式, ルール説明 競技 表彰, 閉会式 片づけ
4. 競技の進行 4.1 競技の始め方 フィールドにピンポン球を配置する. -ピンポン玉は 1 チーム 15 個ずつ用意する. そして, スタートゾーンの前にランダムに配置する. 各チームのロボットをスタートゾーンに置く. -スタートゾーンの中にロボットを置く. この時, スタートエリアからロボットの一部でもはみ出してはいけない. また, ロボットの向きは自由に配置できるものとする. スタートの合図を行い, 競技をスタートさせる. 図 8 開始時のピンポン玉, ロボットの配置位置 4.2 競技の終わり方 競技開始後 5 分経過したのち終了の合図で, 競技を終了させる. 終了の合図の前に放ったピンポン玉が, 終了の合図の後に得点となった場合は得点とみなす. フィールドの外へ出たボールを回収する. 得点を本部へ報告し, 次の競技へと移る. 4.3 得点計算 1~3 点の 3 種類とし, 得点ゾーンに入ったピンポン玉の個数 得点で計算する. 5. 反則事項以下の行為を反則とする.
振り子を使わずに得点ゾーンにピンポン球を入れる. 相手のフィールド内に入る. コードを使ってロボットやピンポン玉を動かす. その他, 明らかに反則行為と思われる行動をとった. 6. 振り子の設計今大会で使用する振り子の回路図, 必要機材を記載する. サーボモータは振り子を持ち上げられる性能を満たすものであれば今回使用するサーボモータを使う必要はない. ただし, サーボモータをマウントする部分の設計見直しが必要である. 図 9 振り子の回路図
表 1: 振り子の必要な電子部品 No. 商品名 使用個数 1 サーボモータ SG90 4 2 サーボモータ SAVOX SB-2272MG 4 3 2.1mm 標準 DC プラグ MP-121M 1 4 フィジカルコンピューティングモジュール Arduino Uno 2 5 モバイルバッテリー大容量 21000mAh 1 6 リミットスイッチ 4 < 振り子のソースコード > #include <Servo.h> #define MACHINE 1// 得点ゾーンから見て右側の振り子を 1 左側を 2 にする #define ServoxPin 9 // 振り子を持ち上げるサーボモータのピン番号 #define MicroServoPin 10 // 振り子を離したりするマイクロサーボモータのピン番号 #define UP_SW 3 // 振り子を持ち上げるリードスイッチのピン番号 #define Hanasu_SW 6 // 振り子を離すリードスイッチのピン番号 Servo MicroServo; Servo PowerServo; #if MACHINE == 1 int ServoxPos = 10; int MicroServoPos = 100; int AddPlusMinus = 1; #define ServoxPosMax(deg) (deg <= 150) #define ServoxPosMin(deg) (deg >= 0) #define ServoxPosFirst(deg) (deg <= 10) #define MicroServoPosMax(deg) (deg <= 100) #define MicroServoPosMin(deg) (deg >= 10) #else
int ServoxPos = 150; int MicroServoPos = 10; int AddPlusMinus = -1; #define ServoxPosMax(deg) (deg >= 10) #define ServoxPosMin(deg) (deg <= 180) #define ServoxPosFirst(deg) (deg >= 150) #define MicroServoPosMax(deg) (deg >= 10) #define MicroServoPosMin(deg) (deg <= 100) #endif void setup() { // サーボ設定 PowerServo.attach(ServoxPin); MicroServo.attach(MicroServoPin); PowerServo.write(ServoxPos); MicroServo.write(MicroServoPos); // スイッチ設定 pinmode(up_sw, INPUT_PULLUP); pinmode(hanasu_sw, INPUT_PULLUP); void loop() { // 振り子を振り上げる if(digitalread(up_sw) == HIGH && digitalread(hanasu_sw)!= HIGH){ if(servoxposmax(servoxpos)){ PowerServo.write(ServoxPos); ServoxPos = ServoxPos + AddPlusMinus; // アームを離して振り子を離す そして 振り子を止めて元の位置に戻る if(digitalread(hanasu_sw) == HIGH && digitalread(up_sw)!= HIGH){
// 振り子を離す while(microservoposmin(microservopos)){ MicroServo.write(MicroServoPos); MicroServoPos = MicroServoPos - AddPlusMinus; delay(10); delay(1000);//1 秒待機 // アームが振り子を止める位置まで移動 while(servoxposmin(servoxpos)) { PowerServo.write(ServoxPos); ServoxPos = ServoxPos - AddPlusMinus; delay(10); delay(100); // 振り子を止める while(microservoposmax(microservopos)) { MicroServoPos = MicroServoPos + AddPlusMinus; MicroServo.write(MicroServoPos); delay(1); // アームの位置を最初に初期位置にする while(servoxposfirst(servoxpos)) { PowerServo.write(ServoxPos); ServoxPos = ServoxPos + AddPlusMinus; delay(50);
delay(50);