Arduinoで超音波センサを使う(1)LEDの制御 | 中峯浩のオフィシャルブログ

中峯浩のオフィシャルブログ

京都教育大学教育学部産業技術科学科で行われている実験実習の内容を簡単に説明します

テーマ:

 今回は Arduino に超音波センサ HC-SR04 (ELEGOO社製) を接続する方法について述べます。まずは、データシートを探してみます。早速、ありました。秋月電子通商のページにリンクされています。また、スイッチサイエンスのページにはサンプルプログラムが掲載されています。ただ、赤い文字で何やら気になる記述があります。。。気にせず行きます。

 スイッチサイエンスのサンプルプログラム、何の苦労もなしに動きます。シリアルモニターに測定距離が表示されます。超音波の反射する素材により大きな誤差が出ます。金属製の障害物にすると誤差の少ない値が出てきます。

https://www.switch-science.com/catalog/1606/ より

 

 では、プログラムを見ていきましょう。

  int Trig = 8;         

   //8番ピンをTrig端子とする

  int Echo = 9;

    //9番ピンをEcho端子とする

  int Duration;

    //Echo端子の出力に現れるパルス幅(データシート参照)

  float Distance;   

         //測定距離

setup()

  Serial.begin(9600);

         //シリアル通信の初期化

  pinMode(Trig, OUTPUT);  

         //Trig端子を出力端子として使う

  pinMode(Echo, INPUT);  

         //Echo端子を入力端子として使う

loop()

  digitalWrite(Trig, LOW);  

         //Trig端子にLOW電圧を出力する

  delayMicroseconds(1);   

         //1us動作を停止する

  digitalWrite(Trig, HIGH);  

         //Trig端子にHIGH電圧を出力する

  delayMicroseconds(11);  

         //11us動作を停止する

  digitalWrite(Trig, LOW);  

         //Trig端子にLOW電圧をかける

      //ここまでの5行で11us幅のパルスを出力する

  Duration = pulseIn(Echo, HIGH);  

         //Echo端子に入力されるパルスを検出します

  if (Duration > 0)    

         //もし、パルスが検出されたら

    Distance = Duration / 2;    

         //計測対象までの時間を半分にする(データシート参照)

    Distance = Distance*340*100/1000000;  

         //距離は時間×速度

    Serial.print(Duration);    

         //伝達時間差

    Serial.print(" us ");    

         //usと表示
      Serial.print(Distance);  

         //距離
      Serial.println(" cm");   

         //cmと表示

  delay(500);           

         //500ms待って新たなトリガを発生

 

 では、ArduinoといえばLED(?)ですから、「超音波センサにより測定した距離が6cm以下になったらLEDが点灯する」というプロジェクトを遂行します(そんな大げさなものではない、6cmにしたのは本日のラッキーナンバーだったから)。

 プログラムの変更点としては、Distanceが6より小さくなったら、digitalWriteでLEDを点灯するだけで行けそうです。プログラムは以下のように変更します。

 

int Trig = 8;
int Echo = 9;
int LED = 13;
int Duration;
float Distance;

void setup() {
  Serial.begin(9600);
  pinMode(Trig, OUTPUT);
  pinMode(Echo, INPUT);
  pinMode(LED, OUTPUT);
}

void loop() {
  digitalWrite(Trig,LOW);
  delayMicroseconds(1);
  digitalWrite(Trig,HIGH);
  delayMicroseconds(11);
  digitalWrite(Trig,LOW);
  Duration = pulseIn(Echo,HIGH);
  if (Duration>0) {
    Distance = Duration/2;
    Distance = Distance*340*100/1000000;
    Serial.print(Duration);
    Serial.print(" us ");
    Serial.print(Distance);
    Serial.println(" cm");
  }
  if (Distance < 6.0) {
    digitalWrite(LED, HIGH);
  }
  else {
    digitalWrite(LED, LOW);
  }

  delay(500);
}

 

プログラムの説明は省略します。質問はコメントのほうへお願いします。完成した回路は次の写真のようなものです。

  


 回路図は、以下の通りです。

 今回は以上です。次回は、超音波センサを利用してモーター制御をしたいと思います。