検索コード

HC-SR04 超音波距離センサーと SSD1306 OLED ディスプレイ用の Arduino コードとビデオ

HC-SR04 超音波距離センサーと SSD1306 OLED ディスプレイ用の Arduino コードとビデオ

このチュートリアルでは、HC-SR04超音波距離センサーとSSD1306 OLEDディスプレイを組み合わせて距離測定を視覚化する方法を説明します。このプロジェクトではコンピュータを使わずに距離を測定できるため、ロボット工学を含むさまざまな用途に最適です。プロジェクトを終えるころには、距離測定結果を直接OLED画面に表示する実用的なセットアップが完成します。

How HC-SR04 ulrasonic sensor work
SSD1306 OLED display

進めるにあたって、両方のコンポーネントに必要な配線接続を説明し、これらのコンポーネントを統合するArduinoコードのウォークスルーを行います。これにより、センサーがどのように距離を測定し、そのデータをOLEDディスプレイに出力するかを理解できるようになります。さらに詳しくは、本チュートリアルに関連するビデオ(ビデオ内 00:00)を参照してください。

ハードウェアの解説

このプロジェクトの主な構成要素は、HC-SR04 超音波距離センサーと SSD1306 OLED ディスプレイです。HC-SR04 は超音波を用いて動作し、トリガーピンから音波パルスを発信し、エコーピンで反射波を受信します。音が戻るまでの時間を計算することで、物体までの距離を測定できます。このセンサーは短距離測定に非常に有効で、通常は最大400〜500 cm 程度まで測定できます。

SSD1306 OLEDディスプレイは、テキストやグラフィックスを表示できるI2Cインターフェースのディスプレイです。SDA(データ線)とSCL(クロック線)の2本のピンで通信します。今回のセットアップでは、これらのピンを特定のArduinoピンに接続しており、容易に統合して制御できます。

データシートの詳細

製造元様々な
部品番号HC-SR04
ロジック/入出力電圧5ボルト
供給電圧5 V
出力電流(チャンネルごと)15 mA
ピーク電流(チャンネルあたり)20 mA
PWM周波数ガイドライン該当なし
入力ロジックの閾値0.3×Vccから0.7×Vccまで
電圧降下 / RDS(オン)/ 彩度該当なし
熱限界0〜70°C
パッケージ4ピンモジュール
備考/バリエーション標準モジュール

  • 両方のコンポーネントに対して適切な電源(5 V)を確保してください。
  • I2C通信では、必要に応じてプルアップ抵抗を使用してください。
  • トリガー線とエコー線は干渉を避けるため短くしてください。
  • 正確な測定のために超音波センサーの向きを確認してください。
  • 機械的振動を避けるため、ディスプレイは安定した面に設置してください。

配線手順

Arduino wiring for HC-SR04 ultrasonic SSD1306 128x64 OLED
Arduino wiring for HC-SR04 ultrasonic SSD1306 128x64 OLED

HC-SR04 超音波センサーを接続するには、まず VCC ピン(通常は赤)を Arduino の 5V ピンに配線します。次に、GND ピン(一般的に黒または黄色)を Arduino の GND ピンのいずれかに接続します。トリガーピン(多くは青)は Arduino のデジタルピン 12 に配線し、エコーピン(通常は緑)はデジタルピン 11 に接続します。

SSD1306 OLEDディスプレイの場合、VCCピンはArduinoの5Vピンに、GNDピンはGNDに接続します。SCLピンはArduinoのA5ピンに、SDAピンはA4ピンに接続してください。専用のI2Cピンを備えた別のArduinoモデルを使用している場合は、ディスプレイをそれらのピンに直接接続してください。

コード例と解説

setup 関数では、ディスプレイとシリアル通信を初期化します。以下の抜粋は、ディスプレイの設定方法を示しています:

void setup() {
   Serial.begin(9600);// set serial monitor with 9600 baud
   display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D
}

ここで、ディスプレイはI2Cアドレスで初期化され、Arduinoと通信できるようになります。シリアルモニタも距離の値を表示するように設定されています。

メインループでは、ディスプレイをクリアし、距離を測定して表示します。以下のコードスニペットは、距離測定の処理方法を示しています:

void loop() {
   display.clearDisplay();
   String distance  = String(sonar.ping_cm());// get distance and convert it to string for display
   robojaxText(distance +"cm", 3, 20, 3, false);
   display.display();
   delay(50); // Wait 50ms between pings
}

このループは距離を継続的に測定し、現在の測定値でディスプレイを更新します。robojaxText関数はOLED画面にテキストを表示するために使用されます。

デモ/何を期待するか

セットアップが完了しコードをアップロードすると、OLED画面に距離がセンチメートルで表示されます。物体をセンサーに近づけたり遠ざけたりすると、表示される値がそれに応じて変化するはずです。センサーの向きが正しく、遮られていないことを確認してください(動画の02:30参照)。

動画のタイムスタンプ

  • 00:00- プロジェクトの紹介
  • 01:15- 配線手順
  • 02:30- コードの説明
  • 04:00- センサーの実演

画像

HC-SR04 ulrasonic sensor
HC-SR04 ulrasonic sensor
How HC-SR04 ulrasonic sensor work
How HC-SR04 ulrasonic sensor work
Arduino wiring for HC-SR04 ultrasonic SSD1306 128x64 OLED
Arduino wiring for HC-SR04 ultrasonic SSD1306 128x64 OLED
SSD1306 OLED display
SSD1306 OLED display
SSD1306 OLED display-dimensions
SSD1306 OLED display-dimensions
SSD1306_128x64_OLDE-4
SSD1306_128x64_OLDE-4
SSD1306 OLED display-back
SSD1306 OLED display-back
44-This is the Arduino code for an HC-SR04 ultrasonic distance sensor with an SSD1306 display.
言語: C++
/*
 * This is the Arduino code for the HC-SR04 Ultrasonic Distance Sensor with SSD1306 Display
 * to measure the distance using Arduino for a robotic car and other applications
 * Watch the video https://youtu.be/Pgx5fNF4Q6M
 * 
 * Written by Ahmad Shamshiri for Robojax Video
 * Date: December 21, 2017, in Ajax, Ontario, Canada
 * Permission granted to share this code given that this
 * note is kept with the code.
 * Disclaimer: this code is "AS IS" and for educational purposes only.
 * 
 */

/* Original Code 
   from https://github.com/adafruit/Adafruit_SSD1306
// https://playground.arduino.cc/Code/NewPing
 * Modified for Robojax video on December 21, 2017
// ---------------------------------------------------------------------------
// Example NewPing library sketch that does a ping about 20 times per second.
// ---------------------------------------------------------------------------
*/
//// start of SSD1306 display 
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2


#define LOGO16_GLCD_HEIGHT 64 
#define LOGO16_GLCD_WIDTH  128 
static const unsigned char PROGMEM logo16_glcd_bmp[] =
{ B00000000, B11000000,
  B00000001, B11000000,
  B00000001, B11000000,
  B00000011, B11100000,
  B11110011, B11100000,
  B11111110, B11111000,
  B01111110, B11111111,
  B00110011, B10011111,
  B00011111, B11111100,
  B00001101, B01110000,
  B00011011, B10100000,
  B00111111, B11100000,
  B00111111, B11110000,
  B01111100, B11110000,
  B01110000, B01110000,
  B00000000, B00110000 };

#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
//// end of SSD1306 display 

// ---------------------------------------------------------------------------
// Example NewPing library sketch that does a ping about 20 times per second.
// ---------------------------------------------------------------------------

#include <NewPing.h>

#define TRIGGER_PIN  12  // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN     11  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 200 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.



void setup() {
   Serial.begin(9600);// set serial monitor with 9600 baud
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64)
  
}// setup end


void loop() {
   display.clearDisplay();
  robojaxText("Distance", 3, 0, 2, false);
  String distance  = String(sonar.ping_cm());// get distance and convert it to string for display
  robojaxText(distance +"cm", 3, 20, 3, false);
    display.display();

  delay(50);                     // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
  Serial.print("Ping: ");
  Serial.print(sonar.ping_cm()); // Send ping, get distance in cm and print result (0 = outside set distance range)
  Serial.println("cm");

}// loop end


/*
 * robojaxText(String text, int x, int y,int size, boolean d)
 * text is the text string to be printed
 * x is the integer x position of text
 * y is the integer y position of text
 * size is the text size, 1, 2, 3 etc
 * d is either true or false.  Use true to display.
 */
void robojaxText(String text, int x, int y,int size, boolean d) {

  display.setTextSize(size);
  display.setTextColor(WHITE);
  display.setCursor(x,y);
  display.println(text);
  if(d){
    display.display();
  }

}

リソースと参考文献

ファイル📁

データシート(pdf)

  • SSD1306 display datasheet
    SSD1306 is a single-chip CMOS OLED/PLED driver with controller for organic / polymer light emitting diode dot-matrix graphic display system. It consists of 128 segments and 64commons. This IC is designed for Common Cathode type OLED panel. The SSD1306 embeds with contrast control, display RAM and oscillator, which reduces the number of external components and power consumption. It has 256-step brightness control. Data/Commands are sent from general MCU through the hardware selectable 6800/8000 series compatible Parallel Interface, I2C interface or Serial Peripheral Interface. It is suitable for many compact portable applications, such as mobile phone sub-display, MP3 player and calculator, etc.
    SSD1306_display_datasheet.pdf 1.79 MB