超音波センサで計測器(SO1602AWWB使用)
動作しているところ
オンステでは相方にArduinoのプログラムを任せていて(Pythonはやったことある)、ほぼArduinoのプログラムをやったことのないJunがArduinoのプログラムを書いてみました!今回は、誰でもわかるような、このプログラムについて書いていきたいと思います。w
出来ること
超音波センサで読み取った値を距離に変換し、それをPCに送り、同時にディスプレイに表示します。また、10cm以下だった場合は、音と光で知らせます。
使用部品(秋月で揃えました)
- Arduino Uno http://akizukidenshi.com/catalog/g/gM-07385/
- 有機ELキャラクタディスプレイモジュール 16×2行 白色 http://akizukidenshi.com/catalog/g/gP-08277/
- HC-SR04(超音波センサ) http://akizukidenshi.com/catalog/g/gM-11009/
- 圧電ブザー(掘り出し物)
- 適当なLED
- 3K、2K、330Ωの抵抗
- 0.1μFのセラミックコンデンサ
回路図
これから、Eagleで基板を制作していこうと思っているので練習として回路図も作ってみました。
ソースコード
//ライブラリ宣言 #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 - デバプラ
最後まで読んでくださりありがとうございました。
アドバイスなどお願いします。🙏