ロボカップのブロック大会2014で使用したプログラムです。 ロボットには、mbedを2台使ってI2C通信しています。 これはSlave側です。 ※独自規格を使用しています。

Dependencies:   ACM1602NI Ping mbed-rtos mbed

main.cpp

Committer:
denden
Date:
2014-03-10
Revision:
0:b9cd980ee324

File content as of revision 0:b9cd980ee324:

// Slave側プログラム

#include <math.h>
#include "mbed.h"
#include "rtos.h"
#include "ACM1602NI.h"
#include "Ping.h"

#define PI 3.14159265358979 // 円周率πの定義

Semaphore PING_slots(2);

#include "PinMode.h"
#include "GlobalVariable.h"
#include "Prototype.h"

#include "I2C_Slave.h"
#include "RotarySW.h"



/*---- PINGの値を並列処理で取得し続ける ----*/
void PING_thread(void const *ping_data) {
    /* 距離記録用変数 */
    int Ping_F = 0;
    int Ping_R = 0;
    int Ping_B = 0;
    int Ping_L = 0;

    while(1) {
        /* 超音波発射 */
        PING_F.Send();
        PING_R.Send();
        PING_B.Send();
        PING_L.Send();

        wait_ms(30);    // 待つ

        /* 結果から距離を算出 */
        Ping_F = PING_F.Read_cm() / 2;  // 正面の距離を記録 [cm]
        Ping_R = PING_R.Read_cm() / 2;  // 右側の距離を記録 [cm]
        Ping_B = PING_B.Read_cm() / 2;  // 後ろの距離を記録 [cm]
        Ping_L = PING_L.Read_cm() / 2;  // 左側の距離を記録 [cm]
        
        // PING_F.Send();  wait_ms(30);  Ping_F=PING_F.Read_cm()/2;
        // PING_R.Send();  wait_ms(30);  Ping_R=PING_R.Read_cm()/2;
        // PING_B.Send();  wait_ms(30);  Ping_B=PING_B.Read_cm()/2;
        // PING_L.Send();  wait_ms(30);  Ping_L=PING_L.Read_cm()/2;


        /* アクセス可能になるまで待機してから、値を代入 */
        PING_slots.wait();
            Ping_data[0] = Ping_F;
            Ping_data[1] = Ping_R;
            Ping_data[2] = Ping_B;
            Ping_data[3] = Ping_L;
        PING_slots.release();

        wait(0.1);      // PINGに愛を!!
    }
}



/*---- 並列処理で各装置との通信を制御 ----*/
int main() {
    Thread PING_t(PING_thread);

    /*---- 初期化処理 ----*/
    I2C_avr.address(0x80);
    I2C_master.address(0xA0);

    /*---- modeを確認 ----*/
    Mode[0] = ((Rotary1)?0:1)*1 + ((Rotary2)?0:1)*2 + ((Rotary3)?0:1)*4 + ((Rotary4)?0:1)*8;

    /*---- mode_masterにmodeを伝える ---*/
    while (!Flag) MBED_MASTER();

    /*---- 各モードに移行 ----*/
    switch(Mode[0]) {
        case 0: while(1) FW();
        case 1: while(1) DF();
        case 2: while(1) DEBUG_IR();
        case 3: while(1) DEBUG_PING();
        case 4: while(1) DEBUG_ANGLE();
        case 5: while(1) DEBUG_KICKER();
        case 6: while(1) DEBUG_MOTER();
        case 7: while(1) DEBUG_LINE();
        case 8: while(1) FW();
        case 9: while(1) FW();
    }
}