본문 바로가기

Study/라즈베리파이 공부

[라즈베리파이] 현재 GPIO 출력값을 읽어와 토글 시키는 방법

반응형

라즈베리파이를 시작하면서 참 많은 것들을 배우게 되었네요. 

해보고 싶은 것들은 많지만, 기초부터 탄탄하게 다지는 중입니다. 

 

GPI 포트로 센서의 입력을 받고, GPO 포트로 LED나 부저 등을 단순 제어하는 방법에 대해서는 충분히 익혔다고 생각합니다. 

GPIO로 단순히 True/False와 같은 출력을 보내는 것은 할 수 있지만, 마지막 출력 상태를 확인해서 toggle 시키려고 하니 어떻게 구현 해야 할지 감이 오지 않더군요. 

결국은 방법을 찾아내서 이렇게 누군가를 위해 블로그로 기록 중입니다. 

 

이번 시간에는 LED를 토글링(toggling) 하기 위해 현재 GPIO 출력값을 읽어오는 방법에 대해서 기록하고자 합니다. 

아울러, not 문법을 통해서 토글링하는 방법까지 설명드리겠습니다. 

 

 

[C라면 XOR 비트연산자로 한방에]

Firmware 개발자로 10년 넘게 C로 밥을 벌어먹고 있는 저에게, C로 toggling 시키는 것은 너무나도 쉽습니다. 

unsigned int* pAddr = REGBASE + OFFSET;

*pAddr ^= BIT_1;

 

위와 같이 XOR 비트 연산자를 통해서 단 한 줄로 출력 값을 토글링시킬 수 있습니다. 

C의 포인터 연산과 비트 연산은 참으로 강력하지요. 

 

위의 구문을 좀 더 쉽게 풀어서 쓴다면 아래와 같습니다. (위의 구문과 equivalent 합니다.)

*pAddr = *pAddr ^ BIT_1;

 

위의 구문을 좀 더 쉽게 풀어서 쓴다면 아래와 같겠지요. (위의 구문보다 속도가 느립니다.)

if( *pAddr & BIT_1 )
	*pAddr &= ~BIT_1;
else
	*pAddr |= BIT_1;

동일한 역할을 하지만 if 비교문이 들어가서 속도가 조금 느립니다.

 


[현재 GPIO 출력값을 읽어오는 방법]

저는 현재 python으로 라즈베리파이를 공부하고 있고, python을 이용해서 GPIO의 출력 값을 읽어오는 방법은 아래와 같습니다.

#led_rgb2.py
  
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(14, GPIO.OUT)

value = GPIO.input(14)
print(value)

GPIO.setup(14, GPIO.OUT) 구문으로 14번핀의 Direction을 OUT으로 설정하였으나, 출력되고 있는 값을 GPIO.input(14) 명령으로 그대로 읽어올 수 있습니다. 

Direction이 INPUT인 것만 GPIO.input(14) 명령으로 읽어올 수 있다는 생각은 고정관념에 불과했던 것입니다. 

 

 

[현재 GPIO 출력값을 토글링하는 방법]

그렇다면 현재 출력되고 있는 값을 읽어와서 토글링하는 방법은 어떻게 될까요?

#led_rgb2.py
  
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(14, GPIO.OUT)

value = not GPIO.input(14)
GPIO.output(14, value)

value = not GPIO.input(14) 로 구현할 수 있겠습니다.

GPIO.input(14)로 값을 읽어와서 not 연산을 하여 value 변수에 할당합니다.

이것을 다시 GPIO.output(14, value) 구문으로 출력해주면 됩니다. 

마지막 출력 값이 1이었다면 0으로 출력되고, 마지막 출력 값이 0이었다면 1로 출력이 되겠습니다. 

 

스크립트를 좀 더 최적화한다면 아래와 같이 한 줄로 줄일 수 있겠습니다. 

#led_rgb2.py
  
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(14, GPIO.OUT)

GPIO.output(14, not GPIO.input(14) )

GPIO.output(14, not GPIO.input(14)) 로 한줄에 토글링을 완성할 수 있습니다. 

변수에 넣어서 not 연산을 하지 않고, GPIO.input(14)로 리턴받은 값에 바로 not 연산을 해서 GPIO.output() 함수의 인자로 바로 전달하니 훨씬 더 깔끔해졌습니다. 

 

 

[끝 맺음말]

라즈베리파이에서 GPIO의 출력값을 알아내서 토글 시키는 방법에 대해서 설명드렸습니다. 

프로그래밍 스킬이 늘고, 수준이 한층 높아진 것이 느껴지시는지요? 

 

이상입니다. 

반응형