
i2c ir 010
main.cpp@0:42c627a323da, 2022-05-06 (annotated)
- Committer:
- caa45040
- Date:
- Fri May 06 13:31:42 2022 +0000
- Revision:
- 0:42c627a323da
i2c_slave_ir_length
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
caa45040 | 0:42c627a323da | 1 | |
caa45040 | 0:42c627a323da | 2 | //i2c_slave_ir_length_010_1 |
caa45040 | 0:42c627a323da | 3 | |
caa45040 | 0:42c627a323da | 4 | |
caa45040 | 0:42c627a323da | 5 | #include "mbed.h" |
caa45040 | 0:42c627a323da | 6 | |
caa45040 | 0:42c627a323da | 7 | |
caa45040 | 0:42c627a323da | 8 | //10の割り算 0から1028までは、正しい。主に0から999 |
caa45040 | 0:42c627a323da | 9 | #define DIV10(n) ((n*205)>>11) |
caa45040 | 0:42c627a323da | 10 | |
caa45040 | 0:42c627a323da | 11 | /* |
caa45040 | 0:42c627a323da | 12 | DigitalOut TX(PB_1); |
caa45040 | 0:42c627a323da | 13 | |
caa45040 | 0:42c627a323da | 14 | //仮想シリアルへの一文字出力 1200bps |
caa45040 | 0:42c627a323da | 15 | int pc_putc(char ch) |
caa45040 | 0:42c627a323da | 16 | { |
caa45040 | 0:42c627a323da | 17 | TX=1; |
caa45040 | 0:42c627a323da | 18 | TX=0;//Start |
caa45040 | 0:42c627a323da | 19 | wait_us(832); |
caa45040 | 0:42c627a323da | 20 | |
caa45040 | 0:42c627a323da | 21 | for(int ii=0; ii<8; ii++) { //Data x 8 |
caa45040 | 0:42c627a323da | 22 | TX=(ch>>ii)&1; |
caa45040 | 0:42c627a323da | 23 | wait_us(832); |
caa45040 | 0:42c627a323da | 24 | }; //for |
caa45040 | 0:42c627a323da | 25 | |
caa45040 | 0:42c627a323da | 26 | TX=1;//Stop |
caa45040 | 0:42c627a323da | 27 | wait_us(832); |
caa45040 | 0:42c627a323da | 28 | |
caa45040 | 0:42c627a323da | 29 | return(0); |
caa45040 | 0:42c627a323da | 30 | } //pc_putc |
caa45040 | 0:42c627a323da | 31 | */ |
caa45040 | 0:42c627a323da | 32 | |
caa45040 | 0:42c627a323da | 33 | //80-20 |
caa45040 | 0:42c627a323da | 34 | unsigned char qq[] = { |
caa45040 | 0:42c627a323da | 35 | 80, 78, 77, 76, 75, 75, 74, 73, 72, 71, |
caa45040 | 0:42c627a323da | 36 | 70, 69, 68, 68, 67, 66, 65, 65, 64, 63, |
caa45040 | 0:42c627a323da | 37 | 63, 62, 61, 61, 60, 60, 59, 58, 58, 57, |
caa45040 | 0:42c627a323da | 38 | 57, 56, 56, 55, 55, 54, 54, 53, 53, 52, |
caa45040 | 0:42c627a323da | 39 | 52, 51, 51, 50, 50, 50, 49, 49, 48, 48, |
caa45040 | 0:42c627a323da | 40 | 47, 47, 47, 46, 46, 46, 45, 45, 45, 44, |
caa45040 | 0:42c627a323da | 41 | 44, 44, 43, 43, 43, 42, 42, 42, 41, 41, |
caa45040 | 0:42c627a323da | 42 | 41, 41, 40, 40, 40, 40, 39, 39, 39, 38, |
caa45040 | 0:42c627a323da | 43 | 38, 38, 38, 37, 37, 37, 37, 37, 36, 36, |
caa45040 | 0:42c627a323da | 44 | 36, 36, 35, 35, 35, 35, 35, 34, 34, 34, |
caa45040 | 0:42c627a323da | 45 | 34, 34, 33, 33, 33, 33, 33, 32, 32, 32, |
caa45040 | 0:42c627a323da | 46 | 32, 32, 32, 31, 31, 31, 31, 31, 31, 30, |
caa45040 | 0:42c627a323da | 47 | 30, 30, 30, 30, 30, 30, 29, 29, 29, 29, |
caa45040 | 0:42c627a323da | 48 | 29, 29, 28, 28, 28, 28, 28, 28, 28, 28, |
caa45040 | 0:42c627a323da | 49 | 27, 27, 27, 27, 27, 27, 27, 27, 26, 26, |
caa45040 | 0:42c627a323da | 50 | 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, |
caa45040 | 0:42c627a323da | 51 | 25, 25, 25, 25, 25, 25, 24, 24, 24, 24, |
caa45040 | 0:42c627a323da | 52 | 24, 24, 24, 24, 24, 24, 23, 23, 23, 23, |
caa45040 | 0:42c627a323da | 53 | 23, 23, 23, 23, 23, 23, 22, 22, 22, 22, |
caa45040 | 0:42c627a323da | 54 | 22, 22, 22, 22, 22, 22, 22, 22, 21, 21, |
caa45040 | 0:42c627a323da | 55 | 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, |
caa45040 | 0:42c627a323da | 56 | 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, |
caa45040 | 0:42c627a323da | 57 | 20, 20, 20, 20, 20, 20 |
caa45040 | 0:42c627a323da | 58 | }; |
caa45040 | 0:42c627a323da | 59 | |
caa45040 | 0:42c627a323da | 60 | //20-10 |
caa45040 | 0:42c627a323da | 61 | unsigned char pp[] = { |
caa45040 | 0:42c627a323da | 62 | 200, 199, 198, 197, 196, 196, 195, 194, 193, 193, |
caa45040 | 0:42c627a323da | 63 | 192, 191, 190, 190, 189, 188, 187, 187, 186, 185, |
caa45040 | 0:42c627a323da | 64 | 185, 184, 183, 183, 182, 181, 181, 180, 179, 179, |
caa45040 | 0:42c627a323da | 65 | 178, 177, 177, 176, 176, 175, 174, 174, 173, 173, |
caa45040 | 0:42c627a323da | 66 | 172, 171, 171, 170, 170, 169, 168, 168, 167, 167, |
caa45040 | 0:42c627a323da | 67 | 166, 166, 165, 165, 164, 163, 163, 162, 162, 161, |
caa45040 | 0:42c627a323da | 68 | 161, 160, 160, 159, 159, 158, 158, 157, 157, 156, |
caa45040 | 0:42c627a323da | 69 | 156, 155, 155, 154, 154, 153, 153, 152, 152, 151, |
caa45040 | 0:42c627a323da | 70 | 151, 151, 150, 150, 149, 149, 148, 148, 147, 147, |
caa45040 | 0:42c627a323da | 71 | 147, 146, 146, 145, 145, 144, 144, 144, 143, 143, |
caa45040 | 0:42c627a323da | 72 | 142, 142, 142, 141, 141, 140, 140, 140, 139, 139, |
caa45040 | 0:42c627a323da | 73 | 138, 138, 138, 137, 137, 136, 136, 136, 135, 135, |
caa45040 | 0:42c627a323da | 74 | 135, 134, 134, 134, 133, 133, 132, 132, 132, 131, |
caa45040 | 0:42c627a323da | 75 | 131, 131, 130, 130, 130, 129, 129, 129, 128, 128, |
caa45040 | 0:42c627a323da | 76 | 128, 127, 127, 127, 126, 126, 126, 125, 125, 125, |
caa45040 | 0:42c627a323da | 77 | 125, 124, 124, 124, 123, 123, 123, 122, 122, 122, |
caa45040 | 0:42c627a323da | 78 | 121, 121, 121, 121, 120, 120, 120, 119, 119, 119, |
caa45040 | 0:42c627a323da | 79 | 119, 118, 118, 118, 117, 117, 117, 117, 116, 116, |
caa45040 | 0:42c627a323da | 80 | 116, 116, 115, 115, 115, 114, 114, 114, 114, 113, |
caa45040 | 0:42c627a323da | 81 | 113, 113, 113, 112, 112, 112, 112, 111, 111, 111, |
caa45040 | 0:42c627a323da | 82 | 111, 110, 110, 110, 110, 109, 109, 109, 109, 108, |
caa45040 | 0:42c627a323da | 83 | 108, 108, 108, 107, 107, 107, 107, 107, 106, 106, |
caa45040 | 0:42c627a323da | 84 | 106, 106, 105, 105, 105, 105, 105, 104, 104, 104, |
caa45040 | 0:42c627a323da | 85 | 104, 103, 103, 103, 103, 103, 102, 102, 102, 102, |
caa45040 | 0:42c627a323da | 86 | 102, 101, 101, 101, 101, 101, 100, 100, 100, 100, |
caa45040 | 0:42c627a323da | 87 | 100 |
caa45040 | 0:42c627a323da | 88 | }; |
caa45040 | 0:42c627a323da | 89 | |
caa45040 | 0:42c627a323da | 90 | //10-6 |
caa45040 | 0:42c627a323da | 91 | unsigned char oo[] = { |
caa45040 | 0:42c627a323da | 92 | 100, 99, 98, 98, 97, 97, 96, 96, 95, 95, |
caa45040 | 0:42c627a323da | 93 | 94, 94, 93, 93, 92, 92, 91, 91, 90, 90, |
caa45040 | 0:42c627a323da | 94 | 90, 89, 89, 88, 88, 87, 87, 86, 86, 86, |
caa45040 | 0:42c627a323da | 95 | 85, 85, 84, 84, 84, 83, 83, 82, 82, 82, |
caa45040 | 0:42c627a323da | 96 | 81, 81, 81, 80, 80, 80, 79, 79, 78, 78, |
caa45040 | 0:42c627a323da | 97 | 77, 77, 76, 76, 75, 75, 74, 74, 74, 73, |
caa45040 | 0:42c627a323da | 98 | 73, 72, 72, 71, 71, 71, 70, 70, 69, 69, |
caa45040 | 0:42c627a323da | 99 | 68, 67, 66, 66, 65, 64, 63, 63, 62, 61, |
caa45040 | 0:42c627a323da | 100 | 61, 60, 60 |
caa45040 | 0:42c627a323da | 101 | }; |
caa45040 | 0:42c627a323da | 102 | |
caa45040 | 0:42c627a323da | 103 | |
caa45040 | 0:42c627a323da | 104 | //赤外線距離センサー(GP2Y0A21YK)の電圧から距離を求める。 |
caa45040 | 0:42c627a323da | 105 | //Voltage //電圧 |
caa45040 | 0:42c627a323da | 106 | int ir_len_i(int Voltage) |
caa45040 | 0:42c627a323da | 107 | { |
caa45040 | 0:42c627a323da | 108 | |
caa45040 | 0:42c627a323da | 109 | int ir_length; //長さ |
caa45040 | 0:42c627a323da | 110 | |
caa45040 | 0:42c627a323da | 111 | if (Voltage >= 0 && Voltage <= 400 ) { |
caa45040 | 0:42c627a323da | 112 | return (800); |
caa45040 | 0:42c627a323da | 113 | } |
caa45040 | 0:42c627a323da | 114 | if (Voltage >= 3120 && Voltage <= 5000) { |
caa45040 | 0:42c627a323da | 115 | return (60); |
caa45040 | 0:42c627a323da | 116 | } |
caa45040 | 0:42c627a323da | 117 | |
caa45040 | 0:42c627a323da | 118 | if (Voltage >= 400 && Voltage <= 1300 ) { //80-20 |
caa45040 | 0:42c627a323da | 119 | |
caa45040 | 0:42c627a323da | 120 | ir_length = (int)qq[(Voltage - 400) >> 2]; |
caa45040 | 0:42c627a323da | 121 | ir_length = ir_length * 10; |
caa45040 | 0:42c627a323da | 122 | |
caa45040 | 0:42c627a323da | 123 | } else if (Voltage >= 1300 && Voltage <= 2300 ) { //20-10 |
caa45040 | 0:42c627a323da | 124 | |
caa45040 | 0:42c627a323da | 125 | ir_length = (int)pp[(Voltage - 1300) >> 2]; |
caa45040 | 0:42c627a323da | 126 | |
caa45040 | 0:42c627a323da | 127 | } else if (Voltage >= 2300 && Voltage <= 3120 ) { //10-6 |
caa45040 | 0:42c627a323da | 128 | |
caa45040 | 0:42c627a323da | 129 | //ir_length = (int)oo[(Voltage - 2300) / 10]; |
caa45040 | 0:42c627a323da | 130 | ir_length = (int)oo[ ((Voltage - 2300)*205)>>11 ]; //10の割り算 |
caa45040 | 0:42c627a323da | 131 | |
caa45040 | 0:42c627a323da | 132 | }//end if |
caa45040 | 0:42c627a323da | 133 | |
caa45040 | 0:42c627a323da | 134 | //戻り値 |
caa45040 | 0:42c627a323da | 135 | return (ir_length); |
caa45040 | 0:42c627a323da | 136 | |
caa45040 | 0:42c627a323da | 137 | } //ir_le_i |
caa45040 | 0:42c627a323da | 138 | |
caa45040 | 0:42c627a323da | 139 | |
caa45040 | 0:42c627a323da | 140 | //アナログ入力の設定 |
caa45040 | 0:42c627a323da | 141 | AnalogIn adc_vbat(A3); //PA_4 |
caa45040 | 0:42c627a323da | 142 | |
caa45040 | 0:42c627a323da | 143 | unsigned char b=200; //マスターに返す値 |
caa45040 | 0:42c627a323da | 144 | |
caa45040 | 0:42c627a323da | 145 | //I2Cの初期化 |
caa45040 | 0:42c627a323da | 146 | I2CSlave slave(PA_10, PA_9); //010 |
caa45040 | 0:42c627a323da | 147 | |
caa45040 | 0:42c627a323da | 148 | //メインルーチン |
caa45040 | 0:42c627a323da | 149 | int main() |
caa45040 | 0:42c627a323da | 150 | { |
caa45040 | 0:42c627a323da | 151 | |
caa45040 | 0:42c627a323da | 152 | int sensorValue; //センサーの読み取り値 |
caa45040 | 0:42c627a323da | 153 | int Voltage; //電圧 |
caa45040 | 0:42c627a323da | 154 | int ir_length; //長さ |
caa45040 | 0:42c627a323da | 155 | |
caa45040 | 0:42c627a323da | 156 | |
caa45040 | 0:42c627a323da | 157 | //TX=1; //ポートの初期化 |
caa45040 | 0:42c627a323da | 158 | |
caa45040 | 0:42c627a323da | 159 | char buf[10];//I2Cバッファー |
caa45040 | 0:42c627a323da | 160 | |
caa45040 | 0:42c627a323da | 161 | //I2Cスレーブのアドレスの設定 |
caa45040 | 0:42c627a323da | 162 | slave.address(0x10); |
caa45040 | 0:42c627a323da | 163 | |
caa45040 | 0:42c627a323da | 164 | //無限ループ |
caa45040 | 0:42c627a323da | 165 | while(1) { |
caa45040 | 0:42c627a323da | 166 | |
caa45040 | 0:42c627a323da | 167 | //I2Cの状態の読み出し(ポーリング) |
caa45040 | 0:42c627a323da | 168 | while( slave.receive() == I2CSlave::ReadAddressed ) {}; |
caa45040 | 0:42c627a323da | 169 | |
caa45040 | 0:42c627a323da | 170 | |
caa45040 | 0:42c627a323da | 171 | buf[0] = b; |
caa45040 | 0:42c627a323da | 172 | |
caa45040 | 0:42c627a323da | 173 | //I2Cマスターに送信する |
caa45040 | 0:42c627a323da | 174 | slave.write(buf,1); |
caa45040 | 0:42c627a323da | 175 | |
caa45040 | 0:42c627a323da | 176 | /* |
caa45040 | 0:42c627a323da | 177 | |
caa45040 | 0:42c627a323da | 178 | //I2Cスレーブの送信データの表示 num debug |
caa45040 | 0:42c627a323da | 179 | int d = b; //buf[0]; |
caa45040 | 0:42c627a323da | 180 | char data_read[3]; //バッファーの定義 |
caa45040 | 0:42c627a323da | 181 | data_read[3] = 0; |
caa45040 | 0:42c627a323da | 182 | data_read[2] = '0' + ( d - (DIV10(d) * 10) ); // '0'+(d%10) |
caa45040 | 0:42c627a323da | 183 | d = DIV10(d); |
caa45040 | 0:42c627a323da | 184 | data_read[1] = '0' + ( d - (DIV10(d) * 10) ); // '0'+(d%10) |
caa45040 | 0:42c627a323da | 185 | data_read[0] = '0' + DIV10(d); // '0'+(d/10) |
caa45040 | 0:42c627a323da | 186 | pc_putc(data_read[0]); |
caa45040 | 0:42c627a323da | 187 | pc_putc(data_read[1]); |
caa45040 | 0:42c627a323da | 188 | pc_putc(data_read[2]); |
caa45040 | 0:42c627a323da | 189 | pc_putc('\r'); |
caa45040 | 0:42c627a323da | 190 | pc_putc('\n'); |
caa45040 | 0:42c627a323da | 191 | */ |
caa45040 | 0:42c627a323da | 192 | |
caa45040 | 0:42c627a323da | 193 | //アナログ値の読み込み 0から4096 |
caa45040 | 0:42c627a323da | 194 | sensorValue = (adc_vbat.read_u16()>>4); |
caa45040 | 0:42c627a323da | 195 | //sensorValue = 1024; |
caa45040 | 0:42c627a323da | 196 | |
caa45040 | 0:42c627a323da | 197 | //アナログ値を電圧に変換 |
caa45040 | 0:42c627a323da | 198 | Voltage = (sensorValue * 3300) >> 12; //stm32 (s*3300)/4096 |
caa45040 | 0:42c627a323da | 199 | //Voltage = 2300; //debug |
caa45040 | 0:42c627a323da | 200 | |
caa45040 | 0:42c627a323da | 201 | ir_length = ir_len_i(Voltage); |
caa45040 | 0:42c627a323da | 202 | |
caa45040 | 0:42c627a323da | 203 | |
caa45040 | 0:42c627a323da | 204 | if ( ir_length <= 199 ) { |
caa45040 | 0:42c627a323da | 205 | |
caa45040 | 0:42c627a323da | 206 | b = ir_length - 60; |
caa45040 | 0:42c627a323da | 207 | |
caa45040 | 0:42c627a323da | 208 | } else { |
caa45040 | 0:42c627a323da | 209 | |
caa45040 | 0:42c627a323da | 210 | b = (unsigned char)( DIV10(ir_length)-20+140 ); |
caa45040 | 0:42c627a323da | 211 | |
caa45040 | 0:42c627a323da | 212 | } |
caa45040 | 0:42c627a323da | 213 | |
caa45040 | 0:42c627a323da | 214 | |
caa45040 | 0:42c627a323da | 215 | //0.5秒の待ち |
caa45040 | 0:42c627a323da | 216 | //wait_ms(500); |
caa45040 | 0:42c627a323da | 217 | |
caa45040 | 0:42c627a323da | 218 | }//while |
caa45040 | 0:42c627a323da | 219 | |
caa45040 | 0:42c627a323da | 220 | }//main |
caa45040 | 0:42c627a323da | 221 | |
caa45040 | 0:42c627a323da | 222 | |
caa45040 | 0:42c627a323da | 223 | //容量削減 |
caa45040 | 0:42c627a323da | 224 | void error(const char* format, ...) {} |
caa45040 | 0:42c627a323da | 225 | |
caa45040 | 0:42c627a323da | 226 |