본문 바로가기

Embedded System

[MCP23017] 임베디드 디지털 입출력 확장

반응형

 


 

안녕하세요.

이번 포스트에서는 아두이노나 라즈베리 등 다양한 개발 보드에서 입출력 핀이 부족할 때 보드를 더 사용할 수도 없고 당황할 때 해결 방법으로 좋은 IC Chip을 설명드립니다. 예시 코드도 제공해 드릴 것이지만 꼭 이해하고 사용해 보세요~


 

 

디지털 입출력 확장

: 충분하지 않은 핀의 개수를 하드웨어적으로 확장시켜 문제를 해결하는 방법을 설명한다.

1. 키 매트릭스

: 예를 들어 2X2 크기의 LED 매트릭스의 경우 4개의 LED를 제어하기 위해 8개의 핀을 사 용하였다. LED 매트릭스의 경우 LED 들을 행과 열로 배열하고 행 또는 열 단위로 제어함으로써 필요한 핀의 개수를 줄일 수 있다. Col1에 HIGH가 가해 지고 Col2에는 LOW가 가해졌다고 가 정해 보자. 1열에 연결된 두 개의 버튼 (SW11과 SW21) 중 늘러진 버튼이 없다면 각 행에 해당하는 값(Row1과 Row2)은 모두 LOW 가 된다. 하지만 1열의 1행 버튼(SW11)이 눌러졌다면 Row1으로는 HIGH가, Row2로는 LOW 가 입력될 것이다.

 

 

2. MCP23017 Chip

: MCP23017 칩은 16비트 디지털 입출력 확장 칩으로 디지털 입출력을 I2C 프로토콜을 이용하여 추가적으로 이용할 수 있도록 해준다. MCP23017은 최 대 8개까지 동시에(하나의 MCU에 8개까지 MCP23017칩 사용 가능) 연결하여 사용할 수 있으므로 최대 128개(8개 디지털 핀을)의 추가적인 입출력 포트를 제공해 줄 수 있다.

  MCP23017은 28개의 핀으로 구성되어 있으며, 8비트 단 위의 두 그룹(bank)으로 입출력 핀을 제공하고 있다. 9번 핀 VDD는 5V에, 10 번 핀 VSS는 GND에 연결하는 전원 핀이다. 11번과 14번 핀은 사용하지 않으며 12번과 13번 핀을 각각 I2C 연결을 위한 클록과 데이터 선으로 아두이노 우노의 경우 SCL을 아날로그 5번 핀에, SDA를 아날로그 4번 핀에 연결한다. I2C 연결에서는 안정적인 데이터 전송을 위해 외부 풀업 저항 연결이 필요하므로 10kΩ 저항을 풀업 저항으로 사용한다. 18번 RESET핀은 GND에 연결할 때 칩을 초기화하는 동작을 하므로 5V에 연 결하여 동작(초기화) 하지 않는 상태의 칩으로 만들어 놓는다. 19번 핀과 20번 핀을 인터럽 트 관련 핀으로 별도로 불필요시 지정하지 않는다. 15번에 서 17번 핀을 I2C 연결을 위한 주소 지정을 위해 사용되는 핀이다.

 

 

 

  MCP23017 칩의 기본 I2C 주소는 0x20 = 0010 00002으로 여기에 (A2A1A1)2 값을 더해 주소가 결정된다. 만약 A2에 5V를 연결하고 A1과 A0를 GND에 연결하였다면 MCP23017 칩의 I2C 주소는 0010 01002=0x24 가 될 것이다. 이처럼 MCP23017 칩에서는 0x20에서 0x27까지 8개의 서로 다른 주소를 지정할 수 있으므로 128(16x8개의 입출력을 I2C를 이용하여 확장할 수 있다. MCP23017 칩을 이용하면 I2C를 위한 SCL과 SDA 두 핀만으로 최대 16개의 LED를 제어할 수 있다. 먼저, MCP23017 칩에 16개의 LED를 제어할 수 있다. 먼저, MCP23017 칩에 16개의 LED를 오른쪽 그림과 같이 연결 (그림은 8개만 1그룹에 연결함) 한다.

 

 

  아두이노와의 연결의 위 그림을 참고한다. 해당 16개 확장핀을 사용할 때 라이브러리(별도 다운 필요*)에서는 디지털 입출력 핀을 0에서 15번까지의 번호로 관리하고 있다. 이때 0번은 GPA0(MCP23017의 21번 핀)에 해 당하고 15번은 GPB7(MCP23017의 8번 핀)에 해당한다. 라이브러리를 사용하기 위해서는 먼저 해당 헤더 파일을 포함시켜야 한다. MCO23017 찹 운 I2C 프로토콜을 사용하므로 Wire 라이브러리의 헤더 파일 역시 포함 시켜야 한다. 헤더 파일이 포함되면 Adafruit_MCP23017 클래스의 객체를 생성한다. MCP23017은 동시에 8개까지 연결할 수 있으므로 여러 개의 칩을 동시에 사용하는 경우에는 칩별로 하나씩 객체를 생성해야 한다. 객체는 begin 함수를 통해 초기화를 수행하며, 초기화에서는 MCP23017 칩의 주소를 설정한다. 주소는 0에서 7까지 값이 지정될 수 있으며, 디폴트 값은 0으로 0x20을 기본 I2C 주소로 사용한다. 주소가 지정되면 사용하고자 하는 핀의 모드를 지정한다. 아 레코드는 MCP23017칩에 연결된 16개의 LED를 일정한 시간 간격으로 점멸하는 예이다.

 

 

  객체이름_digitalWrite 함수는 확장된 16개의 포트를 개별적으로 제어하기 위해 사용된다. 반면, 16개의 핀에 동시에 값을 출력하기 위해서는 writeGPIOAB 함수를 사용할 수 있다. 이때 data는 16 비트 값으로 확장된 16개의 핀에 대응하며 GPA0가 data의 LSB에, GPB7 이 data의 MSB에 해당된다. 아해 코드는 MCP23017 칩을 이용한 출력 확장 일괄제어이다.

 

반응형