
라즈베리 파이의 위에 있는 2열로 된 핀을 GPIO 포트라고 한다.
CPU는 외부와 통신하기 위해 버스(인터페이스)가 필요한데, 기본적으로 USB(Universal Serial Bus)/bluetooth/wifi 등이 있다.
요런 버스(인터페이스)들은 매우 철저하게 규격화되어있어서(ex. usb를 사용하려면 usb 컨트롤러, 프로토콜 등이 필요함)
이처럼 반드시 지켜야 하는 규칙이 존재해서 개발자 마음대로 할 수 있는 게 없다. 따라서 LED 사용 등에 어려움이 있다.
따라서 CPU는 '포트'를 제공해서 개발자가 보다 자유롭게 할 수 있게끔 한다. 볼트(전압)차이의 경우 포트, 볼트를 통일해 규격화를 하는데, 이를 GPIO라고 한다.
그러면 포트를 많이 만들면 좋지 않을까? 라고 생각할 수 있다.
포트를 많이 만들 수 있지만 그러면 패키지 용량이 과도하게 커지는 문제가 발생하기에, 제한을 둔다.
라즈베리 CPU는 GPIO 총 40개를 제공한다.
현재 집적기술이 좋아져서 칩 사이즈를 엄청나게 소형으로 만들 수 있지만, 다리(포트) 수 때문에 그렇게 작아질 수 없는 것이다.
실제 CPU칩은 작은데에 비해 나머지 면적은 다리 때문에 넓히는 것!
PIN mode
즉, Output mode는 Write이고 Input mode는 Read이다.
예를 들어 온도감지센서의 경우에는 Input mode를 사용함이 적절하다.
(온도 감지를 할 수 있는 센서가 있음에도 불구하고 온도를 개발자가 직접 적는건 적절치 않다)
GPIO에 PIN Number가 부여되어 있는데,
3가지 체계가 있다.
1. BCM: BroadCom에서 만들었고, CPU 입장에서의 칩 번호이다.
2. BOARD: Evaluation board의 약어로 라즈베리 '핀헤더' 입장에서 번호이다.
3. WPI(v): WiringPi라는 라이브러리에서 핀번호를 정했다.
하드웨어 셋업 => 핀 번호 체계 중 하나 선택해 진행하는데, 수업때는 3번을 사용해서 진행할 예정!
왜냐면 우린 c언어로 개발할 예정이기에, WiringPi 라이브러리를 사용하기 때문이다!
BCM은 python 개발용에서 잘 사용하는데, python은 먼저 교육용언어이고 인터프리터하기 때문에 속도가 느려서 사용하지 않을 예정이다.
GPIO 번호는 어떤번호를 쓸건지 정하면 된다.
DC와 AC가 있는데, DC는 Direct Current로 직류를 의미하고 AC는 Alternating Current는 교류를 의미한다.
AC의 교류의 경우는 가정용으로 많이 사용하며, 장치들은 직류가 필요하기 때문에 어댑터를 통해 교류 => 직류로 바꾸며, 볼트 또한 조정한다.
그리고 GPIO02(SDA1, I2C)처럼 괄호안에 있는 거는 특별한 설정을 해야 적용된다.

위의 사진 속 핀번호를 보면, wPi가 1번이면 물리핀 번호(physical)는 12번, BCM는 18번이다.
c언어 소스코드에는 wPi 번호를 사용해야 한다!
wiringPi는 라즈베리파이에서 사용하는 GPIO를 위한 c언어 라이브러리이고, wiringPi를 사용하면 아두이노 같은 문법을 사용할 수 있다!
library 사용법
1. c언어 소스코드 속 include문
# include <wiringPi.h>
-lwiringPi
동적라이브러리를 컴파일 할 때 옵션 -l 을 붙인다!
라이브러리는 개발자가 함수를 만든 후 다른 사람이 기능을 쓰게끔 하고 싶은데, 소스코드는 공개되기 싫을때 이용한다.
정적라이브러리와 동적라이브러리가 있는데 정적라이브러리는 호출할 때 그 부분만 컴파일해 사용하는데, 대부분 사용하지 않고 동적라이브러리를 대부분 사용한다.
동적라이브러리는 만약 ~.a 라는 라이브러리 파일이 있다고 가정하자.
그러면 -l 라이브러리 이름라고 치면 사용이 가능하다.

1. 빨간선으로 GPIO의 Power 핀과 브래드 보드의 10번라인의 a에 연결
2. LED는 다리가 긴것과 짧은 것 2개가 있는데, 긴것은 +를 짧은 것은 - 단자이다. 전류의 방향은 + => - 이므로 빨간선 쪽으로 + 다리를 꽂는다.
3. LED와 바로 선을 이으면 합선(쇼트)이 발생하기에, 그 사이에 꼭 저항을 넣어준다. 저항은 사진과 같이 연결해주면 된다.
4. 노란선으로 GPIO의 Ground 핀과 브레드 보드의 + 단자를 연결했다.
LED가 잘 들어오는 것을 확인했다.
LED가 깜빡깜빡하도록 delay 메소드로 코드를 작성했는데, 서서히 빨라지도록 작성하려면 어떻게 해야할까? 고민해보자.
<실습 코드>


