物体までの距離をArduinoとHC-SR04(4ピンの超音波距離測定器:Amazon.co.jp: VKLSVAN 2個 HC-SR04 超音波距離センサーモジュール Arduinoに互換 : 産業・研究開発用品)
で測定するスケッチ。ほとんどを変数化しているので、//-----------------------------以前の数値は可変である。
TRIG はHC-SR04のTrigピンをarduinoの3ピンにEchoを2に、Vccを+5VGrndをGNDにつなげる。 温度は測っていないので25度とした。安価なのでしょうがないが、高くなってもよければ、温度測定のできる精度の高い物もある。
int TRIG = 3;
int ECHO = 2;
int TusinSokudo=9600;
int mati1 = 100;
//
double duration = 0;
double distance = 0;
double speed_of_sound = 331.5 + 0.6 * 25; // 25℃の気温の想定
//-------------------------------------------------------------------------
void setup() {
Serial.begin( TusinSokudo );
pinMode(ECHO, INPUT );
pinMode(TRIG, OUTPUT );
}
void loop() {
digitalWrite(TRIG, LOW);
delayMicroseconds(1);
digitalWrite( TRIG, HIGH );
delayMicroseconds( 1 );
digitalWrite( TRIG, LOW );
duration = pulseIn( ECHO, HIGH ); // 往復にかかった時間が返却される[マイクロ秒]
// if (duration > 0) {
duration = duration / 2; // 往路にかかった時間
distance = duration * speed_of_sound * 100 / 1000000;
Serial.print("Distance:");
Serial.print(distance);
Serial.println(" cm");
// }
delay(mati1);
}
以下はステップモータ2つのコントローラ付き回転させ、HC-SR04を使って超音波で距離を測定する
ARDUINO IDEの スケッチである。
夫々の説明は検索に委ねる。
2つのbyj48を回転させる。
#define で示したようにのそれぞれコントローラのin1ー>
arduino 4につなげる。
また、HC-SR04の
echo、trigerはarduinoの2,3と繋げる。
電源5V、とGNDはそれぞれ繋げる。
/*
hc-s40dで障害物との距離和測り、ステッパーBYJ48で運転制御
*/
#define IN1 4
#define IN2 5
#define IN3 6
#define IN4 7
#define IN5 8
#define IN6 9
#define IN7 10
#define IN8 11
const int NBSTEPS = 4096;
const int STEPTIME = 900;
const int echo=2;
const int trige=3;
int Step = 0;
int mati0 = 20;
int mati1=2;
boolean Clockwise = true;
//---------------------------------------------
int arrayDefault[4] = { LOW, LOW, LOW, LOW };
int stepsMatrix[8][4] = {
{ LOW, LOW, LOW, HIGH },
{ LOW, LOW, HIGH, HIGH },
{ LOW, LOW, HIGH, LOW },
{ LOW, HIGH, HIGH, LOW },
{ LOW, HIGH, LOW, LOW },
{ HIGH, HIGH, LOW, LOW },
{ HIGH, LOW, LOW, LOW },
{ HIGH, LOW, LOW, HIGH },
};
unsigned long lastTime;
unsigned long time;
int sokudo=9600;
int duration = 0;
int distance = 0;
int speed_of_sound = 331.5 + 0.6 * 25; // 25℃の気温の想定
void setup() { // ***** SETUP() ************
Serial.begin(9600);
Serial.println("STERT ! ");
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(IN5, OUTPUT);
pinMode(IN6, OUTPUT);
pinMode(IN7, OUTPUT);
pinMode(IN8, OUTPUT);
Serial.begin( sokudo );
pinMode(echo, INPUT );
pinMode(trige, OUTPUT );
}
void loop() { // ***** loop() ************
unsigned long currentMicros;
int stepsLeft = NBSTEPS;
time = 0;
while (stepsLeft > 0) {
currentMicros = micros();
if (currentMicros - lastTime >= STEPTIME) {
stepper();
time += micros() - lastTime;
lastTime = micros();
stepsLeft--;
}
}
Serial.println(time);
Serial.println("STOP!");
delay(10 * mati0);
//回転方向切り替え
Clockwise = !Clockwise;
stepsLeft = NBSTEPS;
}
void writeStep(int outArray[4]) {
for (int i = 0; i < 4; i++) {
digitalWrite(IN1 + i, outArray[i]);
digitalWrite(IN5 + i, outArray[i]); //******************************
}
}
void stepper() {
writeStep(stepsMatrix[Step]);
} else {
writeStep(arrayDefault);
}
setDirection();
}
void setDirection() {
(Clockwise) ? (Step++) : (Step--);
if (Step > 7) {
Step = 0;
} else if (Step < 0) {
Step = 7;
}
digitalWrite(trige, LOW);
delayMicroseconds(mati1);
digitalWrite( trige, HIGH );
delayMicroseconds( mati0 );
digitalWrite( trige, LOW );
duration = pulseIn( echo, HIGH ); // 往復にかかった時間が返却される[マイクロ秒]
if (duration > 0) {
duration = duration / 2; // 往路にかかった時間
distance = duration * speed_of_sound * 100 / 1000000;
Serial.print("Distance:");
Serial.print(distance);
Serial.println(" cm");
}
delay(20*mati0);
}