산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

I2C 통신은 어떻게 작동합니까? 아두이노와 I2C 튜토리얼

<메인 클래스="사이트 메인" id="메인">

이 튜토리얼에서는 I2C 통신 프로토콜이 어떻게 작동하는지 배우고 Arduino 보드와 이 프로토콜을 사용하는 센서를 사용하여 실용적인 예를 만들 것입니다. 다음 비디오를 보거나 아래에 작성된 튜토리얼을 읽을 수 있습니다.

개요

I2C 통신 버스는 마스터와 여러 슬레이브 장치 또는 여러 마스터 장치 간의 통신이 필요한 많은 전자 설계에서 쉽게 구현할 수 있기 때문에 매우 대중적이고 많은 전자 장치에서 널리 사용됩니다. 7비트 주소 지정을 사용할 때 최대 거의 128(112) 장치와 10비트 주소 지정을 사용할 때 최대 거의 1024(1008) 장치 간의 통신에 두 개의 와이어만 필요하다는 사실과 함께 쉬운 구현이 제공됩니다.

<그림 클래스="aligncenter">

I2C 작동 방식

전선만으로 그렇게 많은 기기들 간의 통신이 어떻게 가능할까요? 각 장치에는 미리 설정된 ID 또는 고유한 장치 주소가 있으므로 마스터가 통신할 장치를 선택할 수 있습니다.

두 개의 와이어 또는 라인을 직렬 클록(또는 SCL) 및 직렬 데이터(또는 SDA)라고 합니다. SCL 라인은 I2C 버스의 장치 간 데이터 전송을 동기화하는 클록 신호이며 마스터 장치에서 생성됩니다. 다른 라인은 데이터를 전달하는 SDA 라인입니다.

두 라인은 "오픈 드레인"이며, 이는 I2C 버스의 장치가 활성 로우이기 때문에 라인이 하이가 되도록 풀업 저항을 연결해야 함을 의미합니다. 저항에 일반적으로 사용되는 값은 약 400kbps에서 더 높은 속도의 경우 2K에서 약 100kbps의 낮은 속도의 경우 10K입니다.

<그림 클래스="aligncenter">

I2C 프로토콜

데이터 신호는 8비트 시퀀스로 전송됩니다. 따라서 특별한 시작 조건이 발생한 후 데이터가 전송되는 슬레이브의 주소를 나타내는 처음 8비트 시퀀스가 ​​옵니다. 각 8비트 시퀀스 이후에는 Acknowledge라고 하는 비트가 뒤따릅니다. 대부분의 경우 첫 번째 Acknowledge 비트 이후에 다른 주소 지정 시퀀스가 ​​오지만 이번에는 슬레이브 장치의 내부 레지스터입니다. 주소 지정 순서 직후에는 데이터가 완전히 전송되고 특수 정지 조건으로 끝날 때까지 데이터 순서를 따릅니다.

이러한 이벤트를 더 자세히 살펴보겠습니다. 시작 조건은 클럭 라인이 여전히 높은 동안 데이터 라인이 로우로 떨어질 때 발생합니다. 그 후 클럭이 시작되고 각 클럭 펄스 동안 각 데이터 비트가 전송됩니다.

장치 주소 지정 시퀀스는 최상위 비트(MSB)로 시작하고 최하위 비트(LSB)로 끝납니다. 8 번째 비트는 마스터가 슬레이브에 쓸 것인지(논리 낮음) 슬레이브에서 읽을 것인지(로직 높음) 표시하는 데 사용됩니다.

다음 비트 AKC/NACK은 슬레이브 장치가 이전 비트 시퀀스를 성공적으로 수신했는지 여부를 나타내는 데 사용됩니다. 따라서 이 시점에서 마스터 장치는 SDA 라인의 제어를 슬레이브 장치로 넘기고 슬레이브 장치가 이전 시퀀스를 성공적으로 수신하면 SDA 라인을 승인이라는 조건으로 끌어내립니다. 슬레이브가 SDA 라인을 풀다운하지 않으면 상태를 Not Acknowledge라고 하며 여러 가지 이유로 인해 이전 시퀀스를 성공적으로 수신하지 못했다는 의미입니다. 예를 들어, 슬레이브는 사용 중이거나 수신된 데이터 또는 명령을 이해하지 못하거나 더 이상 데이터를 수신할 수 없는 경우 등입니다. 이 경우 마스터 장치가 진행 방식을 결정합니다.

다음은 내부 레지스터 주소 지정입니다. 내부 레지스터는 다양한 정보 또는 데이터를 포함하는 슬레이브 메모리의 위치입니다. 예를 들어 ADX345 가속도계에는 고유한 장치 주소와 X, Y 및 Z 축에 대한 추가 내부 레지스터 주소가 있습니다. 따라서 X축의 데이터를 읽으려면 먼저 장치 주소를 보낸 다음 X축에 대한 특정 내부 레지스터 주소를 보내야 합니다. 이 주소는 센서의 데이터시트에서 찾을 수 있습니다.

주소 지정 후 데이터 전송 시퀀스는 R/W 비트에서 선택한 모드에 따라 마스터 또는 슬레이브에서 시작됩니다. 데이터가 완전히 전송된 후 SCL 라인이 High인 상태에서 SDA 라인이 Low에서 High로 갈 때 발생하는 정지 조건으로 전송이 종료됩니다.

예시

예를 들어 5개의 다른 센서로 구성된 GY-80 브레이크아웃 보드와 3개의 다른 센서로 구성된 GY-521 브레이크아웃 보드를 사용하겠습니다. 따라서 I2C 버스가 있는 단 2개의 와이어로 8개의 서로 다른 센서에서 데이터를 얻을 수 있습니다.

<그림 클래스="aligncenter">

다음 사이트에서 이러한 구성요소를 얻을 수 있습니다.

다음은 보드를 연결하는 방법입니다. Arduino 보드의 직렬 클록 핀은 두 브레이크아웃 보드의 직렬 클록 핀에 연결되며 직렬 데이터 핀도 마찬가지이며 Arduino 보드의 Gnd 및 5V 핀으로 보드에 전원을 공급합니다. 브레이크아웃 보드에 이미 풀업 저항이 있으므로 여기에서는 풀업 저항을 사용하지 않습니다.

<그림 클래스="aligncenter">

이제 이러한 칩이나 센서와 통신하려면 고유한 주소를 알아야 합니다. 센서의 데이터 시트에서 찾을 수 있습니다. GY-80 브레이크아웃 보드의 경우 4개의 주소가 있습니다. 3축 가속도계 센서용 16진수 0x53, 3축 자이로 센서용 16진수 0x69, 3축 자력계용 16진수 0x1E, 기압계용 온도계 0x77 센서.

GY-521 브레이크아웃 보드의 경우 주소는 16진수 0x68입니다. Arduino 공식 웹 사이트에서 찾을 수 있는 Arduino I2C 스캐너 스케치를 사용하여 주소를 얻거나 확인할 수도 있습니다. 따라서 여기에서 해당 스케치를 업로드하고 실행하면 I2C 버스에 연결된 장치의 주소를 얻을 수 있습니다.


센서                                           부품 번호                                     I2C 주소

3축 가속도계                   Analog Devices ADXL345                   0x53                데이터시트

3축 GyroST                                Microelectronics L3G4200D             0x69                  데이터시트

3축 자력계                  Honeywell MC5883L                         0x1E                  데이터시트

기압계 + 온도계        Bosch BMP085                                     0x77                 데이터시트


장치의 주소를 찾은 후에는 장치에서 데이터를 읽기 위해 내부 레지스터의 주소도 찾아야 합니다. 예를 들어 GY-80 브레이크아웃 보드의 3축 가속도계 센서에서 X축에 대한 데이터를 읽으려면 X축의 데이터가 저장된 내부 레지스터 주소를 찾아야 합니다. 센서의 데이터시트에서 X축에 대한 데이터는 실제로 16진법 주소 0x32를 갖는 DATAX0과 16진법 주소 0x33을 갖는 DATAX1의 두 레지스터에 저장되어 있음을 알 수 있습니다.

Arduino I2C 코드

이제 X축에 대한 데이터를 가져올 코드를 만들어 보겠습니다. 그래서 스케치에 포함되어야 하는 Arduino Wire Library를 사용할 것입니다. 여기서 먼저 센서 주소와 이전에 찾은 두 개의 내부 레지스터 주소를 정의해야 합니다. Wire.begin() 함수는 Wire 라이브러리를 시작하고 직렬 모니터를 사용하여 센서의 데이터를 표시하기 때문에 직렬 통신도 시작해야 합니다.

루프()에서 Wire.beginTransmission()으로 시작하겠습니다. 우리의 경우 3축 가속도계인 특정 센서로의 전송을 시작하는 기능입니다. 그런 다음 Wire.write() 함수를 사용하여 X 축의 두 레지스터에서 특정 데이터를 요청할 것입니다. Wire.endTransmission() 전송을 종료하고 레지스터에서 데이터를 전송합니다. 이제 Wire.requestFrom() 함수에서 전송된 데이터 또는 두 레지스터에서 두 바이트를 요청합니다.

Wire.available() 이 함수는 검색에 사용할 수 있는 바이트 수를 반환하고 해당 수가 요청된 바이트와 일치하면 Wire.read()를 사용하여 이 경우에는 2바이트입니다. 함수를 사용하여 X축의 두 레지스터에서 바이트를 읽습니다. 마지막으로 데이터를 직렬 모니터에 인쇄합니다. 여기에 그 데이터가 있지만 이것은 원시 데이터이며 X 축의 올바른 값을 얻기 위해 약간의 수학이 필요하다는 점을 명심하십시오. 이에 대한 자세한 내용은 Arduino 보드와 함께 가속도계를 사용하기 위한 다음 튜토리얼에서 찾을 수 있습니다. 이 튜토리얼의 주요 목표는 Arduino I2C 통신 작동 방식을 설명하는 것이기 때문에 과부하가 걸리지 않기 때문입니다.

/*  
 *  How I2C Communication Protocol Works - Arduino I2C Tutorial
 *  
 *   by Dejan, www.HowToMechatronics.com 
 *   
 */

#include <Wire.h>

int ADXLAddress = 0x53; // Device address in which is also included the 8th bit for selecting the mode, read in this case.

#define X_Axis_Register_DATAX0 0x32 // Hexadecima address for the DATAX0 internal register.
#define X_Axis_Register_DATAX1 0x33 // Hexadecima address for the DATAX1 internal register.
#define Power_Register 0x2D // Power Control Register

int X0,X1,X_out;

void setup() {
  Wire.begin(); // Initiate the Wire library
  Serial.begin(9600);
  delay(100);
  // Enable measurement
  Wire.beginTransmission(ADXLAddress);
  Wire.write(Power_Register);
  // Bit D3 High for measuring enable (0000 1000)
  Wire.write(8);  
  Wire.endTransmission();
}

void loop() {
  Wire.beginTransmission(ADXLAddress); // Begin transmission to the Sensor 
  //Ask the particular registers for data
  Wire.write(X_Axis_Register_DATAX0);
  Wire.write(X_Axis_Register_DATAX1);
  
  Wire.endTransmission(); // Ends the transmission and transmits the data from the two registers
  
  Wire.requestFrom(ADXLAddress,2); // Request the transmitted two bytes from the two registers
  
  if(Wire.available()<=2) {  // 
    X0 = Wire.read(); // Reads the data from the register
    X1 = Wire.read();   
  }
  
  Serial.print("X0= ");
  Serial.print(X0);
  Serial.print("   X1= ");
  Serial.println(X1);
}Code language: Arduino (arduino)

제조공정

  1. Raspi 2 WIOT와 Arduino I2C 통신
  2. Arduino 에너지 모니터 및 데이터 로거를 구축하는 방법
  3. 온도 및 습도 데이터 로거
  4. Python3 및 Arduino 통신
  5. Arduino와 함께 NMEA-0183을 사용하는 방법
  6. Arduino 튜토리얼:JARVIS v1 | 홈 오토메이션을 만드는 방법
  7. Arduino 다중 스레드 방법(프로토스레딩 자습서)
  8. nRF24L01 – 작동 원리, Arduino 인터페이스, 회로, 코드
  9. Arduino 및 MPU6050 가속도계 및 자이로스코프 자습서
  10. Arduino 및 ADXL345 가속도계로 방향을 추적하는 방법