코딩하고 싶을 땐, 타자를 두드리자

[라즈베리파이/IoT] Python, 라즈베리파이로 솔래노이드 잠금 장치 구현하기 본문

0x3 프로젝트/인하분실물센터

[라즈베리파이/IoT] Python, 라즈베리파이로 솔래노이드 잠금 장치 구현하기

[BE]모리 2025. 11. 22. 01:55

1. 종합 설계 과제로 분실물 센터를 만들게 되다.

인하대 컴퓨터공학과라면 피할 수 없는 관문이 하나가 있다. 그건 바로 종합설계 과목이다. 4학년 2학기에만(?) 들을 수 있는 과목으로 일종의 졸업 작품이다. 우리는 인하대학교에서 발생하는 분실물에 대한 문제를 중앙화 + AI를 통해 해결해 보자라는 생각으로 해당 기획안을 준비하고 구현하게 되었다. 구현을 위해서 키오스크와 분실물 사물함을 결합하여 관리하자라는 생각으로 사물함에 대해 찾아보기 시작했다.

영화 8번 출구의 예고편 中 한 장면

혹시, 영화 <8번 출구>를 본 경험이 있는가? 내가 최근에 봤던 영화였는데, 스토리가 없는 게임을 이렇게 주제가 담긴 스토리로 풀어갈 수 있다는 게 신선한 영화였다. 이 영화에서 자동으로 열린 사물함을 여는 장면이 나온다. 그리고, 우리가 평소에 지하철 역에서 쓰는 사물함도 화면의 버튼이나 모바일 앱에서 받은 번호로 문을 열 수 있다. 우리는 그 자동화 방식을 이용하기로 하였다.


2. 컴퓨터공학도의 라즈베리파이와 하드웨어 첫 만남

사실, 나는 컴퓨터공학을 전공하고 있지만, 하드웨어의 경험이 많지 않다. 그동안 백엔드와 클라우드 엔지니어 중 하나를 꿈꾸며 클라우드 지식만 많지, 실제 물리 계층에서 우리가 쓰는 코드들이 작동하는 경험은 많이 접하지 못한 거 같다.

그래서, 이번 기회에 라즈베리파이와 AWS를 학교에서 든든하게(?) 지원받기에 관련한 경험과 지식을 쌓아보자는 생각이 커서 도전하게 되었다.

이번에 구현할 것은 라즈베리파이와 연결된 솔래노이드 잠금장치를 조종해보는 것이다.

잠금장치가 있는 사물함에서 많이 쓰이는 솔래노이드 락

먼저, 하드웨어적 지식이 많이 부족했기 때문에 관련 자료를 찾아보았다. 사실 전선도 제대로 연결 못하는 유사 공대생이기 때문이다... ㅎㅎ

이 영상 덕분에 기본을 깨우쳤습니다

그러던 도중 매우 유익한 영상을 발견하게 되었다. 5V 릴레이라즈베리파이 그리고 12V 전원과 연결된 솔래노이드 락이면 충분했다. 그래서 라즈베리파이만 가지고 있던 나는 쿠팡에서 관련한 재료를 쓸어 담아 왔다.


 

3. 실제 연결 후 기본 테스트

라즈베리파이는 기본 세팅이 끝난 상태에서 SSH 프로토콜을 이용해 접근하였다. 혹시, 라즈베리파이 OS부터 설치가 막막하다면 이 블로그의 글을 참고하면 좋을 거 같다. 정말 유익한 포스팅이 아닐 수 없다!

 

[라즈베리파이] 라즈베리파이 OS 간단 설치

목표이 블로그의 목표는 Raspberry Pi Imager를 이용하여 라즈베리파이4에 라즈베리파이 OS를 설치하는 방법을 설명하는 것입니다. 이 툴을 사용하면 라즈베리파이의 운영 체제를 쉽게 바꿀 수 있으

midoriiroplace.tistory.com

 

돌아와서, 기본 세팅이 되었다면 ssh 프로토콜 통신을 통해 라즈베리파이에 접근할 수 있다.

초기 ssh 통신 요청시, 인증키를 서로 받았을 것이다. 이 인증키를 이용해 scp 프로토콜로 노트북에서 라즈베리파이에게 파일을 직접 보낼 수 있다. 물론 linux 기반의 OS라 Vim 편집기로 만들 수도 있었지만, 내 노트북 환경이 더 편했기에 이 환경을 유지하고 싶었다.

scp 통신으로 완성된 파일을 쉽게 보내보자

python -m venv myenv
source myenv/bin/activate
pip install gpiozero

어느 방법으로 라즈베리파이에 접근하였든간에 꼭 가상환경을 세팅해줘야 한다. 라즈베리파이 OS에서 pip install을 강제로 하지 않는 이상 거부하기 때문이다. 그래서, 가상 환경 위에 필요한 라이브러리를 설치하고 python 코드를 실행하면 된다.

 

from gpiozero import OutputDevice
from time import sleep

# 릴레이 설정
# active_high=True: High 신호를 주면 켜짐 (High Trigger)
# active_high=False: Low 신호를 주면 켜짐 (Low Trigger) <- 내 경우엔 이랬다. 상황에 따라 다르니 체크하자.
# initial_value=False: 시작할 때 꺼진 상태로 시작
relay = OutputDevice(18, active_high=False, initial_value=False)

def open_door():
    print("문이 열립니다.")
    relay.on()   # 릴레이 작동 (설정된 active 상태로 전환)
    sleep(5)     # 5초 유지
    relay.off()  # 릴레이 끄기
    print("문이 잠깁니다.")

try:
    while True:
        cmd = input("Enter를 누르면 문을 엽니다 (Ctrl+C로 종료)")
        open_door()

except KeyboardInterrupt:
    print("종료")
    # gpiozero는 종료 시 자동으로 cleanup을 수행

 

 

좌측은 초기에 문이 잠겨있는 상태였고, 이후 Enter를 누르면 우측의 사진처럼 문이 열리는 상태 (전류를 통하게 하여 잠금장치를 푼다)로 변하는 것을 확인할 수 있다. 영상과 다른 점은 나의 경우엔, 5V 릴레이를 4 채널 릴레이를 사용했다는 것인데, 이건 이후 분실물 보관함의 개수에 따라 솔래노이드 잠금장치를 달아야 했기에 확장성 차원에서 미리 구매하였다.


4. 일단 마무리... 그리고 다음 회차 예고

이번 포스트에서는 라즈베리파이의 하드웨어 연동 및 단순 테스트만 진행하였다.

하지만, 아직은 부족한 점이 느껴질 것이다. 바로, 원격으로 열지 못한다는 점이다. 사물함을 열어주기 위해서 한 사람이 라즈베리파이를 하루종일 보고 있는 것은 말이 되지 않는다. 그래서 라즈베리파이가 스스로 자기가 어떤 사물함을 열어주어야 할지 알아야한다. 이걸 어떻게 구현하는 것인지 궁금하지 않은가? 사실 개발이라는 것은 이런 재미라 생각한다. 내가 생각만 했던 것을 현실적으로 그리고 논리적으로 가능하다는 것을 검증하고, 실제 구현했을 때의 그 느낌은 정말 개발자에게 준 선물이라 생각한다.

나의 경우엔, 결국 졸업 작품 시연은 학교 와이파이에서 해야 한다. 학교 와이파이는 생각보다 보안이 엄격해서 특정 포트나 가변 IP 주소의 접근이 막힐 수 있다. 이를 막기 위해 다른 방법을 고안해야 했다.

 

그 결과가, 메시지 브로커를 이용한 비동기 방식이었다.

 

다음 인하분실물센터의 포스트는 AWS IoT Core의 메시지 브로커를 이용한 실제 자동화 구현이다.