Arduino-인터 집적 회로

I2C (Inter-integrated circuit)는 마이크로 컨트롤러와 차세대 특수 집적 회로 간의 직렬 데이터 교환을위한 시스템입니다. 그것들 사이의 거리가 짧을 때 사용됩니다 (수신기와 송신기는 일반적으로 동일한 인쇄판에 있습니다). 두 개의 컨덕터를 통해 연결이 설정됩니다. 하나는 데이터 전송에 사용되고 다른 하나는 동기화 (클럭 신호)에 사용됩니다.

다음 그림에서 볼 수 있듯이 하나의 장치는 항상 마스터입니다. 통신이 시작되기 전에 하나의 슬레이브 칩의 주소 지정을 수행합니다. 이러한 방식으로 하나의 마이크로 컨트롤러가 112 개의 서로 다른 장치와 통신 할 수 있습니다. 전송 속도는 일반적으로 100Kb / 초 (표준 모드) 또는 10Kb / 초 (저속 전송 속도 모드)입니다. 3.4 Mb / sec의 전송 속도를 가진 시스템이 최근 등장했습니다. I2C 버스를 통해 통신하는 장치 간의 거리는 몇 미터로 제한됩니다.

보드 I2C 핀

I2C 버스는 SCL과 SDA의 두 신호로 구성됩니다. SCL은 클럭 신호이고 SDA는 데이터 신호입니다. 현재 버스 마스터는 항상 클럭 신호를 생성합니다. 일부 슬레이브 장치는 시간에 따라 클럭을 낮게 설정하여 마스터가 더 많은 데이터를 전송하도록 지연시킬 수 있습니다 (또는 마스터가 클럭 아웃을 시도하기 전에 데이터를 준비하는 데 더 많은 시간이 필요함). 이것을 "시계 스트레칭"이라고합니다.

다음은 다른 Arduino 보드의 핀입니다.

  • Uno, Pro Mini A4 (SDA), A5 (SCL)
  • Mega, Due 20 (SDA), 21 (SCL)
  • Leonardo, Yun 2 (SDA), 3 (SCL)

Arduino I2C

I2C를 사용하여 두 개의 Arduino 보드를 연결하는 두 가지 모드 (마스터 코드 및 슬레이브 코드)가 있습니다. 그들은-

  • 마스터 송신기 / 슬레이브 수신기
  • 마스터 수신기 / 슬레이브 송신기

마스터 송신기 / 슬레이브 수신기

이제 마스터 송신기와 슬레이브 수신기가 무엇인지 살펴 보겠습니다.

마스터 송신기

다음 기능은 와이어 라이브러리를 초기화하고 I2C 버스를 마스터 또는 슬레이브로 결합하는 데 사용됩니다. 일반적으로 한 번만 호출됩니다.

  • Wire.begin(address) − 주소는 마스터가 지정되지 않았기 때문에 우리의 경우 7 비트 슬레이브 주소이며 버스에 마스터로 연결됩니다.

  • Wire.beginTransmission(address) − 주어진 주소로 I2C 슬레이브 장치로 전송을 시작합니다.

  • Wire.write(value) − 마스터에서 슬레이브 장치 (beginTransmission () 및 endTransmission () 호출 사이) 로의 전송을 위해 바이트를 대기열에 넣습니다.

  • Wire.endTransmission() − beginTransmission ()에 의해 시작된 슬레이브 장치로의 전송을 종료하고 wire.write ()에 의해 큐에 넣은 바이트를 전송합니다.

Example

#include <Wire.h> //include wire library

void setup() //this will run only once { 
   Wire.begin(); // join i2c bus as master
} 

short age = 0; 

void loop() {   
   Wire.beginTransmission(2); 
   // transmit to device #2
   Wire.write("age is = ");
   Wire.write(age); // sends one byte
   Wire.endTransmission(); // stop transmitting
   delay(1000); 
}

슬레이브 수신기

다음 기능이 사용됩니다-

  • Wire.begin(address) − 주소는 7 비트 슬레이브 주소입니다.

  • Wire.onReceive(received data handler) − 슬레이브 디바이스가 마스터로부터 데이터를받을 때 호출되는 함수입니다.

  • Wire.available() − Wire.read ()로 검색 할 수있는 바이트 수를 반환합니다. 이는 Wire.onReceive () 핸들러 내에서 호출되어야합니다.

Example

#include <Wire.h> //include wire library

void setup() {  //this will run only once
   Wire.begin(2); // join i2c bus with address #2
   Wire.onReceive(receiveEvent); // call receiveEvent when the master send any thing 
   Serial.begin(9600); // start serial for output to print what we receive 
}

void loop() {   
   delay(250); 
}

//-----this function will execute whenever data is received from master-----//

void receiveEvent(int howMany) { 
   while (Wire.available()>1) // loop through all but the last {
      char c = Wire.read(); // receive byte as a character
      Serial.print(c); // print the character
   }
}

마스터 수신기 / 슬레이브 송신기

이제 마스터 수신기와 슬레이브 송신기가 무엇인지 살펴 보겠습니다.

마스터 수신기

마스터는 요청하고 고유 주소가 지정된 슬레이브 Arduino에서 전송 된 데이터 바이트를 읽도록 프로그래밍되어 있습니다.

다음 기능이 사용됩니다-

Wire.requestFrom(address,number of bytes)− 마스터가 슬레이브 장치에서 바이트를 요청하는 데 사용됩니다. 그런 다음 wire.available () 및 wire.read () 함수를 사용하여 바이트를 검색 할 수 있습니다.

Example

#include <Wire.h> //include wire library void setup() { 
   Wire.begin(); // join i2c bus (address optional for master) 
   Serial.begin(9600); // start serial for output
} 

void loop() { 
   Wire.requestFrom(2, 1); // request 1 bytes from slave device #2
   while (Wire.available()) // slave may send less than requested {
      char c = Wire.read(); // receive a byte as character
      Serial.print(c); // print the character
   } 
   delay(500); 
}

슬레이브 송신기

다음 기능이 사용됩니다.

Wire.onRequest(handler) − 마스터가이 슬레이브 장치에 데이터를 요청할 때 함수가 호출됩니다.

Example

#include <Wire.h> 

void setup() { 
   Wire.begin(2); // join i2c bus with address #2
   Wire.onRequest(requestEvent); // register event
} 

Byte x = 0;

void loop() { 
   delay(100); 
} 

// function that executes whenever data is requested by master
// this function is registered as an event, see setup()

void requestEvent() { 
   Wire.write(x); // respond with message of 1 bytes as expected by master
   x++; 
}