로그인회원가입

[카테고리:] 스마트홈

홈 오토메이션 관련 DIY

  • 마이크로파이썬으로 Wi-Fi 신호 강도(RSSI) 측정하는 방법 (ESP32 / ESP8266)

    마이크로파이썬으로 Wi-Fi 신호 강도(RSSI) 측정하는 방법 (ESP32 / ESP8266)

    마이크로파이썬(MicroPython)에서는 network 모듈을 사용하면 현재 연결된 Wi-Fi의 RSSI(신호 강도)를 아주 쉽게 측정할 수 있습니다.

    보통 ESP32나 ESP8266 보드에서 많이 사용하는 코드 패턴을 정리해 드릴게요.

    1. 이미 Wi-Fi에 연결된 상태에서 RSSI 측정하기

    현재 Wi-Fi에 연결되어 있는 상태라면 wlan.status('rssi') 메서드를 사용해 실시간 신호 강도를 숫자로 받아올 수 있습니다.

    Python

            
    import network
    import time
    
    # Wi-Fi 스테이션 모드 활성화
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    
    # Wi-Fi가 연결될 때까지 대기 (실제 코드에서는 공유기 접속 코드가 필요합니다)
    while not wlan.isconnected():
        print("연결 대기 중...")
        time.sleep(1)
    
    print("연결 완료!")
    
    # 1초마다 RSSI(신호 강도) 측정하기
    while True:
        if wlan.isconnected():
            # RSSI 값 가져오기 (단위: dBm)
            rssi = wlan.status('rssi')
            print(f"현재 Wi-Fi 신호 강도 (RSSI): {rssi} dBm")
        else:
            print("Wi-Fi 연결이 끊어졌습니다.")
        
        time.sleep(1)
    
    

    2. 주변 Wi-Fi를 스캔하면서 RSSI 측정하기

    공유기에 접속하지 않고, 주변에 있는 모든 Wi-Fi 채널을 검색(Scan)하여 각각의 RSSI를 확인하고 싶을 때는 wlan.scan()을 사용합니다.

    Python

            
    import network
    
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    
    print("주변 Wi-Fi 스캔 중...")
    # 주변 AP 검색
    access_points = wlan.scan()
    
    print(f"{'SSID (이름)':<20} | {'BSSID (Mac)':<18} | {'채널':<5} | {'RSSI':<5}")
    print("-" * 60)
    
    for ap in access_points:
        # scan() 결과 구조: (ssid, bssid, channel, rssi, security, hidden)
        ssid = ap[0].decode('utf-8', 'ignore')
        bssid = ':'.join('%02x' % b for b in ap[1])
        channel = ap[2]
        rssi = ap[3]
        
        print(f"{ssid:<20} | {bssid:<18} | {channel:<5} | {rssi:<5} dBm")
    
    

    💡 RSSI 값 읽는 팁 (참고용)

    RSSI는 음수(dBm)로 표시되며, 0에 가까울수록 신호가 강한 것입니다.

    • -30 ~ -50 dBm: 아주 훌륭함 (공유기 바로 옆)
    • -60 ~ -67 dBm: 양호함 (유튜브 스트리밍, 웹서핑 문제 없음)
    • -70 ~ -80 dBm: 신호가 약함 (연결이 불안정하거나 속도가 느려질 수 있음)
    • -90 dBm 이하: 연결 불가 수준

  • PID 제어의 시대는 끝났다? 차세대 제어 알고리즘 ADRC

    PID 제어의 시대는 끝났다? 차세대 제어 알고리즘 ADRC

    제어 공학에서 오랜 기간 왕좌를 지켜온 PID(Proportional-Integral-Derivative) 제어와 차세대 제어 알고리즘으로 주목받는 ADRC(Active Disturbance Rejection Control, 능동 장해 거부 제어)는 각각의 뚜렷한 철학과 장단점을 가지고 있습니다.

    두 제어 방식의 핵심 개념, 성능 비교, 그리고 앞으로의 제어 트렌드를 상세히 정리해 드립니다.

    1. PID vs ADRC 핵심 개념 이해

    PID 제어: “과거와 현재의 오차만 보고 달린다”

    PID는 시스템의 수학적 모델 없이도, 제어 대상의 ‘출력 값’과 ‘목표 값’의 오차(Error)만을 바탕으로 제어 입력을 생성합니다.

    • P (비례): 현재 오차에 비례해 제어 (속도 결정)
    • I (적분): 누적된 과거 오차를 제거 (정상상태 오차 제거)
    • D (미분): 오차의 변화 추세를 보고 미래를 예측 (오버슈트 억제)

    💡 한계: 시스템 내부에 급격한 외란(Disturbance)이 발생하거나, 모터의 부하가 갑자기 바뀌는 등 ‘동적 특성 변화’가 생기면 PID는 이에 즉각 대응하지 못하고 오차가 커진 후에야 사후 약방문식으로 제어를 시작합니다. 또한 미분(D) 성분은 센서 노이즈를 증폭시키는 고질적인 문제가 있습니다.

    ADRC 제어: “외란을 실시간으로 감시하고 즉시 상쇄한다”

    중국과학원 한징칭(Han Jingqing) 교수가 제안한 ADRC는 “모델의 불확실성과 외부 외란을 실시간으로 추정하여 제어 신호에서 빼버리면, 시스템은 단순한 적분기 형태로 변한다”는 철학에서 출발합니다. 핵심은 ESO(Extended State Observer, 확장 상태 관측기)입니다.

    • 확장 상태 관측기 (ESO): 시스템의 내부 상태뿐만 아니라, ‘수학적 모델의 오류’와 ‘외부 외란’을 하나의 ‘총체적 외란(Total Disturbance)’이라는 새로운 상태 변수로 정의하고 실시간 추정합니다.
    • 외란 상쇄: ESO가 외란을 알아내는 즉시, 제어 입력에서 그만큼을 상쇄(Feedforward 방식)시켜 버립니다.
    • 선형 피드백: 외란이 사라진 깨끗한 시스템에 단순한 에러 피드백을 적용합니다.

    2. 두 제어 방식의 정밀 비교 (어떤 게 우세한가?)

    결론부터 말씀드리면 “제어 성능과 강인성(Robustness) 측면에서는 ADRC가 압도적으로 우세하지만, 구현의 단순함과 범용성 측면에서는 여전히 PID가 우세하다”고 볼 수 있습니다.

    비교 항목PID 제어ADRC 제어우세 승자
    외란 대응 능력오차가 발생한 후 제어 (느림)ESO를 통해 외란을 실시간 상쇄 (매우 빠름)ADRC
    모델 의존도없음 (완전 블랙박스 가능)대략적인 시스템 차수만 알면 됨무승부
    매개변수 튜닝3개 (Kp​,Ki​,Kd​) / 직관적임ESO 대역폭, 제어기 대역폭 등 2~3개 (대역폭 기반 튜닝으로 발전하여 생각보다 쉬움)무승부 (최신 LADRC 기준)
    센서 노이즈 영향미분(D) 항이 노이즈를 증폭시킴ESO가 필터 역할을 하여 노이즈에 강함ADRC
    연산 복잡도매우 낮음 (MCU 자원 거의 안 먹음)관측기(ESO) 상태 방정식을 풀어야 하므로 연산량 많음PID
    산업계 범용성전 세계 산업계의 90% 이상 사용고성능 임베디드 장비를 중심으로 급격히 확산 중PID

    왜 ADRC가 우세한가? (예시)

    모터 제어를 예로 들면, 로봇 팔이 물건을 집어서 갑자기 무게(부하)가 늘어나는 상황이 발생했을 때:

    • PID: 속도가 떨어지고 나서야 Ki​ 항이 서서히 차올라 모터 출력을 높입니다. (응답 지연, 오버슈트 발생 가능)
    • ADRC: 부하가 걸리는 순간 ESO가 이를 ‘외란’으로 즉시 감지하여 한두 스텝 만에 모터 전류를 올려버립니다. 속도 저하가 거의 발생하지 않습니다.

    3. 앞으로의 제어 방식은 어디로 가는가?

    앞으로의 제어 패러다임은 “PID의 점진적 세대교체”와 “지능형 제어의 융합”으로 요약할 수 있습니다.

    ① 하드웨어 성능 향상으로 ADRC의 급부상

    과거에는 ADRC의 복잡한 행렬 연산과 관측기 루프를 저가형 MCU(마이크로컨트롤러)에서 돌리기 부담스러웠습니다. 하지만 최근 하드웨어(Cortex-M 시리즈, ESP32, RP2040 등)의 성능이 비약적으로 상승하면서 ADRC를 탑재하기 매우 유리해졌습니다.

    • 텍사스 인스트루먼트(TI) 사의 모터 제어 칩셋에는 이미 InstaSPIN-MOTION이라는 이름으로 ADRC 기술이 내장되어 상용화되었습니다.
    • 드론(Betaflight 등 프레임워크), 정밀 CNC, 서보 드라이브, 스마트 가전(인버터 컴프레서) 등 외란이 많고 정밀 제어가 필요한 영역에서 PID를 빠르게 대체하고 있습니다.

    ② 데이터 기반 및 AI와의 융합

    전통적인 제어 이론에 딥러닝이나 강화학습(Reinforcement Learning)을 융합하는 시도가 활발합니다.

    • AI 기반 자동 튜닝: PID나 ADRC의 파라미터를 사람이 맞추는 것이 아니라, AI가 시스템의 거동을 보고 실시간으로 최적의 파라미터(Gain)를 찾아주는 방식입니다.
    • 신경망 외란 관측기: ADRC의 핵심인 ESO 자리에 딥러닝 모델을 넣어 복잡한 비선형 외란을 예측하는 연구가 진행 중입니다.

    ③ 현실적인 공존: PID는 죽지 않는다

    ADRC가 아무리 좋아도 밸브 제어, 단순 온조기, 유량 제어처럼 빠른 응답이 필요 없고 정밀도가 적당해도 되는 수많은 산업 현장에서는 여전히 PID가 굳건히 자리를 지킬 것입니다. 싸고, 직관적이며, 유지보수가 편하기 때문입니다.

    요약

    • 현재: 단순하고 범용적인 제어는 여전히 PID가 지배하고 있지만, 고성능·강인 제어가 필요한 곳에서는 한계에 부딪히고 있습니다.
    • 미래: 시스템의 성능을 극대화해야 하는 정밀 제어 분야(로봇, 드론, 전기차 모터 등)에서는 외란 저항성이 압도적인 ADRC가 사실상의 표준(Standard)으로 자리 잡아가고 있습니다.

    💡 여기서 잠깐! 실무 엔지니어링 팁

    앞서 PID와 ADRC의 이론적인 개념을 비교해 보았는데요. 이번에는 실제 임베디드 현업이나 DIY 프로젝트에 적용할 때 꼭 알아야 할 현실적인 실무 포인트 4가지를 짚고 넘어가겠습니다.

    1. ADRC는 쓰기 어렵다? 편견을 깨버린 ‘LADRC’의 등장

    “관측기(ESO)에 행렬식에… 수식이 너무 복잡해서 현업에서 못 쓰겠다” 하시는 분들이 많습니다. 실제로 한징칭 교수가 처음 제안한 초창기 ADRC는 비선형 수식이 많아 튜닝해야 할 파라미터가 10개가 넘어 다들 고개를 저었죠.

    하지만 가오(Gao) 교수가 이를 선형화한 LADRC(Linear ADRC)를 발표하면서 판도가 완전히 바뀌었습니다.

    • 복잡한 파라미터를 단 2개로 압축: 최신 LADRC는 관측기 대역폭(ωo​)과 제어기 대역폭(ωc​)이라는 딱 두 가지만 조절하면 튜닝이 끝납니다.
    • 직관적인 튜닝: 시스템의 주파수 대역폭만 슥슥 조절하면 되기 때문에, 어설프게 Kp​,Ki​,Kd​ 세 개를 붙잡고 수십 번 밤새워 튜닝하는 PID보다 오히려 셋팅이 훨씬 직관적이고 빠릅니다.

    2. 하드웨어 리소스, 내 칩(MCU)에서 돌아갈까?

    제어 알고리즘을 고를 때 가장 중요한 건 결국 “내가 가진 하드웨어 성능으로 커버가 되느냐”입니다.

    • PID 제어: 코드 몇 줄이면 끝납니다. 이산화(Discretization) 과정도 매우 간단해서 아주 저렴한 8비트 아두이노(AVR 계열) 칩에서도 넘치도록 가볍게 돌아갑니다.
    • ADRC 제어: 매 루프마다 내부 상태 방정식 오차를 계산하고 예측하는 연산(오일러 적분 등)이 포함되기 때문에 소수점(Floating Point) 연산이 끊임없이 일어납니다.

    🛠️ 실무 팁: 따라서 연산 성능이 떨어지는 8비트 MCU보다는, 하드웨어 **FPU(부동소수점 연산 장치)**가 탑재된 32비트 MCU(예: Cortex-M4 시리즈, ESP32, RP2040 등) 환경에서 구현하는 것을 적극 권장합니다. 최근에는 워낙 고성능 MCU가 저렴하게 잘 나와서 하드웨어 제약은 거의 사라진 편입니다.

    3. 직관적인 비유로 이해하는 두 방식의 차이

    이해를 돕기 위해 우리가 매일 타는 ‘자동차 운전’으로 두 제어 방식을 비유해 보겠습니다.

    • PID 제어는 ‘운전면허 시험장 코스’를 도는 것과 같습니다. 바람도 안 불고 노면도 고른 완벽한 통제 환경이라면, 엑셀과 브레이크만 적당히 밟아도 자율주행 차가 선을 넘지 않고 완벽하게 목적지까지 달립니다.
    • ADRC 제어는 ‘돌풍이 몰아치는 대관령 고갯길’을 달리는 것과 같습니다. 차가 코너를 돌 때 갑자기 측면에서 강한 돌풍이 불면, 차가 차선 밖으로 밀려나기 전에 운전자가 본능적으로 핸들을 반대 방향으로 확 꺾어 버리죠(외란 상쇄). 외란이 발생해도 차체는 거의 흔들리지 않고 중심을 유지하며 안정적으로 주행하게 됩니다.

    4. 이미 구축된 오픈소스 생태계와 상용화 트렌드

    “이 좋은 걸 나 혼자 맨땅에 헤딩하며 코딩해야 하나?” 걱정하실 필요 없습니다.

    이미 GitHub 등에 Alternative PID, Arduino ADRC, LADRC C++ 같은 키워드로 검색해 보면 잘 짜여진 오픈소스 라이브러리를 쉽게 찾을 수 있습니다. 또한, 오픈소스 드론 플라이트 콘트롤러(PX4, Betaflight)나 로봇 운영체제(ROS) 진영에서도 이미 외란에 강한 ADRC 알고리즘이 메인 제어기로 녹아들고 있는 추세입니다.

    칩 제조사들도 발 빠르게 움직이고 있습니다. 모터 제어 칩의 명가인 텍사스 인스트루먼트(TI) 사의 모터 제어 IC 라인업에는 이미 InstaSPIN-MOTION이라는 이름으로 ADRC 기술이 칩 내부에 하드웨어적으로 탑재되어 상용화되어 있습니다.

    🏁 결론: 나의 프로젝트에는 무엇을 골라야 할까?

    과거에는 연산량 부담 때문에 그림의 떡이었던 ADRC였지만, 이제는 32비트 고성능 MCU를 누구나 수천 원에 구하는 시대가 되었습니다.

    내가 만드는 자동화 장비나 IoT 기기가 ‘갑작스러운 부하 변동이 많고, 외부 노이즈나 바람 같은 환경 변수에 민감한 영역(드론, 정밀 서보 모터, 로봇 팔 등)’에 속한다면, 이제 익숙했던 PID를 잠시 내려놓고 차세대 표준으로 자리 잡고 있는 ADRC(LADRC)를 적용해 보시는 건 어떨까요? 여러분의 장비가 한 차원 더 스마트해지는 것을 경험하실 수 있을 것입니다.

  • 신형 센서가 무조건 좋다? AHT20, BMP280 쓰다가 아차한 ‘통신 거리’의 비밀 (vs DHT11/DHT22)

    신형 센서가 무조건 좋다? AHT20, BMP280 쓰다가 아차한 ‘통신 거리’의 비밀 (vs DHT11/DHT22)

    안녕하세요! 디바이스를 설계하고 IoT 프로젝트를 진행하다 보면 누구나 한 번쯤 “더 정확하고, 더 최신인 센서”를 찾게 마련입니다.

    저 역시 최근 프로젝트를 진행하면서 기존에 흔히 쓰던 DHT11이나 DHT22 대신, 비교적 최신 칩셋이면서 정밀도가 높은 AHT20이나 기압까지 측정되는 BMP280을 적극적으로 도입했습니다. 당연히 스펙이 더 좋으니 결과물도 완벽할 줄 알았죠.

    하지만 실전 배치 단계에서 예상치 못한 복병을 만났습니다. 바로 ‘전선 연장 거리(통신 거리)’ 문제였습니다.

    오늘은 실전에서 직접 삽질하며 깨달은 AHT20/BMP280(I2C 방식)과 DHT11/DHT22(1-Wire 방식)의 통신 거리 제약과 그 이유에 대해 생생하게 공유해 보려고 합니다.

    1. 발목을 잡은 주범, I2C 통신 (AHT20, BMP280)

    AHT20과 BMP280은 성능이 정말 뛰어납니다. 반응도 빠르고 소수점 아래 단위까지 기가 막히게 잡아내죠. 하지만 이 녀석들은 I2C(아이스퀘어드씨) 통신 방식을 사용합니다.

    I2C는 원래 하나의 회로 기판(PCB) 위에서 아주 가까이 있는 칩들끼리 데이터를 주고받으라고 만든 규격입니다. 즉, ‘태생적으로 장거리용이 아니다’라는 뜻입니다.

    • 실전 한계 거리: 별도 조치 없이 일반 전선(점퍼선)으로 연결할 때 안정적인 거리는 30cm ~ 50cm 내외입니다.
    • 1m 넘게 늘리면 어떻게 될까? 선 길이가 1~2m를 넘어가는 순간, 전선 자체의 정전용량(Capacitance)과 주변 노이즈 때문에 데이터가 심하게 왜곡됩니다. 센서 값이 멈춰버리거나 통신 에러가 나면서 MCU가 먹통이 되는 현상을 목격하게 됩니다.

    💡 I2C 센서로 거리를 늘려야만 한다면? 꼭 이 센서들을 멀리 떨어뜨려야 한다면, 통신 속도(Clock Speed)를 기본 400kHz에서 100kHz 이하로 대폭 낮추고, 풀업 저항(2.2kΩ~4.7kΩ)을 보강해야 합니다. 5미터 이상이라면 P82B715 같은 전용 I2C 버스 확장 IC를 추가하는 번거로운 하드웨어 작업이 수반됩니다.

    2. 느리지만 멀리 간다! 1-Wire 통신 (DHT11, DHT22)

    반면, 초보자용으로 분류되거나 구형 취급을 받기도 하는 DHT11과 DHT22는 어떨까요? 이 녀석들은 독자적인 1선(Single-Bus) 디지털 통신 방식을 씁니다.

    데이터 선 딱 하나로 통신을 주고받는데, 데이터 갱신 속도는 1~2초 주기로 다소 느리지만 거리 면에서는 엄청난 깡패입니다.

    • 실전 한계 거리: 기본적으로 5m ~ 10m는 선을 그냥 늘려도 아무 문제 없이 짱짱하게 돌아갑니다.
    • 조건만 맞추면 20m~30m도 거뜬: 전원을 3.3V 대신 5V로 인가해 전압 강하를 막아주고, 데이터 선에 달리는 풀업 저항 값을 4.7kΩ 수준으로 낮춰주면 랜선(UTP)이나 실드선을 타고 수십 미터 밖에서도 온습도 데이터를 안정적으로 쏘아 보내줍니다.

    📊 한눈에 보는 센서별 통신 거리 사양

    센서 명통신 방식정밀도 체감기본 권장 거리한계 극복 방법
    AHT20 / BMP280I2C훌륭함 (0.1∘C 단위)50cm 이내통신 속도 다운, 풀업 저항 매칭, 확장 IC 필수
    DHT111-Wire아쉬움 (1∘C 단위)5m 이내5V 전원 사용, 풀업 저항 조절
    DHT221-Wire준수함 (0.1∘C 단위)5m ~ 10m5V 전원 사용, 풀업 저항 조절, 실드선 활용

    💡 실전에서 얻은 결론: 맹신은 금물, 환경이 우선이다

    부화기 내부나 스마트팜 챔버처럼 제어 장치(MCU)와 센서의 거리가 수 미터 이상 떨어져야 하는 환경이라면, 아무리 최신형 AHT20이나 BMP280이 정밀하다고 해도 배선 작업과 회로 보완 때문에 배보다 배꼽이 더 커질 수 있습니다.

    반면 DHT22는 적당한 정밀도(±0.5∘C)를 보장하면서도, 풀업 저항 하나만 손보면 긴 선을 빼서 원거리 환경을 제어하기에 압도적으로 편리합니다.

    • MCU와 센서가 같은 케이스나 기판에 붙어있다? ➡️ 무조건 AHT20, BMP280 추천 (고정밀, 고속)
    • 수 미터 밖의 먼 곳의 온습도를 끌어와야 한다? ➡️ 뒤도 돌아보지 말고 DHT22 추천 (원거리 안정성)

    기술 스펙 시트에 적힌 정밀도 수치에만 현혹되지 말고, 내가 만들 장치의 ‘물리적 거리와 배선 환경’을 먼저 고려하는 것이 실패 없는 메이킹의 지름길이라는 것을 이번에 배웠네요.

    구형이라고 안 쓰고 중고로 팔까 하다가 아차했습니다.

  • [생활정보] 에어컨 켰는데 습도가 더 높아지는 이유! 배수 문제일까?

    [생활정보] 에어컨 켰는데 습도가 더 높아지는 이유! 배수 문제일까?

    안녕하세요! 여름철 무더위를 피해 에어컨을 켰는데, 온도는 분명 22~24도로 시원해졌음에도 불구하고 오히려 몸이 끈적거리고 습도가 치솟는 경험 해보신 적 있으신가요?

    “어? 에어컨 켜면 제습도 같이 되는 거 아니었나?” “혹시 에어컨 물이 안 빠져서(배수 불량) 그런가?”

    하고 걱정하시는 분들을 위해, 오늘은 에어컨 가동 시 습도가 높아지는 진짜 이유와 해결법을 시원하게 정리해 드리겠습니다!

    1. 배수가 안 돼서 그런 걸까요?

    많은 분들이 가장 먼저 의심하시는 게 바로 ‘배수관 막힘’입니다.

    결론부터 말씀드리면, 물이 방바닥으로 넘쳐흐르지 않는다면 배수관이 완전히 막힌 것은 아닙니다. 다만, 완전히 막히지 않았더라도 실내기 내부 물받이(드레인 팬)에 물이 원활하게 흐르지 않고 고여 있다면 습도 상승에 일부 영향을 줄 수는 있습니다.

    하지만 진짜 주범은 배수가 아니라 ‘에어컨의 운전 원리’에 있습니다.

    2. 온도는 내려가는데 습도는 왜 오를까? (진짜 이유 2가지)

    ① 실외기가 멈추면서 일어나는 ‘역증발 현상’

    에어컨이 제습을 하는 원리는 찬물이 담긴 컵 표면에 물방울이 맺히는 것과 같습니다. 에어컨 내부의 냉각판이 차가워지면서 공기 중의 수분을 머금고, 이 물이 배수관을 통해 밖으로 빠져나가는 것이죠.

    문제는 방 온도가 내가 설정한 온도(예: 23도)에 도달했을 때 발생합니다. 목표 온도에 도달하면 에어컨은 찬 바람을 만드는 실외기(컴프레셔) 가동을 멈추거나 최소화하고 ‘송풍’ 상태로 바뀝니다. 이때, 냉각판에 맺혀 있던 축축한 수분들이 바람을 타고 다시 방 안으로 증발(역증발)해 버립니다. 온도는 낮은데 수분이 대량으로 공급되니 습도가 80~90%까지 순식간에 올라가게 됩니다.

    ② 방 크기에 비해 에어컨 용량이 너무 큰 경우

    방은 작은데 에어컨이 너무 강력하면, 켜자마자 순식간에 목표 온도에 도달합니다. 에어컨이 충분한 시간 동안 실외기를 돌리며 공기 중의 수분을 짜내야 하는데, 너무 일찍 일을 끝내고 실외기를 꺼버리기 때문에 온지만 낮고 습한 상태가 유지되는 것입니다.

    💡 끈적함 탈출! 쾌적하게 에어컨 쓰는 꿀팁

    첫째, 설정 온도를 1~2도만 더 낮춰보세요 이미 온도가 낮아서 춥다면 바람 세기를 ‘약풍’이나 ‘미풍’으로 줄이더라도, 실외기가 멈추지 않고 계속 돌아갈 수 있도록 설정 온도를 조금 더 낮추는 것이 좋습니다. 실외기가 돌아야 수분이 밖으로 계속 배출됩니다.

    둘째, ‘제습 모드’도 설정 온도를 낮게 잡으세요 많은 분들이 오해하시는데, 인버터 에어컨의 제습 모드 역시 설정 온도에 도달하면 송풍으로 바뀌며 습도가 다시 올라갑니다. 제습 모드를 쓰실 때도 희망 온도를 현재 온도보다 2~3도 낮게 설정해야 제습 효과를 제대로 볼 수 있습니다.

    셋째, 끄기 전 ‘송풍’ 또는 ‘자동 건조’는 필수! 에어컨 내부 물받이에 물이 오래 고여 있거나 먼지가 많으면 수분을 더 많이 머금게 됩니다. 에어컨을 끄기 전에는 반드시 ‘자동 건조’ 기능을 켜두시거나, ‘송풍 모드’로 20~30분간 내부를 바짝 말려주셔야 다음 가동 때 습기와 꿉꿉한 냄새를 줄일 수 있습니다.

    에어컨을 켰는데도 끈적거렸던 이유, 이제 궁금증이 풀리셨나요? 실외기가 멈추지 않도록 온도 설정을 지혜롭게 조절하셔서, 올여름은 온도와 습도 둘 다 잡는 쾌적한 여름 보내시길 바랍니다!

  • 스마트홈 온습도/IR 리모콘 제어 “통합 관리 데시보드” 디자인 리뉴얼

    스마트홈 온습도/IR 리모콘 제어 “통합 관리 데시보드” 디자인 리뉴얼

    안녕하세요! 스마트홈 구축의 끝은 결국 ‘UX/UI’와 ‘시각적 만족’이 아닐까 싶습니다. 기존에 사용하던 온습도 모니터링과 에어컨/TV 등 가전 제어용 IR 리모콘 페이지가 슬슬 지겨워지기 시작하더군요. 그래서 이번에 큰맘 먹고 여러 가지 버전의 디자인으로 리모델링을 진행했습니다!

    • 기존 UI의 문제점: 기능은 잘 작동하지만, 한눈에 들어오지 않거나 인테리어와 어울리지 않음.
    • 변화된 핵심 기능: 온습도 데이터 시각화 개선 + IR 리모콘 버튼의 직관적 배치.
    • 여러 가지 디자인 테마 소개:
      • Type A. 모던 다크 모드: 밤에 봐도 눈이 편안하고 테크니컬한 감성.
      • Type B. 미니멀 화이트: 깔끔한 화이트 인테리어에 녹아드는 감성 UI.
      • Type C. 대화면 대시보드형: 거실 월패드나 태블릿에 띄워두기 좋은 한눈에 보기 테마.
    • 색상 테마 5~6개 정도를 선택할 수 있도록 기능 추가
    • 온습도 수치 테이블과 그래프와 온습도를 보고 바로 에어컨 조절을 한페이지에서 할 수 있도록 통합
    • 최근 2시간동안 1분 온습도 추이 기능 추가. 에어컨 온도 조작시 몇분내로 온습도 추이를 볼 수 있다.
    • 기존에 1시간 마다의 온습도 기록은 유지하고 2년 이상의 전체 데이타를 그래프화 해서 볼 수 있다.

    마무리 디자인을 여러 개로 바꿔가며 적용해 보니, 계절이나 기분에 따라 스마트홈 분위기를 바꿀 수 있어 만족도가 200%입니다.

  • ESP32-C3 Mini로 구축하는 스마트한 무선 개발 환경: 웹 파일 탐색기 및 편집기 만들기

    ESP32-C3 Mini로 구축하는 스마트한 무선 개발 환경: 웹 파일 탐색기 및 편집기 만들기

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

    ESP32나 ESP32-C3 같은 마이크로컨트롤러를 가지고 IoT 프로젝트를 진행하다 보면, 매번 소스 코드를 수정할 때마다 USB 케이블을 PC에 연결하고 펌웨어를 다시 업로드하는 과정이 번거롭게 느껴질 때가 많습니다. 특히 센서가 이미 하우징 내부에 고정되어 있거나, 접근하기 어려운 위치에 설치되어 있다면 케이블 연결은 더욱 고역이죠.

    이런 불편함을 해결하기 위해, 예전에 ESP32-C3 Mini 칩 내부의 파일 시스템(LittleFS/SPIFFS)을 웹 브라우저에서 직접 관리하고 편집할 수 있는 ‘웹 기반 파일 탐색기 프로그램’을 개발했었습니다. 오늘은 이 무선 개발 환경의 개념과 장점을 소개해 보려고 합니다.

    1. 왜 무선 개발 환경(Web IDE)이 필요할까?

    일반적으로 ESP32 개발은 PC와 유선으로 연결된 상태에서 진행됩니다. 하지만 웹 기반 무선 개발 환경을 구축하면 다음과 같은 강력한 장점이 생깁니다.

    • 케이블 프리(Cable-Free): Wi-Fi만 연결되어 있다면 언제 어디서든 칩에 접근할 수 있습니다.
    • 실시간 파일 수정: MicroPython이나 내부 설정 파일(JSON, TXT 등)을 웹에서 열어 즉시 수정하고 저장할 수 있습니다.
    • 비개발 환경에서도 제어 가능: 별도의 개발 툴(IDE)을 설치하지 않고, 스마트폰이나 태블릿의 웹 브라우저에서도 칩 내부 파일을 확인하고 코드를 고칠 수 있습니다.

    2. 주요 구현 기능 및 아키텍처

    제가 구현했던 프로그램의 핵심 기능은 크게 세 가지였습니다.

    • 웹 서버 구성: ESP32-C3 내부에서 HTTP 웹 서버를 구동하여 PC나 스마트폰의 브라우저로 접속할 수 있는 UI 페이지를 제공합니다.
    • 파일 탐색기(File Explorer): 내장 파일 시스템(LittleFS 등)과 연동하여 파일 목록 보기, 파일 편집, 삭제 기능을 웹 화면에 구현했습니다.
    • 웹 에디터(Web Editor): 오픈소스 코드 에디터 라이브러리를 활용하여, 웹브라우저 상에서 소스 코드를 직접 편집하고 ESP32-C3 내부에 바로 ‘저장(Save)’할 수 있도록 만들었습니다.
    • 파일에 작성한 마이크로 파이썬 코드를 직접 실행할 수 있습니다.

    3. 작동 프로세스

    1. ESP32-C3 전원이 켜지면 지정된 Wi-Fi 공유기에 접속하거나 자체 AP 모드를 켭니다.
    2. 할당된 IP 주소로 웹 브라우저에 접속합니다.
    3. 깔끔하게 구성된 웹 화면에서 내부 폴더와 파일 구조가 한눈에 보입니다.
    4. 수정하고 싶은 파일(예: main.py 또는 설정 파일)을 클릭해 코드를 수정한 뒤 ‘저장’을 누르면, 무선으로 칩 내부에 반영됩니다.

    4. 마치며

    ESP32-C3 Mini의 작은 크기와 강력한 Wi-Fi 기능 덕분에, 외부 장치 없이 칩 자체만으로도 이런 훌륭한 무선 개발 환경을 품을 수 있었습니다. 특히 IoT 디바이스를 필드에 배치하고 유지보수할 때 이보다 편한 방법이 없더군요.

    자세한 구동 모습은 함께 업로드한 유튜브 쇼츠 영상에서 확인하실 수 있습니다

  • [DIY] 3.3V/5V MCU 호환, A2SHB MOSFET을 이용한 강력한 전방향(360도) IR 송신기 만들기

    [DIY] 3.3V/5V MCU 호환, A2SHB MOSFET을 이용한 강력한 전방향(360도) IR 송신기 만들기

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

    스마트홈 구축이나 가전제품 자동화 제어 프로젝트를 진행하다 보면, 거실 한구석에 있는 ESP32나 스마트 허브에서 방 안의 에어컨, TV, 오디오를 동시에 제어해야 할 때가 있습니다. 하지만 마이크로컨트롤러(MCU)의 GPIO 핀에 IR LED를 하나만 직결하면 신호 도달 거리도 짧고, 지향성(방향) 때문에 사각지대가 생기기 마련이죠.

    오늘은 GND, 5V, IR Signal 딱 3개의 핀만 입력받아, 사방(360도)으로 강력한 신호를 뿜어내는 고출력 IR 송신기 회로를 설계하고 제작하는 방법을 공유합니다.

    1. 핵심 부품 선정 및 설계 포인트

    이번 프로젝트의 핵심은 “전류 증폭”과 “전방향 커버리지”입니다.

    💡 왜 MCU 핀에 LED를 바로 연결하면 안 될까요?

    일반적인 IR LED는 순간적으로 강한 전류(펄스 전류)를 흘려주어야 도달 거리가 늘어납니다. 하지만 ESP32나 RP2040 같은 MCU의 GPIO 핀은 출력 전류가 수십 mA 수준으로 제한되어 있어, LED 5개를 동시에 켜기엔 턱없이 부족합니다. 심지어 과전류로 인해 MCU가 고장 날 수도 있습니다.

    따라서 외부 5V 전원을 끌어 쓰고, 신호선으로는 스위치 역할만 해줄 MOSFET(모스팻)이 필수적입니다.

    🛠️ 주요 부품 리스트

    • IR LED: 5개 (방향 분산 배치용)
    • 전류 제한 저항: 100$\Omega$ ~ 150$\Omega$ 5개 (LED당 1개씩)
    • N-Channel MOSFET: A2SHB (Si2302) 1개 (SOT-23 패키지)
    • 풀다운 저항: 10k$\Omega$ 1개 (회로 안정화용)
    • 게이트 저항: 100$\Omega$ 1개 (MCU 핀 보호용)

    2. 왜 A2SHB (Si2302) MOSFET인가?

    소형 SMD 타입인 A2SHB는 DIY IoT 기기 제작에 정말 축복 같은 부품입니다.

    주요 스펙메이커 관점에서의 장점
    Vgs(th) (문턱 전압)0.65V ~ 1.2V3.3V Logic Level 완벽 지원! ESP32 전압으로도 꽉 열립니다.
    Id (최대 드레인 전류)약 2.3A ~ 2.8AIR LED 5개 합쳐봐야 200~500mA 수준이라 널널하고 발열이 없습니다.
    패키지 크기SOT-23초소형이라 만능기판이나 커스텀 PCB 제작 시 공간을 거의 차지하지 않습니다.

    3. 회로도 및 연결 방법 (Low-Side Switch 구조)

    LED를 5개나 쓰기 때문에 직렬이 아닌 병렬 구조로 설계해야 합니다. 5V 전원에서 IR LED 5개를 직렬로 연결하면 전압 부족(1.3V×5=6.5V)으로 켜지지 않습니다. 또한, 전류 불균형을 막기 위해 반드시 각 LED마다 저항을 1개씩 독립적으로 매칭해야 합니다.

    📌 A2SHB SOT-23 핀 배치 주의사항

    부품에 새겨진 A2SHB 글자가 정방향으로 보이게 놓았을 때 기준입니다.

    • 1번 핀 (왼쪽 아래): GATE (G)
    • 2번 핀 (오른쪽 아래): SOURCE (S)
    • 3번 핀 (위쪽 중앙): DRAIN (D)

    🔌 결선 가이드

    1. 5V 전원선 → IR LED 5개의 애노드(Anode, 긴 다리, +)에 각각 연결
    2. IR LED의 캐소드(짧은 다리, -) → 각각 120$\Omega$ 저항 연결
    3. 5개 저항의 반대편 다리들 → 한곳으로 묶어서 A2SHB의 3번 핀 (DRAIN)에 연결
    4. 시스템 GND → A2SHB의 2번 핀 (SOURCE)에 연결
    5. MCU IR Signal 핀 → 100$\Omega$ 저항을 거쳐 A2SHB의 1번 핀 (GATE)에 연결

    트릭 하나 더! (회로 안정화) MCU가 켜지거나 리셋될 때 신호 핀이 출렁이면서 IR LED가 멋대로 오작동하는 것을 막기 위해, 1번 핀(GATE)과 2번 핀(SOURCE=GND) 사이에 10k$\Omega$ 풀다운 저항을 하나 달아주는 것이 좋습니다.

    4. 저항 값 계산 (Tip)

    IR 신호는 상시 켜져 있는 조명이 아니라, 38kHz 주파수로 빠르게 깜빡이는 펄스 형태입니다. 따라서 일반 LED보다 전류를 조금 더 강하게(약 30mA~50mA) 흘려도 안전합니다.

    • 계산 공식: R=(Vcc​−Vf​)/I
    • 5V(전원)−1.3V(IR LED 전압 강하)=3.7V
    • 각 LED에 30mA(0.03A)를 흘리고 싶다면? 3.7V/0.03A=123.3Ω
    • 👉 결론: 시중에서 구하기 쉬운 120$\Omega$ 또는 150$\Omega$ 저항을 쓰시면 딱 좋습니다. 도달 거리를 극대화하고 싶다면 68$\Omega$~100$\Omega$까지 낮출 수 있으나, 이 경우 LED의 맥스 스펙을 확인하세요!

    5. 제작 팁 및 마무리

    [사방으로 배치된 IR LED 구조 예시 레이아웃 만드기]

    회로를 구성한 뒤, 3D 프린터를 이용해 5개의 LED가 72도 간격(360∘/5)으로 바깥을 바라보도록 원형 거치대(도넛 형태)를 출력해 고정하면 완벽한 전방향 송신기가 됩니다. 원형 배치를 하면 거실 한가운데나 천장에 달았을 때 벽면 반사까지 더해져 방 안의 모든 가전제품이 사각지대 없이 완벽하게 제어되는 쾌감을 맛볼 수 있습니다.

    조그만 SMD 소자인 A2SHB 모스팻 하나로 구현하는 고출력 IR 송신기 회로, 여러분의 IoT 프로젝트에 꼭 적용해 보세요!

    https://www.scribd.com/document/682051880/A2SHB-SOT-23

  • [DIY] 무선 랜(Wi-Fi) PC도 원격으로 켠다! ESP32-C3와 유선 키보드를 활용한 스마트 원격 부팅 스위치 만들기

    [DIY] 무선 랜(Wi-Fi) PC도 원격으로 켠다! ESP32-C3와 유선 키보드를 활용한 스마트 원격 부팅 스위치 만들기

    안녕하세요! 오늘은 PC 원격 부팅에 대한 이야기와 함께, 일반적인 방법으로는 해결하기 힘든 ‘무선 랜(Wi-Fi) 환경에서의 PC 원격 부팅’을 하드웨어 Hack 방식으로 스마트하게 해결한 DIY 프로젝트를 소개해 드려고 합니다.

    1. 왜 이런 장치가 필요했을까? (기획 배경)

    유선 랜의 치트키, WOL (Wake on LAN)

    집이나 사무실에서 외부의 PC를 원격으로 켜야 할 때, 가장 먼저 떠올리는 기술은 WOL(Wake on LAN)입니다. 메인보드와 공유기 설정을 조금만 만져주면 외부에서 매직 패킷(Magic Packet)을 보내 PC를 아주 쉽게 켤 수 있죠.

    • 잠깐, 원격으로 끌 수도 있나요?네, 가능합니다. 다만 WOL은 ‘켜는’ 기술이고, 원격으로 끌 때는 별도의 소프트웨어(예: Chrome 원격 데스크톱, TeamViewer, 또는 Windows의 shutdown 명령어를 활용한 배치 파일 등)를 이용해 OS 내부에서 정상 종료 신호를 보내야 합니다.

    무선 랜(Wi-Fi) 환경의 절망, WoWLAN의 한계

    문제는 PC를 무선 랜(Wi-Fi)으로 연결해 사용하는 경우입니다. 무선 랜에도 WOL과 같은 WoWLAN(Wake on Wireless LAN) 기능이 존재하긴 합니다.

    하지만 설정이 무척 까다롭고, 공유기나 무선 랜카드의 칩셋 궁합을 심하게 타며, PC가 깊은 대기 상태(S3/S4)로 들어가면 무선 연결이 툭 끊겨버려 정작 필요할 때 작동하지 않는 경우가 허다합니다. 사실상 실무에서 쓰기엔 안정성이 많이 떨어지죠.

    “그럼 PC가 켜지는 다른 조건을 이용하면 어떨까?”

    여기서 아이디어가 출발했습니다. PC는 꺼져 있거나 대기 상태일 때도 유선 USB 키보드나 마우스를 딸깍 누르면 잠에서 깨어나는 기능(Wake on USB)이 기본적으로 활성화되어 있는 경우가 많습니다.

    “그렇다면 저렴한 Wi-Fi MCU(ESP32-C3)를 키보드 내부에 심어서, 웹 서버로 신호를 받으면 키보드가 눌린 것처럼 신호를 주면 되잖아?”

    2. 개발 과정과 뜻밖의 난관: ESP32-C3의 하드웨어 제약

    처음 구상은 아주 단순했습니다. ESP32-C3를 PC와 USB로 연결하고, 아두이노의 USB HID 라이브러리(USBHIDKeyboard)를 써서 웹 요청이 들어오면 가상의 스페이스바를 쾅 쳐주는 ‘소프트웨어 방식’이었습니다.

    🚨 뜻밖의 난관: C3에는 Native HID 기능이 없다!

    하지만 개발을 진행하면서 중요한 하드웨어 제약을 알게 되었습니다. ESP32-C3는 내장된 USB 인터페이스가 시리얼 콘솔(CDC) 및 디버깅용으로만 제한되어 있어, 스스로 마우스나 키보드 같은 ‘내이티브 USB HID 장치’로 변신할 수 없다는 사실이었습니다. (이 기능은 상위 모델인 ESP32-S2나 S3에서만 지원됩니다.)

    3. 신의 한 수: “선 3개만 따자!” 물리적 우회 전략

    소프트웨어적인 USB 신호 전송이 불가능하다면, 방법은 하나. 물리적으로 키보드 스위치를 누른 것처럼 속이는 하드웨어 해킹이었습니다.

    처음에는 안 쓰는 키보드 기판(멤버레인 시트 포함)을 통째로 뜯어서 매트릭스 단자를 분석하려고 했습니다. 하지만 굳이 그럴 필요 없이, 지금 실제 사용 중인 유선 키보드 안에서 선 3개만 ESP32-C3로 연결하면 기존 키보드 기능도 완벽히 유지하면서 원격 스위치를 심을 수 있다는 엄청난 효율적 결론에 도달했습니다.

    🛠️ 하드웨어 준비물

    • ESP32-C3 개발 보드 (Mini 타입 등 소형일수록 매립하기 좋습니다.)
    • 소형 NPN 트랜지스터 (예: C1815, 2N2222) 또는 포토커플러(PC817)
    • 1k$,\Omega$ 저항 1개
    • 약간의 전선과 인두기

    🔌 핵심 연결 메커니즘 (3선 연결법)

    키보드가 대기 상태에서도 PC로부터 5V 전원을 공급받는다는 점을 100% 활용합니다.

    1. 전원선 (5V): 키보드 USB 입력단의 5V 라인 ➡️ ESP32-C3의 5V (또는 VIN)
    2. 그라운드 (0V/GND): 키보드의 GND 라인 ➡️ ESP32-C3의 GND 및 트랜지스터의 Emitter
    3. 제어선 (신호 1선): 키보드 컨트롤러 단자 중 핀셋 테스트로 찾아낸 ‘누르면 키가 입력되는 신호선’ ➡️ 트랜지스터의 Collector

    💡 꿀팁 (스위치 단자 찾는 법): 키보드를 PC에 연결하고 메모장을 켠 뒤, 핀셋으로 기판의 금속 단자들을 툭툭 쇼트시켜 봅니다. 이때 메모장에 일반 글자나 스페이스바가 입력되는 단자 조합을 찾습니다. 그중 하나가 GND라면 NPN 트랜지스터로 대치 가능하므로, 선 3개만으로 회로가 끝납니다! (만약 두 단자 모두 GND가 아니라면 포토커플러 PC817을 사용해 4선으로 연결하면 안전합니다.)

    4. 소프트웨어 구현

    ESP32-C3에 업로드할 코드입니다. 웹 브라우저에서 http://[ESP32_IP]/wake로 접속하면 지정된 GPIO 핀을 아주 잠시 동안 HIGH로 만들어서 트랜지스터 스위치를 붙였다가 떼어줍니다. (실제 손으로 키를 탁 누르고 떼는 동작과 같습니다.)

    마이크로파이썬 소스 코드 (main.py)

    5. 프로젝트를 마치며

    이번 DIY의 가장 큰 수확은 하드웨어의 제약(ESP32-C3의 HID 미지원)을 만났을 때, 발상을 전환하여 더 직관적이고 효율적인 물리적 우회로를 찾아낸 점입니다.

    키보드를 통째로 새로 만드는 대신 기존 키보드의 5V, GND, 신호선 단 3개만 링크함으로써 부품 부피도 최소화했고, 평소에는 평범한 키보드로 쓰다가 필요할 때는 세계 어디서든 웹 접속 한 번으로 PC를 깨울 수 있는 완벽한 가성비 스마트 스위치가 완성되었습니다.

    무선 랜 환경이라 WOL 설정을 포기하셨던 분들, 혹은 메인보드의 파워 스위치에서 선을 길게 따오기 번거로우셨던 분들은 책상 위에 늘 놓여있는 ‘유선 키보드’를 활용한 이 방식을 꼭 한 번 도전해 보시기 바랍니다!


    “3선식 아니고 4선식으로 연결해야 할 경우”

    기존 키보드 회로를 분석했을 때 핀셋으로 쇼트시켜서 글자가 나오는 단자 2개를 조합했는데, 이 두 단자 중 그 어느 것도 키보드의 원래 0V(GND)와 연결되어 있지 않은 경우가 있을 수 있습니다.

    이를 매트릭스 회로 구조에서 “4점식(또는 4선식) 연결 방식”이라고 부를 수 있습니다. 가로축 신호선과 세로축 신호선이 공중에 떠 있는 상태에서 서로 만나야만 하기 때문에, 앞서 설명한 3선식(트랜지스터) 방식을 쓰면 오작동하거나 쇼트가 나지 않습니다.

    이때는 처음에 언급했던 포토커플러(PC817)가 구원투수가 됩니다. 왜 이 방식이 필요하고 어떻게 연결하는지 명확하게 정리해 드릴게요.

    1. 왜 4점식일 때는 트랜지스터를 쓰면 안 될까?

    일반적인 NPN 트랜지스터나 MOSFET은 전류를 한 방향으로 흘려보내며, 반드시 기준점이 되는 GND가 서로 묶여 있어야만 스위치가 열립니다.

    만약 키보드 기판의 두 단자가 모두 GND가 아니라 각각 미세한 전압이 흐르고 있는 신호선들이라면, 트랜지스터를 연결하는 순간 키보드 회로의 전압이 ESP32의 GND로 강제로 끌려 내려가면서 키보드 컨트롤러 칩이 먹통이 되거나 PC가 키보드 오류를 뱉게 됩니다.

    2. 해결책: 포토커플러(PC817)를 이용한 4선식 회로

    포토커플러는 내부가 빛(LED)으로 신호를 전달하기 때문에, ESP32의 전원/GND와 키보드의 전원/GND를 전기적으로 완전히 차단(Insulation)해 줍니다. 쉽게 말해, 공중에 떠 있는 키보드 선 2개를 아무런 간섭 없이 순수하게 ‘뚝딱’ 붙여줄 수 있는 마법의 부품입니다.

    이때는 키보드에서 총 4개의 선이 나와야 합니다.

    • 전원 공급용 2선: 키보드 5V, 키보드 GND (ESP32-C3 구동용)
    • 스위치 제어용 2선: 키보드 단자 A, 키보드 단자 B (PC817 스위치 연결용)

    3. 4점식 하드웨어 연결 방법

    PC817의 핀 번호(점 표시가 1번)를 확인하고 다음과 같이 연결합니다.

    1) ESP32-C3 쪽 연결 (전원 및 제어)

    • 키보드 5V ➡️ ESP32-C3 5V (VIN)
    • 키보드 GND ➡️ ESP32-C3 GND
    • ESP32-C3 GPIO 4 ➡️ 220옴 저항 ➡️ PC817 1번 핀(Anode)
    • ESP32-C3 GND ➡️ PC817 2번 핀(Cathode)

    2) 키보드 신호 단자 쪽 연결 (순수 스위치)

    • 키보드 단자 A (전압이 조금 더 높은 쪽) ➡️ PC817 4번 핀(Collector)
    • 키보드 단자 B (전압이 낮은 쪽) ➡️ PC817 3번 핀(Emitter)

    💡 단자 A, B 전압 확인 팁: 멀티미터(직류 전압 모드)로 키보드 단자 2개를 찍어봤을 때, 빨간색 리드봉을 댄 곳이 + 전압으로 나온다면 그 단자를 4번 핀에, 검은색 리드봉이 닿은 단자를 3번 핀에 연결하시면 됩니다.

    4. 소프트웨어(마이크로파이썬) 코드는 그대로!

    하드웨어 제어 방식이 트랜지스터에서 포토커플러로 바뀌었을 뿐, ESP32-C3 입장에서는 GPIO 4번 핀을 HIGH로 켰다가 LOW로 끄는 논리가 완전히 똑같습니다. 따라서 앞서 작성해 드린 마이크로파이썬(또는 아두이노) 소스코드를 수정 없이 그대로 사용하시면 됩니다.

    📝 요약 한 줄

    “만약 키보드 기판을 테스트했을 때 쇼트 단자 중 GND(0V)가 없는 독립된 신호선 조합(4점식) 구조라면, 트랜지스터 대신 **포토커플러(PC817)**를 사용해 회로를 완전히 절연시켜 선 4개로 연결하면 안전하게 성공할 수 있습니다!”


    ” 실제 사용중인 로지텍 키보드 뜯어서 확인해 보니”

    1. 일반 TR이나 MOSFET을 쓸 수 없었던 이유 (키보드 실측 결과)

    처음에는 일반적인 디지털 회로처럼 스위치가 0V와 5V 사이를 오가는 단순한 구조일 것으로 예상했습니다. 그 구조라면 N-Channel MOSFET이나 트랜지스터(TR) 하나로 쉽게 쇼트 신호를 만들 수 있기 때문입니다.

    하지만 멀티미터로 실제 키보드 매트릭스 핀을 정밀하게 찍어본 결과는 완전히 달랐습니다.

    • 실측 결과: 여러 단자 모두 똑같이 4.6V 근방을 유지하고 있었습니다.
    • 신호 감지 방식: 키가 눌리는 순간을 감지하는 메커니즘이 0V-5V의 확실한 논리 레벨이 아니라, 두 핀 사이의 고작 0.03V 내외의 미세한 전압 차이를 가로채는 방식이었습니다.

    여기에 일반 TR을 잘못 물렸다간 메인보드의 그라운드(GND) 노이즈나 미세한 누설 전류 때문에 키보드 컨트롤러가 오작동할 위험이 큽니다. 제어 측(ESP32)과 피제어 측(키보드)의 회로를 전기적으로 완벽하게 분리(절연)하면서 스위칭만 해줄 수 있는 ‘포토커플러’가 강제되는 상황이었습니다.

    2. 자작 포토커플러(IR 소자) 테스트와 기성품 적출

    처음에는 부품 통에 기성품 포토커플러가 보이지 않아, 적외선(IR) 송신 LED와 수신 포토트랜지스터를 일대일로 마주 보게 정렬한 뒤 검은색 절연테이프로 암막 처리를 하여 ‘수제 포토커플러’를 직접 제작해 테스트했습니다.

    이 수제 소자를 테스트해 보니 예상외의 재밌는 결과가 나왔습니다. ESP32로 신호를 주고 멀티미터의 다이오드 모드로 개방 상태를 측정했을 때, 내부 광축이 정밀하게 맞았는지 순방향 전압 강하가 0.1V대로 떨어졌고 저항 모드에서는 90옴 근처가 찍혔습니다.

    나중에 고장 난 스마트폰 충전기(아답터)의 고압-저압 경계선 회로에서 적출한 기성품 PC817과 비교했을 때, 수제 소자가 오히려 테스터기 상에서 더 낮은 저항 특성을 보여주며 준수한 성능을 증명했습니다. (기성품은 반도체 고유의 문턱 전압 때문에 저항 모드에서 187옴 수준의 수치를 띄우며 테스터기를 오해하게 만드는 특성이 있습니다.)

    결과적으로 두 소자 모두 키보드 칩이 인식하기에는 차고 넘치는 최상급 스위치 상태(0.1V대 전압 강하)를 달성했습니다. 다만 장기적인 물리적 내구성과 키보드 내부 매립을 위한 부피를 고려해, 최종 마감은 고장 난 어댑터에서 적출한 기성품 PC817을 사용하기로 결정했습니다.

    3. 최종 회로 구성 (단 3줄의 배선)

    최종 완성된 회로는 군더더기 없이 심플합니다. 복잡한 주변 소자 없이 저항 하나와 포토커플러 하나로 끝납니다.

    1. 입력 제어부: ESP32-C3의 GPIO 4번 핀 ➡️ 220옴 저항 ➡️ 포토커플러 1번 핀(Anode)으로 연결하고, 포토커플러 2번 핀(Cathode)은 ESP32의 GND로 묶어줍니다.
    2. 출력 스위치부: 포토커플러의 4번 핀(Collector)과 3번 핀(Emitter)을 키보드 우측 화살표() 단자의 높은 전압(+) 쪽과 낮은 전압(-) 쪽에 각각 연결합니다.

    테스트 대상으로 최종 낙점한 우측 화살표() 키는 탁월한 선택이었습니다. 메모장 등의 편집기를 켜둔 상태에서 ESP32 웹 버튼을 누르면 커서가 오른쪽으로 한 칸 이동하는 것으로 오작동 없이 확실한 시각적 피드백을 줍니다. 나중에 PC가 켜진 실사용 환경에서도 화면에 불필요한 문자가 무한 입력되거나 시스템 창이 강제로 열리는 리스크가 없어 가장 안전합니다.

    [작업사진]
    알류미늄 테이프 가늘게 자른 것이나 랩핑선을 이용해서 멘브레인 핀 2개 따오기.
    키보드안에 포토 커플링과 저항 넣어서 배선하기.
    ESP32-C3 전원선은 랩핑선보다 굵은 선 사용하기.
    키보드 외부로 꼽을 핀 소켓와 ESP32-C3 장착.

    4. 복병의 등장: 전원 부족으로 인한 무한 리부팅 현상

    회로 배선을 마치고 실전 테스트를 진행하던 중, 예상치 못한 하드웨어 복병을 만났습니다. 웹 버튼을 누르거나 ESP32-C3가 와이파이(Wi-Fi) 통신을 시작할 때마다 칩이 자꾸 죽으면서 무한 리부팅(Brownout)되는 현상이 발생한 것입니다.

    • 원인 분석: 원인은 키보드 순정 내부 배선에 있었습니다. 일반적인 순수 키보드는 구동할 때 전력을 0.1W 이하로 극도로 적게 소비합니다. 그렇다 보니 기성품 키보드 내부에 들어가는 순정 USB 케이블은 데이터 송수신과 이 미세한 전류만을 감당하기 위해 선 두께(AWG)가 매우 얇게 설계되어 있습니다. 반면, ESP32-C3가 와이파이(Wi-Fi) 통신을 시작하면 순간적으로 0.5W 이상, 피크치에는 그보다 훨씬 높은 전력을 잡아먹습니다. 키보드 대비 최소 5배 이상의 전력이 급격하게 필요한 것입니다. 이 상태에서 얇은 케이블을 공유해 쓰다 보니, 전원선의 저항 때문에 순간적으로 전압이 급격하게 떨어지는 전압 강하(Brownout) 현상이 발생했고, 결국 칩이 버티지 못하고 무한 리부팅되는 결과로 이어졌던 것입니다.
    • 임시방편 솔루션 (와이파이 출력 하향): 원래대로라면 두꺼운 USB 케이블로 전원선을 전면 교체하는 것이 정석이지만, 키보드 하우징의 가공 편의성을 위해 소프트웨어적으로 우회하는 방법을 선택했습니다. 마이크로파이썬 소스코드에서 ESP32-C3의 Wi-Fi 송신 신호 강도(TX Power)를 강제로 낮추는 옵션을 추가했습니다. 신호 출력을 깎아 전력 소모의 피크치를 낮추자, 다행히 전압 강하가 선을 넘지 않으면서 리부팅 현상을 깔끔하게 해결할 수 있었습니다. 만약 거실 공유기와 거리가 아주 멀지 않은 환경이라면 이 정도의 신호 제어만으로도 IoT 기능을 안정적으로 구동하기에 충분합니다.


    “장치관리자에 HID 키보드 장치가 여러개 인데 어느게 내가 쓰고 있는 키보드인지 알 수있는 방법은?”

    장치 관리자에 똑같은 이름의 ‘HID 키보드 장치’가 여러 개 떠 있으면 내가 지금 타이핑하고 있는 진짜 키보드가 무엇인지 찾기 참 난감하죠. (이유는 마우스나 메인보드, 심지어 그래픽 카드 제어 프로그램까지도 매크로 기능을 위해 가짜 키보드 드라이버를 심어두기 때문입니다.)

    지금 손으로 누르고 있는 진짜 유선 키보드를 단 10초 만에 확실하게 찾아내는 3가지 방법을 알려드릴게요. 뒤로 갈수록 확실한 방법입니다.

    방법 1: “연결별 보기”로 변경하기 (가장 직관적)

    기본 장치 관리자 화면은 종류별로 묶여 있어서 찾기 어렵습니다. 메인보드의 USB 포트에 꽂힌 경로를 추적하면 쉽게 찾을 수 있습니다.

    1. 장치 관리자 상단 메뉴에서 [보기(V)] ➡️ [디바이스 연결별(V)]을 클릭합니다.
    2. 목록이 트리 구조로 바뀝니다. 여기서 ACPI x64 기반 PC ➡️ Microsoft ACPI-Compliant System 순으로 하위 메뉴를 계속 엽니다.
    3. 중간쯤 내려가다 보면 PCI Express 루트 복합체 아래에 Intel(R) USB 3.10 확장 가능한 호스트 컨트롤러(또는 AMD USB…)가 보입니다.
    4. 그 하위 트리를 열면 USB 루트 허브가 나오고, 거기에 현재 메인보드 USB 포트에 물리적으로 꽂혀 있는 진짜 유선 키보드 이름이 트리 구조로 명확하게 나타납니다.

    방법 2: 드라이버 “속성”에서 위치 확인하기

    여러 개의 HID 키보드 장치 중에서 진짜 전압과 신호를 주고받는 장치를 속성에서 걸러내는 방법입니다.

    1. ‘HID 키보드 장치’를 마우스 우클릭한 뒤 [속성]으로 들어갑니다.
    2. [일반] 탭 중간에 있는 ‘위치:’ 항목을 확인합니다.
    3. 가짜 프로그램 드라이버들은 위치가 알 수 없음이나 비어 있는 경우가 많습니다.
    4. 반면, 진짜 유선 키보드는 USB 입력 장치 또는 on USB Device라고 물리적인 포트 위치가 명확하게 적혀 있습니다.

    방법 3: 하드웨어 ID(속성) 확인하기 (가장 확실함)

    키보드 제조사에는 고유의 ID 코드가 있습니다. 이 코드를 확인하면 100% 구별할 수 있습니다.

    1. 아무 HID 키보드 장치나 우클릭 후 [속성]으로 들어갑니다.
    2. [자세히] 탭을 누른 뒤, 속성 드롭다운 메뉴에서 [하드웨어 ID]를 선택합니다.
    3. 아래 값(Value) 상자에 영어와 숫자가 섞인 문장이 뜹니다.
      • HID\VID_XXXX&PID_XXXX... 모양을 띱니다.
    4. 여기서 VID_ 뒤에 붙은 네 자리 숫자가 제조사 코드(Vendor ID)입니다.
      • 이 네 자리 코드를 구글에 USB VID XXXX라고 검색하면 어느 회사 제품인지 바로 나옵니다. 지금 책상 위에 두고 쓰시는 키보드 브랜드(예: Logitech, Corsair, 앱코 등)의 ID가 적힌 녀석이 바로 진짜 유선 키보드 장치입니다!

    💡 보너스 팁 (키보드 개조 DIY용)

    나중에 개조한 ESP32-C3 장치를 PC에 연결하게 되면, 드라이버 이름은 똑같이 ‘HID 키보드 장치’로 잡히더라도 방법 3을 통해 [하드웨어 ID]를 열어보면 고유 코드가 다르게 뜨기 때문에 내가 만든 스마트 스위치 장치만 귀신같이 골라내서 드라이버 관리를 하실 수 있습니다!

    ex) USB VID 046d 로지텍

  • [DIY 로봇 공학] 직접 만지며 가르치는 ‘학습형 로봇 팔(Direct Teaching)’ 구현 가이드: 왜 자석식 엔코더일까?

    [DIY 로봇 공학] 직접 만지며 가르치는 ‘학습형 로봇 팔(Direct Teaching)’ 구현 가이드: 왜 자석식 엔코더일까?

    안녕하세요! 오늘은 로봇 공학 DIY 프로젝트 중에서도 가장 흥미로운 주제 중 하나인 ‘학습형 로봇 팔(Direct Teaching Robot Arm)’ 구현에 대해 이야기해 보려고 합니다.

    학습형 로봇 팔이란, 사람이 로봇의 관절을 손으로 직접 잡고 원하는 동작(궤적)을 가르치면(녹화), 로봇이 그 동작을 그대로 기억했다가 무한 반복(재생)하는 똑똑한 시스템을 말합니다. 수천만 원짜리 산업용 협동 로봇(Cobot)에서 주로 쓰이는 이 메커니즘을 가성비 좋은 오픈소스 하드웨어로 구현하는 방법을 핵심만 콕 짚어 정리해 드립니다.

    1. 핵심은 위치 제어: 왜 스텝 모터가 아니라 ‘엔코더’인가?

    일반적인 3D 프린터나 소형 CNC는 스텝 모터를 주로 사용합니다. 제어가 쉽기 때문이죠. 하지만 ‘학습형 로봇 팔’을 만들 때는 스텝 모터가 큰 걸림돌이 됩니다. 스텝 모터는 센서 없이 컴퓨터의 명령대로만 움직이는 ‘오픈 루프(Open-loop)’ 방식이라, 전원을 끄고 사람이 손으로 돌리면 모터가 어느 방향으로 얼마나 움직였는지 제어기가 전혀 알 수 없습니다.

    반면, DC 모터에 엔코더(Encoder, 회전 감지 센서)를 결합한 시스템은 ‘클로즈 루프(Closed-loop)’ 방식으로 작동합니다. 모터가 움직이는 각도를 센서가 실시간으로 컴퓨터에 피드백해 주기 때문에, 모터 힘을 풀고 사람이 손으로 관절을 움직여도 그 움직인 궤적(각도 데이터)을 고스란히 기록할 수 있습니다.

    2. 광학식 vs 자기(자석)식 엔코더, 무엇을 써야 할까?

    엔코더에는 크게 프린터 등에서 자주 쓰이는 광학식(Optical)과 자석의 각도를 읽는 자기식(Magnetic) 두 가지가 있습니다. 결론부터 말씀드리면 학습형 로봇 팔에는 자기식 엔코더가 압도적으로 유리합니다.

    • 광학식 엔코더: 빛을 통과시키는 미세한 플라스틱 띠나 원판을 사용합니다. 정밀도는 매우 높지만 덩치가 크고, 먼지나 잉크 분진이 조금만 묻어도 오작동합니다. 또한 전원을 켤 때마다 항상 한쪽 끝으로 움직여 영점(Home)을 잡아야 하는 번거로움이 있습니다.
    • 자기식 엔코더 (강력 추천): 모터 축 끝에 소형 자석을 붙이고 센서가 자장의 각도를 읽는 방식입니다. 먼지나 기름 오염에 무적이며, 기구부가 매우 콤팩트해집니다. 무엇보다 ‘절대 각도(Absolute Position)’를 읽을 수 있어, 전원을 켜자마자 영점 조절 동작 없이 로봇 팔이 현재 몇 도를 바라보고 있는지 즉시 파악합니다.

    3. 학습형 로봇 팔 구현을 위한 추천 부품 라인업

    학습형 로봇 팔은 고속 회전이 필요 없습니다. 대신 로봇의 자체 무게를 버티는 토크(힘)와 전원이 꺼졌을 때 손으로 부드럽게 돌아가는 역구동성이 중요합니다. 이에 최적화된 가성비 조합을 추천합니다.

    부품 분류추천 부품 명칭핵심 선정 이유 및 팁
    메인 MCUESP32 시리즈
    (ESP32-C3 등)
    고속 PID 제어 연산이 가능하고, 메모리가 넉넉하여 학습 데이터(궤적 배열)를 안정적으로 처리 및 저장할 수 있습니다.
    관절 센서AS5600 자석식 엔코더12비트 해상도($360^\circ$를 4,096단계로 쪼갬, 약 $0.087^\circ$ 정밀도)를 지원하며, I2C 또는 아날로그 전압 출력으로 다루기 쉽습니다.
    구동 모터양축 감속 DC 모터
    (감속비 1:30 ~ 1:90 내외)
    저속에서 강력한 토크를 냅니다. ※주의: 전원을 꺼도 사람이 손으로 돌릴 수 없는 ‘웜 기어’는 피하고, 일반 황동/스틸 기어 박스가 달린 양축(Dual Shaft) 모터를 써야 뒤쪽 축에 엔코더 자석을 붙일 수 있습니다.
    모터 드라이버TB6612FNG 또는 L298NESP32의 PWM 신호를 받아 모터의 힘과 방향을 제어합니다. 티칭 모드 시 모터 전류를 완벽히 차단하여 관절을 ‘흐느적하게’ 릴리즈해 주는 역할을 합니다.

    4. 학습형 로봇 팔 작동 프로세스 (소프트웨어 알고리즘)

    전체 시스템은 크게 두 가지 모드로 전환되며 작동합니다.

    1단계: 티칭 모드 (동작 녹화)

    1. 사용자가 ‘녹화 시작’ 버튼을 누릅니다.
    2. ESP32가 모터 드라이버를 Standby 상태로 전환하여 모든 모터의 힘을 뺍니다. (로봇 팔이 흐느적해짐)
    3. 사람이 로봇 팔을 잡고 원하는 동작을 수행합니다.
    4. 모터가 사람 손에 의해 돌아가는 동안, 축 뒤에 달린 AS5600 센서가 실시간 관절 각도를 읽어 일정 주기(예: 20ms)마다 ESP32의 배열이나 SD 카드에 저장합니다.

    2단계: 재생 모드 (동작 재현)

    1. 사용자가 ‘재생 버튼’을 누릅니다.
    2. ESP32가 저장된 각도 데이터 배열을 첫 번째부터 순서대로 꺼냅니다.
    3. 이 데이터를 PID 제어 알고리즘의 목표값(Target)으로 설정하고 모터를 구동합니다.
    4. 로봇 팔이 사람이 가르쳐준 속도와 부드러운 궤적 그대로 똑같이 움직이며 작업을 무한 반복합니다.

    📝 마치며

    자석식 엔코더(AS5600)와 감속 DC 모터의 조합은 수십만 원짜리 스마트 서보 모터를 쓰지 않고도, 단돈 몇 천 원의 부품 조합으로 산업용 협동 로봇의 핵심 메커니즘을 내 방 책상 위에서 구현해 볼 수 있는 최고의 가성비 솔루션입니다.

    하드웨어 제어와 PID 알고리즘을 깊이 있게 공부해 보고 싶다면, 이번 주말 안 쓰는 구형 부품들과 AS5600 센서를 활용해 나만의 학습형 로봇 팔 만들기에 도전해 보시는 건 어떨까요?

    #로봇공학 #ESP32 #AS5600 #자석식엔코더 #로봇팔DIY #PID제어 #하드웨어해킹


    “학습은 DC모터와 자석식 엔코더로 하고 실제움직이기만 한 로봇팔은 서버모터나 스텝모터로 움직이게 하는 방식”

    그 아이디어는 로봇 공학에서 실제로 ‘마스터-슬레이브(Master-Slave) 시스템’ 또는 ‘모킹버드(Mockingbird) 방식’이라고 부르는 매우 훌륭하고 실용적인 접근법입니다!

    학습(입력)용 기기와 실제 구동(출력)용 기기를 물리적으로 분리하는 방식인데, 이 구조를 채택하면 아주 강력한 장점들이 생깁니다. 다만 구현 시 꼭 고려해야 할 역학적 문제도 존재합니다.

    장단점과 핵심 고려사항을 명확하게 정리해 드릴게요.

    1. 이 방식의 엄청난 장점 (Why 훌륭한가?)

    ① 하드웨어의 한계를 완벽히 극복

    실제 무거운 물건을 들고 일해야 하는 로봇 팔(슬레이브)은 강력한 힘(토크)을 내는 스텝 모터나 대형 서보 모터를 써야 합니다. 하지만 이런 모터들은 전원을 꺼도 기어나 자력 때문에 뻑뻑해서 사람이 손으로 부드럽게 움직일 수가 없습니다. 이때, 가볍고 흐느적거리는 ‘입력 전용 뼈대(마스터)’를 따로 만들어서 거기에 DC 모터(또는 모터도 없이 감속 기어와 자석식 엔코더만)를 달아두면, 사람은 힘을 전혀 들이지 않고 아주 부드럽고 정밀하게 동작을 가르칠 수 있습니다.

    ② 안전성과 작업 편의성

    실제 로봇 팔이 쇳덩어리거나 힘이 무지막지하게 강하다면, 티칭 하다가 오작동 시 사람이 다칠 수 있습니다. 하지만 입력용 장치는 플라스틱이나 3D 프린팅으로 가볍게 만들 수 있으므로 안전하고, 책상 앞에 편하게 앉아서 조종간을 움직이듯 녹화할 수 있습니다.

    2. 모터 종류별 매칭 시 고려할 점

    입력은 ‘DC 모터 + 자석식 엔코더(AS5600)’로 고정하고, 출력을 어떤 모터로 하느냐에 따라 성격이 달라집니다.

    1안: 출력층을 ‘스텝 모터’로 할 경우

    • 장점: 가격이 저렴하고 고정밀 제어가 가능합니다.
    • 주의점: 스텝 모터는 회전 각도를 계산할 때 ‘펄스(Pulse)’ 수로 제어합니다. 입력받은 자석식 엔코더의 절대 각도 데이터(예: 0∘→45∘→90∘)를 스텝 모터가 알아들을 수 있는 펄스 수(예: 0스텝 → 100스텝 → 200스텝)로 수학적 변환(매핑)해 주는 코드를 짜야 합니다.

    2안: 출력층을 ‘일반 RC 서보 모터(PWM 제어형)’로 할 경우 (추천)

    • 장점: 코딩이 가장 쉽습니다.
    • 이유: AS5600 센서가 읽은 각도값(0∼360∘)을 그대로 서보 모터의 제어 각도(0∼180∘ 또는 360∘)로 map() 함수를 통해 1:1로 다이렉트 매칭하기가 매우 수월합니다. DIY 스케일에서 가장 빠르게 결과물을 볼 수 있는 조합입니다.

    3. 구현할 때 반드시 발생하는 문제와 해결책

    ⚠️ ‘기하학적 일치(Geometry Matching)’의 문제

    사람이 움직이는 입력용 뼈대(마스터)의 팔 길이 비율과 실제 움직이는 로봇 팔(슬레이브)의 팔 길이 비율이 자로 잰 듯 정확히 똑같아야 합니다.

    • 만약 입력 장치의 팔은 짧은데 실제 로봇 팔이 길다면, 입력 장치를 조금만 움직여도 실제 로봇 팔 끝(그리퍼)은 엄청난 궤적을 그리며 튀어나가게 됩니다.
    • 해결책: 가장 좋은 것은 링크 구조와 길이를 1:1 쌍둥이처럼 똑같이 설계하는 것입니다. 만약 비율이 다르다면, 대학 로봇 공학에서 배우는 순기구학(Forward Kinematics)과 역기구학(Inverse Kinematics)을 코드에 넣어 좌표 계산을 해주어야 합니다.

    “학습용 ‘조종 로봇(마스터)’과 구동용 ‘일꾼 로봇(슬레이브)’을 분리하는 방식은 디즈니 연구소나 영화 촬영용 애니메트로닉스, 원격 수술 로봇에서 실제로 쓰는 프로페셔널한 방식입니다. 센서 가득한 가벼운 뼈대로 정밀하게 녹화하고, 실제 구동은 묵직한 스텝/서보 모터로 수행하는 구조는 DIY 로봇 프로젝트의 완성도를 한 차원 끌어올릴 수 있는 최고의 전략입니다.”


    “자석식 엔코더 부품 추천”

    전통적인 강자인 AS5600과 최근 오픈소스 로봇 및 자작 서보 공학(SimpleFOC 등)에서 엄청난 인기를 끌고 있는 차세대 센서 MT6701은 스펙상 꽤 큰 차이가 있습니다.

    결론부터 말씀드리면, “학습형 로봇 팔” 구현이 목적이라면 성능, 통신 속도, 확장성 모든 면에서 MT6701의 완승입니다. 왜 그런지 두 사양을 조목조목 비교해 드릴게요.

    1. AS5600 vs MT6701 핵심 사양 비교 테이블

    주요 스펙AS5600 (ams OSRAM)MT6701 (MagnTek)로봇 팔 구현 시 영향
    코어 해상도12-bit (4,096 단계)14-bit (16,384 단계)각도 데이터의 촘촘함 (4배 차이)
    최대 제어 각도약 0.087∘ 단위약 0.022∘ 단위미세한 관절 움직임 녹화 시 정밀도 차이
    지원 인터페이스I2C, PWM, AnalogI2C, SSI, ABZ(증분형), PWM, Analog관절 여러 개 연결 시 통신 확장성 차이
    신호 지연 (Delay)최대 약 10~100ms 내외 (필터 활성화 시)μs 미만 (최상급)PID 제어 루프가 돌 때 반응 속도와 진동에 직결
    최대 회정 속도저속 중심최대 30,000 RPM“고속은 필요 없다” 하셨으나 지연율과 직결됨
    부가 기능자석 거리 감지 (단순)Z축 Push (누름) 감지 기능버튼 없이 관절을 ‘꾹’ 눌러 티칭 모드 진입 가능
    가격대 (모듈 기준)약 1,500원 ~ 2,500원약 2,000원 ~ 3,500원거의 차이 없음 (가성비 최강)

    2. 왜 학습형 로봇 팔에는 MT6701이 더 좋을까?

    “고속일 필요가 없다”고 말씀하셨음에도 MT6701을 강력히 추천하는 이유는 ‘해상도’와 ‘신호 지연(전파 지연)’, 그리고 ‘다축 확장성’ 때문입니다.

    ① 4배 더 촘촘한 녹화 (14비트 해상도)

    사람이 손으로 로봇 관절을 아주 미세하게 1mm 조절할 때, AS5600(12비트)은 각도가 튀거나 뭉개져서 기록될 수 있습니다. 반면 MT6701은 14비트로 한 바퀴를 16,384단계로 쪼개기 때문에 사람 손의 미세한 떨림이나 부드러운 호를 그리는 미세 궤적까지 왜곡 없이 완벽하게 백업해 둡니다.

    ② PID 제어 시 진동 최소화 (초저지연)

    AS5600의 가장 큰 단점은 칩 내부의 노이즈 필터 때문에 발생되는 ‘미세한 신호 지연(Latency)’입니다. 각도를 읽고 반영하는 데 수 밀리초 이상 딜레이가 생기면, 재생 모드 시 모터가 목표 각도를 지나쳤다 돌아오는 오버슈트(흔들림, 진동 현상)가 생기기 쉽습니다. 반면 MT6701은 지연 시간이 2 μs(마이크로초) 미만이라 ESP32의 PID 제어 루프가 돌 때 딜레이 없이 칼같이 즉각 반응하므로 모터가 덜덜거리지 않고 아주 부드럽게 멈춰 섭니다.

    ③ 관절을 여러 개 달 때의 편의성 (인터페이스)

    다축 로봇 팔을 만들려면 센서를 3~4개 넘게 써야 하죠?

    • AS5600: I2C 고정 주소가 0x36 하나뿐이라, 센서를 여러 개 쓰려면 I2C 멀티플렉서(TCA9548A) 같은 추가 칩을 주렁주렁 달거나 아날로그 전압 방식으로 변환해야 해서 회로가 지저분해집니다.
    • MT6701: I2C 외에도 SSI(동기식 직렬 인터페이스)나 고성능 모터 드라이버가 바로 읽을 수 있는 ABZ 엔코더 신호를 지원합니다. 특히 SSI 방식을 쓰면 멀티플렉서 칩 없이 ESP32의 SPI 핀(CS 핀만 각각 분리)을 이용해 여러 개의 엔코더 값을 초고속으로 동시에 긁어올 수 있어 다축 로봇 구현이 훨씬 명쾌해집니다.

    ④ 신박한 기능: Z축 푸시 감지 (Contactless Push Button)

    MT6701은 자석이 센서 쪽으로 가까워지는 압력(거리 변화)을 감지해 ‘누름 버튼’ 기능을 임베디드로 지원합니다. 즉, 로봇 팔 관절 끝을 손가락으로 “꾹” 누르면 버튼처럼 인식되게 할 수 있습니다. 따로 티칭 모드 전환 버튼을 안 만들고, 로봇 팔 자체를 꾹 누르면 “녹화 시작”, 다시 꾹 누르면 “재생” 같은 스마트한 UI를 하드웨어 추가 없이 구현할 수 있습니다.

    3. 최종 요약 및 추천

    • AS5600을 쓰는 게 좋을 때: 기존에 다루던 오픈소스 코드나 아두이노 라이브러리 예제가 무조건 많고 직관적인 것을 원할 때, 단축(관절 1개) 짜리 간단한 테스트용 장치를 만들 때.
    • MT6701을 쓰는 게 좋을 때 (강력 추천): 관절이 3개 이상 들어가는 다축 로봇 팔을 깔끔하게 배선하고 싶을 때, 부드럽고 떨림 없는 고급 PID 제어를 구현하고 싶을 때, 손으로 티칭할 때 완벽한 해상도로 궤적을 따고 싶을 때.

    가격 차이도 거의 없기 때문에, 지금 시점에서 제대로 된 학습형 로봇 팔 프로젝트를 빌드하신다면 무조건 MT6701(특히 SSI 통신이나 ABZ 출력이 지원되는 모듈 버전)로 시작하시는 것을 적극 권장합니다!


    “로봇팔 소비전력 고려”

    실제로 하드웨어를 빌드하고 ‘동시에 여러 모터’를 구동하려고 하면, 책상 위에서 매끄럽게 돌아가기 위해 몇 가지 현실적인 하드웨어 요소와 전력 설계를 반드시 추가로 고려해야 합니다.

    가장 중요한 소비전력 계산법놓치기 쉬운 필수 고려 부품들을 정리해 드립니다.

    1. 소비전력 및 파워 서플라이(암페어) 계산

    로봇 팔이 동시에 4개의 모터를 구동한다고 가정하고 계산해 보겠습니다. (보통 3자유도 관절 + 1개 그리퍼 구조)

    ① 모터의 전류 소모 특성 이해 (핵심!)

    DC 모터는 회전할 때 소모하는 전류(Rated Current)와, 무거운 것을 들거나 억지로 멈춰 섰을 때 소모하는 ‘기동 전류(Stall Current, 정동 전류)’의 차이가 매우 큽니다.

    • 평상시 구동: 모터 1개당 보통 0.5A ~ 1.0A 소모.
    • 부하가 걸리거나 멈출 때(Stall): 순간적으로 1개당 2.0A ~ 3.0A 이상 치솟음.

    ② 몇 암페어(A) 파워가 필요할까?

    동시에 4개의 모터가 힘을 쓰며 움직이는 순간(Peak)을 버텨야 하므로, 파워 서플라이는 스탠다드 구동 전류의 합보다 훨씬 여유 있게 잡아야 합니다. 그렇지 않으면 모터가 동시에 돌 때 전압이 뚝 떨어져(Voltage Drop) MCU가 리셋되어 버립니다.

    • 안정적인 추천 사양: 12V / 5A ~ 10A (60W ~ 120W급) SMPS
    • 계산 근거:
      • 모터 4개 동시 구동 평균: 1A×4=4A
      • MCU 및 엔코더 센서류: 약 0.5A
      • 피크 타임 마진(여유율): 약 1.5∼2배

    💡 강력 추천: 아두이노용 소형 어댑터(12V 2A 이런 것)는 모터 2개만 동시에 돌아도 픽픽 꺼집니다. 안전하게 12V 5A 이상의 넉넉한 어댑터나 섀시형 SMPS 전원 공급 장치를 사용하는 것이 정신 건강에 좋습니다.

    2. 빼놓으면 안 되는 필수 부품 & 고려사항

    리스트업 하신 것 외에 실제 조립할 때 “아, 이것도 필요하네?” 하게 되는 필수 요소들입니다.

    ① 모터 드라이버 (Motor Driver)

    • MCU(ESP32 등)는 신호만 줄 뿐, 모터를 돌릴 큰 전류를 주지 못합니다. MCU의 명령을 받아 SMPS의 강력한 전기를 모터로 쏘아줄 모터 드라이버가 무조건 필요합니다.
    • 추천: TB6612FNG (듀얼 채널이라 칩 1개당 모터 2개 제어 가능, 발열 적음) 또는 전류가 높은 모터라면 IBT-2 같은 고전류 드라이버.

    ② 5V / 3.3V 전압 강하 모듈 (DCDC 버크 컨버터)

    • 모터는 강력한 12V 전원을 쓰지만, ESP32나 엔코더 센서(MT6701)는 5V 또는 3.3V로 작동합니다.
    • 12V 전원을 받아 MCU용 안전한 전원으로 깎아줄 LM2596 같은 버크 컨버터(Step-down Module)가 하나 있어야 전원을 한 군데서 깔끔하게 공급할 수 있습니다.

    ③ 다축 엔코더 통신을 위한 하드웨어 배선

    • MT6701 센서를 4개 쓸 때, I2C 통신 대신 SSI(SPI 기반) 통신을 쓰기로 했다면 MCU의 핀이 많이 필요합니다.
    • 센서마다 고유의 데이터 라인을 연결해야 하므로 배선이 복잡해집니다. 로봇 관절이 움직일 때 선이 꼬이거나 끊어지지 않도록 가동성이 좋은 부드러운 전선(실리콘 케이블)과 선을 정리할 케이블 타이/자석 슬리브가 필수적입니다.

    ④ 베어링 (Mechanical Bearing)과 카운터 웨이트

    • 기어드 모터의 축은 ‘회전’을 시키는 힘은 강하지만, 무거운 로봇 팔 뼈대가 위에서 누르는 ‘수직/수평 하중(axial/radial load)’을 직격으로 받으면 기어가 금방 갈려 나가거나 축이 휩니다.
    • 관절 축에는 모터와 별개로 하중을 버텨줄 볼 베어링(Bearing) 구조를 기구 설계(3D 프린팅 등)에 반영해야 부드럽게 움직이고 모터 수명이 오래갑니다. 또한 바닥 베이스는 모터가 움직일 때 로봇 팔이 쓰러지지 않도록 무겁게 만들거나 책상에 고정해야 합니다.

    3. 요약: 최종 체크리스트

    1. [x] 두뇌 & 센서 & 모터: ESP32 + MT6701 4개 + 양축 감속 DC 모터 4개
    2. [ ] 심장 (전원): 12V 5A 이상 SMPS 파워 공급 장치
    3. [ ] 근육 드라이버: TB6612FNG 모터 드라이버 2개 (모터 4개용)
    4. [ ] 혈관 (전압 분배): 12V를 5V/3.3V로 내려줄 DCDC 버크 컨버터 1개
    5. [ ] 관절 보강: 3D 프린팅 기구물에 끼워 넣을 소형 볼 베어링들

    이 정도 라인업만 갖추시면 전력 부족으로 멈추거나 기구가 삐걱거리는 일 없이, 손으로 가르치는 대로 칼같이 움직이는 멋진 다축 학습형 로봇 팔을 완벽하게 빌드하실 수 있습니다!

  • [JavaScript] fetch() 함수 완벽 정복: res와 data의 비밀 (feat. then 이어달리기)

    [JavaScript] fetch() 함수 완벽 정복: res와 data의 비밀 (feat. then 이어달리기)

    안녕하세요! 웹 개발을 하다 보면 서버에서 데이터를 가져오거나 보낼 일이 정말 많죠? 이때 자바스크립트에서 가장 기본적으로 사용하는 무기가 바로 fetch() 함수입니다.

    하지만 처음 fetch()를 접하면 코드가 왜 이렇게 생겼는지, .then() 안의 resdata는 대체 어디서 튀어나온 규칙인지 헷갈리기 마련입니다. 오늘 그 정체를 아주 직관적이고 시원하게 털어드리겠습니다!


    1. fetch()는 ‘2인 3각 이어달리기’다!

    fetch() 함수는 기본적으로 Promise라는 것을 반환합니다. 쉽게 말해 “비동기(나중에 완료될 작업)”로 움직인다는 뜻입니다. 그래서 뒤에 .then()을 붙여서 “이거 끝나면 다음 작업 해!”라고 이어달리기를 시킵니다.

    여기서 가장 중요한 핵심! fetch가 데이터를 가져오는 과정은 무조건 2단계를 거칩니다.

    🏃‍♂️ 1단계: 서버에서 ‘응답 봉투’ 받기

    JavaScript

    fetch()를 실행하면 컴퓨터는 네트워크를 타고 서버로 달려가서 ‘응답(Response) 객체’를 들고 돌아옵니다. 이 객체는 아직 우리가 읽을 수 있는 진짜 데이터(텍스트나 JSON)가 아니라, “연결이 잘 되었는지(200 OK)”, “서버 상태는 어떤지” 등이 적힌 일종의 ‘우편 봉투(헤더)’입니다.

    🏃‍♂️ 2단계: 봉투 열어서 ‘진짜 알맹이’ 꺼내기

    JavaScript

    봉투를 받았으니 안을 열어봐야겠죠? res.json()이나 res.text() 같은 메서드를 실행하면 브라우저가 봉투를 뜯고 내용물을 파싱합니다. 그 파싱이 끝난 진짜 내용물이 두 번째 .then()으로 넘어오게 됩니다.


    2. 💡 가장 많이 하는 오해: “res와 data는 예약어인가요?”

    아닙니다! 변수 이름은 여러분 마음대로 지으셔도 됩니다.

    많은 입문자분들이 괄호 안의 resdata를 자바스크립트의 문법이나 규칙으로 오해하곤 합니다. 하지만 이건 그냥 개발자들이 알아보기 쉽게 지어놓은 ‘매개변수(Parameter) 이름’일 뿐입니다.

    컴퓨터는 순서(1단계는 봉투, 2단계는 내용물)만 기억할 뿐, 이름은 신경 쓰지 않습니다. 아래 코드를 보세요. 변수 이름을 완전히 한글로 바꿔도 100% 똑같이 작동합니다.

    JavaScript

    • 첫 번째 괄호: 내가 ‘봉투’를 뭐라고 부를지 결정하는 자리 (res, response, bongtu 등)
    • 두 번째 괄호: 봉투를 열어젖힌 ‘내용물’을 뭐라고 부를지 결정하는 자리 (data, json, naeyong 등)

    3. 봉투를 여는 여러 가지 방법 (json, text, blob…)

    서버가 우리에게 글자를 보냈을 수도 있고, 사진을 보냈을 수도 있죠? 상황에 맞춰 첫 번째 .then()에서 봉투를 여는 도구를 골라야 합니다.

    메서드언제 쓰나요?다음 .then()이 받는 형태
    .json()서버가 JSON 구조(배열/객체)로 데이터를 줄 때 (가장 많이 씀!){ success: true, user: 'kim' } (JS 객체)
    .text()서버가 HTML이나 일반 텍스트 문장을 통째로 줄 때"안녕하세요!" (일반 문자열)
    .blob()이미지, PDF, ZIP 등 실제 ‘파일’을 다운로드할 때Blob (바이너리 파일 데이터)

    ⚠️ 주의: 봉투는 한 번만 열 수 있습니다! 한 코드 안에서 res.text()를 해버리면 봉투가 찢어져서(?) 그 밑에서 다시 res.json()을 쓸 수 없으니 데이터 성격에 맞는 것 딱 하나만 골라 쓰세요.


    4. 실전! 데이터를 서버로 보낼 때 (POST 요청)

    단순히 데이터를 가져오는 것(GET) 외에, 로그인이나 글쓰기처럼 서버로 데이터를 보낼 때(POST)는 fetch()의 두 번째 인자에 옵션 상자를 넣어줍니다.

    JavaScript


    📝 핵심 요약

    1. fetch()[1단계: 응답 봉투 받기] ➡️ [2단계: 봉투 열어 내용물 꺼내기] 구조이다.
    2. .then((res) => ...).then((data) => ...) 의 변수명은 개발자 마음대로 지어도 된다.
    3. 서버가 준 데이터 형식에 따라 .json() 또는 .text()로 봉투를 열어준다.
    4. 예외 처리를 위해 if (!res.ok)로 봉투의 상태를 먼저 점검하고, 마지막엔 .catch()를 붙여주는 것이 안전하다.

    이제 fetch 코드를 보셔도 절대 헷갈리지 않으시겠죠? 든든하게 단축키나 이벤트 리스너와 엮어서 멋진 웹 애플리케이션을 만들어보세요! 🚀



    단축형태

    JavaScript

    화살표 함수에서는 함수 내부가 딱 한 줄뿐이라면, 아래 두 가지를 세트로 생략할 수 있습니다.

    1. 중괄호 { }
    2. return 키워드

    중괄호를 없애면 자바스크립트가 알아서 “아, 이 한 줄의 실행 결과를 자동으로 return(반환)하라는 뜻이구나!”라고 똑똑하게 이해합니다.


    ⚠️ 주의할 점 딱 한 가지

    줄여 쓰실 때 가장 많이 하는 실수가 중괄호는 넣고 return은 빼먹는 것입니다.

    JavaScript

    중괄호 { }를 여는 순간, 자바스크립트는 자동으로 값을 반환하지 않습니다. 따라서 중괄호를 쓸 거라면 반드시 내부 코드에 return을 명시해 주어야 합니다.

    • 쓸 거면 다 쓰기: (res) => { return res.json(); }
    • 뺄 거면 다 빼기: (res) => res.json()