
i2c_slave_HC_SR04_010
main.cpp@0:e166d7acab38, 2022-05-06 (annotated)
- Committer:
- caa45040
- Date:
- Fri May 06 14:06:50 2022 +0000
- Revision:
- 0:e166d7acab38
i2c_slave_HC_SR04_010_BIN
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
caa45040 | 0:e166d7acab38 | 1 | //i2c_slave_ir_length_010_1 |
caa45040 | 0:e166d7acab38 | 2 | |
caa45040 | 0:e166d7acab38 | 3 | |
caa45040 | 0:e166d7acab38 | 4 | #include "mbed.h" |
caa45040 | 0:e166d7acab38 | 5 | |
caa45040 | 0:e166d7acab38 | 6 | |
caa45040 | 0:e166d7acab38 | 7 | //10の割り算 0から1028までは、正しい。主に0から999 |
caa45040 | 0:e166d7acab38 | 8 | #define DIV10(n) ((n*205)>>11) |
caa45040 | 0:e166d7acab38 | 9 | |
caa45040 | 0:e166d7acab38 | 10 | |
caa45040 | 0:e166d7acab38 | 11 | #define HIGH 1 |
caa45040 | 0:e166d7acab38 | 12 | DigitalOut TRIG(PA_6); |
caa45040 | 0:e166d7acab38 | 13 | DigitalIn ECHO(PA_5); |
caa45040 | 0:e166d7acab38 | 14 | |
caa45040 | 0:e166d7acab38 | 15 | |
caa45040 | 0:e166d7acab38 | 16 | //タイマーの設定 |
caa45040 | 0:e166d7acab38 | 17 | Timer t; |
caa45040 | 0:e166d7acab38 | 18 | |
caa45040 | 0:e166d7acab38 | 19 | unsigned long times; //測定時間 |
caa45040 | 0:e166d7acab38 | 20 | int distance; //長さ |
caa45040 | 0:e166d7acab38 | 21 | |
caa45040 | 0:e166d7acab38 | 22 | |
caa45040 | 0:e166d7acab38 | 23 | //PA_5のオン時間をusで測る 今のところ引数は、無効 |
caa45040 | 0:e166d7acab38 | 24 | int pulseIn(int pin1,int pu1,int timeout1) |
caa45040 | 0:e166d7acab38 | 25 | { |
caa45040 | 0:e166d7acab38 | 26 | |
caa45040 | 0:e166d7acab38 | 27 | t.reset();//タイマーの開始 |
caa45040 | 0:e166d7acab38 | 28 | |
caa45040 | 0:e166d7acab38 | 29 | //timeout1 = 32000000; |
caa45040 | 0:e166d7acab38 | 30 | timeout1 = 100000; //28ms |
caa45040 | 0:e166d7acab38 | 31 | //timeout1 = 1000; //degbu |
caa45040 | 0:e166d7acab38 | 32 | |
caa45040 | 0:e166d7acab38 | 33 | //while(PA_5 == 0) {} |
caa45040 | 0:e166d7acab38 | 34 | |
caa45040 | 0:e166d7acab38 | 35 | loop_s1: |
caa45040 | 0:e166d7acab38 | 36 | timeout1--; |
caa45040 | 0:e166d7acab38 | 37 | // 5432109876543210 |
caa45040 | 0:e166d7acab38 | 38 | if ( (~(GPIOA->IDR)) & 0b0000000000100000 ) { |
caa45040 | 0:e166d7acab38 | 39 | if ( timeout1 ) { |
caa45040 | 0:e166d7acab38 | 40 | goto loop_s1; |
caa45040 | 0:e166d7acab38 | 41 | } |
caa45040 | 0:e166d7acab38 | 42 | } |
caa45040 | 0:e166d7acab38 | 43 | |
caa45040 | 0:e166d7acab38 | 44 | |
caa45040 | 0:e166d7acab38 | 45 | int sd = t.read_us();//測定開始 |
caa45040 | 0:e166d7acab38 | 46 | |
caa45040 | 0:e166d7acab38 | 47 | //timeout1 = 32000000; |
caa45040 | 0:e166d7acab38 | 48 | timeout1 = 100000; //28ms |
caa45040 | 0:e166d7acab38 | 49 | //timeout1 = 1000; //degbu |
caa45040 | 0:e166d7acab38 | 50 | |
caa45040 | 0:e166d7acab38 | 51 | //while(PA_5 != 0) {} |
caa45040 | 0:e166d7acab38 | 52 | |
caa45040 | 0:e166d7acab38 | 53 | loop_in1: |
caa45040 | 0:e166d7acab38 | 54 | timeout1--; |
caa45040 | 0:e166d7acab38 | 55 | // 5432109876543210 |
caa45040 | 0:e166d7acab38 | 56 | if ( (GPIOA->IDR) & 0b0000000000100000 ) { |
caa45040 | 0:e166d7acab38 | 57 | if( timeout1 ) { |
caa45040 | 0:e166d7acab38 | 58 | goto loop_in1; |
caa45040 | 0:e166d7acab38 | 59 | } |
caa45040 | 0:e166d7acab38 | 60 | } |
caa45040 | 0:e166d7acab38 | 61 | |
caa45040 | 0:e166d7acab38 | 62 | |
caa45040 | 0:e166d7acab38 | 63 | return(t.read_us()-sd);//測定終了 |
caa45040 | 0:e166d7acab38 | 64 | |
caa45040 | 0:e166d7acab38 | 65 | }//pulseIn |
caa45040 | 0:e166d7acab38 | 66 | |
caa45040 | 0:e166d7acab38 | 67 | |
caa45040 | 0:e166d7acab38 | 68 | |
caa45040 | 0:e166d7acab38 | 69 | /* |
caa45040 | 0:e166d7acab38 | 70 | DigitalOut TX(PB_1); |
caa45040 | 0:e166d7acab38 | 71 | |
caa45040 | 0:e166d7acab38 | 72 | //仮想シリアルへの一文字出力 1200bps |
caa45040 | 0:e166d7acab38 | 73 | int pc_putc(char ch) |
caa45040 | 0:e166d7acab38 | 74 | { |
caa45040 | 0:e166d7acab38 | 75 | TX=1; |
caa45040 | 0:e166d7acab38 | 76 | TX=0;//Start |
caa45040 | 0:e166d7acab38 | 77 | wait_us(832); |
caa45040 | 0:e166d7acab38 | 78 | |
caa45040 | 0:e166d7acab38 | 79 | for(int ii=0; ii<8; ii++) { //Data x 8 |
caa45040 | 0:e166d7acab38 | 80 | TX=(ch>>ii)&1; |
caa45040 | 0:e166d7acab38 | 81 | wait_us(832); |
caa45040 | 0:e166d7acab38 | 82 | }; //for |
caa45040 | 0:e166d7acab38 | 83 | |
caa45040 | 0:e166d7acab38 | 84 | TX=1;//Stop |
caa45040 | 0:e166d7acab38 | 85 | wait_us(832); |
caa45040 | 0:e166d7acab38 | 86 | |
caa45040 | 0:e166d7acab38 | 87 | return(0); |
caa45040 | 0:e166d7acab38 | 88 | } //pc_putc |
caa45040 | 0:e166d7acab38 | 89 | */ |
caa45040 | 0:e166d7acab38 | 90 | |
caa45040 | 0:e166d7acab38 | 91 | |
caa45040 | 0:e166d7acab38 | 92 | unsigned char b=200; //マスターに返す値 |
caa45040 | 0:e166d7acab38 | 93 | |
caa45040 | 0:e166d7acab38 | 94 | //I2Cの初期化 |
caa45040 | 0:e166d7acab38 | 95 | I2CSlave slave(PA_10, PA_9); //010 |
caa45040 | 0:e166d7acab38 | 96 | |
caa45040 | 0:e166d7acab38 | 97 | //メインルーチン |
caa45040 | 0:e166d7acab38 | 98 | int main() |
caa45040 | 0:e166d7acab38 | 99 | { |
caa45040 | 0:e166d7acab38 | 100 | |
caa45040 | 0:e166d7acab38 | 101 | //タイマーの開始 |
caa45040 | 0:e166d7acab38 | 102 | t.start(); |
caa45040 | 0:e166d7acab38 | 103 | |
caa45040 | 0:e166d7acab38 | 104 | //GPIOの初期化 |
caa45040 | 0:e166d7acab38 | 105 | TRIG = 0; |
caa45040 | 0:e166d7acab38 | 106 | |
caa45040 | 0:e166d7acab38 | 107 | //TX=1; //ポートの初期化 |
caa45040 | 0:e166d7acab38 | 108 | |
caa45040 | 0:e166d7acab38 | 109 | char buf[10];//I2Cバッファー |
caa45040 | 0:e166d7acab38 | 110 | |
caa45040 | 0:e166d7acab38 | 111 | //I2Cスレーブのアドレスの設定 |
caa45040 | 0:e166d7acab38 | 112 | slave.address(0x10); |
caa45040 | 0:e166d7acab38 | 113 | |
caa45040 | 0:e166d7acab38 | 114 | //無限ループ |
caa45040 | 0:e166d7acab38 | 115 | while(1) { |
caa45040 | 0:e166d7acab38 | 116 | |
caa45040 | 0:e166d7acab38 | 117 | //I2Cの状態の読み出し(ポーリング) |
caa45040 | 0:e166d7acab38 | 118 | while( slave.receive() == I2CSlave::ReadAddressed ) {}; |
caa45040 | 0:e166d7acab38 | 119 | |
caa45040 | 0:e166d7acab38 | 120 | //b = 40; //debug |
caa45040 | 0:e166d7acab38 | 121 | buf[0] = b; |
caa45040 | 0:e166d7acab38 | 122 | |
caa45040 | 0:e166d7acab38 | 123 | //I2Cマスターに送信する |
caa45040 | 0:e166d7acab38 | 124 | slave.write(buf,1); |
caa45040 | 0:e166d7acab38 | 125 | |
caa45040 | 0:e166d7acab38 | 126 | /* |
caa45040 | 0:e166d7acab38 | 127 | |
caa45040 | 0:e166d7acab38 | 128 | //I2Cスレーブの送信データの表示 num debug |
caa45040 | 0:e166d7acab38 | 129 | int d = b; //buf[0]; |
caa45040 | 0:e166d7acab38 | 130 | char data_read[3]; //バッファーの定義 |
caa45040 | 0:e166d7acab38 | 131 | data_read[3] = 0; |
caa45040 | 0:e166d7acab38 | 132 | data_read[2] = '0' + ( d - (DIV10(d) * 10) ); // '0'+(d%10) |
caa45040 | 0:e166d7acab38 | 133 | d = DIV10(d); |
caa45040 | 0:e166d7acab38 | 134 | data_read[1] = '0' + ( d - (DIV10(d) * 10) ); // '0'+(d%10) |
caa45040 | 0:e166d7acab38 | 135 | data_read[0] = '0' + DIV10(d); // '0'+(d/10) |
caa45040 | 0:e166d7acab38 | 136 | pc_putc(data_read[0]); |
caa45040 | 0:e166d7acab38 | 137 | pc_putc(data_read[1]); |
caa45040 | 0:e166d7acab38 | 138 | pc_putc(data_read[2]); |
caa45040 | 0:e166d7acab38 | 139 | pc_putc('\r'); |
caa45040 | 0:e166d7acab38 | 140 | pc_putc('\n'); |
caa45040 | 0:e166d7acab38 | 141 | */ |
caa45040 | 0:e166d7acab38 | 142 | |
caa45040 | 0:e166d7acab38 | 143 | // 超音波を発生させる |
caa45040 | 0:e166d7acab38 | 144 | TRIG=1; |
caa45040 | 0:e166d7acab38 | 145 | wait_us(10); |
caa45040 | 0:e166d7acab38 | 146 | TRIG=0; |
caa45040 | 0:e166d7acab38 | 147 | |
caa45040 | 0:e166d7acab38 | 148 | // 超音波を受け取る |
caa45040 | 0:e166d7acab38 | 149 | times = pulseIn( 5, HIGH,2000000); |
caa45040 | 0:e166d7acab38 | 150 | |
caa45040 | 0:e166d7acab38 | 151 | //times = (unsigned long)7700/2; //debug |
caa45040 | 0:e166d7acab38 | 152 | |
caa45040 | 0:e166d7acab38 | 153 | //distance = (int)(times * 0.017); |
caa45040 | 0:e166d7acab38 | 154 | distance = (int)((times * ((unsigned long)(17))) / 100); |
caa45040 | 0:e166d7acab38 | 155 | |
caa45040 | 0:e166d7acab38 | 156 | |
caa45040 | 0:e166d7acab38 | 157 | if(distance <= 60 ) { |
caa45040 | 0:e166d7acab38 | 158 | distance = 60; |
caa45040 | 0:e166d7acab38 | 159 | } |
caa45040 | 0:e166d7acab38 | 160 | if(distance >= 800 ) { |
caa45040 | 0:e166d7acab38 | 161 | distance = 800; |
caa45040 | 0:e166d7acab38 | 162 | } |
caa45040 | 0:e166d7acab38 | 163 | |
caa45040 | 0:e166d7acab38 | 164 | if ( distance <= 199 ) { |
caa45040 | 0:e166d7acab38 | 165 | |
caa45040 | 0:e166d7acab38 | 166 | b = distance - 60; |
caa45040 | 0:e166d7acab38 | 167 | |
caa45040 | 0:e166d7acab38 | 168 | } else { |
caa45040 | 0:e166d7acab38 | 169 | |
caa45040 | 0:e166d7acab38 | 170 | b = (unsigned char)( DIV10(distance)-20+140 ); |
caa45040 | 0:e166d7acab38 | 171 | |
caa45040 | 0:e166d7acab38 | 172 | } |
caa45040 | 0:e166d7acab38 | 173 | |
caa45040 | 0:e166d7acab38 | 174 | |
caa45040 | 0:e166d7acab38 | 175 | //0.5秒の待ち |
caa45040 | 0:e166d7acab38 | 176 | //wait_ms(500); |
caa45040 | 0:e166d7acab38 | 177 | |
caa45040 | 0:e166d7acab38 | 178 | }//while |
caa45040 | 0:e166d7acab38 | 179 | |
caa45040 | 0:e166d7acab38 | 180 | }//main |
caa45040 | 0:e166d7acab38 | 181 | |
caa45040 | 0:e166d7acab38 | 182 | |
caa45040 | 0:e166d7acab38 | 183 | //容量削減 |
caa45040 | 0:e166d7acab38 | 184 | void error(const char* format, ...) {} |
caa45040 | 0:e166d7acab38 | 185 | |
caa45040 | 0:e166d7acab38 | 186 | |
caa45040 | 0:e166d7acab38 | 187 |