i2c ir 010

Dependencies:   mbed

Committer:
caa45040
Date:
Fri May 06 13:31:42 2022 +0000
Revision:
0:42c627a323da
i2c_slave_ir_length

Who changed what in which revision?

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