i2c_slave_HC_SR04_010

Dependencies:   mbed

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?

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