아두이노 우노 Q 초음파 센서와 OLED 디스플레이

이 가이드에서는 초음파 센서를 사용하여 거리를 측정하고 Arduino UNO Q로 OLED 화면에 가운데 정렬된 거리를 표시하는 방법을 배웁니다.

Arduino UNO Q 초음파 센서 oLED

필요한 하드웨어

1×Arduino UNO Q 아마존
1×USB Cable for Arduino Uno Q 아마존
1×초음파 센서 쿠팡 | 아마존
1×SSD1306 I2C OLED 디스플레이 128x64 쿠팡 | 아마존
1×SSD1306 I2C OLED 디스플레이 128x32 아마존
1×점퍼케이블 쿠팡 | 아마존
1×(추천) 아두이노 우노용 스크루 터미널 블록 쉴드 쿠팡 | 아마존
1×(추천) Sensors/Servo Expansion Shield for Arduino Uno 쿠팡 | 아마존
1×(추천) 아두이노 우노용 브레드보드 쉴드 쿠팡 | 아마존
1×(추천) 아두이노 우노용 케이스 쿠팡 | 아마존
1×(추천) 아두이노 우노용 프로토타이핑 베이스 플레이트 & 브레드보드 키트 아마존
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

OLED와 초음파 센서 에 대해

다음 튜토리얼에서 OLED 디스플레이와 초음파 센서에 대해 배웁니다:

배선 다이어그램

Arduino UNO Q 초음파 센서 oLED 연결 배선도

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

MCU 코드

Arduino UNO Q에는 두 개의 프로세서가 있습니다: STM32 MCU(실시간 하드웨어 제어 담당)와 Qualcomm MPU(Debian Linux 실행). 이 섹션에서는 STM32 MCU만 프로그래밍됩니다 — Linux 측은 유휴 상태입니다. 이후 섹션에서 두 프로세서가 함께 작동하는 방식을 보여줍니다.

/* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-ultrasonic-sensor-oled */ #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED display width in pixels #define SCREEN_HEIGHT 64 // OLED display height in pixels #define TRIG_PIN 4 // The Arduino UNO Q pin connected to the ultrasonic sensor's TRIG pin #define ECHO_PIN 3 // The Arduino UNO Q pin connected to the ultrasonic sensor's ECHO pin Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); String distStr; void oledDisplayCenter(String text) { int16_t x1, y1; uint16_t width, height; oled.getTextBounds(text, 0, 0, &x1, &y1, &width, &height); oled.clearDisplay(); oled.setCursor((SCREEN_WIDTH - width) / 2, (SCREEN_HEIGHT - height) / 2); oled.println(text); oled.display(); } void setup() { pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { while (true); // halt if OLED not found } delay(2000); oled.clearDisplay(); oled.setTextSize(2); oled.setTextColor(WHITE); distStr.reserve(10); } void loop() { // generate 10-microsecond pulse to TRIG pin digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); // measure duration of pulse from ECHO pin long duration_us = pulseIn(ECHO_PIN, HIGH); // calculate the distance float distance_cm = 0.017 * duration_us; distStr = String(distance_cm, 1); distStr += " cm"; oledDisplayCenter(distStr); delay(500); }

※ 주의:

코드는 거리 텍스트를 OLED 디스플레이에 가로 및 세로로 가운데 정렬합니다.

빠른 단계

  • Arduino UNO Q 처음 사용하세요? 진행하기 전에 아두이노 우노 Q 시작하기 튜토리얼을 따라 개발 환경을 준비합니다.
  • 컴포넌트 배선: TRIG → pin 4, ECHO → pin 3 연결. OLED SDA → SDA, SCL → SCL 연결.
  • 연결: USB-C 케이블로 Arduino UNO Q를 컴퓨터에 연결합니다.
  • Arduino App Lab 열기: Arduino App Lab을 실행하고 Arduino UNO Q를 감지할 때까지 기다립니다.
  • 새 앱 만들기: Create New App 버튼을 클릭합니다.
create new app in 아두이노 app lab on Arduino UNO Q
  • 앱의 이름을 지정합니다. 예: DIYables_UltrasonicOLED
  • Create를 클릭하여 확인합니다.
  • 새 앱 내에 생성된 폴더 및 파일 세트가 표시됩니다.
아두이노 app lab app folders and files on Arduino UNO Q
  • sketch/sketch.ino 파일을 찾습니다 — 이 파일에 MCU 스케치를 붙여넣을 위치입니다.
  • 스케치 붙여넣기: 위의 MCU 코드를 복사하여 스케치 파일에 붙여넣습니다. 다른 파일은 기본값으로 유지합니다.
    • Install the library: Click the Add sketch library button (the open book icon with a + sign) in the left sidebar.
    add sketch 라이브러리 in 아두이노 app lab on Arduino UNO Q
    • Search for Adafruit SSD1306 created by Adafruit and click the Install button.
    My Apps / DIYables Apps
    Run
    Bricks
    No bricks added...
    Sketch Libraries
    No sketch libra...
    Files
    python
    sketch
    .gitignore
    README.md
    app.yaml
    sketch.ino
    Add sketch library
    Adafruit SSD1306 Adafruit

    SSD1306 oled driver library for monochrome 128x64 and 128x32 displays

    2.5.9
    Install
    More Info
    • Search for Arduino_RouterBridge created by Arduino and click the Install button.
    My Apps / DIYables Apps
    Run
    Bricks
    No bricks added...
    Sketch Libraries
    No sketch libra...
    Files
    python
    sketch
    .gitignore
    README.md
    app.yaml
    sketch.ino
    Add sketch library
    Arduino_RouterBridge Arduino

    This library provides a simple RPC bridge for Arduino UNO Q boards, allowing communication between the board and other devices using MsgPack serialization.

    0.4.1
    Install
    More Info
    • 업로드: Arduino App Lab에서 Run 버튼을 클릭하여 STM32에 컴파일 및 업로드합니다.
    click run 버튼 in 아두이노 app lab on Arduino UNO Q
    • 테스트: 센서 앞에서 손을 흔듭니다 — 거리가 500ms마다 OLED에서 업데이트되어야 합니다.

    ※ 주의:

    이 코드는 학습용입니다. 프로덕션용으로는 초음파 센서 튜토리얼에서 노이즈 필터를 적용합니다.

    Linux + MCU Bridge 프로그래밍

    Arduino UNO Q에는 함께 작동하는 두 개의 프로세서가 있습니다: MPU(Qualcomm, Debian Linux 실행)와 MCU(STM32, Arduino 스케치를 실행하는 Zephyr OS). 이들은 Arduino_RouterBridge 라이브러리를 통해 RPC로 통신합니다 — 절대 raw 시리얼 포트가 아닙니다.

    • 초음파 센서와 OLED는 모두 MCU (STM32)에 연결됩니다 — 센서는 핀 5/9, OLED는 I2C를 통해.
    • MPU는 이들을 직접 제어할 수 없습니다 — MCU에서 Bridge.call("read_distance")를 호출하면, 거리를 측정하고 OLED에 표시하고 Monitor에 인쇄합니다.
    • MPU는 Wi-Fi를 가지고 있습니다 — MPU는 Wi-Fi가 있는 전체 Debian Linux를 실행하므로 Telegram 명령을 수신하고 원격으로 읽기를 트리거할 수 있습니다.
    • 통신: Linux 측의 Bridge.call()은 MCU 측의 Bridge.provide_safe()를 호출합니다 (digitalWrite()와 OLED 쓰기는 하드웨어 API이므로)
    • ⚠️ 예약됨: /dev/ttyHS1 (Linux)과 Serial1 (MCU)는 Arduino Router에서 사용합니다 — 절대 직접 열지 마십시오

    간단히 말해: MPU가 읽기를 요청 → MCU가 거리를 측정 → MCU가 OLED에 표시하고 Monitor에 인쇄합니다.

    MCU 스케치 — Bridge를 사용한 초음파 센서 OLED 디스플레이:

    /* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-ultrasonic-sensor-oled */ #include "Arduino_RouterBridge.h" #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define TRIG_PIN 5 #define ECHO_PIN 9 Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); String distStr; void oledDisplayCenter(String text) { int16_t x1, y1; uint16_t width, height; oled.getTextBounds(text, 0, 0, &x1, &y1, &width, &height); oled.clearDisplay(); oled.setCursor((SCREEN_WIDTH - width) / 2, (SCREEN_HEIGHT - height) / 2); oled.println(text); oled.display(); } void read_distance() { digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); long duration_us = pulseIn(ECHO_PIN, HIGH); float distance_cm = 0.017 * duration_us; distStr = String(distance_cm, 1); distStr += " cm"; oledDisplayCenter(distStr); Monitor.print("Distance: "); Monitor.print(distance_cm); Monitor.println(" cm"); } void setup() { Bridge.begin(); Monitor.begin(); pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Monitor.println("OLED init failed!"); while (true); } delay(2000); oled.clearDisplay(); oled.setTextSize(2); oled.setTextColor(WHITE); distStr.reserve(10); oledDisplayCenter("Ready..."); Bridge.provide_safe("read_distance", read_distance); Monitor.println("Ultrasonic Sensor OLED Bridge ready"); } void loop() {}

    Python 스크립트 (Arduino App Lab) — 매초 Linux에서 거리 읽기 요청:

    /* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-ultrasonic-sensor-oled */ from arduino.app_utils import * import time def loop(): Bridge.call("read_distance") time.sleep(1) App.run(user_loop=loop)
    • 참고: Bridge.begin()이 MCU 스케치에서 호출되고 Linux 측에서 Python 스크립트를 실행하기 전에 스케치가 업로드되어야 합니다.
    • ⚠️ 경고: /dev/ttyHS1 (Linux)을 직접 열거나 코드에서 Serial1 (MCU)을 사용하지 마십시오 — 이들은 Arduino Router에서 예약되고 이들에 접근하면 Bridge가 손상됩니다.

    빠른 단계

    • MCU 스케치 업로드: Arduino App Lab을 열고, 새 앱을 만들고, Bridge MCU 스케치를 sketch/sketch.ino에 붙여넣고, Adafruit SSD1306Arduino_RouterBridge 라이브러리를 설치하고, Run을 클릭합니다.
    • Python 스크립트 추가: 위의 Python 코드를 같은 앱의 Python 탭에 붙여넣습니다.
    • 앱 실행: Run을 클릭합니다 — Python은 매초 읽기를 요청합니다; MCU는 OLED 및 Monitor를 업데이트합니다.
    • 콘솔 확인: Console 탭 → MCU Monitor 서브탭을 열어 거리 값을 확인합니다.

    App Lab 콘솔 출력

    DIYables_Apps
    Stop
    sketch.ino
    1#include "Arduino_RouterBridge.h"
    Serial Monitor
    Python
    Message (Enter to send a message to "Newbiely" on usb(2820070321))
    New Line
    9600 baud
    Ultrasonic Sensor OLED Bridge ready Distance: 29.4 cm Distance: 27.6 cm Distance: 14.3 cm

    Telegram 통합

    Telegram을 통해 원격으로 거리를 읽고 OLED에 표시합니다.

    아직 Telegram 봇이 없으시면, 계속하기 전에 아두이노 우노 Q - 텔레그램 봇을 참조하여 봇 토큰을 받으십시오.

    MCU 스케치: 이전 Bridge 섹션의 동일한 MCU 스케치를 유지합니다 — 변경할 필요가 없습니다. STM32에서 이미 업로드되고 실행 중인지 확인합니다.

    Python 스크립트 (Arduino App Lab) — 초음파 OLED 디스플레이용 Telegram 봇:

    /* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-ultrasonic-sensor-oled */ from arduino.app_utils import * import requests import time BOT_TOKEN = "YOUR_BOT_TOKEN" API_URL = f"https://api.telegram.org/bot{BOT_TOKEN}" last_update_id = 0 def send_message(chat_id, text): requests.post(f"{API_URL}/sendMessage", json={"chat_id": chat_id, "text": text}) def get_updates(): global last_update_id resp = requests.get(f"{API_URL}/getUpdates", params={"offset": last_update_id + 1, "timeout": 5}) return resp.json().get("result", []) def loop(): global last_update_id updates = get_updates() for update in updates: last_update_id = update["update_id"] msg = update.get("message", {}) chat_id = msg.get("chat", {}).get("id") text = msg.get("text", "").strip() if text == "/read": distance = Bridge.call("read_distance") send_message(chat_id, distance) else: send_message(chat_id, "Commands:\n/read — measure distance and display on OLED") time.sleep(0.5) App.run(user_loop=loop)
    • 참고: YOUR_BOT_TOKEN을 Telegram의 @BotFather에서 얻은 토큰으로 바꿉니다.
    • /read를 전송하여 거리 측정을 트리거합니다 — 결과가 OLED 및 Monitor에 표시됩니다.

    빠른 단계

    • MCU 스케치 업로드: 이전 섹션의 Bridge MCU 스케치를 사용합니다 (아직 수행하지 않은 경우 먼저 업로드).
    • Telegram 스크립트 붙여넣기: 위의 Python 코드를 Arduino App Lab의 앱의 Python 탭에 복사합니다.
    • 토큰 설정: 스크립트에서 YOUR_BOT_TOKEN을 실제 봇 토큰으로 바꿉니다.
    • 앱 실행: Run을 클릭합니다 — 봇이 Telegram 메시지를 수신합니다.
    • 테스트: /read를 전송합니다 — 봇이 측정된 거리로 회신합니다. 이는 OLED에도 표시됩니다.

    App Lab 콘솔 출력

    DIYables_Apps
    Stop
    sketch.ino
    1#include "Arduino_RouterBridge.h"
    Serial Monitor
    Python
    [2026-04-29 12:00:01] Telegram: /read [2026-04-29 12:00:01] Distance: 29.4 cm [2026-04-29 12:02:05] Telegram: /read [2026-04-29 12:02:05] Distance: 13.1 cm
    Telegram
    Telegram 12:45
    Welcome to Telegram!
    ArduinoBot 10:19
    Chatting with Arduino...
    telegram-botfather
    BotFather Yesterday
    Your bot has been created.

    ArduinoBot

    bot
    Today
    /read
    10:15 AM ✓✓
    Distance: 29.4 cm
    10:16 AM

    OpenClaw 통합

    아두이노 우노 Q - OpenClaw 튜토리얼을 참조하여 이 튜토리얼에 OpenClaw를 적용할 수 있습니다.

    애플리케이션/프로젝트 아이디어

    • 휴대용 거리 측정기: 센서 + OLED를 손에 들고 거리를 측정할 수 있는 도구로 사용
    • 주차 보조 시스템: 차량이 벽 쪽으로 백업할 때 남은 공간을 막대 그래프로 표시
    • 물 탱크 수위계: 실시간으로 OLED에 현재 수위를 표시
    • 로봇 근처 거리계: 현재 장애물 거리를 탑재된 OLED 화면에 표시
    • 측정 스테이션: 벽에 설치하여 집 개축 프로젝트를 위해 실시간 방 크기를 표시

    도전해 보기

    • 쉬움: 거리 < 20cm일 때 OLED에 큰 텍스트로 "CLOSE!"를 표시
    • 중간: 대상이 가까워질수록 채워지는 OLED에 막대 그래프 그리기
    • 어려움: 실제 거리 값(cm)을 Telegram 사용자에게 메시지로 직접 전송