2009년 2월 4일 수요일

아두이노 입/출력 포트 확장! : PCA9535 IC

예전에도 언급했듯이 아두이노에는 포트가  많은 편이 아닙니다.
사실, 언제나, 물리적인 제약을 극복하고 문제를 해결하는 방법이 있었지만, 없어서 못 쓰는것과 있는데 안 쓰는것은 기분이! 다르죠.

이런 제 허영심을 채워 준 IC를 소개합니다.

![PCA9536breakout](wp-content/uploads/image/PCA9535breakout_in_hand.jpg)

짜잔~

이 칩은 SMD 패키징(TSSOP)이기 때문에, 윤택한 삶을 위해 변환 기판을 만들었습니다.
집구석 에칭으로 어느정도 까지 되는지 궁금하셨던 분들은 참고하세요. 이 변환기판에서 선 굵기는 0.2mm 정도 이고, 정상 동작 합니다. +_+

- [PCA9535 breakout sch&brd](http://web.suapapa.net:8080/svn/HW/breakout/PCA9535_breakout) eagle cad

동작을 위한 아두이노 스케치는 [Keith’s Electronics Blog 의 Arduino I2C Expansion I/O](http://www.neufeld.newton.ks.us/electronics/?p=241)에서 참고하실 수 있습니다.



PCA9535는 16bit I/O 확장 칩입니다. 이 칩은 I2C버스를 통해 아두이노에 연결되기 때문에 아두이노 포트 "두 개"만을 희생하여 16개의 입출력 포트를 얻을 수 있습니다.

I2C가 생소하신 분들을 위해 여기, [wikipedia에서](http://en.wikipedia.org/wiki/I%C2%B2C) 가져 온 I2C 이미지가 있습니다.

![I2C](http://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/I2C.svg/350px-I2C.svg.png)


갈색의 uC는 아두이노구요, 파란 네모 하나(I2C slave)가 PCA9535 입니다. 위 그림에선 슬레이브가 여러개 달려있죠? 그리고, 여전히 사용되는 선은 "두 개" (SDA, SCL)입니다.

고로, 여전히 두개의 포트를 희생한 채로 입출력 포트를 16*n개!!로 확장할 수 있습니다.

[SADI가 자랑(만)한 32port output, 64port input 등딱지](http://sadiinteractionlab.tistory.com/entry/%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8-Arduino-%ED%99%95%EC%9E%A5-%EB%B3%B4%EB%93%9C)도 이와 비슷한 I2C I/O확장 칩들을 사용하는 것으로 예상됩니다.


> I2C 문서들에서 SDA,SCL에 풀업 저항을 각각 달아야 한다고 언급되어 있는데 아두이노의 경우 이 풀업저항들 마저 AVR에 포함되어 있습니다. 이 멋진 기술은 현역으로 여러분이 가지고 있는 핸드폰을 포함한 거의 모든 임베디드 장치에서 사용되고 있습니다. :)

슬레이브가 여러 개 있는데 어떻게 두선만으로 통신이 가능한가 하면, 각 슬레이브에 주소가 정해져 있기 때문입니다. PCA9535에도 주소를 변경하기 위한 핀이 세개 있어서 이를 다르게 하여 같은 IC를 여러개 연결할 수 있습니다.

> 네 거짓말을 좀 했습니다. I2C의 주소는 7bit이기때문에 I2C장치는 2^7=128개 까지 붙일 수 있고, PCA9535에서 사용자가 바꿀수 있는건 7bit중 3개이기때문에 -같은 칩을- 8개 붙일 수 있습니다.

제가 만든 변환기판을 자세히 보면:

![PCA9553breakout_closeshot](wp-content/uploads/image/PCA9535breakout_closeshot.jpg)

왼쪽하단의 솔더링 점퍼들이 I2C 주소를 정하기 위한 것 입니다. 현재는 모두 왼쪽 접점에 솔더링 된어 0 으로 설정된 상태입니다. 1을 설정하려면 오른쪽 접접으로 솔더링 하고, 기판 하단으로 pull up 저항을 연결하게 됩니다.

설명은 이쯤하고, 돌아가는 모습을 보면:

![PCA9535breakout_in_action](wp-content/uploads/image/PCA9535breakout_inaction.jpg)

변환기판 주변에 네 개의 선이 연결되어 있는데 빨강/검정의 5V/GND를 제외한 녹색/흰색 (흰선이 녹선 뒤에 숨어서 잘 안보이네요) 두 선만으로 제어되고 있음을 보실 수 있습니다. 멋지지 않나요?

하지만, 위 테스트에서도 16개의 I/O포트의 반밖에 사용하지 못했듯이, 현재 이 I/C는 제 구실할 곳을 찾지 못하고 책상 서랍에 처박여 있습니다. ㅋ -_-;


- 한 줄 요약 : I2C 만세!?

댓글 12개:

  1. I'm glad my I2C code was helpful to someone!

    I really like your solder pads for setting the I2C address!

    답글삭제
  2. 오아~ 대단하심다. 확실히 작으니 확장시 여러므로 유용할 듯. 사실 저도 사디거 받고 난 뒤 확장할 만큼 많은 포트를 사용하지 않아서요. 하지만 이제 사용할 것 같은데. 수아파파님께서 만드신 이걸하고 사디거 둘 다 테스트 해봐야겠군요. ㅎㅎㅎ

    답글삭제
  3. pashiran 님, digitypo 님/ 감사합니다.
    Keith Neufeld/ Thank you for the code & Thank you for visiting. :)
    I'll translate this post in English soon.

    답글삭제
  4. I was able to read most of it using Google Language Tools. It's not a perfect translation, but it gets the idea across. The rest of the world shouldn't have to speak English just for us lazy Americans. :-)

    답글삭제
  5. Keith Neufeld/ I am surprised Google Translator really do works! I thought It was a toy. what a Google!
    Even so, translating my posts in English have some meaning for me, improving my poor writing skill.
    For now, maybe, Google's translation is better then my -hard- works. :$

    답글삭제
  6. 디지털 핀만 확장이 가능한가요? 아날로그 포트를 확장시킬 수 있는 방법은 없을까요?

    답글삭제
  7. aquaism 님/ ADC 칩을 사용하면 됩니다. 찾아보니 국내에서도 MCP320x 칩을 쉽게 구할 수 있네요. 아두이노에 사용한 예(스케치)도 있구요. 다음 링크:
    http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1206784528

    답글삭제
  8. 감사합니다^^ 저는 4051이라는 mux를 사용하는 방법을 찾았는데,(http://www.arduino.cc/playground/Learning/4051) 혹시 adc를 이용하는 방법과 mux을 이용하는 방법이 어떤 차이가 있는지 아시나요?

    답글삭제
  9. MUX는 여러 소스중 "하나"를 선택하는 거에요(예, 8개중 3번 입력선택). 따라서, 아두이노 아나로그 입력 핀 하나를 -선택된 입력 용으로- 사용합니다. 여러 아나로그 입력을 동시에 받을 필요가 없다면 MUX를 사용하시는게 간단하실 수 있겠네요.
    위에 언급된 ADC칩은 아두이노 아나로그핀이 늘어난 것 처럼 만들어 주는 것이죠. SPI통신은 디지털 핀들을 사용하니 아두이노아나로그핀+ADC칩에서 제공하는 아나로그 포트를 동시에 사용하실 수 있습니다.

    답글삭제
  10. 그림이 다 깨져서 나와요 ㅠㅠ

    답글삭제
  11. 알려주셔서 감사합니다. 수정해 뒀습니다. :)

    답글삭제