로그인회원가입

[카테고리:] RC카

RC카 프로젝트

  • MicroPython 멀티태스킹: 비동기(asyncio)와 멀티스레드, 언제 뭘 써야 할까?

    MicroPython 멀티태스킹: 비동기(asyncio)와 멀티스레드, 언제 뭘 써야 할까?

    ** 비동기와 멀티 스레드 차이

    🥊 한눈에 보는 핵심 차이점

    구분비동기 (uasyncio)멀티스레드 (_thread)
    작업 방식협력적 (Cooperative)
    내가 await으로 쉴 때 다른 일 함
    선점형 (Preemptive)
    OS/CPU가 강제로 작업 전환함
    메모리(RAM) 사용매우 적음 (메모리 절약)많이 듦 (스택 메모리 각각 할당)
    자원 공유/충돌안전함 (내가 쉴 때만 전환되므로)위험함 (변수/하드웨어 동시 접근 충돌)
    동시 작업 수수십~수백 개 가능보드에 따라 보통 2개(코어 수 제한)

    💡 주요 차이점 상세 설명

    1. 작업 switching(전환) 제어권: 내가 넘기느냐 vs 강제로 빼앗기느냐

    • 비동기 (uasyncio):
      • 작업이 진행되다가 await을 만나는 순간 “나 지금 대기 중이니까 다른 일 해~” 하고 스스로 제어권을 넘깁니다.
      • 코드 예측이 쉽고, 내가 원하는 순간에만 작업 전환이 일어나므로 데이터가 꼬일 일이 적습니다.
    • 멀티스레드 (_thread):
      • CPU가 일정 시간(몇 밀리초)마다 코드를 실행 중인 중간에 강제로 멈추고 다른 스레드로 넘겨버립니다.
      • 만약 스레드 A가 센서 값을 읽어서 전역 변수에 쓰는 중에, 스레드 B가 그 변수를 읽으려고 접근하면 데이터가 깨지거나 보드가 다운(Crash)될 수 있습니다. (이를 막으려면 Lock, Mutex 같은 복잡한 장치가 필요함)

    2. 메모리(RAM) 소비량 (마이크로파이썬에서 가장 중요한 이유!)

    마이크로컨트롤러는 PC와 달리 RAM이 수백 KB 정도로 매우 적습니다.

    • 멀티스레드:
      • 스레드를 하나 생성할 때마다 독립적인 메모리 공간(Stack)을 최소 수 KB씩 크게 떼어서 할당해줘야 합니다.
      • 스레드를 3~4개만 띄워도 메모리 부족(MemoryError)이 발생하기 쉽습니다.
    • 비동기:
      • 하나의 스레드(Single Thread) 안에서 “스케줄표”만 가지고 번갈아 돌기 때문에 메모리를 거의 먹지 않습니다. 수십 개의 비동기 루틴을 돌려도 메모리가 여유롭습니다.

    3. 멀티코어 활용 유무

    • 멀티스레드:
      • ESP32나 RP2040 같은 듀얼코어 보드에서 진짜 물리적인 2개의 코어를 동시에 각각 돌리고 싶을 때 유용합니다. (예: 코어 0은 모터 제어, 코어 1은 화면 출력)
    • 비동기:
      • 기본적으로 1개의 코어 안에서 효율적으로 시간을 쪼개 쓰는 방식입니다.

    🎯 결론: 언제 뭘 써야 할까?

    ✅ 이럴 땐 uasyncio (비동기)를 쓰세요!

    • 센서 값 주기적 읽기, LED 깜빡이기, 버튼 입력을 받으면서 네트워크(Wi-Fi/Web) 통신 처리하기 등 “대기 시간(Delay/Sleep/네트워크 응답)”이 많은 대부분의 IoT 작업
    • 메모리가 아슬아슬하거나 여러 개의 단순 루틴을 동시에 돌려야 할 때

    ✅ 이럴 땐 _thread (멀티스레드)를 쓰세요!

    • 지연 시간 없이 CPU를 100% 써서 연산만 주구장창 하는 두 작업을 물리적으로 분리하고 싶을 때
    • 타임 크리티컬해서 한쪽 코어가 멈추지 않고 오직 하드웨어/모터 제어만 전담해야 할 때 (예: 듀얼 코어의 코어 1개를 전용 엔진으로 쓸 때)

    한 줄 요약:

    간단한 대기 작업이 많다면 **메모리가 적게 들고 안전한 uasyncio**가 정석이고, 물리적 듀얼코어를 써서 하드웨어를 극한으로 굴려야 할 때만 제한적으로 **_thread**를 씁니다.

  • [MicroPython] 초보자를 위한 마이크로파이썬 비동기(uasyncio) 프로그래밍 쉬운 정리

    [MicroPython] 초보자를 위한 마이크로파이썬 비동기(uasyncio) 프로그래밍 쉬운 정리

    마이크로파이썬(MicroPython)으로 센서 제어나 IoT 프로젝트를 진행하다 보면 한 번쯤 막히는 순간이 있습니다. 바로 “여러 작업을 동시에 처리하고 싶을 때”입니다.

    기존 방식대로 time.sleep()을 쓰면 제어 장치가 완전히 멈춰버려 다른 센서나 LED가 반응하지 않는 문제가 생기죠. 이 문제를 해결하기 위해 비동기 프로그래밍(uasyncio)을 사용하는데, 개념이 헷갈려 어려워하시는 분들이 많습니다.

    오늘은 마이크로파이썬 비동기 코딩의 개념부터 실전 예제, 주의사항까지 한 눈에 이해하기 쉽게 정리해 드립니다!

    💡 1. 비동기 프로그래밍이란? (쉽게 이해하는 비유)

    비동기 프로그래밍의 핵심은 “대기 시간을 활용해 다른 일을 처리하는 것”입니다.

    • 동기식 (기존 방식):냄비에 물을 올려두고, 물이 끓을 때까지 3분 동안 아무것도 안 하고 냄비만 바라봅니다. 물이 끓으면 라면을 넣고, 다 먹은 후에야 비로소 세탁기를 돌리러 갑니다.
    • 비동기식 (uasyncio 사용):냄비에 물을 올리고 “물 끓는 대기 시간” 동안 세탁기를 돌리러 갑니다. 물이 끓으면 다시 돌아와서 라면을 넣습니다.

    즉, 마이크로컨트롤러(CPU)가 무언가를 기다려야 할 때 놀지 않고 다른 작업을 처리하도록 스케줄표를 짜서 번갈아 가며 실행하는 원리입니다.

    🛠️ 2. 비동기 코딩의 3대 핵심 키워드

    비동기 코드를 작성할 때 다음 3가지 키워드만 기억하면 됩니다.

    1. async def: “이 함수는 비동기로 작동하며, 중간에 멈췄다 돌아올 수 있다”고 선언합니다.
    2. await: “여기서 잠시 기다릴 테니, 기다리는 동안 다른 작업을 처리해라”라고 제어권을 양보합니다.
    3. asyncio.gather(): 여러 개의 비동기 함수(작업)를 하나로 묶어 동시에 실행시킵니다.

    💻 3. 실전 예제: 주기가 다른 LED 2개 동시 제어하기

    가장 흔히 접하는 “두 개의 LED를 서로 다른 주기로 깜빡이기” 예제입니다.

    time.sleep()을 쓰면 LED1이 멈춘 동안 LED2도 같이 멈추지만, 비동기를 쓰면 각자 독립적으로 움직입니다.

    Python

    ⚠️ 4. 마이크로파이썬 비동기 개발 시 실수하기 쉬운 3가지!

    1. time.sleep() 절대 사용 금지time.sleep()은 보드 전체를 강제로 멈추기 때문에 비동기 환경을 무력화시킵니다. 반드시 await asyncio.sleep()을 사용해야 합니다.
    2. await 누락 주의asyncio.sleep() 앞에 await 키워드를 빠뜨리면 지연 없이 그대로 다음 코드로 넘어가 버립니다.
    3. 무한 루프(while True) 내부에는 반드시 await 배치루프 안에서 await으로 제어권을 한 번도 양보하지 않으면 타 작업이 실행 기회를 얻지 못해 보드가 멈추거나 다운될 수 있습니다.

    📝 마무리 요약

    • 대기 시간(센서 데이터 측정 대기, 타이머 지연, 네트워크 통신 등)이 발생할 때 await을 걸어두면 CPU는 그동안 다른 일을 처리합니다.
    • async def로 함수 작성 ➔ 지연 발생 시 await asyncio.sleep()asyncio.run()으로 실행이라는 패턴만 익혀두면 비동기 프로그래밍도 어렵지 않게 적용할 수 있습니다.

    마이크로파이썬 프로젝트에서 여러 센서나 모듈을 동시에 매끄럽게 제어하고 싶다면, 오늘 다룬 비동기 패턴을 꼭 적용해 보세요!


    마이크로파이썬(MicroPython)에서 비동기 프로그래밍이 어렵게 느껴지는 이유는 “여러 일을 동시에 진행하는 것처럼 보이게 만드는 원리” 때문입니다.

    일반적인 파이썬 코드(동기식)가 일방통행이라면, 비동기 코드는 스케줄표를 짜서 효율적으로 번갈아 가며 작업하는 것과 같습니다.

    uasyncio (또는 최신 버전의 asyncio)를 사용한 가장 간단하고 직관적인 실생활 비동기 예제를 소개합니다.

    💡 비동기를 쉽게 이해하는 비유: “라면 끓이기와 빨래하기”

    • 동기식 (기존 방식): 물이 끓을 때까지 3분 동안 아무것도 안 하고 냄비만 멍하니 바라본 뒤, 물이 끓으면 라면을 넣고, 다 먹은 후에야 세탁기를 돌립니다.
    • 비동기식 (uasyncio): 물을 올려두고 “끓는 동안(대기 시간)” 세탁기를 돌리러 갑니다. 물이 끓으면 다시 돌아와서 라면을 넣습니다.

    핵심은 “무언가를 기다려야 하는 시간(await asyncio.sleep)”에 CPU가 놀지 않고 다른 일을 하게 만드는 것입니다.

    🛠️ 핵심 키워드 3가지

    1. async def: “이 함수는 비동기로 작동하며, 중간에 멈췄다 돌아올 수 있다”고 선언합니다.
    2. await: “여기서 잠시 기다릴 테니, 기다리는 동안 다른 일을 처리해라”라고 양보합니다. (time.sleep 대신 asyncio.sleep을 써야 함!)
    3. asyncio.gather: 여러 비동기 함수들을 모아서 동시에 실행시킵니다.

    ⚠️ 마이크로파이썬 비동기 코딩 시 주의할 점!

    1. time.sleep()을 절대 사용하지 마세요.
      • time.sleep()은 보드 전체를 멈춰버리므로 비동기의 이점이 사라집니다. 반드시 await asyncio.sleep()을 사용해야 합니다.
    2. await 누락 금지
      • asyncio.sleep() 앞에 await을 빠뜨리면 기다리지 않고 그냥 넘어가버립니다.
    3. 무한 루프 안에 await이 최소 하나는 있어야 합니다.
      • while True: 안에서 await으로 제어권을 양보하지 않으면 다른 작업이 실행될 기회를 얻지 못해 보드가 튕기거나 멈출 수 있습니다.

    📌 요약

    • 시간이 걸리는 작업(센서 값 대기, 대기 시간, 네트워크 통신)이 있을 때 await을 걸어두면, 보드는 그 시간에 다른 일을 처리합니다.
    • 일단 async def로 함수 만들기 ➔ 기다릴 땐 await asyncio.sleep() 쓰기 ➔ asyncio.run()으로 실행하기 패턴만 익혀두시면 훨씬 수월해집니다!

  • [Embedded/IoT] RC카 자율주행 장애물 회피 방법론: 초음파의 한계부터 ToF 레이저 센서 활용까지

    [Embedded/IoT] RC카 자율주행 장애물 회피 방법론: 초음파의 한계부터 ToF 레이저 센서 활용까지

    안녕하세요! Mana’s Lab입니다.

    소형 RC카나 자율주행 로봇(AGV) 프로젝트를 진행할 때 가장 기본적이면서도 까다로운 과제가 바로 ‘장애물 회피(Obstacle Avoidance)’입니다.

    보통 입문용으로 초음파 센서(HC-SR04)를 가장 먼저 떠올리지만, 실제 주행을 시켜보면 의자 다리나 책상 기둥에 그대로 충돌하는 문제에 봉착하게 됩니다.

    이번 글에서는 초음파 센서가 왜 의자 다리를 감지하지 못하는지 물리적 한계를 짚어보고, 이를 해결하기 위한 VL53L0X ToF 레이저 센서 활용법 및 최적의 시스템 제어 알고리즘을 정리해 보겠습니다.

    1. 초음파 센서는 왜 의자 다리를 놓칠까?

    초음파 센서 3개를 좌/정면/우에 배치하면 벽이나 큰 상자 같은 장애물은 잘 피합니다. 하지만 방 안의 의자 다리나 얇은 철제 기둥을 만나면 어김없이 충돌합니다.

    Plaintext

    🛠️ 물리적 한계 원인

    1. 음파 산란(Diffuse Reflection): 초음파 빔 폭은 약 15°~30°로 넓게 퍼집니다. 가느다란 원통형 기둥에 맞은 음파는 센서로 되돌아가지 못하고 옆으로 꺾여 나가버려, 센서는 전방이 뚫려있다고 오인합니다.
    2. 낮은 각도 분해능: 서보모터에 초음파 센서를 달아 회전시켜도, 넓은 빔 특성 때문에 얇은 기둥의 정밀한 위치를 짚어낼 수 없습니다.

    2. 해결책: ToF(Time-of-Flight) 레이저 센서의 도입

    이 문제는 직진성이 매우 강하고 빔이 가느다란 VL53L0X ToF 레이저 센서를 사용하면 깔끔하게 해결됩니다.

    💡 ToF(Time-of-Flight)란?

    빛(적외선)을 쏘아 목표물에 맞고 되돌아오는 **비행 시간(t)**을 피코초 단위로 측정하여 거리를 계산하는 방식입니다. (Distance=2c×t​)

    물체의 색상이나 면적의 영향을 적게 받으며, 가느다란 의자 다리에도 레이저 빔이 정확히 반사되어 들어옵니다.

    3. 서보모터 + ToF 센서 조합 시 주의점

    그렇다면 SG90 서보모터 위에 VL53L0X 센서를 얹고 180도를 지속적으로 회전시키면 될까요? 아쉽게도 연속 회전 방식은 주행 중 오차가 매우 큽니다.

    ⚠️ 연속 회전 시 발생하는 이슈

    • 진동 및 지터(Jitter): 저가형 서보모터의 미세한 떨림이 레이저 빔을 흔들어 거리 측정 오류를 유발합니다.
    • 샘플링 타임 지연: ToF 센서가 1회 측정에 소요하는 시간(20~50ms) 동안 모터가 계속 움직이면 데이터 왜곡이 생깁니다.

    💡 올바른 접근: Step-and-Scan (정지 후 측정)

    오류 없는 데이터를 얻으려면 각도 이동지터 안정화 대기(10~15ms)ToF 측정 프로세스를 거쳐야 합니다.

    4. 실전 알고리즘: 전방 60도 고속 스윕(Sweep)

    180도 전체를 2도 간격으로 정밀 스캔하면 1회 탐색에 4~5초가 걸립니다. 차가 달리는 도중에는 반응 속도가 너무 느려 이미 충돌하게 됩니다.

    실시간 자율주행을 위해서는 스캔 범위를 전방 ±30°(총 60도) 영역으로 압축하는 것이 핵심입니다.

    Plaintext

    • 스캔 범위: 60° ~ 120° (90° 정면 기준)
    • 스캔 간격: 5° 간격 (총 13개 측정 포인트)
    • 소요 시간: 약 0.15초~0.2초 (초당 5회 고속 탐색!)

    5. MicroPython 핵심 제어 코드

    ESP32 / RP2040 환경에서 동작하는 MicroPython 실전 회피 주행 예시입니다. 서보모터의 왕복 스캔을 비동기적으로 처리하며 전방 기둥을 감지합니다.

    Python

    6. 결론 및 하드웨어 구성 비교 한눈에 보기

    RC카 장애물 회피 시스템을 구성할 때 목적에 맞춘 센서 추천 요약입니다.

    회피 방식장점단점비고
    초음파 센서 3개저렴하고 구현이 쉬움의자 다리, 기둥 감지 불가벽면 위주 공간에 적합
    서보 + ToF 센서 1개알뜰한 부품 구성, 의자 다리 감지기계적 대기시간 존재 (스캔 속도 제한)본 포스팅 권장 방식
    ToF 센서 3개 고정 배열기계적 유격 없음, 초당 30회 고속 회피I2C 주소 변경(XSHUT 핀) 제어 필요주행 속도/반응성 최강

    가느다란 기둥이나 복잡한 실내 환경에서 RC카 자율주행을 구현하신다면, 초음파 대신 ToF 레이저 센서를 활용한 고속 스캔 방식을 강력히 추천합니다!


    ** 기타

    1. 대표 센서별 장애물 감지 성능 비교

    센서 종류원리의자 다리/가근 기둥 감지실시간성 / 스캔 속도환경 영향 (빛/날씨)가격 & 구현 난이도
    초음파 (HC-SR04 등)음파 반사 시간❌ 불가 (음파 산란)보통 (소리 속도 제약)바람/소음 영향매우 저렴 / 쉬움
    단일 ToF 레이저 (VL53L0X 등) + 서보적외선 비행 시간⭕ 우수보통 (기계적 이동 제약)직사광선 아래 오차저렴 / 보통
    멀티 ToF 고정 배열 (2~3개)적외선 비행 시간⭕ 우수⚡ 매우 빠름 (고정형)직사광선 아래 오차약간 증가 / 쉬움
    회전형 2D LiDAR (RPLiDAR 등)360° 모터 회전 레이저⭕ 최상⚡ 매우 빠름 (초당 5~10회)직사광선 아래 오차고가 / 어려움
    카메라 (AI/Vision / Depth)이미지 분석 / 격자 측정⭕ 최상CPU/MCU 성능에 의존조도(밝기) 영향고가 / 매우 어려움

    2. RC카 회피 알고리즘 추천 (목적/예산별)

    🥇 최리얼타임 추천 1: ToF 레이저 센서 3개 고정 배열 (성능 vs 가성비 최강)

    서보모터로 회전시키는 기계적 유격/지연을 완전히 없애고, VL53L0X 센서 3개를 좌/정면/우 고정각으로 배치하는 방식입니다.

    Plaintext

    • 장점:
      • 기계적 움직임(서보모터)이 전혀 없어 반응 속도가 초당 30회 이상으로 매우 빠릅니다.
      • 레이저 빔이 가느다란 의자 다리나 책상 다리를 달리는 중에도 놓치지 않고 감지합니다.
      • 회로 및 모터 진동 노이즈 문제에서 자유롭습니다.
    • 구현 핵심:
      • I2C 주소가 같은 센서 3개를 XSHUT 핀을 사용해 각각 다르게 주소를 부여하여 독립적으로 읽어옵니다.

    🥈 추천 2: 서보모터 + ToF 레이저 1개 (전방 60도 고속 스캔)

    현재 검토하셨던 방식으로, 센서 추가 구매 없이 기존 모듈을 활용하는 가장 알뜰한 방법입니다.

    • 장점: 센서 1개로 전방 60도 영역 전체의 거리 지도를 얻을 수 있습니다.
    • 단점: 서보모터 스텝 이동 대기시간(10~15ms) 때문에 반응 속도가 고정형 3개 방식보다는 떨어집니다.

    🥉 최종 끝판왕: 2D LiDAR (RPLiDAR A1 등)

    소형 슬립링 모터가 내부에서 초당 5~10회 회전하며 전방 360도 전체의 정밀한 거리 점군(Point Cloud) 데이터를 뽑아냅니다.

    • 장점: 실시간 장애물 회피는 물론, 지도 작성(SLAM)과 자율주행 경로 생성까지 완벽히 가능합니다.
    • 단점: 센서 가격이 높고, 센서 데이터를 처리하기 위해 라즈베리 파이 같은 उच्च성능 SBC(Single Board Computer) 및 ROS 환경이 필요합니다.

    💡 결론 및 최종 제안

    1. 가느다란 기둥(의자 다리)을 확실히 피하면서 달리려면: 초음파는 무조건 제외하고 ToF 레이저 센서를 사용해야 합니다.
    2. 달리는 속도를 유지하고 싶다면: 서보모터를 빼고 ToF 센서 3개 고정 배치 방식이 반응 시간과 회피 정확도 면에서 최고의 선택입니다.
    3. 부품을 새로 사지 않고 기존 장비(서보+VL53L0X)로 완성하려면: 앞서 작성해 드린 전방 60도 고속 스윕(Sweep) 알고리즘이 가장 합리적인 솔루션입니다.

  • ESP32로 만든 레트로 감성, 퐁(PONG) 게임기

    ESP32로 만든 레트로 감성, 퐁(PONG) 게임기

    비디오 게임 역사의 시조새이자 대중화의 일등 공신인 퐁(Pong)의 유래

    💡 퐁(Pong)의 탄생과 유래

    1. 앨런 알코어와 아타리(Atari)의 만남

    퐁은 1972년, 전설적인 게임 회사 **아타리(Atari)**의 공동 창업자인 **놀런 부슈널(Nolan Bushnell)**의 아이디어에서 시작되었습니다. 부슈널은 갓 입사한 엔지니어 **앨런 알코어(Allan Alcorn)**의 실력을 테스트하기 위해 간단한 과제를 하나 주었습니다. 그것이 바로 ‘화면에 점 하나와 막대기 두 개가 있는 테니스 게임’을 만드는 것이었습니다.

    2. 마그나복스 오디세이에서의 영감

    사실 퐁은 완전한 무(無)에서 탄생한 것은 아닙니다. 부슈널은 세계 최초의 가정용 게임기인 **마그나복스 오디세이(Magnavox Odyssey)**의 탁구 게임 시연을 본 적이 있었고, 여기서 영감을 얻어 알코어에게 제작을 지시했습니다.

    TMI: 이후 마그나복스는 아타리를 상대로 저작권 소송을 제기했고, 아타리가 로열티를 지불하며 합의에 이르게 됩니다. 이것이 비디오 게임 역사상 최초의 저작권 분쟁으로 기록되어 있습니다.

    3. ‘퐁’이라는 이름의 유래

    원래 게임의 이름은 단순히 ‘테니스(Tennis)’가 될 뻔했습니다. 하지만 이미 다른 게임들이 그 이름을 사용하고 있었기 때문에, 새로운 이름이 필요했습니다. 부슈널은 공이 패들에 부딪힐 때 나는 특유의 “퐁(Pong)” 하는 효과음에서 착안하여 이름을 지었습니다.


    🚀 퐁이 세운 기록들

    • 최초의 상업적 성공: 캘리포니아의 한 술집(Andy Capp’s Tavern)에 설치된 퐁 아케이드 기기는 며칠 만에 동전 통이 꽉 차서 고장 날 정도로 폭발적인 인기를 끌었습니다.
    • 비디오 게임 산업의 시작: 퐁의 성공은 비디오 게임이 단순히 연구소의 실험물이 아니라, 거대한 상업적 가치가 있는 산업임을 증명했습니다.
    • 가정용 게임기 열풍: 1975년 출시된 ‘홈 퐁(Home Pong)’ 버전은 크리스마스 시즌에 엄청난 판매고를 올리며 거실을 오락실로 바꾸어 놓았습니다.

    🎨 퐁의 시각적 구성

    퐁의 그래픽은 지금 보면 매우 단순하지만, 당시에는 혁명이었습니다.

    • 패들(Paddle): 플레이어가 조종하는 수직 막대
    • 볼(Ball): 화면을 오가는 사각형 점
    • 점수판: 화면 상단에 표시되는 숫자
    출처 : 유튜브 https://youtube/sPsAYDMgjvE?si=0uzZDce-8tUOireC

    부품기능ESP32-C3 핀비고
    TFT LCDSCK (Clock)GPIO 4하드웨어 SPI 고정
    MOSI (Data)GPIO 6하드웨어 SPI 고정
    RES (Reset)GPIO 10일반 출력
    DC (Data/Cmd)GPIO 1일반 출력
    CS (Select)GPIO 0일반 출력
    입력 장치POT_L (가변저항)GPIO 3ADC1_CH3
    POT_R (가변저항)GPIO 2ADC1_CH2
    BUTTON (시작/정지)GPIO 9내부 풀업 사용
    출력 장치BUZZERGPIO 7PWM 출력

    Python pong.py

  • 레이저 거리 센서 VL53L0X, XSHUT 핀으로 다중연결 (2/2)

    레이저 거리 센서 VL53L0X, XSHUT 핀으로 다중연결 (2/2)

    똑같은 VL53L0X 센서를 2개, 3개, 혹은 그 이상 연결하고 싶을 때 가장 저렴하고 스마트한 방법을 소개합니다. 핵심은 **”잠든 센서를 하나씩 깨워서 새 이름을 지어주는 것”**입니다.

    1. 하드웨어 연결의 핵심: XSHUT 핀

    VL53L0X에는 XSHUT이라는 핀이 있습니다. 이 핀은 센서를 Standby(대기) 상태로 만드는 핀입니다.

    • XSHUT에 0(GND)을 주면: 센서가 꺼집니다 (I2C 통신 안 함).
    • XSHUT에 1(VCC)을 주면: 센서가 켜집니다 (기본 주소 0x29로 응답 시작).

    연결 방법:

    1. VCC, GND, SCL, SDA는 모든 센서가 공유하도록 병렬로 연결합니다.
    2. XSHUT 핀만은 공유하지 않고, MCU(ESP32, Arduino 등)의 개별 디지털 핀에 각각 하나씩 연결합니다.

    2. 소프트웨어 전략: “순차적 깨우기와 이름표 달기”

    전원이 들어오는 순간 모든 센서는 주소가 0x29로 같습니다. 이 상태에서 통신하면 충돌이 나겠죠? 그래서 다음과 같은 순차적 초기화 로직을 사용합니다.

    1. 전원 OFF: 모든 센서의 XSHUT 핀을 LOW로 내려서 전부 잠재웁니다.
    2. 첫 번째 센서 깨우기: 1번 센서의 XSHUT만 HIGH로 올립니다. 이제 1번 센서만 0x29 주소로 응답합니다.
    3. 주소 변경: MCU가 0x29 주소로 명령을 보내 “너의 주소를 0x30으로 바꿔!”라고 지시합니다.
    4. 두 번째 센서 깨우기: 2번 센서의 XSHUT을 HIGH로 올립니다. 2번 센서는 방금 깬 것이므로 기본 주소인 0x29로 응답합니다. (1번은 이미 0x30이 되었으므로 충돌하지 않습니다.)
    5. 반복: 위 과정을 센서 개수만큼 반복하여 모든 센서에 고유 주소(0x30, 0x31, 0x32…)를 할당합니다.

    3. MicroPython 예제 코드 (ESP32-C3 기준)

    이 로직을 코드로 구현하면 다음과 같습니다.

    Python


    4. 이 방식의 장단점

    장점:

    • 비용 제로: 추가 부품 없이 MCU 핀만 더 사용하면 됩니다.
    • 유연성: 소프트웨어적으로 주소를 마음대로 정할 수 있습니다.

    단점:

    • 핀 소모: 센서 개수만큼 MCU의 GPIO 핀이 필요합니다. (핀이 부족하면 TCA9548A 같은 멀티플렉서 칩을 써야 합니다.)
    • 휘발성: 전원이 꺼지면 주소 설정이 날아갑니다. 부팅 시마다 초기화 코드를 실행해야 합니다.

    마무리하며

    VL53L0X를 여러 개 써서 자율주행 로봇이나 레이더를 만들고 싶다면, 이 XSHUT 제어 방식이 가장 빠르고 효율적인 정답입니다. 핵심은 **”모두 끄고, 하나씩 켜서, 이름을 바꿔준다”**는 것만 기억하세요!


    Tip: I2C 라인에 풀업 저항이 적절히 달려있는지 확인하세요. 센서가 많아질수록 통신 속도를 조금 낮추는 것이 안정적입니다.



    ※ VL53L0X처럼 소프트웨어로 I2C 주소를 동적으로 변경하는 방식은 임베디드 설계에서 꽤나 영리하고 효율적인 트릭입니다. 보통은 납땜을 하거나 스위치를 조절해야 하는데, 이 방식은 핀 하나(XSHUT)만 더 써서 수십 개의 동일 센서를 제어할 수 있게 해주니까요.

    이런 방식을 지원하거나, I2C 주소 충돌을 해결하기 위해 사용하는 다른 부품과 방법들을 소개해 드릴게요.


    1. VL53L0X와 같은 방식을 쓰는 부품들

    이 방식은 주로 “Daisy Chain” 초기화가 필요한 정밀 센서들에서 종종 발견됩니다.

    • VL53L1X / VL53L3CX (STMicroelectronics): VL53L0X의 형제 모델들입니다. 작동 방식이 완전히 같아서 똑같이 XSHUT 핀을 이용해 주소를 할당합니다.
    • PCA9685 (PWM 드라이버): 기본적으로는 점퍼 납땜형이지만, 소프트웨어 레지스터 설정을 통해 “All Call” 주소나 개별 주소 응답 여부를 제어할 수 있는 기능이 있습니다.
    • 일부 스마트 배터리 관리 IC (BMS): 여러 개의 배터리 셀을 감시할 때, 초기 부팅 시 순차적으로 주소를 부여받는 방식을 사용하기도 합니다.

    2. 하드웨어 주소 핀이 있는 부품 (가장 일반적)

    대부분의 I2C 부품(OLED, 센서 등)은 주소 변경을 위해 ADR, ADDR, A0, A1 등의 핀을 가지고 있습니다.

    • 동작 원리: 이 핀에 GND를 연결하느냐, VCC를 연결하느냐에 따라 주소가 0x3C 또는 0x3D로 결정됩니다.
    • 한계: 보통 선택권이 2개(0 또는 1)뿐이라, 같은 센서를 3개 이상 쓰려면 이 방법만으로는 부족합니다.

    3. 주소 충돌을 해결하는 ‘진짜’ 해결사: I2C Multiplexer

    사용자님이 이번에 구현하신 XSHUT 제어 방식이 소프트웨어적인 트릭이라면, 하드웨어적으로 가장 깔끔한 해결책은 TCA9548A 같은 I2C 멀티플렉서를 쓰는 것입니다.

    • 작동 방식: 입구는 하나인데 출구가 8개인 “I2C 스위치”라고 보시면 됩니다.
    • 특징:
      1. 모든 센서의 주소가 0x29로 같아도 상관없습니다.
      2. MCU가 “지금은 1번 통로만 열어줘”라고 명령하면 1번 센서와만 통신합니다.
      3. VL53L0X를 8개, 16개씩 써야 하는 대형 프로젝트에서는 XSHUT 핀을 일일이 제어하는 것보다 이 칩 하나를 쓰는 게 핀 절약에 훨씬 유리합니다.

    4. 왜 이런 방식을 쓸까요?

    I2C는 원래 **”주소가 고정되어 있다”**는 전제로 만들어진 규격입니다. 하지만 현실에서는 똑같은 센서를 여러 방항(왼쪽, 오른쪽, 중앙)에 달아야 할 일이 많죠.

    • XSHUT 방식의 장점: 추가 비용(멀티플렉서 칩 값)이 들지 않고, MCU 핀만 넉넉하다면 무한정 확장 가능합니다.
    • XSHUT 방식의 단점: 전원이 꺼지면 주소 설정이 날아가기 때문에, boot.py나 초기화 루틴에서 항상 순차적으로 깨우는 코드가 반드시 들어가야 합니다.

    Python vl53l0x.py

    Python multi.py

  • QC 3.0 보조배터리 전압 트리거 만들기 (5V~12V 가변 전원)

    QC 3.0 보조배터리 전압 트리거 만들기 (5V~12V 가변 전원)

    퀄컴(Qualcomm)의 **퀵 차지(Quick Charge, 이하 QC)**는 모바일 기기 충전 속도를 획기적으로 높인 기술의 대명사입니다. RC카나 로봇 제작 시, 일반 5V 전원보다 훨씬 높은 출력을 얻을 수 있어 아주 유용하죠.

    현재까지 출시된 주요 버전과 특징을 정리해 드릴게요.


    1. QC 버전별 변천사

    버전출시 년도주요 특징최대 전압/전력
    QC 1.02013단순 고전류 (5V 2A)10W
    QC 2.02014전압 고정 선택 (5V, 9V, 12V, 20V)18W
    QC 3.02016INOV(미세 전압 조정) 도입 (3.6V~20V 사이 0.2V 단위)18W
    QC 4 / 4+2017USB-PD와 호환 시작, 효율 및 발열 개선27W+ (PD 시 60W~100W)
    QC 52020100W+ 초고속 충전, 배터리 수명 연장 기술100W 이상

    2. 왜 로봇 제작에 QC 3.0이 가장 인기인가요?

    사용자가 구현하려는 방식(D+, D- 전압 조절)이 바로 QC 3.0의 핵심 기능이기 때문입니다.

    • QC 2.0: 정해진 전압(9V, 12V 등)만 딱딱 골라 쓸 수 있습니다.
    • QC 3.0: 사용자가 원하시는 것처럼 **0.2V 단위로 전압을 올리고 내리는 ‘가변 모드’**가 공식적으로 포함된 첫 버전입니다. 로봇의 모터 힘을 미세하게 튜닝할 때 이만한 기술이 없습니다.
    • QC 4.0 이후: USB-PD(Power Delivery) 표준을 따르기 시작하면서, 전압을 조절하는 방식이 훨씬 복잡한 디지털 통신(Protocol)으로 바뀌었습니다. 그래서 ESP32의 GPIO만으로 직접 구현하기에는 QC 3.0 방식이 가장 쉽고 직관적입니다.

    3. 현재의 위치

    2026년 현재는 QC 5가 플래그십 스마트폰의 표준이지만, DIY 로봇이나 소형 RC카 분야에서는 여전히 QC 3.0 규격이 가장 많이 쓰입니다. 알리익스프레스나 국내 쇼핑몰에서 구할 수 있는 보조배터리의 90% 이상이 QC 3.0을 기본으로 지원하기 때문에 호환성 걱정도 거의 없습니다.


    🛠️ QC 3.0 전압 트리거의 원리

    QC 3.0은 USB의 D+와 D- 라인의 전압 조합을 통해 출력 전압을 결정합니다. ESP32-C3의 GPIO에서 나오는 전압은 3.3V이므로, 저항 분배를 통해 QC 규격에 맞는 전압(0.6V, 3.3V 등)을 만들어 D+/D-에 넣어주는 것이 핵심입니다.

    전압 테이블 (H: 3.3V, L: 0V, M: 0.6V)

    • 5V: D+(0.6V), D-(0V)
    • 9V: D+(3.3V), D-(0.6V)
    • 12V: D+(0.6V), D-(0.6V)
    • 가변 모드(Continuous): D+(0.6V), D-(3.3V)로 진입 후 신호를 주어 0.2V씩 조절

    1. 하드웨어 구성 (회로 연결)

    ESP32-C3의 3.3V 출력을 0.6V로 낮추기 위해 10kΩ과 2.2kΩ 저항을 직렬로 연결하여 분배합니다.

    • D+ 연결: GPIO 0 (High), GPIO 1 (0.6V 분배점)
    • D- 연결: GPIO 2 (High), GPIO 3 (0.6V 분배점)
    • 스위치 5개: GPIO 4, 5, 6(고정 전압), GPIO 7, 8(증감) – 모두 풀업(Pull-up) 설정

    2. RC카/로봇 제작 시 활용 팁

    1. 가벼운 전원 시스템: 무거운 리포(Li-Po) 배터리 대신 QC 3.0 지원 보조배터리를 사용하면 충전이 간편하고 무게를 획기적으로 줄일 수 있습니다.
    2. 모터 드라이버 전압 최적화: 5V에서는 힘이 부족하고 12V에서는 모터가 과열될 때, 0.2V 단위 미세 조정 기능을 사용하여 로봇의 최적 토크 지점을 찾을 수 있습니다.
    3. 주의사항: USB 케이블의 품질에 따라 고전류 전송 시 전압 강하가 생길 수 있으므로, 되도록 굵은 전력용 케이블을 사용하는 것이 좋습니다.

    ESP32-C3를 활용한 QC 3.0 전압 트리거 시스템의 회로도와 상세 가이드를 정리해 드리겠습니다.

    1. 하드웨어 회로 구성 (핵심)

    QC 3.0 규격에서 0.6V는 매우 중요한 기준 전압입니다. ESP32-C3의 3.3V 출력 핀 2개와 저항 분배를 조합하여 D+와 D-에 각각 0V, 0.6V, 3.3V를 만들어줍니다.

    전압 분배기 구성 (D+, D- 각각 동일)

    • High (3.3V): GPIO 0 (D+용), GPIO 2 (D-용) → 직접 연결
    • Medium (0.6V): GPIO 1 (D+용), GPIO 3 (D-용) → 10kΩ과 2.2kΩ 저항을 사용하여 분배
      • 3.3V에서 10kΩ과 2.2kΩ을 거치면 약 3.3×10+2.22.2​≈0.59V가 나옵니다.

    스위치 연결

    • 5V, 9V, 12V 선택: GPIO 4, 5, 6
    • 0.2V Up/Down: GPIO 7, 8
    • 모든 스위치는 한쪽은 GPIO에, 반대쪽은 GND에 연결합니다.

    2. 마이크로파이썬 코드

    이 코드는 처음에 ‘핸드셰이크’ 과정을 거친 뒤, 버튼 입력에 따라 D+/D- 전압을 조합하여 보조배터리에 명령을 내립니다.

    Python Trigger.py


    3. 로봇/RC카 적용 시의 장점

    1. 배터리 효율: 12V 모터를 돌리기 위해 7.4V 배터리 두 개를 직렬로 연결할 필요 없이, 가벼운 보조배터리 하나로 5V(로직용)와 12V(모터용)를 동시에 해결할 수 있습니다.
    2. 안전성: 보조배터리 자체에 과전류/과방전 방지 회로가 내장되어 있어 자작 로봇의 화재 위험을 크게 줄여줍니다.
    3. 정밀 제어: 단순히 모터를 켜고 끄는 게 아니라, 전압 자체를 0.2V씩 조절하여 로봇의 속도 한계를 물리적으로 튜닝할 수 있습니다.

    💡 주의사항

    • 측정 필수: 실제 전압이 변하는지 반드시 멀티미터(테스터기)로 확인한 후 로봇의 모터 드라이버나 메인 보드에 연결하세요.
    • 공통 접지(GND): 보조배터리의 USB 출력 GND와 ESP32-C3의 GND는 반드시 연결되어 있어야 신호가 전달됩니다.

    4. 블로그용 한 줄 요약 (Key 포인트)

    1. 회로의 핵심: 3.3V×10kΩ+2.2kΩ2.2kΩ​≈0.6V 의 전압 분배 법칙을 이용하여 QC 규격 신호를 생성합니다.
    2. 가변 모드 비결: D+ 혹은 D- 라인에 15ms~20ms 사이의 짧은 펄스를 주어 전압을 0.2V씩 조절합니다.
    3. 모드 전환: 가변 모드에서 고정 전압으로 돌아갈 때는 반드시 5V 리셋 시퀀스를 거쳐야 보조배터리가 오류 없이 반응합니다.
  • ESP-NOW 최적화 코드

    ESP-NOW 최적화 코드

    ESP32-C3에서 ESP-NOW Long-Range(LR) 모드를 설정하려면 Wi-Fi 물리 계층(PHY) 설정을 직접 제어해야 합니다. 이 모드는 데이터 전송 속도를 낮추는 대신, 수신 감도를 대폭 높여 장애물 통과 능력과 통신 거리를 약 2~3배가량 늘려줍니다.

    MicroPython 환경에서 사용할 수 있는 최적화된 설정 예제를 정리해 드립니다.


    💡 ESP-NOW Long-Range 설정 핵심 코드 (MicroPython)

    이 코드는 송신기와 수신기 양쪽 보드 모두에 동일하게 적용되어야 통신이 가능합니다.

    Python


    🛠️ 왜 이 코드가 더 멀리 가나요?

    1. network.MODE_LR: 이 명령은 Wi-Fi 칩셋이 낮은 비트레이트를 사용하여 신호를 더 길게 쏘도록 만듭니다. 일반 Wi-Fi 신호가 닿지 않는 “데드존”에서도 통신이 유지됩니다.
    2. sta.disconnect(): 로봇카가 이동 중에 주변 와이파이 공유기(AP)를 찾으려고 시도하면 통신이 튀거나 지연이 발생할 수 있는데, 이를 사전에 차단합니다.
    3. 고정 채널 (추가 팁): 주변 환경에 따라 sta.config(channel=6) 처럼 채널을 명시적으로 지정하면 간섭을 더 효과적으로 피할 수 있습니다.

    ⚠️ 주의사항 (꼭 읽어보세요!)

    • 양방향 필수: 송신기는 LR 모드인데 수신기가 일반 모드라면 데이터를 받지 못합니다. 반드시 조종기로봇카 둘 다 설정하세요.
    • 속도 저하: 전송 거리가 늘어나는 대신 대역폭이 줄어듭니다. 하지만 조종기 데이터(몇 바이트 수준)를 보내는 데는 전혀 지장이 없습니다.
    • 전력 소모: 신호를 더 강하고 길게 유지하므로 배터리 소모가 일반 모드보다 약간 더 빠를 수 있습니다.

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

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

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

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

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

    2. 핵심 동작 원리

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

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

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

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

    Python

    제작 후기

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

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

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

    일반 LED와는 차원이 다르다! 고휘도 LED 사용 시 주의할 점

    왼쪽 일반 LED, 중앙 오른쪽 고휘도 LED

    1. LED의 소비전력 기준

    보통 소비전력을 기준으로 일반 LED와 고휘도(파워) LED를 구분합니다.

    • 일반 LED (Signal LED): 약 0.06W 이하
      • 보통 20mA 정도의 낮은 전류에서 작동하며, 기기의 전원 상태를 알리는 용도로 쓰입니다.
    • 고휘도/파워 LED: 일반적으로 0.5W ~ 1W 이상부터를 의미합니다.
      • 0.5W급: 약 150mA 정도 소모. (손전등, 실내 조명 보조용)
      • 1W급: 약 300∼350mA 소모. (본격적인 조명의 시작점)
      • 3W~10W 이상: 수 Amper(A) 단위의 전류가 필요하며, 매우 강력한 열이 발생합니다.
    일반 LED는 저항 연결만으로 사용 (Created with Wokwi)

    2. 왜 1W가 기준점이 될까?

    회로 설계 입장에서 1W는 “단순 제어”에서 “전력 제어”로 넘어가는 경계선이기 때문입니다.

    • 1W 미만: 적당한 저항기 하나로 전류를 제어할 수 있는 수준입니다.
    • 1W 이상: 앞서 말씀하신 것처럼 **트랜지스터(MOSFET)**가 스위치 역할을 해줘야 하고, 저항기도 고출력용(시멘트 저항 등)을 써야 하며, 본격적인 방열 대책이 수반되어야 합니다.

    3. MCU의 출력 전류 한계 (가장 중요한 이유)

    MCU의 핀(GPIO)은 신호를 주고받기 위한 용도이지, 전력을 공급하기 위한 용도가 아닙니다.

    • ESP32-C3의 한계: 일반적으로 핀 하나당 허용되는 최대 전류는 약 20~40mA 내외입니다.
    • 1W LED의 요구량: 전력 공식(P=VI)에 따라, 3.3V 전압에서 1W 고휘도 LED를 켜려면 최소 약 300mA 이상의 전류가 필요합니다.
    • 결과: MCU 핀이 감당할 수 있는 수준보다 약 10배 이상의 전류가 흐르게 되며, 이 과정에서 MCU 내부 회로가 타버리거나 칩 전체가 손상될 수 있습니다.

    4. 전압 레벨의 불일치

    • 고휘도 LED: 백색 고휘도 LED의 경우 구동 전압(Forward Voltage)이 보통 3.2V~3.6V 사이입니다.
    • MCU 출력: ESP32-C3는 3.3V로 작동하지만, 전류를 많이 끌어다 쓰면 전압 강하가 일어나 LED가 제대로 밝기를 내지 못하거나 불안정해집니다. 트랜지스터를 사용하면 5V나 12V 같은 외부 전원을 별도로 끌어와 LED에 공급할 수 있습니다.

    5. 발열 문제

    전류가 많이 흐르면 열이 발생합니다. MCU의 작은 칩 내부에서 높은 전류를 소화하려고 하면 칩의 온도가 급격히 상승하여 시스템이 멈추거나 수명이 단축됩니다. 전력 제어 전용 부품인 트랜지스터는 이러한 열을 견디도록 설계되어 있습니다.

    고휘도 1w이상 LED는 트랜지스터를 사용해서 연결 (Created with Wokwi)

    그러면 고휘도 LED로 전원 공급을 하는 5v도 MCU 핀에 연결되어 있지 않냐 할 수 있는데 내부 반도체 로직을 통하지 않고 MCU 전원과 단지 내부 배선으로 연결되어 있어서 보다 안전하다 할 수 있다. 더 큰 전류가 흐른다면 아예 부하용 전원에 직접 연결하는게 제일 안전합니다.

    그냥 연결시 5핀을 3.3v 으로 on 시키면 칩내 반도체의 허용전류이상으로 발열로 손상됩니다.
    예외적 꼼수로 5번핀을 PWM 으로 설정하고 duty를 절반 이하로 낮게 해주어 평균 전압을 낮춰서 사용가능합니다.
    (Created with Wokwi)
    실제 RC카에 적용된 고휘도 LED, 밝기는 PWM duty로 조절 할 수 있어서 고휘도 LED에는 구지 저항을 달지 않았습니다.
    소프트웨어적으로 duty를 항상 50% 이하로만 조절되도록 하면 됩니다.

  • TV 리모컨으로 RC카 무선 조종하기! ESP32-C3 IR Receiver Control

    TV 리모컨으로 RC카 무선 조종하기! ESP32-C3 IR Receiver Control

    적외선 리모컨(IR Remote Control)은 보이지 않는 빛(적외선)을 이용해 가전제품을 제어하는 가장 보편적인 무선 통신 방식입니다. 간단하게 핵심만 요약해 드릴게요.


    1. 작동 원리 (송신과 수신)

    리모컨 버튼을 누르면 내부의 마이크로컨트롤러가 특정 데이터 코드를 생성하고, 이를 IR LED를 통해 빛의 신호로 쏘아보냅니다.

    • 송신부 (Remote): 전기 신호를 특정 주파수(보통 38kHz)로 깜빡이는 적외선 빛으로 변환하여 발사합니다.
    • 수신부 (Receiver): 가전제품에 달린 IR 수신 모듈이 이 빛을 감지하여 다시 전기 신호로 바꾼 뒤, 기기를 작동시킵니다.

    2. 주요 구성 요소

    • IR LED: 적외선을 내보내는 전구 역할입니다.
    • 캐리어 주파수 (Carrier Frequency): 햇빛이나 형광등 같은 주변 잡음과 구별하기 위해 신호를 38kHz 정도의 일정한 리듬으로 실어 보냅니다.
    • 프로토콜 (Protocol): 제조사마다 신호를 해석하는 규칙이 다릅니다 (예: NEC, Sony, Samsung 규격 등).

    3. 장단점

    장점단점
    저렴한 비용: 제작 단가가 매우 낮습니다.직선성: 빛이라서 장애물이 있으면 막힙니다.
    낮은 전력 소모: 배터리 하나로 수개월 사용 가능합니다.짧은 거리: 보통 5~10m 이내에서만 작동합니다.
    설정 간편: 별도의 페어링 과정이 거의 필요 없습니다.각도 제한: 수신부를 정확히 향해야 잘 눌립니다.
    IR 수신부
    TV 박스 리모콘 응용, NEC 코드
    TV BOX 리모콘의 nec IR 신호를 ESP32-C3이 수신해서 RC카 제어