라즈베리파이 4로 햄스터 훔쳐보기

햄도·2021년 8월 22일
0
post-thumbnail

왜 이런 짓을 하는걸까?

작년 11월 뜬금없이 알리에서 라즈베리파이를 구매했다.

새로 나온 라즈베리파이4가 작은 크기에 비해 꽤 스펙이 좋다는 소식을 듣고 샀던 것 같다.

그래도 12만원을 아무 목적도 없이 태우긴 죄책감이 들어서..
항상 궁금했던 우리집 햄스터(이름은 고도 이다)의 사생활을 감시할 수 있는 무언가를 만들 거라는 핑계를 대고 카메라와 같이 구매했다.

햄스터는 야행성(엄밀히 따지면 황혼 또는 여명에 활동하는 박명박모성이라고 한다)이기 때문에 자주 만날 수 없다. 그래서 5만원정도 하는 펫캠을 설치하는 사람들도 있지만 그건 촬영하고 저장하는게 끝이라 재미가 없어보였다. 이왕이면 내가 커스텀할 수 있는 기기를 하나 사서 온갖 재밌는 기능을 추가하면 좋겠다고 생각했다.

하지만 이 글을 2021년 8월이 되어서야 쓰는 이유는? 미루고 미루다 얼마 전 개발했기 때문이다 🙄
별로 어려운 개발은 아니었는데.. 연초쯤 환경설정으로 삽질을 하다가 질려버리기도 했고 동영상은 찍히는데 어디로 보내서 어떻게 봐야 할지 결정을 하지 못한 채 회사일에 치이게 되었다.

그렇게 반 년 정도가 지나서야 다시 라즈베리파이(라즈베리파이 이름은 괴도 이다)를 켤 수 있게 되었다.

개발과정

초반에 무슨 삽질을 했는지조차 기억이 안나지만, 대충 다음과 같은 과정으로 만들었다.

  1. 라즈베리파이 및 카메라 조립
    조립방법은 검색하면 쉽게 찾을 수 있다 🧑‍🔧주변 사람들의 반응.. 💣
    판매처마다 케이스가 다른데 내가 주문한 케이스는 조잡해서 조립하다가 금이 가고 깨졌다. 새로 사기에는 케이스가 꽤 비싸서 그냥 테이프로 수리했다. 주문한 카메라까지 조립해 연결한 모습. 눈이 달린 것 같다 👀

  2. 운영체제 설치
    라즈베리파이를 구매할 때 sd카드를 주는데, 그 카드를 노트북에 연결해 os를 깔았다. 처음에는 우분투 마테를 설치했는데 PiCamera가 돌아가지 않아 라즈비안을 재설치했다.
    개발자들의 호캉스 풍경.. 호텔에 가서까지 세팅을 시도했지만 이 날은 삽질만 했다.올해 초 강릉 여행에도 라즈베리파이를 가져가 다시 세팅을 시도했다. 이 날 운영체제를 라즈비안으로 바꾸고 카메라를 작동시키는 데에 성공했다.

  3. 코드 작성
    먼저 10초 간 동영상을 촬영해 저장하는 코드를 짰다.

    def record(camera:PiCamera, file_name:str):
        camera.start_recording(file_name)
        camera.wait_recording(10)
        camera.stop_recording()

    기본적으로 동영상은 h264라는 확장자로 저장되는데, 이것을 다른 곳으로 전송하면 별도 코덱을 설치해야 재생이 가능했다. 그래서 h264를 mp4로 바꿔주는 로직도 추가했다.

    def make_mp4(file_name:str):
        new_name = file_name.split('.')[0] + '.mp4'
        command = f'MP4Box -add {file_name} {new_name}'
        process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
        output, error = process.communicate()
        return new_name

    어디로 전송할지도 고민을 했는데, 일단 텔레그램에 챗봇을 만든 후 그 챗봇을 채널에 추가해 일방적으로 영상을 보내도록 했다.

    def send_message(file_name:str):
        token = os.environ['BOT_TOKEN']
        channel_id = os.environ['CHANNEL_ID']
        url = f'https://api.telegram.org/bot{token}/sendVideo'
        data = {'chat_id': channel_id}
        r = requests.post(url, data, files={'video':open(file_name, 'rb')})
        print(r.json())   
    

    텔레그램 봇 토큰을 BOT_TOKEN에, 메세지를 보낼 채널 아이디는 CHANNEL_ID에 환경변수로 추가했다. 챗봇과 채널을 각각 만들고, 챗봇을 채널에 추가해 관리자 권한을 줘야 메세지를 보내도록 할 수 있다.
    sendVideo 요청을 보낼 때에는 requests.post 메소드에서 전송할 파일을 files에 넣어 보내줘야 한다.
    마지막으로 이 로직을 크론에 등록해 매일 오전 2시, 2시 20분, 2시 40분에 10초씩 영상을 찍어 메세지를 전송하기로 했다. 마음같아선 새벽 내내 찍어 저장하고 싶었지만 카메라의 LED 램프가 너무 뜨거워져 혹시나 터질까봐 걱정이 됐다.
    그래서 햄스터가 가장 활발히 활동할 시간대에 영상을 찍고, 아예 shutdown하도록 했다. 그리고 다음 날 잠들기 전 내가 다시 라즈베리파이를 켜주기만 하면 그 날 밤에도 촬영을 할 수 있다.

  4. 카메라 세팅
    햄스터가 새벽에 주로 시간을 보내는 쳇바퀴가 잘 보이는 위치에 카메라를 올려두었다.
    초점을 맞추는 방법을 몰라 한참 헤맸는데, 잘 찾아보니 렌즈를 돌려 거리를 조절하는 방식으로 초점을 맞출 수 있었다.

이렇게 개발을 해놨는데.. 무슨 일인지 카메라 LED가 잘 제어되지 않는다. LED 램프가 켜져야 불을 꺼도 촬영이 가능한데 지난 며칠 간 LED 램프가 켜지지 않아 까만 화면만 촬영됐다.

그런데 드디어 오늘 LED 램프가 켜졌다! 쳇바퀴를 열심히 돌리는 햄스터도 찍혔다.

LED 문제는 어떻게 해야 할지 모르겠다.. 자기 멋대로 켜지고싶으면 켜지는데 운에 맡겨야 하는걸까? 아니면 더 비싼 카메라를 사봐야 하는걸까?
하드웨어 문제는 내가 고치기가 힘들지만, 낮에 계속 촬영하고 있다가 움직임이 감지되면 녹화하는 등의 방식으로 수정해도 괜찮을 것 같다.

소감

😓 금방 끝날 줄 알았는데 의외로 오래 붙들고 있었다. 생각지도 못했던 카메라 LED 문제와 동영상 전송에 시간을 많이 소모했다.
🍒 라즈베리파이가 생각보다 사양이 좋아(적어도 aws 프리티어로 사용했던 t1 micro보다는 훨씬 좋은 것 같다) 햄스터 염탐 이외에도 이런저런 용도로 쓸 수 있을 것 같다.
🐹 가뜩이나 수명도 짧은데 낯을 가려 자주 볼 수 없는 햄스터의 모습을 조금이라도 더 볼 수 있다는 게 기쁘다. 고도야 건강하게 오래 살자.

profile
developer hamdoe

0개의 댓글