2.2 GPIO핀 제어

c{mpy0202}

 MicroPython 에서는 핀번호를 ESP8266모듈의 GPIO 번호를 사용한다. 아래 그림에서 보면 0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16 번이다.



이들을 제어하기 위해서는 machine 모듈의 Pin 객체를 이용해야 한다.


from machine import Pin

p0 = Pin(0, Pin.OUT)    # GPIO0 출력핀 객체 생성
p0.high()               # set pin to high
p0.low()                # set pin to low
p0.value(1)             # set pin to high

p2 = Pin(2, Pin.IN)     # GPIO2 입력핀 생성
print(p2.value())       # get value, 0 or 1

p4 = Pin(4, Pin.IN, Pin.PULL_UP) # enable internal pull-up resistor
p5 = Pin(5, Pin.OUT, value=1) # set pin high on creation

위와 같이 Pin 객체의 생성자에 입력/출력 그리고 초기값 등등을 지정해 줄 수 있으며 멤버함수 high(), low() 로 출력값을 지정하거나 value()함수로 핀의 입력값을 받을 수 있다.


출력

입력

p = Pin(n, Pin.OUT)
p = Pin(n, Pin.IN)
p = Pin(n, Pin.IN, Pin.PULL_UP)
p.high() 혹은 p.value(1)
p.low() 혹은 p.value(0)
p.value()

여기서 n은 0,1,2,3,4,5,12,13,14,15,16 중 하나이다.


이와 같이 value() 멤버함수는 출력값을 지정해 줄 때도 쓰이고 입력인수가 없을 경우에는 핀의 입력값을 읽을 때도 사용된다.


단, 1번과 3번 핀은 시리얼 통신에 사용되며 16번 핀은 wakeup 기능(deepsleep 모드에서)에 사용되므로 가급적 사용하지 말아야 한다.



Posted by 살레시오
,

여기에서는 LED를 켜고 끄는 실험을 해 보도록 한다. LED는 파이썬 코드가 GPIO를 동작시키는 것을 시각적으로 확인할 수 있는 가장 간단한 도구이다. 다음 그림과 같이 LED를 저항과 직결한 뒤 12번 핀에 연결한다. 저항은 200Ω (혹은 그 이상) 이고 이것은 LED에 과전류가 흐르는 것을 막아주는 역할을 한다. LED는 극성이 있는 소자이다. 다리가 긴 쪽이 anode(+극), 짧은 쪽이 cathod(-극)이므로 연결할 때 방향을 주의해야 한다. 잘못 연결하면 LED가 켜지지 않는다. 짧은 다리는 저항과 직결하여 6번 핀(GND)에 연결하고 긴 쪽은 12번 핀과 연결하면 된다.


그림 9.2.1 LED 결선도 (긴 다리를 12번 핀에 연결)


 GPIO핀으로 LED를 제어하기 위해서 이 핀을 먼저 GPIO.setup()를 이용하여 출력으로 설정해야 한다. 그 이후에 GPIO.output()함수로 GPIO.HIGH 신호를 내보내면 LED가 켜지고 GPIO.LOW 신호를 내보내면 LED가 꺼진다.


blink.py

import RPi.GPIO as GPIO
import time

led = 12
GPIO.setmode(GPIO.BOARD)
GPIO.setup(led, GPIO.OUT)

for k in range(10):
   GPIO.output(led, GPIO.HIGH)
   time.sleep(0.5)
   GPIO.output(led, GPIO.LOW)
   time.sleep(0.5)

GPIO.cleanup()


이 프로그램은 LED를 10번 점멸시키고 난 뒤 종료된다. 이것을 실행하려면 다음과 같이 하면 된다.


sudo python3 blink.py


전에 언급한 바와 같이 반드시 앞에 sudo 명령을 붙여야 한다는 것이 유의하자.


 한 가지 언급할 것은 저항 값을 선택하는 방법이다. 데이터 쉬트에 의하면 LED에는 10mA 정도 흐르도록 하면 되고 이때 LED의 전압 강하가 1.7V 정도이다. 따라서 오옴의 법칙에 의해서 R = (3.3-1.7)/0.01 = 160Ω  을 얻을 수 있다. 이 결과로부터 160Ω 이상의 저항을 선택하되 너무 저항 값이 크면 불빛을 눈으로 확인하기 어려우므로 160~500Ω 범위의 저항을 선택하면 된다.

원문링크

Posted by 살레시오
,

 라즈베리파이 2에는 40개의 헤더 핀(header pin)이 있는데 이것을 외부의 장치들을 연결하여  제어할 수 있다. 다음 그림에 그 구조를 도시하였다.



BCM

핀 번호

BOARD

BCM



3.3V

1

2

5V


SDA1

GPIO2

3

4

5V


SCL1

GPIO3

5

6

GND



GPIO4

7

8

GPIO14

TxD


GND

9

10

GPIO15

RxD


GPIO17

11

12

GPIO18



GPIO27

13

14

GND



GPIO22

15

16

GPIO23



3.3V

17

18

GPIO24


MOSI

GPIO10

19

20

GND


MISO

GPIO9

21

22

GPIO25


SCLK

GPIO11

23

24

GPIO8

CE0


GND

25

26

GPIO7

CE1

SDA0

GPIO0

27

28

GPIO1

SCL0


GPIO5

29

30

GND



GPIO6

31

32

GPIO12



GPIO13

33

34

GND



GPIO19

35

36

GPIO16



GPIO26

37

38

GPIO20



GND

39

40

GPIO21



그림 9.1.1 라즈베리파이 B+, A+, 2B의 GPIO 헤더핀들


라즈베리파이 초기 모델에는 26핀만 있었다. 라즈베리파이 B+ 을 포함한 이후의 모델은 (A+, 2 model B, zero) 이것이 확장되어 40핀 GPIO핀을 갖는데 26번 핀까지는 동일한 배치이고 27번부터 40번까지가 더 추가되었다.


  그림 9.1을 보면 40개 중 대부분이 GPIO라고 이름이 붙어 있는데 이는 디지털 신호(digital signal)를 입출력 할 수 있는 포트핀 (port pin)으로 사용할 수 있다는 의미이다. 디지털 신호란 두 가지 상태만을 갖는 신호를 의미하며 하나의 비트로 표시되며 0 혹은 1 값만을 가질 수 있다. 물리적으로는 전압으로 구별되며 라즈베리파이에서  0은 0V(GND), 1은 3.3V 전압을 의미한다. (라즈베리파이의 내부 로직은 3.3V로 동작한다. 반면 아두이노는 보통 5V로 동작하는데 따라서 이 둘을 직접 연결할 경우 라즈베리파이가 손상될 가능성이 있다.) 포트핀은 츨력 혹은 입력 기능을 수행할 수 있는데 출력으로 사용되면 0V 혹은 3.3V 전압값을 갖도록 할 수 있으며 입력으로 사용된다면 포트핀의 전압이 0V인지 3.3V인지를 감지할 수 있다. 이 기능을 이용하면 예를 들어 LED를 점멸한거나 혹은 연결된 버튼의 눌렸는지 여부를 알아낼 수 있다.


 이외에도 5V/3.3V/0V(GND)는 외부에 전원을 공급할 때 사용되는 전원핀이고,  시리얼 통신/SPI 통신/I2C통신을 할 수 있으며 PWM 기능을 갖는 핀도 있다. 하지만 아날로그 입력을 받을 수 있는 핀은 없으며 이를 위해서는 별도의 외부 장치를 이용해야 한다.


 라즈베리파이에는 헤더핀만 나와있어서 빵판을 이용하여 실험하고자 할 때는 조금 불편하다. 이를 개선하기 위해서 다양한 연결 부품이 시중에 시판되고 있다.


그림 9.1.2 GPIO 핀을 빵판에 편리하게 연결해주는 제품의 예


이러한 확장 보드를 이용하면 앞으로의 실험을 좀 더 편하게 실행할 수 있다.

원문링크

Posted by 살레시오
,

 비글본블랙(이하 BBB)를 아두이노 모터쉴드(이하 모터쉴드)와 연결해서 모터제어 실험하면서 알게 된 시행착오를 본 포스트에 기록하고자 한다.

 아두이노 모터쉴드는 L298P 칩을 사용하는데 전원이 디지털 블록에 공급되는 핀 (Vss) 와 모터 제어용 전원 핀 (Vs) 두 개가 있다. 쉴드의 5V 헤더가 바로 이 Vss 핀에 연결되어 있으므로 5V핀에 5V 전원을 반드시 연결해야 L298P가 정상동작한다. Vin 헤더핀은 Vs에 연결되어 있으므로 이 핀에는 모터제어용 전원 (datasheet 상으로는 50V 까지 가능) 을 인가하면 된다. 나는 Vin에 적당한 전원을 연결하면 Vss에는 변압되어 들어가는 줄 알았는데 회로도를 보니 그게 아니었다.

<아두이노 모터쉴드 rev C 회로도>

따라서 모터쉴드의 5V 헤더에는 BBB의 5V핀과 연결하여 L298P 의 로직부에 전원을 인가해야 정상동작한다. 문제는 BBB는 3.3V 로 동작한다는 것인데 다행히 L298N이 2.3V 이상이면 HIGH로 간주하므로 문제가 없다.  (실제로 모터쉴드와 3.3V로 동작하는 아두이노Due 와의 연결법도 소개되어 잇다.)

 

 그런데 datasheet상에는 Vss의 최소전압은 4.5V인데 혹시나해서 3.3V를 연결했는데도 정상적으로 동작했다. 하지만 이 방법은 바람직하지는 않은 것 같다.  그리고 모터쉴드의 IOREF 핀은 별다른 역할을 하지 않는다. 여기에 BBB의 동작전압인 3,3V를 연결하면 이것이  L298에 인가되는 것이 아니니 주의해야 한다.

 아래 간략한 회로도를 첨부하였다.

아래는 pyBBIO 모듈을 이용한 파이썬 제어프로그램 예이다. 1초마다 회전 방향을 바꿔준다.


from bbio import *
import time
bbio_init()

pwm = GPIO1_16
brk = GPIO0_5
dir = GPIO0_13

pinMode(pwm, OUTPUT)
pinMode(brk, OUTPUT)
pinMode(dir, OUTPUT)

digitalWrite(pwm, HIGH)
digitalWrite(brk, LOW)
digitalWrite(dir, LOW)

while True:
   digitalWrite(dir, HIGH)
   print(str('dir 1')
   time.sleep(1)
   digitalWrite(dir, LOW)
   print('dir2')
   time.sleep(1)

bbio_cleanup()







Posted by 살레시오
,

 파이썬을 공부해 나가면서 한 동안 파이썬으로 GPIO를 제어하는 방법을 찾고 있었다. 라즈베리파이에서 RPIO나 WiringPi 와 같은 파이썬 모듈을 쓸 수 있으나 라즈베리파이의 GPIO기능 자체가 너무 빈약하다는게 문제다. 아두이노 계열은 파이썬이 되지를 않고 라즈베리파이에 연결할 수 있는 아두이노 (혹은 유사 보드)들이 몇몇 검색되었는데 파이썬으로 제어를 하기에는 제약이 많다. 그나마 아두이노에 standard firmata 를 올리고 라즈베리파에에서 pyFirmata 로 제어하는 방법이 있기는 한데 직접 해 보니 이상하게 잘 동작이 되지 않았다.

 비글본블랙(이하 BBB) 이라는 보드는 (마데 인 America 이다.) 리눅스 머신이면서 GPIO가 라즈베리파이와는 비교도 안 되게 많이 마련되어 있다.  하드웨어를 제어하는데 자바스크립트를 이용하며 이것을 잘 몰랐기 때문에 한 번 살펴보기만 하고 서랍에 넣어두었었다.

그런데 구글링해보니 여기에도 파이썬으로 GPIO를 제어할 수 있는 모듈들이 있었다. 그 중 PyBBIO 와 adafruit 에서 배포하는 Adafruit_BBIO 라는 파이썬 모듈이 활발하게 개발 중인 것 같다. 이것을 이용하면 포트, PWM, ADC 와 같은 주변기기들을 파이썬으로 제어할 수 있다. 그래서 한 번 시도해보기로 했다.

 먼저 BBB 를 모니터에 연결하려면 마이크로HDMI 케이블(없으면 젠더라도)이 있어야 해서 주문을 했다. 다른 방법으로 BBB는 USB만 PC와 연결하면 ssh로 PC상에서 터미널 창을 띄울 수 있고 구글링해보면 방법도 잘 나와 있다. 그래서 putty 라는 프로그램을 이용하여 원격 터미널 창에서 파이썬 모듈을 설치한 후 실험을 몇 개 해 보았는데 잘 되었다. 포트로 LED를 깜박이고 cds셀을 이용한 ADC 실험도 해 보았는데 매우 간단하게 잘 되었다.

 다음은 원격 터미널 상에서 nano를 이용하여 LED를 깜박이는 프로그램을 작성하는 화면이다.


 PyBBIO는 아두이노의 API와 유사하게 작성되어 있으며, 반면 Adafruit_BBIO는 라즈베리파의 RPIO 를 많이 참고한 것 같다. 취향에 따라 선택하면 되겠다.




Posted by 살레시오
,