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

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

Last updated at Posted at 2024-03-10

参考

↓ここをクリック↓

↑ここをクリック↓

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

o_cop990.jpg

o_cop991.jpg

Arduino_Core_STM32/cores/arduino/wiring_pulse.cpp

o_cop992.jpg

受信




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

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




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

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?