728x90
반응형
맨 위로 올라가기
I2C 란?

 

I2C 는 'Inter-Intergrated Circuit'의 약어이며 Inter라는 접두어는 '사이에' 또는 '서로'를 의미하는 것으로

여러 반도체 장치 사이에서 통신을 위해 설계되었음을 나타내는 것을 의미한다.
또한 Intergrated Circuit은 집적 회로로 따라서 I2C는 집적 회로들 사이에서 데이터를 교홚하기 위해 사용되는

통신 프로토콜의 개념으로 이해하면 될 것 이다.

I2C의 목적은 복잡하고 비용이 많이 드는 병렬 통신 방식 대신에 보다 간편하고 효율적인 방법을 제공하기 위해 설계됨.

I2C 는 동기식 저속 직렬(Synchronous Serial) 통신 버스에 대한 Protocol로 필립스에 의해 80년대 초 개발되었다.
이 통신 프로토콜은 마이크로컨트롤러, 센서, 메모리, 기타 반도체 장치들 사이의 통신을 위해 설계되었다.


기본구조로 I2C 시스템은 두 개의 신호선을 사용한다.

  1. SDA(Serial Data Line): 데이터 전송 위한 선
  2. SCL(Serial Clock Line): 데이터 전송을 동기화하는 클럭 신호를 위한 선

I2C의 작동원리는 다음과 같다.

  1. Mater와 Slave:
    I2C 통신에서는 'master'와 'slave' 라는 주요 구성 요소가 있다.
    마스터 장치는 클럭 신호를 생성하고 통신을 제어하는 반면, 슬레이브 장치들은 마스터 지시에 따라 데이터를 보내거나 받는다.

  2. 주소 지정:
    각 슬레이브 장치는 고유한 주소를 가지고 있으며, 마스터는 이 주소를 사용하여 특정 슬레이브와 통신한다

  3. 데이터 전송:
    데이터는 바이트 단위로 전송되며, 각 전송은 시작 및 정지 조건으로 구분된다.

  4. 동기화:
    SCL 클럭 신호는 마스터 장치에 의해 생성되며, 모든 데이터 전송은 이 클럭에 동기화되어 진행된다.

Pi 에 적용

 

GPIO 2와 GPIO 3은 라즈베리 파이의 I2C1 핀으로, 다양한 외부 센서 및 장치와의 2선 통신을 가능하게 한다.

 

I2C 핀에는 3.3V로 고정된 1.8kΩ의 풀업 저항이 포함되어 있다.

따라서 풀업이 방해 될 수 있는 일반 목적의 입출력으로 사용하기에는 적합하지 않다.

I2C는 Multi drop bus로, 여러 장치들을 같은 두 핀에 연결할 수 있다.

각 장치는 고유한 I2C 주소를 가지고 있다.

 

연결된 I2C 주변 장치의 주소를 간단한 한줄 명령어로 확인할 수 있다.

sudo apt-get install i2c-tools
sudo i2cdetect -y 1

이후 Python에서 smbus 라이브러리를 활용하여 I2C에 access 할 수 있다.

import smbus
DEVICE_BUS = 1
DEVICE_ADDR = 0x15
bus = smbus.SMBus(DEVICE_BUS)
bus.write_byte_data(DEVIECE_ADDR, 0x00, 0x01)

# Arduino Sketch IDE Upload

#include <Wire.h>

// use the built in LED
const int ledPin = 13;

void setup() {
    // Join I2C bus as follower
    Wire.begin(0x8);

    Wire.onReceive(receiveEvent);

    // Setup initial state for pin 13
    pinMode(ledPin, OUTPUT);
    digitalWrite(ledPin, LOW);
}

void receiveEvent(int howMany) {
    while (Wire.available()) {
        char c = Wire.read();
        digitalWrite(ledPin, c);
    }
}

void loop() {
    delay(10);
}

 

** trouble shooting

sudo i2cdetect -y 1

 

위와 같이 I2C 버스를 스캔하여 연결된 장치 및 주소를 탐색시 표시가 되지 않는 경우가 발생한다.

이는 raspi-config에서 I2C가 활성화되어있지 않기 때문인데, 문제는 raspi-config이 일반적인 방법으로 설치가 되지 않는다는 것이다. 따라서 다음의 절차에 따라 설치하면 된다.

 

wget -4 https://archive.raspberrypi.org/debian/pool/main/r/raspi-config/raspi-config_20210604_all.deb -P /tmp
apt-get install libnewt0.52 whiptail parted triggerhappy lua5.1 alsa-utils -y
apt-get install -fy
dpkg -i /tmp/raspi-config_20210604_all.deb

 

위 명령줄을 따라 입력 후 raspi-confg를 부팅 파티션에 마운트해야한다.

 

sudo mount /dev/mmcblk0p1 /boot

 

이후 다음 명령줄을 통해 raspi-config를 prompt에 따라 I2C를 활성화한다.

sudo raspi-config

 

Interface Options
I2C

 

이후 다음 명령줄을 통해 사용자 계정에 대해 I2C에 접근 권한을 부여해줘야 된다.

sudo adduser <username> i2c

 

이후 재부팅한다.

 

*GPIO 위치가 잘못 배선 되어 발생한 문제였음.

sudo apt-get install python3-smbus
#!/usr/bin/env python3

import smbus
import time

addr = 0x8
bus = smbus.SMBus(1)

try:
    while True:
        bus.write_byte(addr, 0x0)
        time.sleep(1)
        bus.write_byte(addr, 0x1)
        time.sleep(1)
except KeyboardInterrupt:
    bus.write_byte(addr, 0x0)
finally:
    bus.close()

 

위 코드는 'smbus' 라이브러리를 사용하여 I2C 통신을 통해 연결된 장치에 데이터를 전송한다.
write_byte 메서드는 I2C 주소 장치에 바이트 데이터를 전송하는데 사용된다. (0, 1 값으로 스위칭 내장LED 점멸)

 

728x90
반응형

+ Recent posts