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/i2c/i2c_roots.cpp
- Committer:
- alt0710
- Date:
- 2018-05-01
- Revision:
- 27:c7d8f514209a
- Parent:
- 24:37a074e767c8
- Child:
- 30:8ee22331bfaf
File content as of revision 27:c7d8f514209a:
#include "mbed.h" #include "comm.h" #include "interface_manager.h" #include "status_manager.h" #include "parameter_manager.h" #include "i2c_roots.h" /* **mbedクラス** */ #ifdef LPC4088 #elif STM32 I2C i2cMBED(PB_7, PB_6); // sda, scl #endif Ticker i2c_Timer; /* **ローカル関数定義** */ static void initLCD(void); static void sendCommand(unsigned char command); static void sendCharacter(unsigned char a); static void clearDisp(void); static void moveCursor(unsigned char address); static void initialiseCursorPosition(void); /* **ローカル変数** */ /* **ローカル関数** */ void i2c_send(void) { //500msec周期で送信 //送信記述はここに書く printfLCD(InterfaceManager::i2c.LCDMsg); } static void initLCD(void) { xdev_out(sendCharacter); sendCommand(0x38); sendCommand(0x39); sendCommand(0x14); sendCommand(0x70); sendCommand(0x56); sendCommand(0x6C); wait_ms(200); sendCommand(0x38); sendCommand(0x0C); sendCommand(0x01); wait_ms(2); initialiseCursorPosition(); } extern void printfLCD(const char* fmt, ...) { va_list arp; clearDisp(); va_start(arp, fmt); xvprintf(fmt,arp); va_end(arp); initialiseCursorPosition(); } static void sendCommand(unsigned char command) { char data[2]; data[0]= 0x80; data[1]= command; i2cMBED.write(ADDRESS_LCD, data, 2); wait_us(27); } static void sendCharacter(unsigned char a) { if(a == '\n') { //改行コードのときは改行する moveCursor(0x40); return; } char data[2]; data[0]= 0xC0; data[1]= a; i2cMBED.write(ADDRESS_LCD, data, 2); wait_us(27); } static void initialiseCursorPosition(void) { /* 通信終了時にカーソルを頭に戻す */ char data[2]; data[0]= 0x00; data[1]= 0x80; i2cMBED.write(ADDRESS_LCD, data, 2); } static void clearDisp(void) { sendCommand(0x01); wait_ms(1); } static void moveCursor(unsigned char address) { sendCommand(0x80 | address); } /* **グルーバル関数** */ extern void initI2C(void) { i2cMBED.frequency(400000); initLCD(); i2c_Timer.attach(i2c_send, I2C_SEND_CYCLE_TIME); } /* **クラス** */ I2C_Roots::I2C_Roots() { } void I2C_Roots::setLCDMsg(char* msg,char msg_num) { for(char i = 0; i <= msg_num ; i++) { LCDMsg[i] = *(msg + i); } } void I2C_Roots::setIndicateMsg(char* msg,char msg_num) { for(char i = 0; i <= msg_num ; i++) { IndicateMsg[i] = *(msg + i); } i2cMBED.write(ADDRESS_INDICATE, IndicateMsg, msg_num); } void I2C_Roots::setIDMsg(char* msg,char msg_num) { for(char i = 0; i <= msg_num ; i++) { IDMsg[i] = *(msg + i); } i2cMBED.write(ADDRESS_EEPROM, IDMsg, msg_num); } void I2C_Roots::readIDMsg(void) { char msg_num = 2; for(char i = 0; i <= msg_num ; i++) { IDMsg[i] = 0; } msg_num = 2; i2cMBED.write(ADDRESS_EEPROM, IDMsg, msg_num, 1); msg_num = 1; i2cMBED.read(ADDRESS_EEPROM, IDMsg, msg_num, 1); ParameterManager::machine_id = IDMsg[0]; if(ParameterManager::machine_id > MAX_ID) { ParameterManager::machine_id = MIN_ID; } }