늦여름 정전 뒤 아두이노 I2C 센서를 되살리는 순서

profile_image
작성자 회로복구사도현
댓글 0건 조회 4회

늦여름에는 폭염으로 전력 사용량이 늘고 국지성 호우와 낙뢰까지 겹칩니다. 아두이노는 다시 켜졌는데 화면이 멈추거나 센서 값만 0으로 고정된다면, 부품 고장보다 전원 복귀 순서 때문에 잠긴 I2C 통신을 먼저 의심해야 합니다. 무작정 리셋 버튼을 누르기 전에 어느 선에서 문제가 시작됐는지 순서대로 좁혀야 같은 장애의 반복을 막을 수 있습니다.

정전 직후에는 센서보다 전원 상태부터 확인합니다

완전 정전과 순간 전압 강하는 증상이 다릅니다

전원이 완전히 끊겼다가 다시 들어오면 마이크로컨트롤러와 센서가 대체로 함께 초기화됩니다. 더 까다로운 상황은 에어컨이나 펌프가 작동하는 순간 전압이 짧게 떨어지는 브라운아웃입니다. 아두이노만 리셋되고 센서는 애매한 전압에서 살아남으면, 두 장치가 서로 다른 통신 상태를 가진 채 다시 만날 수 있습니다.

USB 전원과 외부 어댑터를 동시에 사용하는 프로젝트도 주의해야 합니다. USB를 통해 보드는 살아 있지만 센서 전원만 꺼졌다가 복구되거나, 반대로 센서 모듈의 풀업 저항을 통해 SDA와 SCL에 전류가 역류할 수 있습니다. 이때 전원 LED가 켜졌다는 이유만으로 정상이라고 판단하면 원인을 놓치기 쉽습니다.

  • 멀티미터로 보드의 5V 또는 3.3V 레일을 측정하고 센서 단자에서도 같은 전압이 도달하는지 확인합니다.
  • 전원을 끈 뒤 최소 10초 기다려 커패시터가 충분히 방전되도록 합니다.
  • USB, 어댑터, 배터리 중 어떤 전원이 먼저 들어오는지 기록합니다.
  • 센서 전압이 데이터시트의 동작 범위 아래로 잠시 내려가는지 가능하면 오실로스코프로 관찰합니다.
전원 LED는 전압의 존재만 보여줄 뿐, 전압이 안정적이었는지까지 증명하지는 않습니다. 정전 뒤 통신 장애에서는 평균 전압보다 짧은 순간의 강하가 더 중요한 단서입니다.

SDA와 SCL의 대기 전압으로 잠긴 버스를 찾습니다

둘 다 HIGH여야 새 통신을 시작할 수 있습니다

I2C 버스가 쉬고 있을 때 SDA와 SCL은 풀업 저항에 의해 HIGH 상태를 유지합니다. 3.3V 시스템이라면 두 선에서 대략 3.3V, 5V 시스템이라면 설계에 맞는 HIGH 전압이 보여야 합니다. SCL은 HIGH인데 SDA가 계속 LOW라면 센서가 데이터 전송 중 정전을 만나 다음 클록을 기다리는 상황일 수 있습니다.

SCL까지 LOW로 고정됐다면 센서의 클록 스트레칭, 배선 단락, 손상된 레벨 시프터를 함께 살펴야 합니다. 전원을 끈 상태에서 저항 측정 기능으로 SDA 또는 SCL과 GND 사이가 비정상적으로 낮은지도 확인해 보세요. 점퍼 케이블이 젖었거나 브레드보드 안쪽에 수분이 남은 경우에도 같은 증상이 나타납니다.

  1. 모든 장치가 연결된 상태에서 SDA와 SCL의 대기 전압을 각각 기록합니다.
  2. 전원을 끄고 센서 모듈을 하나씩 분리한 뒤 선이 HIGH로 회복되는지 봅니다.
  3. 문제를 일으키는 모듈을 찾으면 커넥터 방향, 납땜 브리지, 수분 흔적을 확대해 확인합니다.
  4. 로직 분석기가 있다면 마지막 정상 프레임 뒤 ACK가 어디에서 멈췄는지 확인합니다.

아두이노의 기본 개념과 입출력 구조가 낯설다면 지식백과의 아두이노 설명을 함께 참고하면 보드, 핀, 개발 환경의 관계를 이해하는 데 도움이 됩니다. 다만 보드마다 I2C 핀과 논리 전압이 다르므로 최종 배선은 반드시 해당 보드의 공식 핀맵으로 확인해야 합니다.

I2C 스캐너로 주소 응답부터 다시 세웁니다

본 프로그램보다 작은 진단 코드가 먼저입니다

복잡한 프로젝트 코드는 디스플레이 출력, 무선 연결, 파일 저장이 동시에 움직이므로 장애 지점을 구분하기 어렵습니다. 정전 후에는 기능을 모두 걷어낸 I2C 스캐너를 올려 센서 주소가 ACK로 응답하는지만 확인하는 편이 빠릅니다. 평소 인식되던 0x44나 0x76 같은 주소가 사라졌다면 애플리케이션 로직보다 전원, 배선, 버스 잠금을 먼저 봐야 합니다.

주소가 검색되는데 실제 측정값을 읽지 못한다면 초기화 명령이나 변환 대기 시간이 부족할 가능성이 큽니다. 전원 복구 직후 센서 내부 발진기와 보정 데이터가 준비되기까지 수십 밀리초에서 수백 밀리초가 필요한 제품도 있습니다. 기존 코드의 시작 지연을 무작정 길게 늘리기보다 데이터시트의 파워온 시간과 상태 레지스터를 확인하는 것이 정확합니다.

  • 스캐너에서 검색 시작 시각과 발견 주소를 시리얼 로그로 남깁니다.
  • 100kHz에서 먼저 시험하고 정상일 때만 400kHz로 올립니다.
  • 센서 하나만 연결한 결과와 전체 센서를 연결한 결과를 비교합니다.
  • 주소는 잡히지만 값이 이상하면 칩 ID와 상태 레지스터를 먼저 읽습니다.
  • 스캔을 지나치게 빠르게 반복하지 말고 회차 사이에 짧은 간격을 둡니다.

센서 라이브러리도 결국 장치를 초기화하고 레지스터를 읽는 드라이버 역할을 합니다. 개발 도구가 이 과정을 어떻게 묶는지 더 알고 싶다면 디바이스 드라이버 통합개발환경의 개요도 개념을 확장하는 참고 자료가 됩니다. 라이브러리 이름만 바꾸기보다 어느 초기화 명령에서 실패하는지 출력하면 복구 설계가 훨씬 쉬워집니다.

아홉 번의 클록과 STOP 조건으로 통신을 풀어냅니다

센서가 기다리던 비트를 끝까지 보내 줍니다

전송 도중 마스터가 리셋되면 슬레이브는 다음 클록이 들어올 것으로 생각하며 SDA를 LOW로 잡고 있을 수 있습니다. 이런 경우 SCL을 GPIO 출력으로 잠시 전환해 최대 아홉 번 펄스를 보내면 센서 내부의 남은 비트가 이동하면서 SDA가 풀리기도 합니다. 이어서 SDA가 LOW인 상태에서 SCL을 HIGH로 만든 후 SDA를 HIGH로 전환해 STOP 조건을 만들어 줍니다.

이 절차는 만능 수리가 아닙니다. SCL 자체가 LOW로 고정돼 있거나 센서 전원이 불안정하면 GPIO를 강제로 구동하는 행위가 핀 충돌을 만들 수 있습니다. 먼저 두 선의 전압을 확인하고, 오픈드레인 동작을 흉내 낼 때는 LOW 출력과 입력 상태를 전환하는 방식으로 구현해야 안전합니다.

  1. I2C 주변장치를 비활성화하고 SDA와 SCL을 입력 상태로 둡니다.
  2. SDA가 LOW인지 읽고, LOW라면 SCL을 천천히 최대 아홉 번 토글합니다.
  3. 각 펄스 뒤 SDA가 HIGH로 풀렸는지 검사해 풀렸다면 반복을 중단합니다.
  4. STOP 조건을 만든 뒤 I2C 주변장치를 다시 초기화합니다.
  5. 센서의 칩 ID를 읽어 복구 성공 여부를 검증합니다.
복구 루틴은 부팅할 때 한 번만 실행하기보다 통신 타임아웃이 연속으로 발생했을 때 제한적으로 호출하는 편이 좋습니다. 실패할 때마다 무한 반복하면 본래의 전원 결함이 가려집니다.

아홉 번이라는 수는 한 바이트와 ACK 구간을 진행시키기 위한 실용적인 상한입니다. 그래도 SDA가 풀리지 않으면 펄스를 계속 보내지 말고 센서 전원을 차단하는 다음 단계로 넘어가야 합니다. 복구 횟수와 실패 시각을 EEPROM이나 서버 로그에 남겨 두면 계절성 전원 문제를 찾는 자료가 됩니다.

소프트웨어 리셋과 전원 재인가를 구분합니다

센서마다 회복 가능한 깊이가 다릅니다

일부 센서는 전용 소프트 리셋 명령을 제공하며, 이 명령으로 측정 상태와 레지스터를 초기값으로 되돌릴 수 있습니다. 그러나 I2C 주소 자체가 응답하지 않거나 SDA를 LOW로 붙잡은 상태라면 소프트 리셋 명령도 전달되지 않습니다. 이때는 센서의 전원 레일을 실제로 끊었다가 다시 공급하는 전원 사이클이 필요합니다.

센서 VCC를 아두이노 GPIO에서 직접 공급하는 방법은 소형 저전력 모듈에서 보이지만 권장되는 일반 해법은 아닙니다. 기동 전류가 핀 허용치를 넘거나 보호 다이오드를 통해 역전류가 흐를 수 있기 때문입니다. P채널 MOSFET이나 로드 스위치를 사용하고, 전원을 끌 때 SDA와 SCL도 입력 상태로 바꾸면 기생 전원 공급을 줄일 수 있습니다.

  • 주소 응답이 있으면 상태 레지스터 확인 후 소프트 리셋을 시도합니다.
  • 주소 응답이 없고 버스 복구도 실패하면 센서 전원만 차단합니다.
  • 전원 OFF 시간은 데이터시트 기준을 따르되 커패시터 방전 시간을 포함합니다.
  • 전원 ON 후 파워온 대기 시간을 확보하고 칩 ID부터 읽습니다.
  • 세 번 이상 실패하면 자동 재시도를 멈추고 오류 상태를 명확히 표시합니다.

여러 센서가 한 전원 레일을 공유한다면 하나를 재부팅하려다 모든 측정이 끊길 수 있습니다. 현장 장치에서는 센서 그룹별 로드 스위치, 개별 활성화 핀, 리셋 가능한 I2C 버퍼를 고려할 만합니다. 비용은 늘지만 온실 제어기나 원격 관측기처럼 방문이 어려운 사물인터넷 장비에서는 복구 가능성이 유지보수 비용을 크게 줄여 줍니다.

늦여름 전원 노이즈가 돌아오지 않게 배선을 손봅니다

복구 코드보다 먼저 물리적 재발 원인을 줄입니다

8월 말의 냉방기, 제습기, 환기 팬은 센서 프로젝트와 같은 멀티탭을 사용하는 경우가 많습니다. 모터가 켜질 때 생기는 전압 강하와 스위칭 노이즈가 긴 센서 선에 유도되면 I2C 오류가 반복됩니다. 특히 브레드보드 점퍼선을 1m 이상 늘여 쓴 구성은 버스 정전용량과 외부 잡음에 모두 취약합니다.

센서 가까이에 0.1µF 세라믹 커패시터를 두고, 모듈 전원 입구에는 부하 특성에 맞는 벌크 커패시터를 추가하면 순간 변동을 줄일 수 있습니다. 다만 용량을 크게 만드는 것만으로 해결하려 하면 전원 OFF 시간이 길어져 불완전한 리셋을 만들 수 있습니다. 커패시터 용량, 전원 공급기의 응답, 센서 기동 전류를 함께 봐야 합니다.

  • SDA와 GND, SCL과 GND를 각각 가까이 배치해 신호의 귀환 경로를 짧게 만듭니다.
  • 모터 전원선과 I2C 배선을 평행하게 길게 붙이지 않습니다.
  • 여러 모듈에 달린 풀업 저항이 병렬로 연결돼 지나치게 낮아지지 않았는지 계산합니다.
  • 실외함 케이블 인입부에는 물방울이 타고 들어오지 않도록 드립 루프를 만듭니다.
  • 워치독, 브라운아웃 감지, 통신 타임아웃을 함께 설정합니다.

배선이 길어질수록 속도를 낮추는 선택도 현실적입니다. 400kHz가 필요하지 않은 온습도 기록 장치라면 100kHz 또는 그보다 낮은 속도가 충분할 수 있습니다. 그래도 수 미터를 안정적으로 연결해야 한다면 I2C를 그대로 연장하기보다 차동 버스 확장기나 RS-485 기반 원격 노드를 검토하는 편이 유지보수에 유리합니다.

베란다 관측기가 소나기 뒤 스스로 회복한 과정

멈춘 온습도 기록을 현장 순서대로 추적했습니다

서울의 한 아파트 베란다에서 아두이노 호환 보드, 3.3V 온습도 센서, 소형 OLED를 함께 운용한다고 가정해 보겠습니다. 늦은 오후 소나기와 짧은 정전 뒤 보드는 재부팅됐지만 OLED에는 마지막 측정값만 남았습니다. 시리얼 로그에는 센서 읽기 실패가 반복됐고, I2C 스캐너에서는 OLED 주소만 보였습니다.

첫 번째 조치는 전체 코드를 수정하는 일이 아니었습니다. 멀티미터로 확인하니 SCL은 3.3V였지만 SDA가 0.2V에 머물렀습니다. 센서 커넥터를 분리하자 SDA가 즉시 3.3V로 돌아왔으므로, 보드보다 센서가 버스를 붙잡고 있다는 사실을 확인할 수 있었습니다.

  1. 전원을 완전히 끄고 USB 케이블까지 분리한 뒤 15초 동안 방전했습니다.
  2. 다시 켜기 전 커넥터 내부의 습기를 제거하고 센서 옆 디커플링 커패시터 납땜을 점검했습니다.
  3. 부팅 초기에 SCL 펄스를 최대 아홉 번 보내고 STOP 조건을 생성하는 복구 루틴을 추가했습니다.
  4. 센서 초기화 전에 100ms를 기다린 후 칩 ID와 측정 준비 상태를 순서대로 읽었습니다.
  5. 읽기 실패가 세 번 이어지면 로드 스위치로 센서 전원을 500ms 끊고 한 번만 재시도하도록 설정했습니다.

다음 소나기에는 전원 로그에 브라운아웃 한 차례가 남았지만 측정은 약 2초 뒤 재개됐습니다. OLED도 최신 값으로 갱신됐고, 복구 카운터가 1 증가해 장애 시점을 추적할 수 있었습니다. 마지막으로 멀티탭에서 제습기와 관측기 전원을 분리하고 I2C 속도를 400kHz에서 100kHz로 낮추자 이후 반복 오류도 사라졌습니다.

이 사례의 핵심은 리셋을 많이 거는 데 있지 않습니다. 전원 확인 → 버스 전압 측정 → 주소 스캔 → 클록 복구 → 센서 전원 재인가 순서를 지켰기 때문에 고장 부위를 좁히면서 자동 복구까지 설계할 수 있었습니다. 같은 계절에 비슷한 멈춤이 생긴다면 복구 횟수, 전압 강하 시각, 실패한 센서 주소를 함께 기록해 다음 소나기 전 배선과 전원을 보강해 보세요.

댓글목록

등록된 댓글이 없습니다.