All_outlook

All_outlook

RCJ Soccer Lightに出場予定の高校1年生4人組です!中学の科学部仲間で再集合して結成しました。作ったものや研究結果、余談?などを上げていきます。

ホームページ Junの個人ブログ

このブログの影響で生じた損害などにおいては責任を負いかねます。試す場合は完全自己責任でお願いします。
ブログの運営はJunがやっています。

超音波センサで計測器(SO1602AWWB使用)

動作しているところ

オンステでは相方にArduinoのプログラムを任せていて(Pythonはやったことある)、ほぼArduinoのプログラムをやったことのないJunがArduinoのプログラムを書いてみました!今回は、誰でもわかるような、このプログラムについて書いていきたいと思います。w

youtu.be

出来ること

超音波センサで読み取った値を距離に変換し、それをPCに送り、同時にディスプレイに表示します。また、10cm以下だった場合は、音と光で知らせます。

使用部品(秋月で揃えました)

回路図

これから、Eagleで基板を制作していこうと思っているので練習として回路図も作ってみました。

f:id:J_jun:20200325231320j:plain
計測器_回路図

ソースコード

//ライブラリ宣言
#include <I2CLiquidCrystal.h>
#include <Wire.h>

#define echoPin 12 // 超音波_Echo
#define trigPin 13 // 超音波_Trigger
int pin = 11;      // ブザー
int led = 10;      // LED

//変数初期化
double Duration = 0; //受信した間隔
double Distance = 0; //距離

I2CLiquidCrystal lcd(0x3c, (uint8_t)127);
                  //  |             +--- contrast (0-255)
                  //  +-------- I2C ADDR (SA0=L: 0x3c, SA0=H: 0x3d)
void setup() {
  lcd.begin(16,2);         //LCDディスプレイをオン
  lcd.noCursor();          //LCDカーソルを非表示
  
  Serial.begin( 9600 );    //ポートを開き、速度を設定
  
  pinMode(echoPin,INPUT);  //echoPinを入力に設定
  pinMode(trigPin,OUTPUT); //trigPinを出力に設定

  pinMode(led,OUTPUT);     //ledPinを出力に設定
}

void loop() {
  digitalWrite(led,LOW);            //ledをON
  digitalWrite(trigPin,LOW);        //超音波(音)を停止
  delayMicroseconds(2);             //2μ秒待機
  digitalWrite(trigPin,HIGH);       //超音波(音)を出力
  delayMicroseconds(10);            //10μ秒待機
  digitalWrite(trigPin,LOW);        //超音波(音)を停止
  Duration = pulseIn(echoPin,HIGH); //パルスを計測(音が行って帰ってくるまでの時間)
    
  if (Duration > 0) {                    //Duration内の値が数かどうか判断
    //数だった場合の処理
    Duration = Duration/2;               //往復距離なので半分にする
    Distance = Duration*340*100/1000000; // 音速を340m/sなのでそこから距離を算出(cm)
    Serial.println(Distance);            //シリアルで出力
    }

  if (Distance < 10) {      //距離が10cm以下かどうか判断
    //10cm以下だった場合の処理
    tone(pin,262,200);      //ドを鳴らす
    digitalWrite(led,HIGH); //ledをOFF
  }
  
  lcd.clear();         //LCDをクリア
  lcd.print(Distance); //LCDに距離を表示
  
  delay(100); //0.1秒待機
  
  }

工夫点

ディスプレイに新しいデータを送るたびに続いてしまっていたので lcd.clear(); を入れたりして安定するようにしました。
これからは、距離によって音階が変わるようにしたり、たまに変な値が出てしまうので、それを防ぐため、5回分のデーターの最上値と最低値を省き平均するプログラムができたらいいなと思っています。
他にも、タクトスイッチを使用しディスプレイで操作出来るプログラムを書きたいです。いい方法があったら教えて下さい!

参考にさせてもらったブログ様

不快にさせてしまったら、すいません。消せと言われたらすぐ消します。
ストロベリー・リナックス/秋月電子のI2C液晶/OLEDほかをArduinoで使う https://n.mtng.org/ele/arduino/i2c.html
圧電ブザーを鳴らせてみよう · Arduino docs
液晶表示(LiquidCrystalクラス)ライブラリ | ルネサス エレクトロニクス
Arduinoでパーツやセンサを使ってみよう~超音波モジュール編 | Device Plus - デバプラ



最後まで読んでくださりありがとうございました。
アドバイスなどお願いします。🙏