주소가 같은 I2C 센서 여러 개를 한 버스에 연결할 수 있을까?

profile_image
작성자 버스설계자현우
댓글 0건 조회 7회

I2C 센서를 하나씩 연결하면 잘 작동하는데 두 개를 꽂는 순간 값이 뒤섞이거나 통신이 멈추나요? 고장이라기보다 동일한 I2C 주소를 가진 장치가 동시에 응답하는 상황일 가능성이 큽니다. 주소 변경 핀이 없는 센서도 멀티플렉서, 전원 제어, 소프트웨어 버스를 활용하면 함께 사용할 수 있습니다.

주소 충돌은 왜 스캐너로도 찾기 어려울까

같은 주소가 하나처럼 보이는 함정

I2C 스캐너는 주소별로 응답 여부만 확인합니다. 예를 들어 주소가 모두 0x76인 기압 센서 두 개를 병렬로 연결하면 스캐너에는 0x76 하나만 표시될 수 있습니다. 센서가 두 개라고 알려주는 기능이 아니므로 검색 결과가 정상처럼 보인다는 점이 가장 큰 함정입니다.

두 장치가 읽기 요청에 동시에 응답하면 같은 비트를 내보낼 때는 문제가 드러나지 않습니다. 그러나 측정값이나 레지스터 상태가 달라지는 순간 SDA 선에서 데이터가 섞이고, 마스터는 실제로 어느 센서의 값을 읽었는지 구분할 수 없습니다. 주소 충돌이 항상 즉시 오류 코드로 나타나지 않는 이유입니다.

  • 센서를 한 개만 연결했을 때 주소와 측정값을 먼저 기록합니다.
  • 두 번째 센서를 추가한 뒤 주소 개수가 아니라 값의 독립성을 확인합니다.
  • 한 센서만 가열하거나 가려서 두 채널이 서로 다른 반응을 보이는지 시험합니다.
  • 모듈의 뒷면 납땜 점퍼와 데이터시트에서 주소 선택 비트를 찾아봅니다.
숨은 팁: 동일 주소 센서 두 개가 스캐너에서 하나로 보인다면 배선부터 뜯지 말고, 각 센서를 단독 연결해 모델명과 주소를 표로 남겨 보세요. 원인 분리가 훨씬 빨라집니다.

처음 센서 실습을 구성한다면 아두이노의 보드 구조와 활용 범위를 함께 확인해 두면 마스터 장치, 확장 보드, 센서 모듈의 역할을 구분하는 데 도움이 됩니다.

주소 선택 핀은 가장 싸고 간단한 해결책이다

점퍼 하나에도 조합 순서가 있다

BME280의 SDO, VL53L0X의 XSHUT처럼 일부 센서는 주소를 선택하거나 부팅 후 새 주소를 지정할 수 있는 핀을 제공합니다. 모듈 기판에 ADDR, A0, A1, SA0라고 적힌 패드가 있다면 멀티플렉서를 사기 전에 먼저 확인하세요. 저항 위치를 옮기거나 납땜 브리지를 연결하는 것만으로 주소를 바꿀 수 있습니다.

다만 칩이 지원하는 주소 수와 모듈이 실제로 노출한 선택지는 다를 수 있습니다. 3.3V 전용 핀을 5V에 직접 묶거나, 이미 기판 저항으로 HIGH에 연결된 패드를 다시 GND와 단락하면 손상 위험이 있습니다. 전원을 끈 상태에서 멀티미터의 연속성 모드로 패드 연결을 확인한 뒤 작업하는 편이 안전합니다.

  1. 각 센서를 단독 연결해 기본 주소를 읽습니다.
  2. 모듈 회로도나 칩 데이터시트에서 주소 선택 조건을 확인합니다.
  3. 첫 번째 센서는 기본값으로 두고 두 번째부터 주소를 변경합니다.
  4. 변경 후 전원을 완전히 껐다 켜고 다시 스캔합니다.
  5. 코드에는 센서 객체마다 주소를 명시해 채널이 뒤바뀌지 않게 합니다.

부팅할 때만 주소를 바꿀 수 있는 센서

거리 센서처럼 모든 장치가 같은 기본 주소로 시작하지만 종료 핀을 제공하는 제품도 있습니다. 이때는 모든 센서를 정지 상태로 둔 뒤 하나씩 깨워 임시 주소를 배정합니다. 주소가 휘발성이라면 재부팅 때마다 이 초기화 순서를 반복해야 하며, 마이크로컨트롤러 리셋 후 센서 전원이 계속 살아 있는 상황까지 고려해야 합니다.

방법장점놓치기 쉬운 조건
납땜 점퍼부품 추가가 없음선택 가능한 주소가 적음
주소 변경 명령여러 장치 확장 가능부팅 순서 제어 핀이 필요함
모듈 교체배선이 단순함호환 라이브러리를 다시 확인해야 함

I2C 멀티플렉서는 채널을 방처럼 나눠 준다

TCA9548A를 쓸 때의 실전 요령

주소를 바꿀 수 없다면 TCA9548A 계열 I2C 멀티플렉서가 실용적입니다. 마스터는 먼저 멀티플렉서의 제어 레지스터에 사용할 채널 비트를 쓰고, 이어서 평소처럼 센서 주소로 통신합니다. 동일한 0x44 온습도 센서를 서로 다른 채널에 배치하면 센서 코드를 크게 고치지 않고도 개별 측정이 가능합니다.

잘 알려지지 않은 활용법은 채널을 한 번에 하나만 열 필요가 없다는 점입니다. 서로 주소가 다른 센서라면 여러 채널을 동시에 활성화할 수도 있습니다. 하지만 채널별 풀업 저항이 병렬로 합쳐지고 전체 정전용량도 증가하므로, 문제를 추적할 때는 한 채널씩 여는 방식이 훨씬 명확합니다. 센서 읽기가 끝나면 채널을 닫아 두는 습관도 예기치 않은 충돌을 줄입니다.

  • 멀티플렉서 자체 주소와 센서 주소가 겹치지 않는지 확인합니다.
  • 채널 선택 직후 짧은 고정 지연부터 넣기보다 첫 통신의 ACK를 검사합니다.
  • 센서 초기화 함수도 반드시 해당 채널을 연 다음 호출합니다.
  • 채널 번호, 센서 위치, 논리 이름을 코드와 케이블 라벨에 함께 기록합니다.
  • 긴 케이블 채널은 통신 속도를 낮춰 별도로 검증합니다.
채널을 바꿨는데 이전 센서 값이 계속 보인다면 버스 오류보다 라이브러리 캐시를 의심하세요. 측정 시작 명령과 데이터 읽기 명령 사이에 다른 채널로 전환하지 않았는지도 살펴봐야 합니다.

라이브러리가 장치와 운영 환경 사이에서 어떤 역할을 하는지 낯설다면 디바이스 드라이버 통합개발환경의 개요도 참고할 만합니다. 완성된 라이브러리를 쓰더라도 채널 선택 책임은 사용자 코드에 남는 경우가 많습니다.

부품을 추가하지 않고 버스를 하나 더 만드는 방법

하드웨어 I2C와 소프트웨어 I2C 나누기

남는 GPIO가 있고 통신량이 적다면 두 핀을 소프트웨어 I2C로 구성해 동일 주소 센서를 별도 버스에 둘 수 있습니다. 하나는 보드의 하드웨어 I2C에, 다른 하나는 소프트웨어 버스에 연결하는 식입니다. 느린 환경 센서를 몇 초 간격으로 읽는 프로젝트라면 멀티플렉서 없이도 깔끔하게 해결될 수 있습니다.

대가는 CPU 점유와 타이밍 민감성입니다. Wi-Fi 처리, 인터럽트, 모터 제어가 동시에 실행되면 비트뱅잉 파형이 흔들릴 수 있습니다. 사용하는 라이브러리가 Wire 객체를 인자로 받는지도 확인해야 합니다. 전역 Wire만 고정해서 쓰는 라이브러리는 두 번째 버스를 선언해도 내부 통신 대상을 바꾸지 못할 수 있습니다.

  • 추천 상황: 저속 센서가 1~2개이고 GPIO 여유가 있을 때
  • 피할 상황: 고속 샘플링, 긴 배선, 실시간 제어가 동시에 필요할 때
  • 확인 항목: 반복 시작 조건, 클록 스트레칭, 타임아웃 지원 여부
  • 디버깅 팁: 각 버스의 SDA와 SCL 색상을 다르게 정하고 스캔 로그도 분리할 것

라즈베리파이에서는 가상 버스 번호를 기록한다

라즈베리파이는 설정에 따라 추가 I2C 버스를 활성화할 수 있지만, 사용 가능한 핀과 오버레이는 보드 모델 및 운영체제 구성에 따라 달라집니다. 인터넷 예제의 버스 번호를 그대로 복사하기보다 현재 시스템에서 생성된 장치 파일과 핀 설정을 확인하세요. 센서 주소뿐 아니라 버스 번호까지 한 쌍으로 관리해야 유지보수 때 혼동하지 않습니다.

예를 들어 설정 파일에는 주방 센서를 bus 1의 0x44, 실외 센서를 bus 3의 0x44처럼 기록합니다. 애플리케이션 로그에도 이 두 값을 함께 출력하면 현장에서 센서 하나만 교체했을 때 원인을 빠르게 좁힐 수 있습니다.

멀티플렉서를 달고도 값이 섞이는 세 가지 순간

초기화, 풀업, 비동기 작업의 엇갈림

첫 번째 실수는 채널을 선택하기 전에 센서의 begin 함수를 호출하는 것입니다. 많은 라이브러리는 초기화 단계에서 칩 ID를 읽고 보정 계수를 저장합니다. 잘못된 채널에서 초기화하면 시작부터 다른 센서의 계수가 객체에 들어가므로, 이후 채널만 올바르게 바꿔도 측정값이 이상할 수 있습니다.

두 번째는 모든 센서 모듈의 풀업 저항을 그대로 둔 채 여러 채널을 동시에 여는 것입니다. 4.7kΩ 저항 여러 개가 병렬로 연결되면 등가 저항이 지나치게 낮아져 장치가 LOW를 만들 때 더 많은 전류를 흘려야 합니다. 반대로 채널 쪽 풀업을 모두 제거하면 닫힌 채널의 선이 떠버릴 수 있으므로, 메인 버스와 각 분기에서 실제로 필요한 저항 구성을 회로도로 확인해야 합니다.

  1. 채널 선택과 센서 읽기를 하나의 함수 또는 잠금 구간으로 묶습니다.
  2. 비동기 작업 두 개가 같은 멀티플렉서를 동시에 바꾸지 못하게 뮤텍스를 사용합니다.
  3. 초기화 실패 시 무한 재시도하지 말고 해당 채널을 닫은 뒤 오류를 기록합니다.
  4. 센서 객체의 보정값과 최근 측정값이 채널별로 분리됐는지 확인합니다.

채널 번호를 센서 주소처럼 고정하면 생기는 문제

세 번째 실수는 물리 채널 번호를 프로그램 전체에 숫자로 흩뿌리는 것입니다. 케이블을 한 칸 옮기는 순간 코드 여러 곳을 수정해야 하고, 일부만 바뀌면 값이 조용히 뒤바뀝니다. GREENHOUSE_TEMP처럼 위치를 나타내는 이름에 채널 번호와 주소를 매핑하고, 부팅 시 매핑 정보를 로그로 출력하세요.

센서 두 개의 값이 비슷해서 구분이 어렵다면 한쪽에 손을 대거나 짧게 바람을 불어 의도적인 변화를 만드세요. 그 변화가 지정한 채널에서만 나타나는지 확인하는 검사가 단순 스캔보다 강력합니다. 마지막으로 자동 복구 코드를 넣을 때 멀티플렉서 리셋만 반복하지 말고, 센서 전원 상태와 채널별 초기화 순서까지 다시 실행해야 현장에서 되살아나는 시스템이 됩니다.

주소가 같은 I2C 센서 여러 개를 한 버스에 연결할 수 있을까?

댓글목록

등록된 댓글이 없습니다.