LoginSignup
1
0

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

Last updated at Posted at 2024-03-19

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

o_cop99b.jpg

プログラム



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

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


送信(マスター)



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


1
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
1
0