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