参考
↓ここをクリック↓
↑ここをクリック↓
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
結果
Arduino_Core_STM32/cores/arduino/wiring_pulse.cpp
受信
//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
//インクルド
#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