0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

STM32G031とGP2Y0A21YK(赤外線距離センサー)で6cmから80cmを求める。 I2C(0x80 7bit(0x40))出力

Last updated at Posted at 2022-04-20

目的
adcのテスト用
赤外線距離センターを使い距離を測る。

どうしてこうなったかは、6-10,10-20,20-80を参考

o_con322.jpg

メインプログラム



//ir_length_d_031_1

#include <Arduino.h>
#include <Wire.h>


#include "I2C_OUT_0X80_031_1.h"


//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];

  }//end if

  //戻り値
  return (ir_length);

} //ir_le_i


//初期化
void setup() {

  //i2cの初期化
  pc.beginNS(9600);

}//setup


//メインループ
void loop() {

  int sensorValue; //センサーの読み取り値
  int Voltage;     //電圧
  int ir_length;   //長さ

  //アナログ値の読み込み

  analogReadResolution(12); //adc 12bit mode
  //sensorValue = analogRead(A3); // PA11 PIN5 031
  sensorValue = analogRead(A9); // PB7  PIN1 031

  //sensorValue = analogRead(A0); //UNO


  //アナログ値を電圧に変換

  Voltage = (sensorValue * 3300) >> 12; //stm32

  //V <- S*4.882 UNO +-1mV
  //Voltage = ((sensorValue * 8) + ( (sensorValue * 8) / 10 ) + ( (sensorValue * 2) / 100 )) / 10  + (sensorValue * 4);


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


  //値の表示
  //pc.printNS(sensorValue);
  pc.printNS("800");
  pc.printNS(",");

  //前の0を削る
  //  0123  add
  // [1234] data
  int yy = 0;
  if     (ir_length >= 1000) {
    yy = 0;
  }
  else if (ir_length >= 100) {
    yy = 1;
  }
  else if (ir_length >= 10)  {
    yy = 2;
  }
  else                      {
    yy = 3;
  }

  pc.printNS( (char *)(ch_hex_a(ir_length) + yy) );

  pc.printNS(",");
  pc.printNS("0");



  //リターン
  pc.printNS("\r\n");



  delay(10);// 1/100秒待つ

}//loop






I2C_OUT_0X80_031_1.hのプログラム




#ifndef TEST_H
#define TEST_H

//I2C_OUT_0X80_031_1


//10の割り算 0から1028までは、正しい。主に0から999
#define DIV10(n) ((n*205)>>11)

char ch_hex_a_b[16];
char *ch_hex_a(int x)
{

    ch_hex_a_b[4] = 0;

    if       ( x >= 9000 ) {x = x - 9000; ch_hex_a_b[0] = '9';
    } else if( x >= 8000 ) {x = x - 8000; ch_hex_a_b[0] = '8';
    } else if( x >= 7000 ) {x = x - 7000; ch_hex_a_b[0] = '7';
    } else if( x >= 6000 ) {x = x - 6000; ch_hex_a_b[0] = '6';
    } else if( x >= 5000 ) {x = x - 5000; ch_hex_a_b[0] = '5';
    } else if( x >= 4000 ) {x = x - 4000; ch_hex_a_b[0] = '4';
    } else if( x >= 3000 ) {x = x - 3000; ch_hex_a_b[0] = '3';
    } else if( x >= 2000 ) {x = x - 2000; ch_hex_a_b[0] = '2';
    } else if( x >= 1000 ) {x = x - 1000; ch_hex_a_b[0] = '1';
    } else                 {              ch_hex_a_b[0] = '0';
    }//if

    ch_hex_a_b[3] = '0' + (  x - (DIV10(x) * 10)  );  // 3  <- 120 - 123
    x = DIV10(x);                                     // 12 <= 123 / 10
    ch_hex_a_b[2] = '0' + (  x - (DIV10(x) * 10)  );  // 2  <- 12 - 10
    ch_hex_a_b[1] = '0' +  DIV10(x);                  // 1  <- 12 / 10

    return(ch_hex_a_b);

} //ch_hex_a


//クラスの定義
struct _pc
{
  void beginNS(int sp);      //メソッドの宣言
  int  putcNS(char ch);      //メソッドの宣言
  int  printNS(char *str1);  //メソッドの宣言
  int  printNS(int num);     //メソッドの宣言 オーバーロード
};


#define ADDR1  0x40

//STM32G031J6M6 i2cピンの定義
#define sdaPin PA12    // ArduinoA4
#define sclPin PA11    // ArduinoA5


//ポートをhiにする 初期化
//メソッドの定義
void _pc::beginNS(int sp)
{
  //i2cの初期化
  Wire.begin(sdaPin, sclPin); //STM32G031J6M6
}


//仮想シリアルへの一文字出力 9600bps
//メソッドの定義
int _pc::putcNS(char ch)
{
  //I2Cに送信
  Wire.beginTransmission(ADDR1);
  Wire.write( ch );
  Wire.endTransmission();

  delay(1);//連続送信防止の為に1ms待つ

  //戻り値
  return (0);
}


//文字列の表示
//メソッドの定義
int _pc::printNS(char *str1)
{
  //文字の中身がゼロか
  while (*str1) {

    //一文字出力
    putcNS(*str1 ++);

  } //while

  //戻り値
  return (0);
}


//文字列の表示 オーバーロード 4桁
//メソッドの定義
int _pc::printNS(int num)
{
  if(num < 0) { putcNS('-'); num = 0 - num;   }
    
  char *str1 = ch_hex_a(num);
  
  //文字の中身がゼロか
  while (*str1) {

    //一文字出力
    putcNS(*str1 ++);

  } //while

  //戻り値
  return (0);
}


//実体の作成
_pc pc;


#endif





0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?