로그인회원가입

[카테고리:] 부품 리뷰

DIY 용 단일 부품 리뷰

  • INA226 초정밀 전력 모니터링 가이드: 소수점 단위까지 잡아내는 리얼타임 와트메타(Wattmeter) 만들기

    INA226 초정밀 전력 모니터링 가이드: 소수점 단위까지 잡아내는 리얼타임 와트메타(Wattmeter) 만들기

    1. 들어가며: “내 프로젝트, 전기를 얼마나 먹을까?”

    임베디드 프로젝트를 진행하다 보면 단순히 동작 여부를 넘어, 실제 소모 전력이 얼마나 되는지 궁금할 때가 많습니다. 특히 배터리로 구동되는 기기라면 ‘mA’ 단위의 미세한 차이가 기기의 수명을 결정짓죠. 오늘은 16비트 ADC의 강력한 성능을 가진 INA226 센서를 이용해, 단순한 전압 측정을 넘어 전력 소모의 흐름을 눈으로 직접 확인하는 초정밀 디지털 전력계를 만들어 보았습니다.

    2. 하드웨어 구성의 핵심: “데이터의 길목을 찾아라”

    이번 프로젝트에서 가장 중요한 부분은 INA226의 배선이었습니다. 시중의 모듈은 터미널 구멍이 여러 개라 헷갈리기 쉽지만, 테스터기를 이용해 직접 확인해 본 결과 2번(IN+)과 3번(IN-) 구멍이 션트 저항에 직접 연결된 핵심 경로임을 확인했습니다.

    • 제어기: ESP32-C3 (I2C 통신: SDA GPIO 0, SCL GPIO 1)
    • 센서: INA226 (High-side 측정 방식)
    • 디스플레이: SSD1306 OLED (128×64)
    • 부하(Load): LED 2개, 소형 DC 모터 (스위치로 개별 제어)

    3. 소프트웨어 구현

    단순히 숫자만 띄우는 것이 아니라, MicroPython을 이용해 데이터의 시인성을 극대화했습니다. OLED 화면에는 전압(V), 전류(mA), 전력(mW)을 소수점 자리까지 정밀하게 표기하고, 하단에는 현재 전력 소모량을 직관적으로 알 수 있는 **바 그래프(Bar Gauge)**를 구현했습니다.

    또한, PC의 **시리얼 플로터(Serial Plotter)**를 연동하여 스위치를 켤 때마다 전류가 계단식으로 상승하거나 모터에 부하가 걸릴 때 그래프가 요동치는 모습을 실시간으로 관찰할 수 있도록 설계했습니다.

    4. 프로젝트의 하이라이트: LED vs 모터

    실제 테스트 결과는 흥미로웠습니다.

    • LED 1개 점등: 안정적인 저전력 소모를 보여주며 그래프가 정지해 있는 느낌입니다.
    • 모터 가동: LED보다 훨씬 높은 전류를 소모하며, 특히 모터 축에 물리적인 부하를 주면 전류값이 즉각적으로 솟구치는 ‘피크 전류’ 현상을 INA226이 아주 예민하게 잡아냈습니다. 이는 가변저항 수치를 단순히 뿌려주는 것이 아니라, 진짜 흐르는 전기를 실시간으로 계측하고 있다는 증거입니다.

    5. 마치며: 정밀 측정의 즐거움

    INA226은 단순한 센서 그 이상이었습니다. 0.1mA의 미세한 변화까지 잡아내는 이 장치는 이제 제 책상 위에서 모든 프로젝트의 에너지 효율을 감시하는 ‘보디가드’ 역할을 하게 될 것입니다. 여러분도 직접 만든 장치로 보이지 않는 전기의 흐름을 제어해 보세요!

    빨간 동그라미 안의 두선이 전력측정선 부하에 직렬연결

    Python ina226.py

    Python wattmeter.py

  • 2.0 인치 TFT 디스플레이 ST7789V 성능리뷰

    2.0 인치 TFT 디스플레이 ST7789V 성능리뷰

    안녕하세요! 오늘은 마이크로컨트롤러(MCU) 프로젝트의 꽃, 디스플레이 업그레이드 이야기를 해보려 합니다. 최근 알리나 국내 오픈마켓에서 “2.0인치 OLED”라는 제목으로 팔리는 제품들, 아마 많이 보셨을 겁니다. 저도 이번에 스마트 부화기 프로젝트를 위해 하나 업어왔는데요. 결론부터 말씀드리면, 이건 OLED가 아니라 ST7789V 드라이버를 사용하는 TFT LCD입니다!

    하지만 실망하긴 이릅니다. 오히려 이 녀석, 제대로 다뤄보니 OLED보다 훨씬 매력적인 구석이 많거든요.

    1. “OLED라고 써있는데 왜 LCD인가요?”

    판매자들의 낚시성 제목에 속으셨나요? 괜찮습니다. 구조를 보면 명확합니다.

    • OLED: 소자 스스로 빛을 내어 백라이트가 없고 종이처럼 얇음. (번인 위험 있음)
    • TFT LCD: 뒤에서 LED가 빛을 쏴주는 백라이트 방식. (번인 걱정 없음!)

    24시간 내내 온도와 습도를 띄워야 하는 ‘스마트 부화기’ 같은 장치에는 오히려 화면이 타버릴 걱정 없는 TFT LCD가 신의 한 수입니다.


    2. 하드웨어 SPI: 고속도로를 타야 제맛!

    이 디스플레이의 핵심은 속도입니다. 보통 핀이 모자라다고 아무 핀에나 연결(Software SPI)하면 화면이 뚝뚝 끊기는 걸 보게 됩니다. 하지만 ESP32-C3의 **하드웨어 전용 핀(IOMUX)**을 사용하면 이야기가 달라집니다.

    • 권장 핀 배치 (ESP32-C3 SuperMini 기준):
      • SCK: GPIO 4 (전용 고속 통로)
      • MOSI: GPIO 6 (전용 고속 통로)
      • CS/DC/RES: GPIO 5, 7, 10 (비교적 자유로움)

    이렇게 연결하고 SPI 속도를 60MHz로 설정하면, MicroPython 환경에서도 초당 60프레임급의 부드러운 애니메이션을 감상할 수 있습니다.


    3. “깜빡임(Flicker)과의 전쟁”에서 승리하는 법

    처음 코드를 짜면 숫자가 바뀔 때마다 화면이 깜빡거려 눈이 아플 수 있습니다. 이건 ‘지우고(Black) -> 새로 쓰기(Text)’ 과정에서 검은색이 우리 눈에 잔상으로 남기 때문인데요.

    해결책은 ‘배경색 동시 출력’입니다. tft.text(font, "12:30", x, y, WHITE, BLACK) 처럼 글자색과 배경색을 한 번에 쏘면, 기존 글자를 지울 필요 없이 덮어씌워지기 때문에 깜빡임이 0%가 됩니다. 마치 고급 스마트워치 같은 부드러움을 느낄 수 있죠.


    4. 실전! 벽돌깨기 게임으로 증명하는 퍼포먼스

    단순히 수치만 띄우기엔 이 LCD의 성능이 아깝습니다. 하드웨어 SPI의 극한을 테스트하기 위해 벽돌깨기 게임을 돌려보았습니다.

    • 잔상 제거 팁: 공이 벽에 부딪힐 때 미세하게 남는 빨간 점들은 좌표 계산의 오차 때문입니다. 공이 벽을 뚫고 나가지 않도록 좌표를 강제로 고정(ball_x = WIDTH - size)해주면 아주 깨끗한 화면을 유지할 수 있습니다.

    5. 마무리하며: 2편 예고

    이번 1편에서는 2인치 TFT LCD의 정체를 밝히고, 하드웨어 SPI를 통한 성능 최적화까지 알아보았습니다.

    “작은 OLED의 답답함에서 벗어나, 240×320 고해상도의 시원시원한 화면을 보니 이제야 프로젝트 할 맛이 나네요!”

    이어지는 2편에서는 이 화면 아래에 ToF(거리 측정) 센서 3개를 연동하여 실시간 데이터를 멋지게 시각화하는 과정을 공유해 드리겠습니다. 핀이 부족할 것 같다고요? I2C 버스의 마법을 기대해 주세요!

    ※ 부록: 성능을 결정짓는 SPI 전용 핀 가이드

    ESP32-C3 SuperMini는 핀 수가 적지만, 내부적으로 **IOMUX(Input/Output Multiplexer)**라는 고속 도로가 특정 핀에 깔려 있습니다. 이 ‘전용석’을 지키느냐 아니냐에 따라 LCD의 주사율이 천차만별로 달라집니다.

    1. SPI 전용 핀 테이블 (성능 최우선)

    LCD 핀 이름ESP32-C3 핀 (GPIO)역할변경 가능 여부이유
    SCL (SCK)GPIO 4시리얼 클럭변경 불가 (고수)60MHz급 고속 신호를 낼 수 있는 하드웨어 전용 라인
    SDA (MOSI)GPIO 6데이터 송신변경 불가 (고수)화면의 픽셀 데이터를 쏘는 핵심 통로
    RES (RST)GPIO 2 리셋 신호자유롭게 변경 가능화면을 껐다 켤 때만 쓰므로 속도와 상관없음
    DC (RS)GPIO 3 데이터/명령 선택자유롭게 변경 가능제어 신호용이라 일반 GPIO 아무 곳이나 OK
    CSGPIO 1 칩 선택자유롭게 변경 가능통신 시작 시 한 번만 신호를 주면 됨

    2. 왜 4번과 6번을 사수해야 하나요?

    ESP32-C3의 내부 구조상, GPIO 4와 6은 CPU를 거치지 않고 메모리에서 디스플레이로 직접 데이터를 쏘는 IOMUX 경로를 탑니다.

    만약 핀이 부족하다고 0번이나 1번으로 SPI 핀을 옮기게 되면, 데이터가 내부 교환기(GPIO Matrix)를 한 번 더 거치게 되어 신호 지연이 발생합니다. 결과적으로 60MHz로 설정해도 실제로는 그 절반의 속도도 내기 힘들고, 화면에 미세한 노이즈나 끊김이 발생할 수 있습니다.

    🔍 심화 학습: 왜 I2C는 자유롭고, SPI는 까다로운가?

    배선을 하다 보면 “I2C는 0, 1번으로 옮겨도 괜찮은데, 왜 SPI는 꼭 전용 핀을 쓰라고 할까?”라는 궁금증이 생깁니다. 이는 ESP32-C3 내부의 데이터 배달 경로 차이 때문입니다.

    1. I2C: “천천히 가도 줄만 잘 서면 되는 우편물”

    I2C 통신(센서용)은 보통 400kHz(0.4MHz) 속도로 움직입니다.

    • 내부 구조: ESP32-C3 내부에는 ‘GPIO 매트릭스’라는 거대한 교환기가 있습니다.
    • 성능 유지 비결: I2C는 워낙 느린 신호라 이 교환기를 거쳐서 어떤 핀으로 나가더라도 데이터가 뭉개지거나 지연될 걱정이 없습니다. CPU 부하도 하드웨어 컨트롤러가 알아서 처리하므로 8, 9번 기본 핀이 아닌 0, 1번으로 옮겨도 하드웨어 가속 성능이 100% 유지됩니다.

    2. SPI: “초고속으로 달려야 하는 전용 고속도로”

    반면, 우리가 LCD에 사용하는 SPI는 **60MHz(60,000kHz)**라는 어마어마한 속도로 데이터를 쏩니다. I2C보다 무려 150배나 빠릅니다.

    • IOMUX(고속도로): 60MHz급 초고주파 신호는 내부 교환기(GPIO Matrix)를 거치면 신호가 감쇄되거나 노이즈가 생겨 통신이 끊깁니다. 그래서 CPU와 핀이 직접 연결된 IOMUX라는 ‘직통 고속도로’를 타야만 합니다.
    • 전용석의 마법: GPIO 4(SCK)와 6(MOSI)이 바로 그 고속도로 진입로입니다. 이 자리를 벗어나 다른 핀으로 SPI를 강제 할당(Software SPI 등)하면, 내부 교환기를 거치느라 속도가 20MHz 이하로 급감하거나 CPU가 직접 핀을 제어해야 해서 전체 시스템이 느려지게 됩니다.

    💡 요약하자면?

    통신 방식주요 용도속도 체감핀 전략
    I2C거리/온도 센서거북이 (느림)아무 핀이나 OK! 하드웨어 성능 저하 없음.
    SPI고해상도 LCD슈퍼카 (매우 빠름)전용 핀(4, 6) 필수! 옮기면 화면이 뚝뚝 끊김.

  • 1mm의 정밀함! 레이저 거리 센서 VL53L0X 초보 가이드 (1/2)

    1mm의 정밀함! 레이저 거리 센서 VL53L0X 초보 가이드 (1/2)

    안녕하세요! 오늘은 스마트 부화기 프로젝트의 쓰일 VL53L0X ToF(Time-of-Flight) 거리 센서를 ESP32-C3에 연결하고 정밀도를 높이는 과정을 공유합니다. 기존의 초음파 센서보다 훨씬 작고 정확한 이 녀석, 어떻게 다루는지 함께 보시죠.


    1. 사용 부품 소개

    이번 프로젝트에 사용된 주요 하드웨어입니다.

    • MCU: ESP32-C3 SuperMini
      • 초소형 사이즈에 Wi-Fi와 Bluetooth를 지원하며, RISC-V 아키텍처 기반으로 가성비가 매우 뛰어난 보드입니다.
    • Sensor: VL53L0X (ToF 방식)
      • Time-of-Flight(빛의 비행시간) 원리를 이용합니다. 보이지 않는 적외선 레이저를 쏘고 반사되어 돌아오는 시간을 측정해 거리를 계산합니다.
      • 장점: 초음파 센서(HC-SR04)처럼 소리에 의존하지 않아 주변 소음이나 공기 흐름에 강하고, mm 단위의 정밀한 측정이 가능합니다.
    • Display: 0.96″ SSD1306 OLED
      • I2C 통신을 통해 실시간 거리 데이터를 시각화합니다.
    • 기타: 90도 꺾임 헤더 핀, 브레드보드, 점퍼 와이어.

    2. 하드웨어 팁: 왜 90도 핀(Right Angle)인가?

    보통 센서를 사면 일자형 헤더 핀이 들어있지만, 저는 90도 꺾임 핀을 별도로 준비해 납땜했습니다.

    • 이유: 일자형 핀을 브레드보드에 꽂으면 센서가 하늘을 보게 됩니다. 하지만 90도 핀을 쓰면 센서가 브레드보드 정면을 바라보게 되어, 사물과의 거리를 측정하는 실험 환경을 만들기 훨씬 수월합니다.
    • 주의: 일반 핀을 펜치로 꺾으면 길이가 짧아져 접촉 불량이 생기니, 꼭 기성품 90도 핀을 사용하세요!

    3. 회로 구성 (Wiring)

    ESP32-C3의 I2C 핀은 자유롭게 설정 가능하지만, 저는 관리가 편하도록 아래와 같이 연결했습니다.

    센서/OLED 핀ESP32-C3 핀역할
    VCC (VIN)3.3V전원 공급
    GNDGND접지
    SCLGPIO 0I2C 클럭 라인
    SDAGPIO 1I2C 데이터 라인

    4. 소프트웨어 트러블슈팅: ImportError 해결

    MicroPython 환경에서 PC용 라이브러리를 그대로 쓰면 ImportError: no module named 'ctypes'라는 에러를 만나게 됩니다.

    • 해결책: ESP32의 가벼운 메모리에 맞게 설계된 경량화된 MicroPython 전용 드라이버를 사용해야 합니다. ctypes 모듈 없이 machine.I2C만으로 작동하는 코드를 적용하여 문제를 해결했습니다.

    5. 정밀도 높이기: 오프셋 보정과 필터링

    레이저 센서라고 해서 완벽하진 않습니다. 테스트 결과 두 가지 보정이 필요했습니다.

    1. 오프셋(Offset) 보정: 실제 거리보다 약 20mm(2cm) 정도 길게 측정되는 경향이 있어, 코드에서 raw_distance - 20을 해주어 영점을 잡았습니다.
    2. 지터(Jitter) 제거: 숫자가 미세하게 떨리는 현상을 잡기 위해 **가중 평균 필터(Low Pass Filter)**를 적용했습니다.
      • smooth_dist = (alpha * current_raw) + ((1 - alpha) * smooth_dist)
      • 이 공식을 통해 OLED의 바 그래프가 아주 부드럽게 움직이도록 만들었습니다.

    6. 결과 확인 (Thonny 플로터)

    Thonny의 Plotter 기능을 켜면 실시간으로 거리 변화가 그래프로 그려집니다. 손을 센서 앞에 가져다 대면 반응 속도가 얼마나 빠른지, 그리고 필터가 얼마나 부드럽게 작동하는지 한눈에 확인할 수 있습니다.


    마치며

    이번 1편에서는 단일 센서의 기초 설정과 최적화 방법을 알아봤습니다. mm 단위로 딱딱 끊어지는 데이터를 보니 벌써 부화기 프로젝트가 반쯤 성공한 기분이네요!

    이어지는 2편에서는 오늘 배운 내용을 바탕으로 I2C 주소 충돌을 해결하고 센서 3개를 동시에 제어하는 멀티 센서 시스템을 구축해 보겠습니다.

    Python vl53l0x.py

  • ESP32와 원형 LCD(GC9A01)를 활용한 실감 나는 로봇 눈 만들기 (feat. MicroPython)

    ESP32와 원형 LCD(GC9A01)를 활용한 실감 나는 로봇 눈 만들기 (feat. MicroPython)

    1.28 인치 7PIN 8PIN SPI TFT LCD 모듈 GC9A01 

    프로젝트 개요: 왜 원형 LCD인가?

    일반적인 사각형 디스플레이와 달리 GC9A01 원형 TFT LCD는 로봇의 눈을 표현하기에 최적화된 형태를 가집니다. 하지만 두 개의 고해상도(240×240) 화면을 동시에, 그것도 자연스럽게 구동하는 데는 여러 기술적 난관이 있었습니다.

    🛠️ 주요 문제 해결 및 기술적 포인트

    1. SPI 통신 속도 최적화 (60MHz의 발견)

    초기에는 통신 안정성을 위해 낮은 속도를 고려했으나, 고해상도 이미지를 실시간으로 뿌리기엔 역부족이었습니다.

    • 해결: SPI 클럭 속도를 60MHz로 설정하여 데이터 전송 병목 현상을 해결했습니다. 신호가 더 날카롭고 정확하게 전달되면서 화면 깨짐 없이 부드러운 프레임 전환이 가능해졌습니다.

    2. 하드웨어 리셋(Reset) 핀의 분리

    두 디스플레이의 리셋 핀을 하나로 묶었을 때 발생하는 초기화 오류를 해결했습니다.

    • 해결: 각 LCD에 독립적인 리셋 핀을 할당하고, 순차적으로 tft.reset()을 수행하여 컨트롤러가 확실하게 명령을 인식하도록 개선했습니다.

    3. 노이즈 없는 깨끗한 부팅 (Zero-Noise Start)

    전원을 넣을 때 비디오 램(VRAM)의 무작위 데이터 때문에 나타나는 ‘지직거리는 노이즈’를 잡았습니다.

    • 해결: 하드웨어 리셋 직후, 눈 이미지를 그리기 전에 tft.fill(0) 명령으로 화면을 검은색으로 즉시 초기화하는 로직을 추가하여 고급스러운 부팅 시퀀스를 완성했습니다.

    4. 시차 없는 동기화: 인터리빙(Interleaving) 기법

    왼쪽 눈을 다 그리고 오른쪽 눈을 그리면 발생하는 미세한 시차(약 0.1~0.2초)는 로봇의 생동감을 떨어뜨립니다.

    • 해결: 전체 이미지를 한 번에 보내지 않고, 20줄씩 번갈아 가며(Interleaving) 양쪽 눈에 쏘는 방식을 도입했습니다. 이를 통해 우리 눈에는 양쪽 눈이 동시에 움직이는 것처럼 보이는 완벽한 동기화를 구현했습니다.

    5. 코믹한 감정 표현 (윙크 및 사시 동작)

    단순한 시선 이동을 넘어 로봇에게 성격을 부여했습니다.

    • 기능: 한쪽 눈의 통신만 열어 수행하는 윙크, 그리고 좌우 이미지를 교차하여 시선을 모으거나 벌리는 코믹 사시(Eye Gag) 패턴을 랜덤으로 배치해 생동감을 더했습니다.

    💡 연결 시 주의사항 (Troubleshooting Tips)

    1. 전력 공급: ESP32의 3.3V 출력은 디스플레이 두 개를 감당하기에 충분하지만, 점퍼 와이어가 너무 길거나 헐거우면 전압 강하로 인해 화면이 떨릴 수 있습니다. 가급적 짧고 굵은 선을 사용하세요.
    2. 공유 핀 vs 독립 핀: * SCL, SDA, DC는 두 디스플레이가 사이좋게 나눠 쓰는 공유 핀입니다.
      • CS와 RES는 각 눈을 따로 제어하기 위한 독립 핀입니다. (이걸 합치면 어제 겪으셨던 초기화 지옥이 다시 찾아옵니다!)
    3. BL (Backlight) 핀: 만약 8핀 모듈을 사용 중이시라면 BL 핀을 3.3V에 직접 연결하거나, 남는 GPIO에 연결해 밝기 조절(PWM) 용도로 쓰실 수 있습니다. (7핀 모듈은 내부적으로 VCC에 묶여 있어 생략 가능합니다.)

    “SPI 통신의 효율을 극대화하기 위해 클럭과 데이터 라인은 공유하되, 각 디스플레이의 개별 제어를 위해 CS와 Reset 라인을 분리하여 하드웨어적 안정성을 확보했습니다.”

    라이브러리 gc9a01.py 다운로드

    Python gc10.py

  • I2C 주소 똑같아도 상관없음! 멀티플랙서 TCA9548A 사용법

    I2C 주소 똑같아도 상관없음! 멀티플랙서 TCA9548A 사용법

    I2C 주소가 같은 ssd1306 5개를 esp32-c3 mini 에 연결해서 구동하려고 한다. 어떻게 연결해야 하나?

    1. I2C 주소 문제 (0x3C, 0x3D)

    일반적인 SSD1306 모듈은 뒷면의 저항(Jumper) 위치를 옮겨서 주소를 0x3C 또는 0x3D 중 하나로 설정할 수 있습니다.

    • 결론: 동일한 I2C 버스 하나에는 최대 2개까지만 직접 연결할 수 있습니다.
    • 우리는 5개를 연결해야 하므로, 단순히 병렬로 연결하는 것만으로는 불가능합니다.

    2. 해결 방법: I2C Multiplexer (TCA9548A) 사용

    가장 깔끔하고 권장되는 방법은 TCA9548A 같은 I2C 확장 모듈을 사용하는 것입니다.

    • 원리: 이 칩은 1개의 I2C 입력을 받아 8개의 독립된 I2C 채널(선택 가능)로 분리해 줍니다.
    • 연결 방식: ESP32-C3의 I2C 핀을 TCA9548A에 연결하고, 각 OLED를 TCA9548A의 SD0/SC0부터 SD4/SC4까지 하나씩 연결합니다.
    • 장점: 코드가 매우 단순해지며 전압 관리도 수월합니다.

    3. 멀티플렉서 없이 연결하는 방법 (S/W I2C 또는 Multi-Bus)

    부품을 추가하고 싶지 않다면 두 가지 대안이 있습니다.

    A. 소프트웨어 I2C (Bit-banging)

    ESP32-C3는 핀 매핑이 자유롭습니다. 5개의 디스플레이를 위해 각각 다른 GPIO 쌍을 사용하는 방식입니다.

    • 핀 소모: SDA 5개 + SCL 1개(공통) = 총 6개의 핀 필요.
    • 단점: CPU 부하가 늘어나고 화면 업데이트 속도가 느려질 수 있습니다.

    B. 공통 SCL + 개별 SDA 방식

    SSD1306 라이브러리(u8g2 등)에서 SDA 핀을 각각 다르게 설정하여 5개의 인스턴스를 생성합니다.

    • ESP32-C3 GPIO 예시:
      • SCL: GPIO 8 (공통)
      • SDA1: GPIO 0, SDA2: GPIO 1, SDA3: GPIO 2, SDA4: GPIO 3, SDA5: GPIO 4

    4. 회로 연결 가이드 (TCA9548A 기준 권장)

    ESP32-C3 MiniTCA9548ASSD1306 (5개)
    3.3VVINVCC (모두 연결)
    GNDGNDGND (모두 연결)
    GPIO 8 (SCL)SCL
    GPIO 10 (SDA)SDA
    SD0~SD4각 OLED의 SDA에 하나씩 연결
    SC0~SC4각 OLED의 SCL에 하나씩 연결

    ⚠️ 주의사항

    1. 전류 소모: OLED 5개를 동시에 켜면 전류 소모가 상당합니다. ESP32-C3 Mini의 3.3V 출력 핀만으로는 부족할 수 있으니, 외부 3.3V 전원을 사용하는 것이 안정적입니다.
    2. 메모리(RAM): ESP32-C3는 RAM이 넉넉한 편이지만, 128×32 해상도 버퍼 5개를 동시에 유지하면 메모리 압박이 올 수 있습니다. u8g2 라이브러리의 _F_(Full Buffer) 모드 대신 _1_ 또는 _2_ (Page Buffer) 모드 사용을 권장합니다.

    Pythone PCA9548A.py


  • 왜 내 OLED는 얼룩덜룩해질까? 수명을 2배 늘리는 팁 (feat. PIR sensor)

    왜 내 OLED는 얼룩덜룩해질까? 수명을 2배 늘리는 팁 (feat. PIR sensor)

    OLED 번인 방지: PIR 센서로 디스플레이 수명 늘리는 법

    OLED 디스플레이의 최대 단점인 밝기 저하와 번인 현상! 장시간 화면을 켜두었을 때 발생하는 얼룩덜룩한 잔상을 방지하기 위해, PIR 인체감지 센서를 활용하여 사람이 있을 때만 화면이 켜지게 만드는 스마트한 해결 방법을 소개합니다.


    ※📱 OLED의 원리와 치명적인 약점: 왜 번인이 생길까?

    1. OLED란 무엇인가? (Organic Light Emitting Diode)

    OLED는 ‘유기 발광 다이오드’의 약자로, 화면 뒤에서 빛을 쏴주는 백라이트가 필요한 LCD와 달리 소자 하나하나가 스스로 빛을 내는(자발광) 방식입니다.

    • 완벽한 블랙: 빛을 아예 꺼버릴 수 있어 무한대의 명암비를 자랑합니다.
    • 얇은 두께: 백라이트가 없어 디스플레이를 매우 얇게, 심지어 종이처럼 휠 수도 있습니다.

    2. 치명적인 단점: 번인(Burn-in)과 수명

    하지만 OLED는 **’유기물’**을 태워서 빛을 냅니다. 마치 촛불처럼 켜두면 서서히 타들어 가며 수명이 줄어듭니다.

    • 밝기 불균형: 특정 픽셀만 계속 켜져 있으면 그 부분의 소자가 다른 곳보다 빨리 노화되어 어두워집니다.
    • 잔상(Ghosting): 화면을 꺼도 예전 모습이 얼룩처럼 남는 현상입니다. 특히 고정된 UI(시계, 메뉴바)가 있는 DIY 프로젝트에서 자주 발생합니다.

    3. 실제 1~2개월만 계속 켜놔도 OLED가 아래처럼 얼룩덜룩 된 사례

    왼쪽: 정상, 중앙:상시 켜논 화면, 오른쪽: 번인현상으로 밝기 불균형

    ※🛠️ 공학적 해결책: PIR 센서와의 만남

    OLED의 수명을 늘리는 가장 확실한 방법은 **”필요할 때만 켜는 것”**입니다. 하지만 매번 버튼을 누르기는 귀찮죠. 이때 PIR(Passive Infrared) 센서가 훌륭한 대안이 됩니다.

    PIR 센서란?

    적외선을 통해 사람의 움직임을 감지하는 센서입니다. 현관문 자동등에 쓰이는 바로 그 센서입니다!

    작동 알고리즘 (PIR + OLED)

    1. 감지 모드: PIR 센서가 주변의 움직임을 감시합니다. (OLED는 Off 상태로 수명 보존)
    2. 활성화: 사람이 다가오면 센서가 신호를 보내고, MCU(아두이노, ESP32 등)가 즉시 OLED를 켭니다.
    3. 자동 종료: 설정한 시간 동안 움직임이 없으면 다시 OLED를 꺼서 소자를 보호합니다.

    “OLED의 선명함은 포기할 수 없지만, 번인이 걱정된다면 PIR 센서를 달아보세요. 하드웨어적인 보호 수단 하나가 여러분의 디스플레이 수명을 2배, 아니 10배까지도 늘려줄 것입니다. 이번 프로젝트를 통해 똑똑하고 오래가는 DIY 기기를 만들어보시길 바랍니다!”


    1. PIR 센서란? (Passive Infrared)

    • Passive(수동형): 센서가 스스로 빛이나 에너지를 쏘는 게 아니라, 외부에서 들어오는 적외선 에너지를 ‘받기만’ 하기 때문에 붙여진 이름입니다.
    • 작동 원리: 모든 생명체(사람, 동물)는 열을 방출하며, 이 열은 적외선 형태로 나타납니다. PIR 센서 안에는 두 개의 적외선 감지 소자가 있는데, 사람의 움직임으로 인해 두 소자에 들어오는 적외선 양에 차이가 생기면 “사람이 있다!”라고 판단하고 신호를 보냅니다.

    2. 왜 하얀색 축구공 모양인가요? (프레넬 렌즈)

    센서 위를 덮고 있는 올록볼록한 반구 모양은 단순한 덮개가 아니라 **’프레넬 렌즈(Fresnel Lens)’**입니다.

    • 주변의 적외선을 한곳으로 모아주고, 감지 범위를 넓혀주는 역할을 합니다.
    • 이 렌즈 덕분에 아주 작은 센서 하나로도 수 미터 앞의 움직임을 포착할 수 있습니다.

    3. 주요 조절 장치 (뒷면 가변 저항)

    보통 센서 뒷면에는 작은 나사(가변 저항)가 두 개 있습니다.

    • Sensitivity (감도): 감지 거리를 조절합니다 (약 3m ~ 7m).
    • Delay Time (지연 시간): 움직임이 감지된 후 얼마나 오랫동안 신호를 유지할지 결정합니다 (5초 ~ 5분).
      • OLED 프로젝트 팁: 지연 시간을 10~20초 정도로 설정하면 사람이 자리를 떠나고 잠시 후에 화면이 꺼지게 할 수 있어 자연스럽습니다.

    4. OLED 수명 연장에 왜 최고인가요?

    • 초저전력: 센서 자체가 전기를 거의 안 먹어서 24시간 켜두어도 부담이 없습니다.
    • 비접촉: 버튼을 누를 필요가 없어 기기 마모가 없고 위생적입니다.
    • 확실한 효과: “사람이 없을 땐 끄고, 있을 때만 켠다”는 로직을 통해 OLED 소자의 발광 시간을 물리적으로 줄이는 가장 효율적인 방법입니다.

    5. PIR 센서는 온도 변화에 민감합니다. (주의)

    • 에어컨 실외기 근처나 햇빛이 너무 강하게 드는 곳에 OLED 장치를 두면, 사람이 없어도 화면이 제멋대로 켜질 수 있습니다.

    🐍 최종 코드

    Python

    🐍 OLED 전면 점등 테스트 코드 (ESP32-C3)

    Python

  • 폐프린터 버리지 마세요! 스텝모터 재활용하기 (L298N)

    폐프린터 버리지 마세요! 스텝모터 재활용하기 (L298N)

    폐 프린터에서 추출한 모터는 Japan Servo KP39EM2-011 스텝 모터였습니다.

    **일본 서보(JAPAN SERVO CO., LTD.)**에서 제조한 바이폴라(Bipolar) 타입의 스텝 모터입니다. 정확한 모델명은 KP39EM2-011 (EM-240 시리즈)입니다.


    1. 주요 스펙 (Label 정보 분석)

    • Step Angle (보폭): 1.8 DEG/STEP입니다. 즉, 한 바퀴(360도)를 도는 데 200스텝이 필요합니다.
    • 타입: 일반적으로 4개의 선이 나오는 바이폴라 방식입니다.
    • 크기: NEMA 14 또는 17 사이즈보다 약간 작거나 슬림한 타입일 가능성이 높으며, 주로 정밀한 위치 제어가 필요한 프린터, 스캐너, 소형 자동화 기기에 사용됩니다.

    2. L298N 연결

    이 모터는 17HS4011과 제어 방식이 동일합니다.

    3. 배선 찾기 (가장 중요!)

    이 모터는 보통 4가닥의 전선이 연결됩니다. 색상만으로 판별하기 어려울 때는 멀티미터(테스터기)로 통전 테스트를 해서 짝을 찾아야 합니다.

    • A상 짝: 선 두 개를 찍었을 때 저항값이 측정되는 한 쌍 (예: 검정-초록) -> L298N의 IN1, IN2 쪽 연결.
    • B상 짝: 나머지 저항값이 측정되는 한 쌍 (예: 빨강-파랑) -> L298N의 IN3, IN4 쪽 연결.

    ⚠️ 사용 시 주의사항

    • 전압/전류: 이 모델(EM-240 계열)은 정격 전압이 낮고 전류 소모가 작을 수 있습니다. L298N으로 구동할 때 모터가 너무 뜨거워진다면 전압을 낮추거나 코드의 delay를 조절해야 합니다.
    • 정밀도: 1.8도 스텝 각도를 가지고 있어 위치 제어가 매우 정확합니다. 과학상자 로봇의 팔을 움직이거나 정밀하게 전진/후진할 때 아주 좋습니다.

    Python step.py

    ** 저소음을 기대하고 pwm 를 사용한 코드. 그다지 효과는 없습니다.

    Python step_pwm.py

  • HDD 스핀들 모터, L298N으로 돌려봤더니… 결과는?

    HDD 스핀들 모터, L298N으로 돌려봤더니… 결과는?

    오늘의 프로젝트는 폐하드드라이브 추출 모터 구동 테스트입니다. 결론부터 말씀드리면 ‘절반의 성공, 절반의 실패’입니다. L298N의 전압 강하와 스텝 신호의 한계 때문에 하드디스크 특유의 초고속 회전(7200RPM)을 구현하기엔 역부족이었습니다. 실패를 통해 배운 BLDC 모터의 특성을 공유합니다.

    Python spin.py : Test code

    1. BLDC vs Stepper: “스핀들 모터는 3상 BLDC 방식이라, 일반적인 H-브리지 드라이버로는 위상 제어가 정교하지 못하다.”
    2. L298N의 한계: “L298N은 전압 강하(1.2V∼3V)가 커서 고속 모터에 전력을 밀어주기 힘들다.”

    ※ ESC 드라이버 원리

    하드드라이브 스핀들 모터 테스트에서 왜 L298N이 실패했는지, 그 해답은 바로 **ESC(Electronic Speed Controller, 전자 변속기)**의 작동 원리에 있습니다.

    스핀들 모터는 일반적인 모터와 달리 3상 BLDC(Brushless DC) 모터입니다. 이 모터를 돌리려면 단순히 전기를 주는 게 아니라, 아주 정교한 ‘타이밍’이 필요합니다.


    1. ESC의 핵심 역할: “전자식 브러시”

    일반 DC 모터는 내부에 물리적인 브러시가 있어 회전할 때 알아서 전극을 바꿔줍니다. 하지만 BLDC(Brushless) 모터는 이름 그대로 브러시가 없습니다. 대신 ESC가 3개의 선(U, V, W)에 번갈아 가며 전류를 흘려 가상의 회전 자기장을 만들어줍니다.

    2. 작동 원리 (3상 제어)

    ESC는 내부의 MCU와 MOSFET을 사용해 다음 과정을 초고속으로 수행합니다.

    1. 전류 스위칭: 3개의 코일에 120∘씩 위상차를 두고 전류를 공급합니다. (U→V, V→W, W→U 방식)
    2. 역기전력(Back-EMF) 감지: 모터가 돌 때 발생하는 미세한 전기를 감지하여, 현재 자석(로터)이 어디쯤 있는지 파악합니다. (센서리스 방식)
    3. 피드백 루프: 자석의 위치에 딱 맞춰서 다음 코일에 전기를 흘려줍니다. 이 타이밍이 어긋나면 모터가 덜덜거리기만 하고 돌지 않습니다.

    3. 왜 L298N으로는 제 성능이 안 났을까?

    ‘제 속도가 안 나는 현상’의 기술적인 이유는 이렇습니다.

    • 제어 방식의 한계: L298N은 단순히 전압을 줬다 뺐다 하는 H-브리지 방식입니다. 스핀들 모터처럼 수천 RPM으로 도는 모터의 ‘역기전력’을 계산해서 타이밍을 맞추는 기능이 없습니다.
    • 스위칭 속도: HDD 모터는 7,200RPM 이상으로 돕니다. 이를 위해선 초당 수천 번 전극을 바꿔야 하는데, 일반적인 코딩(Soft PWM)이나 L298N의 반응 속도로는 이 속도를 따라갈 수 없습니다.
    • 전압 강하: L298N 내부의 바이폴라 트랜지스터는 열로 에너지를 많이 소비하여, 모터에 충분한 전류를 전달하지 못합니다.

    4. ESC를 쓰면 달라지는 점

    만약 저가형 알리발 ESC(예: HW-30A 등)나 전용 BLDC 드라이버 칩을 사용하시면:

    1. 자동 타이밍: 모터의 회전 위치를 스스로 파악해 최적의 효율로 밀어줍니다.
    2. 고속 회전: 하드디스크 특유의 “키이이잉~” 하는 고주파 소리와 함께 초고속 회전을 볼 수 있습니다.
    3. 간편한 제어: 마이크로파이썬에서 PWM 신호(서보모터와 동일한 방식) 하나만 보내면 속도 조절이 끝납니다.

    5. “L298N은 스핀들 모터의 ‘눈(역기전력 감지)’ 역할을 못 해주기 때문에 눈 감고 달리는 것과 같다”

    ※ pc팬에 있는 자기장 홀센서를 달아서 회전수를 측정해서 u,w,v 변환속도를 조절하게 하면 되지 않을까?

    이론적으로는 맞지만 실제로 고급 BLDC 모터들은 **홀 센서(Hall Effect Sensor)**를 내부에 3개 달아서 자석의 위치를 정확히 파악하고 전기를 넣어줍니다. 이를 ‘센서드(Sensored) BLDC’ 방식이라고 합니다.

    1. 왜 가능하지만 어려운가?

    1) 속도의 장벽 (CPU의 한계) HDD 모터는 보통 7,200 RPM입니다. 초당 120바퀴를 돌죠.

    • 3상 제어를 하려면 한 바퀴 돌 때 전극을 6번 바꿔줘야 합니다. (120×6=720번/초)
    • 홀 센서 신호를 받아서(Interrupt), 계산하고, L298N에 신호를 쏘는 이 과정을 1.3ms(밀리초) 안에 완벽하게 끝내야 합니다.
    • 마이크로파이썬은 인터프리터 방식이라 이 정도 속도로 실시간 피드백을 처리하면 타이밍이 조금만 어긋나도 모터가 “드르륵” 하며 멈춰버립니다.

    2) 홀 센서 배치(정렬) 문제 PC 팬은 이미 센서가 최적의 위치에 고정되어 있지만, 하드디스크 모터는 센서가 없습니다.

    • 홀 센서를 120∘ 간격으로 아주 정밀하게 배치해야 합니다. 1mm만 틀어져도 위상(Phase)이 꼬여서 효율이 떡락하거나 열만 발생합니다.

    3) L298N의 느린 응답속도 L298N 내부의 소자(Bipolar Transistor)는 켜고 꺼지는 속도가 최신 MOSFET에 비해 느립니다. 고속 스위칭을 하려고 하면 신호가 뭉개져서 모터에 제대로 된 힘을 전달하지 못합니다.

    ※ 홀센서 3개나 달 필요없이 하나만 달아도 회전수는 나오니까 회전수에 비례해서 u,w,v 전환속도만 올려주면 되지 않을까?

    1. 회전수만 알면 안 되는 이유: “타이밍(Phase)”

    모터가 도는 속도를 알아서 그에 맞춰 전극 전환 속도($Hz$)를 올리는 건 가능합니다. 하지만 자석이 지금 어디 있는지 모르면 이런 상황이 발생합니다.

    • 최악의 시나리오: 자석이 코일 앞에 딱 왔을 때 밀어줘야 하는데, 타이밍이 안 맞아서 자석을 뒤에서 잡아당기는 위치에서 전기를 주게 될 수도 있습니다.
    • 결과: 모터가 회전력을 얻는 게 아니라, 서로 밀고 당기다가 진동만 커지고 열이 나면서 멈춰버립니다(탈조 현상).

    2. 홀센서 1개의 한계

    홀센서가 1개라면 “한 바퀴 도는 데 10ms 걸렸네?”라는 건 알 수 있지만, 지금 이 순간 자석이 U번 코일에 있는지 V번 코일에 있는지는 알 수 없습니다.

    • 3개일 때: 각 센서가 $120^\circ$ 마다 신호를 주므로, “지금 자석이 V번 통과했으니 U번에 전기를 줘!”라고 실시간 지시가 가능합니다.
    • 1개일 때: “방금 자석이 지나갔어! 근데 그다음은… 음… 아마 이 속도면 지금쯤 V번 근처겠지?”라고 추측해서 전기를 줘야 합니다.

    [Image showing the 6-step commutation sequence of a BLDC motor compared to a single hall sensor pulse]

    3. “오픈 루프” 가속 방식 (Open-loop Acceleration)

    사실 주인장님이 말씀하신 방식은 실제 산업 현장에서도 씁니다. 센서 없이 일단 박자에 맞춰서 억지로 돌리는 방식이죠.

    1. 낮은 주파수에서 모터를 강제로 부들부들 떨게 하며 출발시킵니다.
    2. 모터가 박자를 타기 시작하면 서서히 주파수를 올립니다.
    3. 문제점: 조금만 속도를 빨리 올리거나 부하가 걸리면 박자를 놓치고(탈조) 바로 멈춥니다.

    🚀 시도해볼 만한 코드 로직 (MicroPython)

    만약 정말 해보고 싶으시다면, 홀센서 1개를 Interrupt로 잡아서 **’한 바퀴 도는 시간(T)’**을 계산한 뒤, 다음 바퀴에서 T/6 시간마다 전극을 바꾸는 코드를 짜볼 수는 있습니다.

    Python

    ※ 보다 빠른 아두이노 C 언어로 짜면 좀 더 나을까?

    1. C언어로 짜면 나아지는 점 (Software 측면)

    • 인터럽트 속도: 센서 신호가 들어오자마자 반응하는 속도가 파이썬보다 수십 배 빠릅니다.
    • 직접 제어: digitalWrite 대신 레지스터를 직접 건드리는 방식을 쓰면 나노초(ns) 단위로 전극을 바꿀 수 있어 박자를 놓칠 확률이 줄어듭니다.
    • 정밀 타이밍: micros() 함수를 이용해 자석의 위치를 훨씬 정교하게 예측할 수 있습니다.

    2. 하지만 여전히 안 되는 이유 (Hardware 측면)

    문제는 L298N 드라이버 자체에 있습니다.

    • 스위칭 손실 (Heat): L298N은 구식 바이폴라 트랜지스터 방식이라, 고속으로 켰다 껐다 하면 내부 저항 때문에 엄청난 열이 발생하고 전압이 깎입니다. 모터에 충분한 에너지가 전달되지 않습니다.
    • 역기전력(Back-EMF) 처리 불가능: 7,200 RPM으로 돌면 모터에서 엄청난 역전기가 발생합니다. 전용 ESC는 이 전기를 활용하거나 제어하는데, L298N은 이를 그냥 열로 태워버리거나 칩이 타버릴 수 있습니다.
    • 위상 전환의 한계: 최고 속도에 도달하려면 단순히 전기를 주는 게 아니라, 회전 속도에 맞춰 전기를 주는 시점을 앞당기는 ‘진각(Timing Advance)’ 제어가 필요한데, 이걸 생으로 코딩하는 건 거의 박사 학위 수준의 난이도입니다.

    최종결론: “돌릴 수는 있으나 제 성능을 발휘하려면 전용 ESC(전자 변속기)나 전용 드라이버 칩이 필요하다”

  • WiFi의 한계를 넘어, ESP32-C3와 무선 모듈의 만남

    WiFi의 한계를 넘어, ESP32-C3와 무선 모듈의 만남

    ESP32-C3는 뛰어난 가성비와 RISC-V 아키텍처, 그리고 강력한 내장 WiFi/Bluetooth 기능으로 많은 메이커의 사랑을 받고 있습니다. 하지만 실제 프로젝트 하다 보면 한계에 부딪히곤 합니다.

    “벽 하나만 통과해도 끊기는 WiFi 거리, 배터리를 순식간에 갉아먹는 전력 소모까지…”

    이런 고민을 해결하기 위해 우리는 ESP32-C3의 내장 기능을 넘어 외부 무선 전용 모듈로 눈을 돌려야 합니다. 오늘 포스팅에서는 ESP32-C3의 적은 핀으로도 효율적으로 연결할 수 있는 CC1101, CC1120, CC1200, LoRa, 그리고 CC1310까지, 5종의 무선 모듈을 전격 비교해 보겠습니다. 내 프로젝트에 ‘딱’ 맞는 무선 솔루션은 무엇일까요? 지금 바로 확인해 보시죠.

    ** 무선 모듈 5종 스펙 비교 (ESP-NOW vs Sub-1GHz)

    프로젝트의 성패는 내 상황에 맞는 ‘주파수’와 ‘칩셋’을 고르는 데 있습니다. 속도가 중요한 영상 전송인지, 거리가 중요한 원격 제어인지 아래 표를 통해 확인해 보세요.

    [한눈에 보는 무선 모듈 비교표]

    항목ESP-NOW (내장)CC1101CC1120 / CC1200LoRa (SX1276)CC1310
    주요 주파수2.4GHz433 / 868 / 915MHz433 / 868 / 915MHz433 / 915MHz433 / 868 / 915MHz
    최대 속도~4 Mbps (매우 빠름)~600 kbps~1 Mbps~37.5 kbps (매우 느림)~4 Mbps
    통신 거리약 100~200m약 300~500m약 1km 이상최대 5~10km약 1km 이상
    소비 전력높음 (80~300mA)매우 낮음 (15~30mA)낮음 (20~40mA)낮음 (10~20mA)낮음 (15~30mA)
    특징추가 비용 없음가성비 최고, 입문용고성능, 신뢰성 위주초장거리, 저속 데이터멀티 프로토콜 지원

    ** 모듈별 상세 분석: 내 프로젝트에는 무엇이 좋을까?

    ① ESP-NOW: “추가 비용 제로, 빠른 속도”

    ESP32-C3 내장 WiFi 기능을 활용합니다. 별도의 모듈 연결이 필요 없어 회로가 깔끔합니다.

    • 장점: 속도가 빨라 저해상도 이미지 전송이 가능합니다.
    • 단점: WiFi 대역(2.4GHz)을 써서 장애물(벽)에 약하고 전기를 많이 먹습니다.

    ② CC1101: “가성비와 저전력의 교과서”

    가장 대중적인 Sub-1GHz 모듈입니다.

    • 장점: 가격이 저렴하고 ESP32-C3의 3.3V 핀으로도 충분히 구동됩니다. 조종기 배터리를 오래 쓰고 싶을 때 최고의 선택입니다.
    • 단점: 거리가 LoRa만큼 길지는 않습니다.

    ③ CC1120 / CC1200: “전문가급 성능과 신뢰성”

    CC1101의 상위 버전으로, 통신 신뢰성이 매우 높습니다.

    • 장점: 데이터 전송 속도가 빠르면서도 수신 감도가 좋아 장애물 투과력이 뛰어납니다. 산업용 로봇 제어에 적합합니다.

    ④ LoRa (SX127x): “거리에 모든 것을 걸었다”

    속도를 포기하는 대신 거리를 극한으로 끌어올린 방식입니다.

    • 장점: 수 킬로미터 밖에서도 명령을 전달할 수 있습니다.
    • 단점: 속도가 너무 느려 실시간 조이스틱 반응이 약간 답답할 수 있고, 영상 전송은 절대 불가능합니다.

    ⑤ CC1310: “차세대 무선 통신의 올인원”

    강력한 성능의 SoC(System on Chip) 기반 모듈입니다.

    • 장점: Sub-1GHz 대역임에도 불구하고 매우 빠른 전송 속도를 자랑합니다. 저전력과 고속 통신 두 마리 토끼를 잡고 싶을 때 선택합니다.

    ** 핵심 요약: 선택 가이드

    • “돈 안 들이고 근거리에서 로봇을 조종하고 싶다”ESP-NOW
    • “조종기 배터리가 오래가야 하고 전선 연결이 간편해야 한다”CC1101
    • “로봇이 보이지 않는 아주 먼 곳까지 보내고 싶다”LoRa
    • “데이터 양도 많고 거리도 포기할 수 없다”CC1200 / CC1310

    ** ESP32-C3와 CC1101을 연결하는 회로도와 마이크로파이썬 예제 코드를 통해 무선 통신을 직접 구현해 보겠습니다!

    모듈 2개를 사서 하나는 ‘송신기(Transmitter)’, 다른 하나는 ‘수신기(Receiver)’로 설정하면 완벽한 무선 통신 시스템이 됩니다.

    CC1101 433MHz 무선 모듈은 TI(Texas Instruments) 사의 칩을 기반으로 한 RF 송수신 장치입니다. 로봇카를 조종하거나 멀리 떨어진 센서의 데이터를 받을 때 아주 유용합니다.

    SMA(안테나 커넥터) 모델은 교체 가능한 안테나를 달 수 있어, 일반 스프링 안테나보다 **훨씬 긴 전송 거리(최대 300~500m 이상)**를 확보할 수 있는 상급 모델입니다.

    1. 주요 특징 및 용도

    • 트랜시버(Transceiver): 송신과 수신이 모두 가능합니다. 로봇에 달면 명령을 받을 수도 있고, 현재 배터리 상태(INA219 값)를 나에게 다시 보낼 수도 있습니다.
    • 강력한 투과력: 2.4GHz(WiFi/Bluetooth)보다 주파수가 낮은 433MHz 대역을 써서 벽이나 장애물을 훨씬 잘 통과합니다.
    • SMA 안테나: 돌려서 끼우는 방식의 안테나를 사용합니다. 안테나를 큰 것으로 바꾸면 도달 거리가 수 킬로미터까지 늘어나기도 합니다.

    2. 하드웨어 연결 (ESP32-C3와 SPI 통신)

    CC1101은 SPI 인터페이스를 사용합니다. ESP32-C3와 다음과 같이 연결하세요.

    CC1101 핀ESP32-C3 핀설명
    VCC3.3V주의: 5V 금지 (칩 타버림)
    GNDGND공통 접지
    SCKPin 4SPI Clock
    MISO(GDO1)Pin 5SPI Master In (데이터 받기)
    MOSIPin 6SPI Master Out (데이터 보내기)
    CSNPin 7Chip Select (장치 선택)
    GDO0Pin 2데이터 수신 알림용 (인터럽트)

    3. 마이크로파이썬 사용 방법

    마이크로파이썬에서 CC1101을 제어하려면 SPI 라이브러리를 사용해야 합니다.

    Python

    꿀팁: CC1101은 설정할 레지스터가 수십 개로 매우 복잡합니다. 직접 코딩하기보다는 GitHub에서 micropython-cc1101 라이브러리를 다운로드하여 사용하는 것을 강력 추천합니다.


    4. 주의사항 (사용 전 필독!)

    1. 안테나 미연결 금지: 안테나(SMA)를 끼우지 않은 상태에서 전원을 넣고 **송신(Transmit)**을 하면, 밖으로 나가지 못한 전파 에너지가 칩으로 되돌아와 모듈이 타버릴 수 있습니다. 반드시 안테나를 먼저 조립하세요.
    2. 전압 주의: CC1101은 3.3V 전용입니다. 보조배터리 12V를 직접 연결하면 안 되며, 반드시 ESP32-C3의 3.3V 출력 핀이나 별도의 강압 회로를 거쳐야 합니다.
    3. 법적 규제: 433MHz 대역은 국내에서 출력과 사용 용도에 제한이 있을 수 있습니다. 취미용 로봇 제어(소출력)는 괜찮지만, 너무 큰 안테나로 출력을 높여 다른 통신을 방해하지 않도록 주의해야 합니다.

    ** CC1101의 상급(상위) 제품군

    CC1101이 “가성비 보급형”이라면, 더 먼 거리나 더 정밀한 통신을 위한 상위 모델들이 있습니다.

    상위 모델특징 및 차이점추천 용도
    CC1120성능 라인 (Performance Line). CC1101보다 수신 감도가 훨씬 좋아 통신 거리가 비약적으로 깁니다.1km 이상의 장거리 통신
    CC1200최신 고속 라인. 데이터 전송 속도가 최대 1Mbps로 빠르고, 최신 무선 표준(802.15.4g)을 지원합니다.고성능 로봇 제어 및 데이터 전송
    LoRa (SX1276/78)장거리 끝판왕. CC1101과 같은 대역을 쓰지만 기술 방식이 달라 수 킬로미터(10km+) 전송이 가능합니다.산악 지형이나 초장거리 무선 조종
    CC1310 (SoC)두뇌 통합형. CC1101 기능에 ARM Cortex-M3 CPU가 합쳐진 칩입니다. 별도의 ESP32 없이 이 칩 하나로 로봇 제어와 무선을 다 합니다.초소형/저전력 통합 시스템

    전송 속도 및 영상/소리 가능 여부 비교

    모델명최대 전속 속도영상 전송 가능 여부소리(음성) 전송 가능 여부
    CC1101약 600 kbps불가능 (초당 0.1프레임 미만)매우 낮은 음질 (무전기 수준 이하)
    CC1120약 200 kbps불가능불가능
    CC1200약 1,000 kbps (1Mbps)초저해상도 스틸컷 가능무전기 수준 (64kbps 이하)
    LoRa (SX1276)약 37.5 kbps절대 불가능불가능
    CC1310약 4,000 kbps (4Mbps)아주 거친 흑백 영상 가능가능 (단, 프로그래밍 매우 어려움)

    [ESP32-C3 상태별 소비전력 비교 (평균)]

    상태 (Mode)평균 전류 (mA)전력 (3.3V 기준)특징
    CPU Only (RF Off)약 20 ~ 25mA~80mWWiFi/BT를 완전히 끄고 연산만 할 때
    WiFi Active (TX)약 190 ~ 335mA~1W영상 스트리밍, 데이터 업로드 중 (피크치 높음)
    WiFi Active (RX)약 80 ~ 90mA~280mW데이터 수신 대기 중
    ESP-NOW (Active)약 70 ~ 120mA~300mW직접 통신 중 (WiFi보다 오버헤드가 적음)
    Modem-sleep약 15 ~ 20mA~50mWWiFi 연결은 유지하되 무선 회로만 잠시 끔
    Deep-sleep약 5 ~ 10µA~0.03mW타이머 외 모든 기능 정지 (초절전)

    [CC1101 소비전력 상세 (3.3V 기준)]

    상태 (Mode)소비 전류 (mA)비고
    송신 (TX)약 12 ~ 30mA출력 설정(-30dBm ~ +10dBm)에 따라 다름
    수신 (RX)약 15 ~ 17mA데이터가 오길 기다리는 상태
    대기 (Idle)약 1.7mA회로는 켜져 있으나 송수신 안 함
    절전 (Sleep)약 0.2 ~ 0.4µA초절전 상태. 거의 0에 가까움

    1. ESP-NOW vs CC1101 전력 비교

    로봇카 제어 신호를 주고받을 때, 무선 모듈 자체의 전력 소모 차이는 어마어마합니다.

    • ESP-NOW (C3 내장 WiFi 활용): 수신 대기 시에도 최소 80mA 이상 소모.
    • CC1101: 수신 대기 시 15mA 내외 소모.
    • 결론: 무선 통신만 놓고 보면 CC1101이 ESP-NOW보다 약 5~6배 더 배터리에 유리합니다.

    2. 왜 이렇게 차이가 날까요?

    • 주파수의 특성: 2.4GHz(WiFi)는 초당 처리해야 할 데이터 양이 많고 회로가 복잡해 기본 전력이 많이 듭니다. 반면 433MHz 대역을 쓰는 CC1101은 구조가 단순하고 저속 통신에 최적화되어 있습니다.
    • 프로토콜의 가벼움: WiFi는 통신을 유지하기 위해 뒤에서 계속 패킷을 주고받아야 하지만, CC1101은 평소엔 완전히 잠들어 있다가 필요할 때만 찰나의 순간에 전기를 쓰고 다시 잠들 수 있습니다.

  • NEMA 17부터 28BYJ-48까지: 내 프로젝트에 딱 맞는 스텝모터 고르기

    NEMA 17부터 28BYJ-48까지: 내 프로젝트에 딱 맞는 스텝모터 고르기

    1. 스텝모터 3종 토크 비교표

    모델명최대 토크 (Holding Torque)크기 (두께)특징
    17HS4401약 40 ~ 45 N·cm40mm (표준)가장 강력함. 
    17HS4023약 14 ~ 15 N·cm23mm (슬림)가벼움. 
    28BYJ-48약 3 ~ 4 N·cm19mm (원형)매우 약함. 내부 감속기가 있어 느림

    2. 상세 분석

    ① 17HS4401 (대장급)

    • 힘: 세 모델 중 압도적으로 강합니다.
    • 조합: TMC2209 드라이버의 성능을 100% 끌어낼 수 있습니다.

    ② 17HS4023 (경량급)

    • 힘: 17HS4401의 약 1/3 수준입니다.
    • 용도: 로봇 팔에 쓰인다면 맨 끝에 달리는 그리퍼(집게) 부분에 쓰기 좋습니다. 끝부분이 무거우면 아래쪽 모터들이 힘들어하기 때문입니다.

    ③ 28BYJ-48 (초미니급)

    • 힘: 17HS4401의 약 1/10 수준밖에 안 됩니다.
    • 주의점: 이 모터는 아두이노 입문용으로 유명하지만, 내부에 플라스틱 기어가 들어있어 무거운 걸 억지로 돌리면 기어가 갈려버릴 수도 있습니다. 전압도 보통 5V나 12V 전용이라 TMC2209와 궁합을 맞추기도 까다롭습니다.

    ** NEMA 17 모터(특히 17HS4401)를 돌리기 위해 가장 많이 쓰이는 드라이버 4종을 비교해 드릴게요.


    1. 모터 드라이버 4종 비교표

    모델명최대 전류 (Peak)마이크로스테핑소음 수준주요 특징
    A49882.0A1/16매우 큼가장 저렴함, 입문용 표준
    DRV88252.5A1/32높은 전압(45V) 견딤, 강한 힘
    TMC22082.0A1/256매우 조용스텔스촙(저소음) 기술의 시작
    TMC22092.8A1/256최고로 조용센서리스 홈밍, 낮은 발열

    2. 드라이버별 상세 특징

    ① A4988 (가성비 끝판왕)

    • 장점: 가격이 매우 저렴하고 설정이 단순합니다. 고장 나도 부담이 없습니다.
    • 단점: 모터가 돌 때 “삐~” 하는 고주파 소음과 진동이 심합니다.
    • 추천: 소음 상관없이 일단 저렴하게 구동해보고 싶을 때 사용하세요.

    ② DRV8825 (고전압/고출력)

    • 장점: A4988보다 조금 더 큰 전류를 흘릴 수 있고, 32분주(1/32)를 지원해 움직임이 조금 더 부드럽습니다.
    • 단점: 여전히 소음이 있고, 전류 설정(Vref)이 조금 까다롭습니다.

    ③ TMC2208 (조용한 사무실용)

    • 장점: 모터 소리가 거의 안 들릴 정도로 조용해집니다. (StealthChop2 적용)
    • 단점: 방열판을 제대로 안 붙이면 열이 많이 나서 멈출 수 있습니다.

    ④ TMC2209 (로봇 팔 최적의 선택)

    • 장점: 2208보다 힘(전류)이 더 좋고 발열은 적습니다. 특히 StallGuard(센서리스 홈밍) 기능이 있어, 로봇 팔이 끝까지 가서 부딪히면 스스로 멈추게 설정할 수 있습니다. (별도의 스위치가 필요 없음)
    • 단점: 다른 드라이버들에 비해 가격이 가장 비쌉니다.

    ** ESP32-C3 와 TMC2209 연결시 주의사항

    1. 전압 차이 주의 (3.3V vs 5V)

    • ESP32-C3: 신호선 전압이 3.3V입니다.
    • 드라이버(TMC2209 등): 보통 로직 전압으로 3.3V와 5V를 모두 지원하지만, 모터를 돌리는 주 전원(VM)은 12V~24V를 따로 넣어줘야 합니다.
    • 주의: ESP32-C3의 핀에 실수로 12V 전원이 닿으면 보드가 즉사하므로 배선할 때 전원 분리를 확실히 해야 합니다.

    2. TMC2209와의 찰떡궁합: UART 제어

    ESP32-C3는 핀 수가 적은 편이지만, UART 통신을 지원합니다. TMC2209 드라이버를 UART 모드로 연결하면 다음과 같은 엄청난 장점이 생깁니다.

    • 소프트웨어로 전류 조절: 드라이버의 가변저항을 드라이버로 돌릴 필요 없이, 코딩으로 모터 힘(전류)을 조절할 수 있습니다.
    • 세밀한 설정: StealthChop(저소음)과 SpreadCycle(고출력) 모드를 상황에 따라 실시간으로 바꿀 수 있습니다.

    3. 추천 배선 전략

    ESP32-C3는 핀(GPIO) 개수가 제한적이므로 효율적으로 나눠 써야 합니다.

    • STEP / DIR 핀: 각 모터당 2개의 핀이 필요합니다. (3축 로봇 팔이면 6개 사용)
    • UART 핀: 한 개의 UART 채널로 여러 개의 TMC2209를 묶어서 제어할 수 있습니다. (주소 설정 방식)
    • 전원: 12V 5A 이상의 **SMPS(전원 공급 장치)**를 사용해 모터에 힘을 실어주고, ESP32-C3용으로는 5V 강압 회로(Buck Converter)를 쓰는 것이 가장 안정적입니다.

    ** STEP/DIR, UART

    쉽게 비유하자면 **Step/Dir은 ‘운전대와 액셀’**이고, **UART는 ‘차량 설정 메뉴(내비게이션 설정)’**라고 보시면 됩니다.


    1. Step / Dir (실시간 주행 신호)

    모터를 실제로 움직이게 만드는 **’실시간 명령’**입니다.

    • Step (발걸음): 이 핀에 신호(Pulse)를 한 번 줄 때마다 모터가 한 칸(Step) 움직입니다. 신호를 빨리 주면 모터가 빨리 돌고, 천천히 주면 느리게 돕니다.
    • Dir (방향): 이 핀에 신호를 넣느냐(High) 빼느냐(Low)에 따라 시계 방향으로 돌지, 반시계 방향으로 돌지가 결정됩니다.

    2. UART (스마트한 관리 및 설정)

    TMC2209의 똑똑한 기능들을 **’프로그래밍’**으로 제어하기 위한 통신로입니다. 원래 드라이버들은 드라이버로 나사를 돌려서 전류를 맞추거나 점퍼선을 꽂아야 했는데, UART가 있으면 코딩으로 다 해결됩니다.

    • 전류 제어: “지금은 로봇 팔이 물건을 안 들고 있으니까 전류를 낮춰서 열을 식히자” 같은 명령이 가능합니다.
    • 모드 변경: “지금은 정밀해야 하니까 StealthChop(저소음) 모드로 해” 혹은 “지금은 힘이 세야 하니까 SpreadCycle 모드로 바꿔”라고 지시할 수 있습니다.
    • 상태 모니터링: “지금 모터가 막혔어(Stall)?” 혹은 “드라이버가 너무 뜨거워?” 같은 정보를 ESP32-C3가 물어보고 답변을 받을 수 있습니다.

    3. 두 핀을 같이 쓰는 이유

    로봇 팔을 만들 때는 보통 두 방식을 병행합니다.

    1. 동작은 Step/Dir로: AccelStepper 같은 라이브러리를 써서 부드럽게 가속/감속하며 움직입니다.
    2. 설정은 UART로: 처음에 전원이 켜질 때 모터의 힘(전류)을 설정하거나, 센서리스 홈밍(부딪히면 멈추기) 민감도를 설정할 때 사용합니다.

    💡 팁: ESP32-C3에서 UART 연결 시

    TMC2209 한 개당 UART 핀 하나씩 다 연결할 필요가 없습니다. UART 핀 하나에 저항을 이용해서 여러 대의 드라이버를 병렬로 연결하고, 소프트웨어에서 각 드라이버의 ‘주소(Address)’를 지정해 호출하는 방식을 주로 씁니다. (핀 아끼기에 최고죠!)

    4종류의 드라이버 중에서 **소프트웨어(코딩)로 설정을 주무를 수 있는 건 TMC2209(및 TMC2208)**뿐입니다.

    나머지 구형 드라이버들과 어떻게 다른지 비교해 보면 왜 TMC2209가 ‘똑똑한 드라이버’인지 확실히 알 수 있습니다.


    1. 설정 방식의 결정적 차이

    드라이버 모델설정 방식 (전류/옵션)특징
    A4988 / DRV8825하드웨어 수동 설정드라이버 위의 아주 작은 **나사(가변저항)**를 드라이버로 돌려서 전류를 맞춰야 합니다. (돌리다 삑끗하면 드라이버가 타버리기도 합니다.)
    TMC2208 / TMC2209UART 통신 설정ESP32-C3에서 코드를 전송해 전류값(mA)을 숫자로 입력할 수 있습니다. 나사를 돌릴 필요가 없습니다.

    2. UART가 없으면 겪는 불편함 (구형 드라이버)

    A4988이나 DRV8825 같은 드라이버는 ‘말을 못 알아듣는 장치’와 같습니다.

    • 전류 변경 불가: 로봇 팔이 빈 손일 때와 무거운 물건을 들었을 때 모터 힘을 다르게 하고 싶어도, 하드웨어적으로 고정되어 있어 불가능합니다.
    • 모드 고정: 저소음 모드나 고출력 모드를 상황에 맞춰 바꿀 수 없고, 점퍼 와이어를 일일이 뺏다 꽂았다 해야 합니다.

    3. TMC2209 UART만의 “필살기”

    다른 드라이버에는 아예 없고, TMC2209를 UART로 연결했을 때만 쓸 수 있는 기능이 있습니다.

    • 실시간 자가 진단: 모터가 과열되었는지, 선이 끊어졌는지 ESP32-C3가 UART로 물어보고 에러 메시지를 띄울 수 있습니다.
    • 센서리스 홈밍 (StallGuard): 로봇 팔이 물리적인 벽에 부딪혀서 모터에 부하가 걸리면, UART를 통해 “지금 부딪혔어!”라고 신호를 줍니다. 덕분에 리미트 스위치(센서) 없이도 로봇 팔의 시작 위치를 잡을 수 있습니다.

    💡 정리하자면

    “TMC2209는 명령을 알아듣는 지능형 드라이버이고, 나머지는 시키는 대로 전기만 흘려주는 단순형 드라이버“라고 이해하시면 됩니다.

    ESP32-C3를 사용하신다면 핀 개수가 적기 때문에, UART를 통해 여러 개의 TMC2209를 묶어 관리하는 방식이 하드웨어 구성 면에서도 훨씬 깔끔하고 강력합니다.

    ** 배선 연결법

    ESP32-C3와 TMC2209를 UART 방식으로 연결하는 방법은 일반적인 통신 연결보다 조금 독특합니다. TMC2209는 단일 선(Single-line) UART를 사용하기 때문에, ESP32-C3의 TX와 RX를 하나로 묶어주는 과정이 필요합니다.

    가장 표준적이고 안정적인 1kΩ 저항을 이용한 연결법을 알려드릴게요.


    1. UART 회로 연결 (핵심)

    TMC2209의 PDN_UART 핀 하나를 통해 데이터를 주고받기 위해 다음과 같이 배선합니다.

    • ESP32-C3 TX (GPIO 21)1kΩ 저항TMC2209 PDN_UART
    • ESP32-C3 RX (GPIO 20) —————-→ TMC2209 PDN_UART 핀에 직접 연결

    왜 저항을 쓰나요? > ESP32-C3가 데이터를 보낼 때(TX)와 받을 때(RX) 신호가 충돌하는 것을 방지하기 위함입니다. 이 저항 덕분에 선 하나로 양방향 대화가 가능해집니다.


    2. 전체 핀 배선도 (ESP32-C3 기준)

    로봇 팔의 모터 하나를 제어하기 위한 전체 연결도입니다.

    TMC2209 핀연결 대상 (ESP32-C3 / 전원)비고
    VCC (또는 VDD)ESP32-C3 3.3V로직 전원
    GND공통 GND모든 전원의 마이너스를 하나로 묶음
    VM (또는 Vmotor)12V ~ 24V (+) 전원모터 구동용 (SMPS)
    PDN_UARTGPIO 20 & 21 (저항 거침)UART 설정 통신용
    STEPGPIO 0회전 신호 (펄스)
    DIRGPIO 1방향 신호 (High/Low)
    EN (Enable)GPIO 7모터 잠금/해제 제어

    ** 1 N⋅cm 의 의미

    1. 토크 단위 읽는 법

    • 표기: 1 N·cm
    • 읽는 법: 1 뉴턴 센티미터
    • 실제 의미: 모터 축 중심에서 1cm 떨어진 지점에 약 102g의 추를 달았을 때, 모터가 버틸 수 있는 회전력입니다.

    2. 우리가 비교한 모터들의 힘 (한눈에 보기)

    가장 중요한 **’버티는 힘(토크)’**을 다시 깔끔하게 정리해 드릴게요.

    모터 모델토크 (힘)비유 (사과 1개 ≈ 100g)
    17HS440145 N·cm1cm 거리에서 사과 약 45개를 들어 올림
    17HS402314 N·cm1cm 거리에서 사과 약 14개를 들어 올림
    28BYJ-483 N·cm1cm 거리에서 사과 약 3개를 겨우 들어 올림

    3. 로봇 팔 길이에 따른 실제 무게 계산 (중요!)

    로봇 팔이 길어지면 지레의 원리 때문에 들 수 있는 무게가 줄어듭니다.

    • 팔 길이가 10cm라면?
      • 17HS4401: 약 460g까지 버팀 (사과 4.5개)
      • 17HS4023: 약 140g까지 버팀 (사과 1.4개)
      • 28BYJ-48: 약 30g까지 버팀 (방울토마토 몇 개 수준)

    ** 모터별 소비전력 및 특징 비교

    항목28BYJ-48 (소형)17HS4023 (슬림)17HS4401 (표준)
    정격 전압5V / 12V (모델별 상이)약 3.5V (드라이버 제어)약 3.6V (드라이버 제어)
    정격 전류0.2A ~ 0.3A1.0A1.5A ~ 1.7A
    권장 전력 (W)약 1W ~ 3W약 4W ~ 8W약 6W ~ 15W
    주요 용도가벼운 장식, 정밀 회전소형 로봇 (추천)3D 프린터, 대형 로봇
    토크(힘)매우 약함 (기어비 의존)중간 (메카넘 휠 적합)강함 (무겁고 전력 많이 먹음)

    ** 모터별 최고 회전속도 및 특성 비교

    구분28BYJ-48 (소형)17HS4023 (슬림)17HS4401 (표준)
    최고 속도 (RPM)15 ~ 25 RPM600 ~ 1,000 RPM600 ~ 1,200 RPM
    실용 속도 (RPM)10 ~ 15 RPM300 ~ 500 RPM300 ~ 600 RPM
    속도 한계 원인내장된 감속 기어슬림한 몸체의 낮은 토크고속 시 역기전력 발생
    주행 체감매우 느림 (거북이 수준)적당함 (일반 로봇카)빠름 (파워풀한 주행)