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

Dependencies:   ACM1602NI Ping mbed-rtos mbed

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?

UserRevisionLine numberNew 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