STM32C011でI2Cスレーブから赤外線距離を読み取って遊ぶ。(STM32C011J4M7) (ターゲットリセット)


x 過去ログを見よ
x 「Arduino」関連を見てください

x PA13を使います。
x 自己責任の意味がわかる人がお読みください。
x 間違った操作を行うと二度と書き込めなくなります。
x ターゲットリセットを接続してください。
x 非常用として「3秒ルール」があり、起動後、3秒以内に接続してください。
x Arduinoのタブの使い方がわかる人

STM32C011でI2Cスレーブから赤外線距離を読み取って遊ぶ。(STM32C011J4M7) (ターゲットリセット)


Arduino I2C STM32 GP2Y0A21YK STM32C011


目的
AIの餌
AIや小学生用に自動化、ユニット化された、プラットホームを提供する。
赤外線距離センサーとしてGP2Y0A21YK(秋月販売コード102551)
===完成20240321===

仕様
単位は、mm
0mmから255mmまで
6cm以下は、保証しない
エラーまたは、オーバーは、255。(0もあるかも)
I2CのIDは、8ビットで0x60(Arduino I2C IDで0x30)から8個

例

```

Serial.println(IR_Length_S0());


```

結果

![o_cop99a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2268a54b-b179-0a24-ce87-f7bcdef773ff.jpeg)

![o_cop99b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d852e0f2-0d34-e08b-be59-567117fa8d76.jpeg)


プログラム

```c++


//I2C_Slave_IR_Length_C011_1


//インクルド
#include <Arduino.h>
#include <Wire.h>


//定義
#define ADD_IR_Length_S0 ((0x60)>>1)
#define ADD_IR_Length_S1 ((0x62)>>1)
#define ADD_IR_Length_S2 ((0x64)>>1)
#define ADD_IR_Length_S3 ((0x66)>>1)
#define ADD_IR_Length_S4 ((0x68)>>1)
#define ADD_IR_Length_S5 ((0x6A)>>1)
#define ADD_IR_Length_S6 ((0x6C)>>1)
#define ADD_IR_Length_S7 ((0x6E)>>1)

#define Sensor_Sx ADD_IR_Length_S0

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


//初期化処理
void setup() {

  delay(3000); //not Delete (絶対消すな)(消しちゃィゃーん)

  //I2Cの初期化
  Wire.setSDA(19);   //PA10
  Wire.setSCL(18);   //PA9
  //Wire.begin( 0x80>>1 ); //debug
  Wire.begin( Sensor_Sx ); // Slave ID #xx
  Wire.onRequest(requestEvent);

  //GPIOの初期化
  pinMode(PA13, INPUT);

}//setup


//メインループ
void loop() {
  delay(1); //ダミー
}//loop


int b = 0; //バイナリーの「b」距離

//I2Cの読み取り関数
void requestEvent() {

  //値の送信 1つ前の値
  //b=46;//debug
  Wire.write( b );

  //アナログ値の読み込み
  analogReadResolution(12);         //adc 12bit mode
  int sensorValue = analogRead(PA13); //センサーの読み取り値

  //アナログ値を電圧に変換
  int Voltage = (sensorValue * 3300) >> 12; //stm32　(s*3300)/4096 電圧

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

  //距離の転記
  if (ir_length >= 255) {
    b = 255;
  } else {
    b = ir_length;
  }

}//requestEvent


```

-----------------------------------------
別のマイコン

送信(ヘッダー)

IR_Length_I2C.h

```c++:IR_Length_I2C.h


//IR_Length_I2C.h


//インクルド
#include <Arduino.h>
#include <Wire.h>


//定義
#define ADD_IR_Length_S0 ((0x60)>>1)
#define ADD_IR_Length_S1 ((0x62)>>1)
#define ADD_IR_Length_S2 ((0x64)>>1)
#define ADD_IR_Length_S3 ((0x66)>>1)
#define ADD_IR_Length_S4 ((0x68)>>1)
#define ADD_IR_Length_S5 ((0x6A)>>1)
#define ADD_IR_Length_S6 ((0x6C)>>1)
#define ADD_IR_Length_S7 ((0x6E)>>1)

#define IR_Length_S0() IR_Length_Sx(ADD_IR_Length_S0)
#define IR_Length_S1() IR_Length_Sx(ADD_IR_Length_S1)
#define IR_Length_S2() IR_Length_Sx(ADD_IR_Length_S2)
#define IR_Length_S3() IR_Length_Sx(ADD_IR_Length_S3)
#define IR_Length_S4() IR_Length_Sx(ADD_IR_Length_S4)
#define IR_Length_S5() IR_Length_Sx(ADD_IR_Length_S5)
#define IR_Length_S6() IR_Length_Sx(ADD_IR_Length_S6)
#define IR_Length_S7() IR_Length_Sx(ADD_IR_Length_S7)


//I2Cの初期化
void INT_IR_Length_I2C() {

  //I2Cの初期化
  Wire.setSDA(19);   //PA10
  Wire.setSCL(18);   //PA9
  Wire.begin();  //I2Cの初期化

}//INT_IR_Length_I2C


int SET_IR_Length = 0;//状態

//距離の読み込み関数
int IR_Length_Sx(int add_1 ){

  if(SET_IR_Length == 0){INT_IR_Length_I2C();SET_IR_Length = 1;}

  //読み込み
  //Wire.requestFrom( 0x80>>1 , 1); //debug
  Wire.requestFrom( add_1 , 1);

  int b = 255; //読み込み値 バイナリーの「b」
  while (Wire.available())  {   // 要求より短いデータが来る可能性あり
    b = Wire.read();            // 1バイトを受信
    if( b < 0 ) { b = 256 + b; }
  }//while

  return( b ); //データの戻り値

} //IR_Length_Sx


```


送信(マスター)

```c++


//I2C_Master_IR_Length_C011_1


//インクルド
#include "IR_Length_I2C.h"


//初期化
void setup() {

  delay(3000); //not delete

  //00:PB7
  //01:PC14
  //1x:Reserved
  SYSCFG->CFGR3 = SYSCFG->CFGR3 | 0b01;

  Serial.setTx(PC14);
  Serial.setHalfDuplex();
  Serial.begin(9600);

  Serial.print("\r\nSTART\r\n"); //スタートと表示

}//setup


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

  //距離の表示 超音波距離センサー0
  Serial.println( IR_Length_S0() ); // 小数点以上

  delay(1000); //1秒待つ

}//loop


```