아두이노 모듈 주소 찾는 I2C 주소 스캐너

아두이노/응용

아두이노 모듈은 대부분 I2C통신을 이용해 아두이노와 데이터를 주고받는다.

I2C통신을 하기 위해선 주소가 필요한데 주소를 찾는다고 인터넷을 뒤지거나 명기된 주소와는 다른 주소를 가진(OLED모듈) 모듈이 있어 I2C스캐너가 필요하다.

 

I2C는 무엇인가?

I2C는 통신방식중 하나로 데이터 선(SDA)와 클럭 선(SCL)로 이루어져 있다. 하나의 마스터(아두이노)와 최대 127개의 슬레이브(모듈)로 구성가능하고 각각의 슬레이브(모듈)은 0x12, 0x47과 같은 주소를 가지며 해당 주소를 명기하면서 데이터를 송수신한다. 아두이노에서 사용가능한 다른 통신방식으로는 UART와 SPI가 있다.

여기서는 단순히 모듈 주소를 찾기위한 내용이므로 I2C에 대한 자세한 내용은 사이트를 참조하자.

 

 

I2C 주소 스캐너

아두이노 IDE에서 간단히 연결된 I2C주소를 스캔하는 방법이 있다.

바로 I2C 스캐너로, I2C 주소에 해당하는 1번부터 120번(121~127번을 사용하는 센서는 아직 없다)까지 데이터를 전송해 응답이 있는 주소를 표시한다.

 

우선 연결하려는 모듈에 전원선을 연결하고 데이터선(SDA는 SDA끼리, SCL은 SCL끼리)을 연결한다.

아두이노 우노의 경우 A4가 SDA, A5가 SCL이다.

아두이노와 MCP4725센서를 I2C 연결한 모습

 

이제 아래 코드를 아두이노 IDE에 붙여넣고 아두이노 보드에 업로드하자. 업로드 방법은 이 글을 참조.

#include <Wire.h>

void setup() {
  Serial.begin (115200);

  while (!Serial)
    {
    }

  Serial.println ();
  Serial.println ("I2C scanner. Scanning ...");
  byte count = 0;
 
  Wire.begin();
  for (byte i = 1; i < 120; i++)
  {
    Wire.beginTransmission (i);
    if (Wire.endTransmission () == 0)
      {
      Serial.print ("Found address: ");
      Serial.print (i, DEC);
      Serial.print (" (0x");
      Serial.print (i, HEX);
      Serial.println (")");
      count++;
      delay (10);
      } // end of good response
  } // end of for loop
  Serial.println ("Done.");
  Serial.print ("Found ");
  Serial.print (count, DEC);
  Serial.println (" device(s).");
}  // end of setup

void loop() {}

 

 

업로드가 완료되었으면 우측 상단의 시리얼 모니터를 눌러보자. 아래와 같이 연결된 주소[0x60]가 나타난다.

이제 모듈을 사용할 때 필요한 소스코드에 해당 주소를 넣으면 정상적으로 통신이 가능하다.

 

시리얼 모니터

 

 

 

 

 

 

 

0x60 의 I2C 주소가 발견되었다.

 

 

 

추가) 

0x57, 0x68의 I2C주소를 가지는 DS1302 RTC모듈을 연결하고 오실로스코프로 SDA(CH1) SCL(CH2)의 파형을 측정해보았다.

 

I2C주소를 발견하고 본문 소스코드대로 딜레이가 발생한 후 다시 주소를 검색하는 모습

 

0x68에서 I2C 주소를 발견한 모습