RobocupSSLのメイン基板白mbedのプログラム
Rootsロボット mainプログラム
~ Robocup SSL(小型車輪リーグ)ロボット ~
Robocup SSLとは
●試合構成
Robocup小型ロボットリーグ(Small Size League)は,直径180[mm],高さ150[mm]以内のサイズのロボット6台が1チームとなり,オレンジ色のゴルフボールを使ってサッカー競技を行う自立型ロボットコンテストである.
フィールドの上には2台のWebカメラが設置され,フィールド上のロボットとボールを撮影する.Visionサーバは,フィールドの画像データよりロボットとボールの座標データを算出し,LANを用い各チームのAI用PCに送信する.Webカメラの撮影速度は,60[fps]である.レフリーボックスは,ファウルやフリーキック,スローインなどの審判の判定を入力し,LANを通じて各チームのAI用PCに送信する.それぞれのチームのAI用PCは,ロボットとボールの座標,審判の判定を元にロボットの移動,キックなどの作戦を決定し,無線によってロボットに指令を送信する.
ロボット機能紹介
●オムニホイールによる方向転換不要の全方位移動
オムニホイールは,自由に回転可能なローラをホイールの外周上に配置した車輪である.ローラの回転により,車輪の回転と垂直の方向に駆動力を発することはできないが移動は可能となる.各車輪の角速度を調整することによって全方向への移動を可能にする.
●ドリブルバーのバックスピンによるボール保持
●電磁力を利用したキッカー
●キッカーの電磁力エネルギーを充電する充電回路
●ロボット情報が一目でわかるLCD
interface/button/button_roots.cpp
- Committer:
- alt0710
- Date:
- 2017-04-25
- Revision:
- 5:4be30999853f
- Parent:
- 4:8c6f6b687303
- Child:
- 6:21b3fbe57b88
File content as of revision 5:4be30999853f:
#include "mbed.h" #include "comm.h" #include "interface_manager.h" #include "button_roots.h" /* **mbedクラス** */ #ifdef LPC4088 #elif STM32 //ModeSelectSW DigitalIn Mode_SW1(A3); DigitalIn Mode_SW2(A2); //CrossSelectSW InterruptIn CrossSW_UP(D11); //EXT2 InterruptIn CrossSW_LEFT(D7); //PUSH InterruptIn CrossSW_DOWN(D9); //KICK DigitalIn DUMY(D8); //KICK InterruptIn CrossSW_RIGHT(A1); //EXT #endif DigitalOut myled(LED1); Ticker t_up; Ticker t_left; Ticker t_down; Ticker t_right; /* **ローカル割り込み関数** */ void check_click_up(void) { if(InterfaceManager::button.count_click[0] == 1) { InterfaceManager::button.setButtunStatus(CROSS_UP, SINGLE_CLICK); } else if(InterfaceManager::button.count_click[0] == 2) { InterfaceManager::button.setButtunStatus(CROSS_UP, DOUBLE_CLICK); } InterfaceManager::button.count_click[0] = 0; t_up.detach(); } void check_click_down(void) { if(InterfaceManager::button.count_click[1] == 1) { InterfaceManager::button.setButtunStatus(CROSS_DOWN, SINGLE_CLICK); } else if(InterfaceManager::button.count_click[1] == 2) { InterfaceManager::button.setButtunStatus(CROSS_DOWN, DOUBLE_CLICK); } InterfaceManager::button.count_click[1] = 0; t_down.detach(); } void check_click_left(void) { if(InterfaceManager::button.count_click[2] == 1) { InterfaceManager::button.setButtunStatus(CROSS_LEFT, SINGLE_CLICK); } else if(InterfaceManager::button.count_click[2] == 2) { InterfaceManager::button.setButtunStatus(CROSS_LEFT, DOUBLE_CLICK); } InterfaceManager::button.count_click[2] = 0; t_left.detach(); } void check_click_right(void) { if(InterfaceManager::button.count_click[3] == 1) { InterfaceManager::button.setButtunStatus(CROSS_RIGHT, SINGLE_CLICK); } else if(InterfaceManager::button.count_click[3] == 2) { InterfaceManager::button.setButtunStatus(CROSS_RIGHT, DOUBLE_CLICK); } InterfaceManager::button.count_click[3] = 0; t_right.detach(); } void click_up(void) { myled = !myled; switch(InterfaceManager::button.count_click[0]){ case 0: t_up.attach(check_click_up, CHECK_TIME); InterfaceManager::button.count_click[0]++; break; case 1: InterfaceManager::button.count_click[0]++; break; default: InterfaceManager::button.count_click[0] = 0; break; } } void click_down(void) { myled = !myled; switch(InterfaceManager::button.count_click[1]){ case 0: t_down.attach(check_click_down, CHECK_TIME); InterfaceManager::button.count_click[1]++; break; case 1: InterfaceManager::button.count_click[1]++; break; default: InterfaceManager::button.count_click[1] = 0; break; } } void click_left(void) { myled = !myled; switch(InterfaceManager::button.count_click[2]){ case 0: t_left.attach(check_click_left, CHECK_TIME); InterfaceManager::button.count_click[2]++; break; case 1: InterfaceManager::button.count_click[2]++; break; default: InterfaceManager::button.count_click[2] = 0; break; } } void click_right(void) { myled = !myled; switch(InterfaceManager::button.count_click[3]){ case 0: t_right.attach(check_click_right, CHECK_TIME); InterfaceManager::button.count_click[3]++; break; case 1: InterfaceManager::button.count_click[3]++; break; default: InterfaceManager::button.count_click[3] = 0; break; } } /* **グルーバル関数** */ void initButton(void) { Mode_SW1.mode(PullDown); Mode_SW2.mode(PullDown); CrossSW_UP.mode(PullNone); CrossSW_DOWN.mode(PullNone); DUMY.mode(PullNone); CrossSW_LEFT.mode(PullNone); CrossSW_RIGHT.mode(PullNone); //入力割り込み設定 CrossSW_UP.fall(&click_up); CrossSW_LEFT.fall(&click_left); CrossSW_DOWN.rise(&click_down); CrossSW_RIGHT.fall(&click_right); } /* **クラス** */ Button_Roots::Button_Roots() { //count_click[4] = {0}; modeSW1 = 0; modeSW2 = 0; modeSW = 0; crossUp = 0; crossDown = 0; crossLeft = 0; crossRight = 0; } char Button_Roots::getButtonStatus(char ButtonNames) { switch(ButtonNames){ case MODE_SW1: return !Mode_SW1; case MODE_SW2: return !Mode_SW2; case MODE_SW: modeSW = !Mode_SW1 + (!Mode_SW2 << 1); return modeSW; case CROSS_UP: button_status = crossUp; crossUp = 0; return button_status; case CROSS_DOWN: if( (!DUMY) && (cross_down_old == 1) ){ is_button_pushed = 1; }else{ is_button_pushed = 0; } cross_down_old = !DUMY; button_status = is_button_pushed; //crossDown = 0; return button_status; case CROSS_LEFT: button_status = crossLeft; crossLeft = 0; return button_status; case CROSS_RIGHT: button_status = crossRight; crossRight = 0; return button_status; default: return 99; } } char Button_Roots::setButtunStatus(char ButtonNames, char ButtonStatus) { switch(ButtonNames){ case MODE_SW1: return modeSW1 = ButtonStatus; case MODE_SW2: return modeSW2 = ButtonStatus; case CROSS_UP: return crossUp = ButtonStatus; case CROSS_DOWN: return crossDown = ButtonStatus; case CROSS_LEFT: return crossLeft = ButtonStatus; case CROSS_RIGHT: return crossRight = ButtonStatus; default: return 99; } }