LPC1114とGP2Y0A21YK(赤外線距離センサー)で6cmから80cmを求める。 ソフトウェアシリアル出力(ハードはichigojam)


目的
adcのテスト用
どうしてこうなったかは、6-10,10-20,20-80を参考

工夫点は、書き込み用シリアルとデータ出力用シリアルを
分ける事によつて開発の効率を上げた。
データ出力用シリアルの出力先は、dp9
標準シリアルに出力を出したい場合は、dp16に変えればよい
速度は9600bps


```c++

#include "mbed.h"
 
//10の割り算 0から1028までは、正しい。主に0から999
#define DVI10(n) ((n*205)>>11)
 
//Serial pc(USBTX, USBRX); // tx, rx
//Serial pc(SERIAL_TX, SERIAL_RX); //767
//Serial pc(PA_2, PA_3); //010
//Serial pc(PA_9, PA_10); //010
//Serial pc(dp16, dp15); // tx, rx 1114

#define UART_DELAY (96) //  1/9600

//仮想シリアルの出力ポート
//DigitalOut TX(PA_9); //010
//DigitalOut TX(PA_2); //010
//DigitalOut TX(dp16); //1114  標準シリアルポートTX
DigitalOut TX(dp9); //1114

//DigitalOut myled(D13);    //767
//DigitalOut myled(PA_4);   //010
//DigitalOut myled(dp14); //1114

//アナログ入力の設定
//AnalogIn adc_vbat(A3); //PA_4
//AnalogIn adc_vbat(A0); //767
AnalogIn adc_vbat(dp4); //1114

char ch_hex_a_b[5];
char *ch_hex_a(int l_num)
{
    int a,b,c;

    b=DVI10(l_num);
    c=l_num-(b*10);
    a=DVI10(b);
    b=b-(a*10);

    ch_hex_a_b[0] = '0' + a;
    ch_hex_a_b[1] = '0' + b;
    ch_hex_a_b[2] = '0' + c;
    ch_hex_a_b[3] = 0;

    return(ch_hex_a_b);
} //ch_hex_a

//タイマーの定義
Timer t;

int q_st; //スタートタイム debug
int q_et; //エンドタイム   debug

//仮想シリアルへの一文字出力 9600bps
int pc_putc(char ch) {

    TX=1;
    
    q_st = t.read_us(); //debug
    
    TX=0;//START
    wait_us(UART_DELAY);
    
    for(int ii=0;ii<8;ii++){
        TX=(ch>>ii)&1;
        wait_us(UART_DELAY);
    }; //for

    TX=1;//Stop
    wait_us(UART_DELAY);

    q_et = t.read_us(); //debug 引いた数が0で1041ufなら正解
         
    return(0);
    
} //pc_putc

//文字列の表示
int pc_printf(char *str1) {

    //文字の中身がゼロか
    while(*str1){
            
        //一文字出力
        pc_putc(*str1 ++);
                        
    } //while

    //戻り値
    return(0);
}//pc_printf


//赤外線距離センサー(GP2Y0A21YK)の電圧から距離を求める。
//Voltage //電圧
float ir_len(float Voltage)
{

    float ir_length;   //長さ

    if (Voltage >= 0.0f  && Voltage <= 0.4f) {Voltage = 0.4f;}
    if (Voltage >= 3.12f && Voltage <= 5.0f) {Voltage = 3.12f;}

    if        (Voltage >= 0.4f && Voltage <= 1.3f ) { //80-20

        ir_length = 1.0f/ ( 0.0125f + ( ( Voltage - 0.4f) *  (0.0375f/0.9f) ) );

    } else if (Voltage >= 1.3f && Voltage <= 2.3f ) { //20-10

        ir_length = 1.0f/ ( 0.05f   + ( ( Voltage - 1.3f) * 0.05f ) );

    } else if (Voltage >= 2.3f && Voltage <= 2.75f)  { //10-8

        ir_length = 1.0f/ ( 0.1f + ( ( Voltage - 2.3f) * (0.025f/0.45f) ) );

    } else if (Voltage >= 2.75f && Voltage <= 2.98f) { //8-7

        ir_length = 1.0f/ ( 0.125f + ( ( Voltage - 2.75f) * (0.0179f/0.23f) ) );

    } else if (Voltage >= 2.98f && Voltage <= 3.12f) { //7-6

        ir_length = 1.0f/ ( 0.1429f + ( ( Voltage - 2.98f) * (0.0238f/0.14f) ) );

    }//end if

    //戻り値
    return(ir_length);

} //ir_len


char buffer[30];

int main() {
    
    float Voltage;      //電圧
    float ir_length;    //長さ
    int ir_length_i;    //長さ
    int ir_length_s;    //長さ 小数点以下

    //初期化
    TX=1;wait_ms(2);    //文字分のウエート
    pc_printf("\r\n");  //ゴミの吐き出し
            
    //タイマーの開始
    t.start();

    //最初のウエート
    wait_ms(1000);

    //無限ループ
    while(1) { 

        //adcの読み込み 0から4096 (精度は10bitのはず)
        int s = (adc_vbat.read_u16()>>4);

//d sprintf(buffer,"%d",s);     //debug
//d pc_printf( buffer );        //debug
//d pc_printf( "\r\n" );        //debug

        //電圧に変換 ex 3.300 -> 3300 mVを出力
        s=(s*6600)>>13;

//d sprintf(buffer,"%d",s);     //debug
//d pc_printf( buffer );        //debug
//d pc_printf( "\r\n" );        //debug

        Voltage = (float)s / 1000.0f;
        //赤外線距離センサー(GP2Y0A21YK)の電圧から距離を求める。
        ir_length = ir_len(Voltage);

        ir_length_i = (int)ir_length;
        ir_length_s = (int)(ir_length*1000);
        ir_length_s = ir_length_s - (ir_length_i * 1000);

        //距離の小数点以上の表示
        pc_printf(  ch_hex_a(ir_length_i)  );
        //pc_printf(  "\r\n"  );
        
        //小数点の表示
        pc_printf(  "."  );
        
        //距離の小数点以下の表示
        pc_printf(  ch_hex_a(ir_length_s)  );
        pc_printf(  "\r\n"  );
        
        //約0.1秒を待つ
        wait_ms(100);
    } //while

} //main

////容量削減
//void error(const char* format, ...){}




```

![serial_adc_1114_1_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/7b01dbe6-c5f0-37cb-0f1c-c1332091744d.jpeg)

![serial_adc_1114_1_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/06935671-0df3-30a8-d7a8-49e442ddd36e.jpeg)