정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

아두이노와 센서2개의 I2C 통신 문의
이홍석 | 2018-05-29

1. 프로젝트 사용한 보드 종류

 아두이노 pro Micro

 

 

2. 사용한 개발 프로그램명

 아두이노 IDE

 

 

3. 사용한 센서 모델명

 Lipo fuel gauge(MAX17043), GY-86(MPU6050  HMC5883L  MS5611)

 

4. 연결한 회로 설명 (또는 이미지)

 

 

5. 소스코드 (주석 필수)

  max17043 소스코드와 gy-86소스코드

 

 

6. 문제점 및 에러 내용

모터를 구동하는데 Li폴리머 배터리로 전원공급을 하고 있습니다.

 GY-86(자이로센서)를 이용하면서 MAX17043(Li 배터리 잔량 센서) Li폴리머 배터리의 잔량을 구하려고 하고 있습니다. 즉, 아두이노 한 대로 2개 센서의 i2c통신을 하려고합니다.

아두이노 프로 마이크로에서 2,3번 핀이 sda,scl 핀이라서 I2C통신을 위해 위의 그림처럼 두 센서를 아두이노에 병렬로 연결하였습니다.

아두이노간 1:N I2c 통신은 마스터 아두이노에 코딩을하고 N대의 슬레이브 아두이노에 코딩을 한다고 알고 있습니다.  그런데 저 같은 경우에는 마스터 아두이노에 코딩을 한다고 하면 슬레이브에 해당하는 센서 2개에는 코딩을 할 수 없는데 이런 경우에는 어떤식으로 접근해야 하나요?

센서2개에 대한 코드는 가지고 있으나 이를 i2c통신에 사용하기 위한 접근법을 알고 싶습니다.

프로필사진

kocoafabeditor 2018-05-30 08:52:28

안녕하세요. 코코아팹입니다.

 

아두이노로 wire라이브러리를 이용하여 I2C 통신을 할 때 Slave 장비들은 각각의 I2C를 이용해서 구별을 해줍니다.(센서의 I2C 주소는 데이터시트를 참고하시거나 아래 링크에 있는 I2C 주소 확인하는 코드를 이용해보세요,)

 

I2C 주소 확인하기 : https://kocoafab.cc/tutorial/view/689 ( 중간쯤 있습니다.)

 

각각의 센서의 예제 코드를 보시면 Addr 관련 변수를 미리 선언해 두고 이를 사용해서 데이터를 받는 코드가 있습니다.

 

이 Addr 주소를 따로 기억해 두고, 필요한 센서에 따라 Addr주소를 바꿔가면서 쓰시면 될 것 같습니다.

 

프로필사진

kocoafabeditor 2018-05-30 08:58:26

위 링크에 I2C 주소 확인하는 소스코드가 빠져있어서 아래 직접 전달드립니다.

 

아래 코드를 복사하여 사용하세요.

 

 

#include <Wire.h>

 

void setup()

{

  Wire.begin();

 

  Serial.begin(9600);

  while (!Serial);          

  Serial.println("\nI2C Scanner");

}

 

void loop()

{

  byte error, address;

  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;

  for(address = 1; address < 127; address++ )

  {

    Wire.beginTransmission(address);

    error = Wire.endTransmission();

 

 if (error == 0)

    {

      Serial.print("I2C device found at address 0x");

      if (address<16)

        Serial.print("0");

        Serial.print(address,HEX);

        Serial.println("  !");

 

      nDevices++;

    }

    else if (error==4)

    {

      Serial.print("Unknow error at address 0x");

      if (address<16)

        Serial.print("0");

        Serial.println(address,HEX);

    }   

  }

  if (nDevices == 0)

    Serial.println("No I2C devices found\n");

  else

    Serial.println("done\n");

 

  delay(5000);

}

프로필사진

이홍석 2018-05-30 13:34:46

감사합니다!

이전글   |    RN-42(BT Module) 명령어 - HID 추가 2018-05-29
다음글   |    초음파 센서 시간 질문 드립니다. 2018-05-30