ロボカップのブロック大会2014で使用したプログラムです。 ロボットには、mbedを2台使ってI2C通信しています。 これはSlave側です。 ※独自規格を使用しています。
Dependencies: ACM1602NI Ping mbed-rtos mbed
main.cpp@0:b9cd980ee324, 2014-03-10 (annotated)
- Committer:
- denden
- Date:
- Mon Mar 10 07:58:40 2014 +0000
- Revision:
- 0:b9cd980ee324
????????????2014????????????? ???????mbed?2????I2C???????? ???Slave????; ; ??????????????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
denden | 0:b9cd980ee324 | 1 | // Slave側プログラム |
denden | 0:b9cd980ee324 | 2 | |
denden | 0:b9cd980ee324 | 3 | #include <math.h> |
denden | 0:b9cd980ee324 | 4 | #include "mbed.h" |
denden | 0:b9cd980ee324 | 5 | #include "rtos.h" |
denden | 0:b9cd980ee324 | 6 | #include "ACM1602NI.h" |
denden | 0:b9cd980ee324 | 7 | #include "Ping.h" |
denden | 0:b9cd980ee324 | 8 | |
denden | 0:b9cd980ee324 | 9 | #define PI 3.14159265358979 // 円周率πの定義 |
denden | 0:b9cd980ee324 | 10 | |
denden | 0:b9cd980ee324 | 11 | Semaphore PING_slots(2); |
denden | 0:b9cd980ee324 | 12 | |
denden | 0:b9cd980ee324 | 13 | #include "PinMode.h" |
denden | 0:b9cd980ee324 | 14 | #include "GlobalVariable.h" |
denden | 0:b9cd980ee324 | 15 | #include "Prototype.h" |
denden | 0:b9cd980ee324 | 16 | |
denden | 0:b9cd980ee324 | 17 | #include "I2C_Slave.h" |
denden | 0:b9cd980ee324 | 18 | #include "RotarySW.h" |
denden | 0:b9cd980ee324 | 19 | |
denden | 0:b9cd980ee324 | 20 | |
denden | 0:b9cd980ee324 | 21 | |
denden | 0:b9cd980ee324 | 22 | /*---- PINGの値を並列処理で取得し続ける ----*/ |
denden | 0:b9cd980ee324 | 23 | void PING_thread(void const *ping_data) { |
denden | 0:b9cd980ee324 | 24 | /* 距離記録用変数 */ |
denden | 0:b9cd980ee324 | 25 | int Ping_F = 0; |
denden | 0:b9cd980ee324 | 26 | int Ping_R = 0; |
denden | 0:b9cd980ee324 | 27 | int Ping_B = 0; |
denden | 0:b9cd980ee324 | 28 | int Ping_L = 0; |
denden | 0:b9cd980ee324 | 29 | |
denden | 0:b9cd980ee324 | 30 | while(1) { |
denden | 0:b9cd980ee324 | 31 | /* 超音波発射 */ |
denden | 0:b9cd980ee324 | 32 | PING_F.Send(); |
denden | 0:b9cd980ee324 | 33 | PING_R.Send(); |
denden | 0:b9cd980ee324 | 34 | PING_B.Send(); |
denden | 0:b9cd980ee324 | 35 | PING_L.Send(); |
denden | 0:b9cd980ee324 | 36 | |
denden | 0:b9cd980ee324 | 37 | wait_ms(30); // 待つ |
denden | 0:b9cd980ee324 | 38 | |
denden | 0:b9cd980ee324 | 39 | /* 結果から距離を算出 */ |
denden | 0:b9cd980ee324 | 40 | Ping_F = PING_F.Read_cm() / 2; // 正面の距離を記録 [cm] |
denden | 0:b9cd980ee324 | 41 | Ping_R = PING_R.Read_cm() / 2; // 右側の距離を記録 [cm] |
denden | 0:b9cd980ee324 | 42 | Ping_B = PING_B.Read_cm() / 2; // 後ろの距離を記録 [cm] |
denden | 0:b9cd980ee324 | 43 | Ping_L = PING_L.Read_cm() / 2; // 左側の距離を記録 [cm] |
denden | 0:b9cd980ee324 | 44 | |
denden | 0:b9cd980ee324 | 45 | // PING_F.Send(); wait_ms(30); Ping_F=PING_F.Read_cm()/2; |
denden | 0:b9cd980ee324 | 46 | // PING_R.Send(); wait_ms(30); Ping_R=PING_R.Read_cm()/2; |
denden | 0:b9cd980ee324 | 47 | // PING_B.Send(); wait_ms(30); Ping_B=PING_B.Read_cm()/2; |
denden | 0:b9cd980ee324 | 48 | // PING_L.Send(); wait_ms(30); Ping_L=PING_L.Read_cm()/2; |
denden | 0:b9cd980ee324 | 49 | |
denden | 0:b9cd980ee324 | 50 | |
denden | 0:b9cd980ee324 | 51 | /* アクセス可能になるまで待機してから、値を代入 */ |
denden | 0:b9cd980ee324 | 52 | PING_slots.wait(); |
denden | 0:b9cd980ee324 | 53 | Ping_data[0] = Ping_F; |
denden | 0:b9cd980ee324 | 54 | Ping_data[1] = Ping_R; |
denden | 0:b9cd980ee324 | 55 | Ping_data[2] = Ping_B; |
denden | 0:b9cd980ee324 | 56 | Ping_data[3] = Ping_L; |
denden | 0:b9cd980ee324 | 57 | PING_slots.release(); |
denden | 0:b9cd980ee324 | 58 | |
denden | 0:b9cd980ee324 | 59 | wait(0.1); // PINGに愛を!! |
denden | 0:b9cd980ee324 | 60 | } |
denden | 0:b9cd980ee324 | 61 | } |
denden | 0:b9cd980ee324 | 62 | |
denden | 0:b9cd980ee324 | 63 | |
denden | 0:b9cd980ee324 | 64 | |
denden | 0:b9cd980ee324 | 65 | /*---- 並列処理で各装置との通信を制御 ----*/ |
denden | 0:b9cd980ee324 | 66 | int main() { |
denden | 0:b9cd980ee324 | 67 | Thread PING_t(PING_thread); |
denden | 0:b9cd980ee324 | 68 | |
denden | 0:b9cd980ee324 | 69 | /*---- 初期化処理 ----*/ |
denden | 0:b9cd980ee324 | 70 | I2C_avr.address(0x80); |
denden | 0:b9cd980ee324 | 71 | I2C_master.address(0xA0); |
denden | 0:b9cd980ee324 | 72 | |
denden | 0:b9cd980ee324 | 73 | /*---- modeを確認 ----*/ |
denden | 0:b9cd980ee324 | 74 | Mode[0] = ((Rotary1)?0:1)*1 + ((Rotary2)?0:1)*2 + ((Rotary3)?0:1)*4 + ((Rotary4)?0:1)*8; |
denden | 0:b9cd980ee324 | 75 | |
denden | 0:b9cd980ee324 | 76 | /*---- mode_masterにmodeを伝える ---*/ |
denden | 0:b9cd980ee324 | 77 | while (!Flag) MBED_MASTER(); |
denden | 0:b9cd980ee324 | 78 | |
denden | 0:b9cd980ee324 | 79 | /*---- 各モードに移行 ----*/ |
denden | 0:b9cd980ee324 | 80 | switch(Mode[0]) { |
denden | 0:b9cd980ee324 | 81 | case 0: while(1) FW(); |
denden | 0:b9cd980ee324 | 82 | case 1: while(1) DF(); |
denden | 0:b9cd980ee324 | 83 | case 2: while(1) DEBUG_IR(); |
denden | 0:b9cd980ee324 | 84 | case 3: while(1) DEBUG_PING(); |
denden | 0:b9cd980ee324 | 85 | case 4: while(1) DEBUG_ANGLE(); |
denden | 0:b9cd980ee324 | 86 | case 5: while(1) DEBUG_KICKER(); |
denden | 0:b9cd980ee324 | 87 | case 6: while(1) DEBUG_MOTER(); |
denden | 0:b9cd980ee324 | 88 | case 7: while(1) DEBUG_LINE(); |
denden | 0:b9cd980ee324 | 89 | case 8: while(1) FW(); |
denden | 0:b9cd980ee324 | 90 | case 9: while(1) FW(); |
denden | 0:b9cd980ee324 | 91 | } |
denden | 0:b9cd980ee324 | 92 | } |
denden | 0:b9cd980ee324 | 93 | |
denden | 0:b9cd980ee324 | 94 | |
denden | 0:b9cd980ee324 | 95 | |
denden | 0:b9cd980ee324 | 96 | |
denden | 0:b9cd980ee324 | 97 | |
denden | 0:b9cd980ee324 | 98 | |
denden | 0:b9cd980ee324 | 99 | |
denden | 0:b9cd980ee324 | 100 | |
denden | 0:b9cd980ee324 | 101 | |
denden | 0:b9cd980ee324 | 102 | |
denden | 0:b9cd980ee324 | 103 | |
denden | 0:b9cd980ee324 | 104 | |
denden | 0:b9cd980ee324 | 105 |