I2C 통신 주소만 알면 끝이라는 착각이 회로를 멈춘다
I2C 통신이 쉬워 보이는데도 처음에 막히는 이유
선 두 가닥이라는 말이 만든 오해
I2C 통신은 SDA와 SCL 두 신호선으로 여러 장치를 연결할 수 있어 입문자에게 매우 매력적으로 보입니다. 그래서 아두이노 예제 코드에 센서 주소만 넣으면 바로 값이 나올 것 같지만, 실제 책상 위 회로에서는 주소, 전원, 풀업 저항, 배선 길이, 라이브러리 설정이 함께 맞아야 합니다.
특히 초보자가 가장 많이 놓치는 부분은 “통신이 된다”와 “센서 값이 안정적으로 읽힌다”를 같은 의미로 받아들이는 것입니다. I2C 스캐너에서 주소가 보였더라도 센서 초기화가 실패하거나 값이 0으로 고정될 수 있습니다. 이는 고장이 아니라 회로와 코드가 아직 같은 조건을 공유하지 못했다는 신호입니다.
- SDA는 데이터가 오가는 선이며 보드마다 핀 위치가 다릅니다.
- SCL은 클록 신호선으로, 너무 긴 배선에서는 파형이 흐려질 수 있습니다.
- GND 공통이 빠지면 주소 스캔조차 불안정해집니다.
- 주소 발견은 시작점일 뿐, 센서 동작 확인은 별도 단계입니다.
입문 단계에서는 “주소가 뜬다”보다 “같은 값을 반복해서 안정적으로 읽는다”를 성공 기준으로 잡는 편이 훨씬 안전합니다.
주소가 맞아도 데이터가 틀릴 수 있는 진짜 원리
7비트 주소와 레지스터를 구분해야 합니다
I2C 센서 설명서에는 보통 0x76, 0x77, 0x68 같은 주소가 등장합니다. 그런데 주소는 집 문패에 가깝고, 실제 데이터는 집 안의 특정 서랍인 레지스터에서 읽어야 합니다. 같은 주소로 연결에 성공해도 어떤 레지스터를 어떤 순서로 읽느냐에 따라 결과가 전혀 달라질 수 있습니다.
예를 들어 온습도 센서는 측정 명령을 먼저 보내고 일정 시간 뒤 결과 레지스터를 읽어야 하는 경우가 많습니다. 반대로 가속도 센서는 전원 관리 레지스터를 깨우지 않으면 계속 잠든 상태일 수 있습니다. 초보자가 예제 코드를 그대로 복사했는데 값이 이상하다면, 센서 모델명과 레지스터 맵이 예제와 같은지부터 확인해야 합니다.
- 데이터시트에서 기본 I2C 주소를 확인합니다.
- 주소 선택 핀, 예를 들어 ADDR 또는 SDO 상태를 확인합니다.
- 초기화에 필요한 레지스터 쓰기 순서를 살핍니다.
- 측정 대기 시간이 필요한 센서인지 확인합니다.
라이브러리가 모든 차이를 숨기지는 않습니다
아두이노 라이브러리는 복잡한 레지스터 접근을 편하게 감싸 주지만, 보드와 센서 버전이 바뀌면 내부 설정이 맞지 않을 수 있습니다. 아두이노의 기본 개념을 이해하고 나면, 예제 코드가 왜 특정 핀과 전압을 가정하는지도 더 빨리 보입니다.
초보 회로에서는 전압부터 맞춰야 통신이 살아납니다
3.3V와 5V를 가볍게 보면 안 됩니다
센서 연결에서 I2C 주소보다 먼저 확인해야 할 것은 전압입니다. 아두이노 우노 계열은 5V 로직을 쓰는 경우가 많고, ESP32나 라즈베리파이는 보통 3.3V 로직을 기준으로 합니다. 3.3V 센서에 5V 풀업이 걸리면 당장 동작하는 것처럼 보여도 장기적으로 센서 입력단에 부담을 줄 수 있습니다.
반대로 5V 보드에 3.3V 센서를 붙였는데 통신이 가끔만 되는 경우도 있습니다. 이때는 로직 레벨 변환기, 센서 모듈에 이미 붙어 있는 풀업 저항, 보드 내부 풀업 설정을 함께 봐야 합니다. “VCC만 3.3V에 꽂으면 안전하다”는 말은 절반만 맞습니다. I2C 선이 어떤 전압으로 끌어올려지는지가 더 중요합니다.
- 라즈베리파이 GPIO는 3.3V 기준이므로 5V 신호 입력을 피해야 합니다.
- 5V 아두이노와 3.3V 센서를 섞을 때는 레벨 변환기를 우선 검토합니다.
- 센서 모듈에 풀업 저항이 이미 있는지 회로도를 확인합니다.
- 전원이 USB, 배터리, 외부 어댑터로 바뀌면 노이즈 조건도 달라집니다.
전압이 맞지 않는 회로는 초반에는 “운 좋게 동작”하고, 시간이 지나면 “이유 없이 불안정”해지는 경우가 많습니다.
풀업 저항은 부품 하나가 아니라 버스의 속도 조절 장치입니다
왜 저항값 하나로 성공과 실패가 갈릴까요
I2C는 장치들이 선을 직접 HIGH로 밀어 올리는 방식이 아니라, LOW로 끌어내리고 풀업 저항이 다시 HIGH 상태로 올려 주는 구조입니다. 그래서 풀업 저항은 단순한 보조 부품이 아니라 I2C 버스의 회복 속도를 정하는 핵심 요소입니다. 저항값이 너무 크면 신호가 천천히 올라가고, 너무 작으면 장치가 LOW로 끌어내릴 때 부담이 커집니다.
짧은 점퍼선 하나로 센서 1개를 연결할 때는 모듈에 포함된 4.7kΩ 풀업만으로도 충분한 경우가 많습니다. 하지만 센서를 여러 개 붙이거나 브레드보드 배선을 길게 늘리면 합성 저항과 배선 용량이 달라집니다. 이때 주소는 보이는데 값이 튀거나, 특정 센서만 간헐적으로 사라지는 현상이 생길 수 있습니다.
- 센서 모듈마다 풀업 저항이 병렬로 추가되는지 확인합니다.
- 센서가 많아지면 전체 풀업이 너무 강해지지 않는지 계산합니다.
- 배선이 길어질수록 통신 속도를 낮춰 테스트합니다.
- 400kHz보다 100kHz에서 먼저 안정성을 확인합니다.
입문자는 오실로스코프 없이도 징후를 볼 수 있습니다
전문 장비가 없어도 증상은 꽤 많은 것을 알려 줍니다. 같은 코드가 책상 위 짧은 배선에서는 되고 케이스 안 긴 배선에서는 안 된다면 풀업과 배선 용량을 의심할 만합니다. 손으로 선을 건드릴 때 값이 흔들린다면 접촉 불량, 공통 접지, 노이즈 문제도 함께 점검해야 합니다.
아두이노와 라즈베리파이에서 같은 센서가 다르게 보이는 까닭
보드가 바뀌면 I2C 환경도 바뀝니다
아두이노와 라즈베리파이는 모두 I2C 센서를 다룰 수 있지만, 개발 환경과 기본 설정이 다릅니다. 아두이노는 스케치 업로드 후 단일 프로그램이 반복 실행되는 구조라 센서 테스트가 단순합니다. 라즈베리파이는 운영체제 위에서 I2C 인터페이스를 활성화하고, 권한과 패키지, 파이썬 라이브러리까지 함께 맞춰야 합니다.
라즈베리파이에서 i2cdetect 명령으로 주소가 보인다면 하드웨어 연결은 어느 정도 확인된 것입니다. 하지만 파이썬 코드에서 권한 오류가 나거나 SMBus 번호가 맞지 않으면 값 읽기는 실패합니다. 반대로 아두이노에서는 핀 이름이 보드마다 달라 A4/A5만 믿고 연결했다가 실패하는 경우가 흔합니다.
- 아두이노 우노는 보통 A4가 SDA, A5가 SCL로 쓰입니다.
- ESP32는 코드에서 SDA/SCL 핀을 지정하는 경우가 많습니다.
- 라즈베리파이는 I2C 인터페이스 활성화와 버스 번호 확인이 필요합니다.
- 운영체제 기반 보드는 장치 드라이버와 사용자 권한도 점검합니다.
임베디드 개발에서는 하드웨어와 소프트웨어 사이를 이어 주는 계층을 이해하는 것이 중요합니다. 더 넓은 관점에서 개발 환경의 역할이 궁금하다면 디바이스 드라이버 통합개발환경의 개요처럼 드라이버와 개발 도구의 관계를 살펴보면 도움이 됩니다.
첫 프로젝트는 화려한 사물인터넷보다 한 센서 로그가 낫습니다
입문용 목표를 작게 잡아야 배울 것이 선명합니다
사물인터넷 프로젝트를 시작하면 온도, 습도, 조도, 미세먼지, 가속도 센서를 한 번에 붙이고 싶어집니다. 하지만 초보 단계에서는 센서가 많아질수록 실패 원인이 기하급수적으로 늘어납니다. 전원 문제인지, 주소 충돌인지, 코드 문제인지, 클라우드 전송 문제인지 분리하기 어려워지기 때문입니다.
가장 좋은 첫 과제는 센서 하나를 안정적으로 읽고, 같은 값을 시간순으로 기록하는 것입니다. 예를 들어 BME280 같은 환경 센서를 하나 연결해 5초마다 온도와 습도를 시리얼 모니터에 출력해 보세요. 그다음 CSV 저장, OLED 표시, 와이파이 전송 순서로 확장하면 어느 단계에서 문제가 생겼는지 바로 알 수 있습니다.
- 1단계: 센서 하나의 주소를 스캔합니다.
- 2단계: 예제 코드로 원시 값을 읽습니다.
- 3단계: 10분 이상 값이 튀지 않는지 관찰합니다.
- 4단계: 표시 장치나 네트워크 기능을 하나씩 추가합니다.
- 5단계: 케이스에 넣은 뒤에도 같은 결과가 나오는지 확인합니다.
센서 데이터가 생활 기록이나 환경 기록으로 확장되는 흐름은 라이프로그와도 닿아 있습니다. 데이터가 단순 숫자를 넘어 사용자의 상태와 행동을 설명한다는 관점은 라이프로그 서비스 설명에서도 참고할 수 있습니다.
입문자가 바로 써먹는 I2C 연결 순서
문제 해결은 순서를 정하면 쉬워집니다
I2C 회로가 안 될 때 가장 답답한 순간은 무엇부터 봐야 할지 모를 때입니다. 이럴 때는 코드를 계속 고치기보다 하드웨어, 주소, 초기화, 데이터 해석 순서로 나누어 확인하는 편이 빠릅니다. 특히 전자회로 입문자는 브레드보드 접점과 점퍼선 방향만 바꿔도 문제가 사라지는 경험을 자주 하게 됩니다.
아래 순서는 아두이노, ESP32, 라즈베리파이 모두에 적용할 수 있는 기본 흐름입니다. 다만 보드별 핀 이름과 전압 기준은 반드시 별도로 확인해야 합니다. 같은 I2C라는 이름을 쓰더라도 보드 제조사와 모듈 설계에 따라 기본 조건이 달라지기 때문입니다.
- 전원 확인: 센서 VCC가 3.3V용인지 5V 허용인지 먼저 봅니다.
- GND 확인: 보드와 센서의 접지가 반드시 이어져야 합니다.
- 핀 확인: SDA와 SCL이 서로 바뀌지 않았는지 확인합니다.
- 주소 스캔: I2C 스캐너로 실제 응답 주소를 확인합니다.
- 예제 실행: 센서 모델에 맞는 라이브러리 예제를 먼저 돌립니다.
- 속도 낮추기: 불안정하면 100kHz 이하에서 다시 테스트합니다.
가격대보다 데이터시트가 더 중요합니다
입문용 센서 모듈은 몇 천 원대부터 쉽게 구할 수 있지만, 싸고 비싼 것보다 문서가 잘 있는지가 더 중요합니다. 회로도, 주소 설정, 전압 범위, 라이브러리 링크가 명확한 모듈을 고르면 실패 시간이 크게 줄어듭니다. 처음부터 가장 저렴한 부품만 고르기보다, 학습용으로 검증된 모듈 하나를 선택하는 것이 결과적으로 더 경제적입니다.
센서를 두 개 꽂으면 왜 하나만 보일까요
주소 충돌은 초보자가 가장 늦게 의심하는 원인입니다
입문자가 자주 묻는 질문이 있습니다. “센서 하나씩 연결하면 둘 다 되는데, 같이 꽂으면 왜 하나만 보이나요?” 이 상황에서는 먼저 I2C 주소 충돌을 의심해야 합니다. I2C 버스에서는 같은 주소를 가진 장치 두 개가 동시에 응답하면 마스터가 어느 장치의 대답인지 구분하기 어렵습니다.
예를 들어 같은 온습도 센서 모듈 두 개를 샀다면 둘 다 기본 주소가 같을 가능성이 높습니다. 일부 모듈은 납땜 점퍼나 ADDR 핀으로 주소를 하나 더 선택할 수 있지만, 선택 가능한 주소가 2개뿐인 경우도 많습니다. 같은 센서를 세 개 이상 써야 한다면 I2C 멀티플렉서 같은 부품을 고려해야 합니다.
- 각 센서를 하나씩만 연결해 주소를 따로 기록합니다.
- 두 센서를 함께 연결한 뒤 스캐너 결과가 어떻게 바뀌는지 봅니다.
- ADDR, SDO, CSB 같은 주소 선택 핀이 있는지 확인합니다.
- 주소 변경이 불가능하면 TCA9548A 같은 I2C 멀티플렉서를 검토합니다.
다만 주소 충돌만이 원인은 아닙니다. 센서를 두 개 꽂는 순간 풀업 저항이 병렬로 겹쳐 버스 조건이 바뀌거나, 전원 공급이 부족해질 수도 있습니다. 따라서 “같은 주소인가?”를 확인한 뒤에도 전압, 풀업, 배선 길이를 함께 봐야 합니다. 초보 단계에서 가장 실용적인 답은 단순합니다. 센서는 하나씩 성공시키고, 추가할 때마다 주소 스캔과 10분 안정성 테스트를 반복하세요.

- 다음글라즈베리파이가 꼭 이기는 건 아닌 I2C 센서 선택 26.10.11
등록된 댓글이 없습니다.
