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


参考

↓ここをクリック↓

https://qiita.com/caa45040/items/ca9ab5bfd9d8c8901699

↑ここをクリック↓

x pulseIn(がうまく動かない(20240312)


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

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


目的
超音波距離センサーをマイコンを使いI2C化する
完成(202403120142)

仕様
単位は、mm
0mm,1mm,...,255mm
エラー時,オーバー時は、255mm
一つ前の値を返す(すぐに戻り値を返してあげないとI2Cの処理が落ちる為)
(超音波距離センサーの処理は、時間が掛るんだょ(怒り!!))
最新の値が欲しい時は、空読みしてください。
連続読みする時は、約1秒(340m(往復))ぐらい開けてください。
(割り込み禁止等の何の処理もしていません。)
それより、短くする場合は、よく考えて、「自己責任」でお願いします。
送信(マストー)、受信(スレーブ)共にC011です
約2cmから約6cmぐらいまで不感距離があります(特に何の処理もしていません)
0x90から10個
グローバル変数を使ってイニシャライズ(初期化)(I2Cの初期化)もオート(自動化)する。
グローバル変数が0の時は、初期化。それ以外は、無視

```
int a=0;

int UltraSonic_Sx(int add1) {

if( a==0 ) {i2cの初期化  ;a=1;  } 

...

```


いろいろ
STM32G031の超音波距離センサーねたは、最初は、食いつきが悪くて
失敗したかなと思ったがほぼ、アクセス数のトップクラスになっていた為
なぜか、秋月の超音波距離センサーが安いような(300円?(20240310))
(Scratch for Arduino)と言うノンコードがあるらしい
全ては、機能作成者(C++での開発)の責任で全自動以外の不適切らしい。
パラメータ指定でほぼほぼオートそれってゲーム? えへへ、ゲームて言うんだよ。
(Scratch for Arduino)単体での開発(機能やデバイス)が事実的に不可能?で、確実に開発者と利用者が乖離している。それ破綻していると言う。まー細かい事は、いいか?
マネタイズの事を考えると箱庭ゲームになるのか!!
超音波のことをウルトラソニックと言うらしい　かっこいいので決定
AIやノーコードが流行りなので作ってみる。後でGITHUBする。
今、GITHUBの自動コードの宣伝がきたーーーーーーーーーーーー
「サマーウォーズ」的に「つくつたの俺」ごっこして遊びたい。
長いコードは、現実的でないので
思想的には、AS400のRPGのアセンブラのマクロ言語みたいなコマンドとパラメータの組み合わせ

例

```

//超音波センサー0
Serial.println(UltraSonic_S0());

//超音波センサー1
Serial.println(UltraSonic_S1());


```


接続

受信

1 エコー
2 VDD
3 GND
4 ターゲットリセット

8 トリガー
7 未接続
6　I2C
5 I2C

送信

1ハードシリアル
2 VDD
3 GND
4ターゲットリセット

8 SWD
7 SWD
6 I2C
5 I2C

結果

![o_cop989.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a475c46b-3d70-310b-7d35-087de998ad6f.jpeg)


![o_cop990.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/4d777518-f295-f663-2449-e6c1890d85f9.jpeg)

![o_cop991.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c91ec108-9614-4243-8abe-760876daa450.jpeg)

Arduino_Core_STM32/cores/arduino/wiring_pulse.cpp

![o_cop992.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5e556797-f931-d46a-6bb5-43d0715a717a.jpeg)


 

受信

```c++



//I2C_Slave_UltraSonic_C011_1


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


//定義
#define ADD_UltraSonic_S0 ((0x90)>>1)
#define ADD_UltraSonic_S1 ((0x92)>>1)
#define ADD_UltraSonic_S2 ((0x94)>>1)
#define ADD_UltraSonic_S3 ((0x96)>>1)
#define ADD_UltraSonic_S4 ((0x98)>>1)
#define ADD_UltraSonic_S5 ((0xA0)>>1)
#define ADD_UltraSonic_S6 ((0xA2)>>1)
#define ADD_UltraSonic_S7 ((0xA4)>>1)
#define ADD_UltraSonic_S8 ((0xA6)>>1)
#define ADD_UltraSonic_S9 ((0xA8)>>1)

#define Sensor_Sx ADD_UltraSonic_S0

#define TRIG PA14
#define ECHO PB7

//100の割り算 0から30000までは、だいたい正しい
#define DIV100(in) ((in*(65536/100*64+24))>>22)


//初期化処理
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(TRIG, OUTPUT); digitalWrite(TRIG, LOW);
  pinMode(ECHO, INPUT);

}//setup


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


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

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

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

  // 超音波を発生させる
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);

  delayMicroseconds(1);

  // 超音波を受け取る　測定時間
  //int times = pulseIn(ECHO, HIGH, 24000);

  int timeout1 = 100000;    //28ms

loop_s1:
  timeout1--;
  //                            5432109876543210
  if (     (~(GPIOB->IDR))  & 0b0000000010000000     ) {
    if ( timeout1 ) {
      goto loop_s1;
    }
  }

  timeout1 = 100000;    //28ms

  uint32_t start = micros();

loop_in1:
  timeout1--;
  //                      5432109876543210
  if (   (GPIOB->IDR) & 0b0000000010000000   ) {
    if ( timeout1 ) {
      goto loop_in1;
    }
  }

  unsigned long times = micros() - start;


  // 測定時間を長さに変換
  //distance = (int)(times * 0.017);//((340/2)/10000)
  //int distance = (times * 17) / 100;
  int distance = DIV100(((int)times) * 17);

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

}//requestEvent



```

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

送信

UltraSonic_I2C.h

```c++:UltraSonic_I2C.h


//UltraSonic_I2C.h


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


//定義
#define ADD_UltraSonic_S0 ((0x90)>>1)
#define ADD_UltraSonic_S1 ((0x92)>>1)
#define ADD_UltraSonic_S2 ((0x94)>>1)
#define ADD_UltraSonic_S3 ((0x96)>>1)
#define ADD_UltraSonic_S4 ((0x98)>>1)
#define ADD_UltraSonic_S5 ((0xA0)>>1)
#define ADD_UltraSonic_S6 ((0xA2)>>1)
#define ADD_UltraSonic_S7 ((0xA4)>>1)
#define ADD_UltraSonic_S8 ((0xA6)>>1)
#define ADD_UltraSonic_S9 ((0xA8)>>1)

#define UltraSonic_S0() UltraSonic_Sx(ADD_UltraSonic_S0)
#define UltraSonic_S1() UltraSonic_Sx(ADD_UltraSonic_S1)
#define UltraSonic_S2() UltraSonic_Sx(ADD_UltraSonic_S2)
#define UltraSonic_S3() UltraSonic_Sx(ADD_UltraSonic_S3)
#define UltraSonic_S4() UltraSonic_Sx(ADD_UltraSonic_S4)
#define UltraSonic_S5() UltraSonic_Sx(ADD_UltraSonic_S5)
#define UltraSonic_S6() UltraSonic_Sx(ADD_UltraSonic_S6)
#define UltraSonic_S7() UltraSonic_Sx(ADD_UltraSonic_S7)
#define UltraSonic_S8() UltraSonic_Sx(ADD_UltraSonic_S8)
#define UltraSonic_S9() UltraSonic_Sx(ADD_UltraSonic_S9)

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

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

}//INT_UltraSonic_I2C


int SET_UltraSonic = 0;//状態

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

  if(SET_UltraSonic == 0){INT_UltraSonic_I2C();SET_UltraSonic = 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 ); //データの戻り値

} //UltraSonic_Sx


```

```c++


//I2C_Master_UltraSonic_C011_1


//インクルド
#include "UltraSonic_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( UltraSonic_S0() ); // 小数点以上

  delay(1000); //1秒待つ

}//loop

```