박쥐 같은 RC카? 초음파 센서로 자율주행 만들기

안녕하세요! 오늘은 마이크로파이썬(MicroPython)과 초음파 센서를 활용해, 장애물을 스스로 감지하고 피해가는 자율주행 RC카 소개입니다.

1. 초음파 센서(Ultrasonic Sensor)란?

초음파 센서는 박쥐가 사물을 감지하는 것과 비슷한 원리로 작동합니다. 센서에서 발사된 초음파가 장애물에 맞고 돌아오는 시간을 측정해 거리를 계산합니다. 우리가 사용할 HC-SR04 센서는 가성비가 좋아 아두이노나 ESP32 프로젝트에 가장 많이 쓰이는 부품입니다.

2. 핵심 동작 원리

자율주행의 핵심은 ‘판단’입니다. 코드의 로직은 다음과 같습니다.

  1. 초음파 센서로 전방 거리를 실시간 측정한다.
  2. 거리가 20cm 이내로 가까워지면 차를 멈춘다.
  3. 후진하거나 방향을 틀어 새로운 경로를 찾는다.
  4. 이때 **랜덤 함수(Random)**를 사용하여 회전 시간을 500ms~1800ms 사이로 주면, 매번 다른 각도로 회전하여 더 자연스러운 회피 기동이 가능합니다.

3. 마이크로파이썬 소스 코드

아래는 거리를 측정하고 랜덤하게 회전하는 코드 예시입니다.

Python

import machine
import utime
import random

# 초음파 센서 핀 설정
trigger = machine.Pin(0, machine.Pin.OUT)
echo = machine.Pin(1, machine.Pin.IN)

def get_distance():
    trigger.low()
    utime.sleep_us(2)
    trigger.high()
    utime.sleep_us(10)
    trigger.low()
    
    while echo.value() == 0:
        signaloff = utime.ticks_us()
    while echo.value() == 1:
        signalon = utime.ticks_us()
        
    timepassed = signalon - signaloff
    distance = (timepassed * 0.0343) / 2
    return distance

# 메인 루프
while True:
    dist = get_distance()
    
    if dist < 20:  # 장애물 감지 (20cm)
        print("장애물 발견! 회피합니다.")
        # 회전 시간 랜덤 설정 (500ms ~ 1800ms)
        turn_time = random.randint(500, 1800)
        # (여기에 모터 제어 코드를 추가하세요)
        utime.sleep_ms(turn_time)
    else:
        # 전진 코드
        pass

제작 후기

4. 초음파 센서의 한계와 주의점

실행 테스트를 하다가 발견한 문제점이 있습니다. 초음파 센서는 소리의 반사를 이용하기 때문에 장애물의 재질에 따라 측정값이 부정확할 수 있습니다.

  • 섬유질 장애물(인형, 수건, 두꺼운 옷 등): 매끄러운 벽과 달리 수건이나 인형 같은 섬유 재질은 초음파를 반사하지 않고 흡수해 버립니다. 이 경우 센서는 앞에 물체가 있어도 거리가 멀거나 없는 것으로 판단해 RC카가 그대로 충돌할 수 있습니다.
  • 해결 방법: 자율주행의 완성도를 높이려면 초음파 센서와 함께 적외선(IR) 센서를 보조로 사용하거나, 장애물 코스를 설정할 때 가급적 딱딱하고 매끄러운 재질의 물체를 배치하는 것이 좋습니다. 레이저 거리 측정 센서를 다음에 적용해 봐야겠습니다.
초음파 거리 측정 표시: neopixel 3개, 빨강 충돌 위험 , 노랑 근접, 녹색 35센티 이상 안전 거리

코멘트

“박쥐 같은 RC카? 초음파 센서로 자율주행 만들기” 에 하나의 답글

  1. micro2iot 아바타

    [구매정보] 블로그에서 사용한 부품 구매정보입니다.
    아래 링크를 통해 구매 시 소정의 수수료를 제공받으며, 채널 운영에 큰 도움이 됩니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다