GreenPiThumb: A Raspberry Pi Gardening Bot

Michael Lynch

GreenPiThumb: 라즈베리 파이 가드닝 봇

소개

이것은 GreenPiThumb의 이야기입니다. 집 안 화분에 자동으로 물을 주는 가드닝 봇이지만, 때로는 식물을 죽이기도 합니다.

GreenPiThumb 전체 시스템

이 이야기는 약 1년 전, 문득 화초를 하나 키워보고 싶다는 생각이 들면서 시작되었습니다. 식물 하나 있으면 보기도 좋고 꼭 필요한 산소도 공급해주며, 손님들에게 내가 책임감 있는 어른이라는 인상, 생명체를 돌볼 줄 아는 사람이라는 인상을 줄 수 있을 것 같았습니다.

하지만 저는 프로그래머이지 정원사가 아닙니다. 식물을 키운다면 일주일에 몇 번씩 물을 주고 상태를 확인해야 합니다. 그래서 몇 백 시간을 들여 그 일을 대신해 줄 로봇을 만드는 편이 훨씬 쉽겠다고 생각했습니다. 식물이 80년을 산다면 계산상 살짝 이득입니다.

왜 GreenPiThumb인가?

제가 맡는 대부분의 소프트웨어 프로젝트처럼 GreenPiThumb의 가장 큰 동기는 새로운 기술을 배우는 것이었습니다. 이전 앱인 ProsperBot은 Go, Ansible, Redis를 익히기 위해 만들었습니다. GreenPiThumb은 프론트엔드 개발, 특히 JavaScript와 AngularJS를 배울 기회라고 생각했습니다.

친구 Jeet은 막 프로그래밍을 배우기 시작한 참이었습니다. 그래서 GreenPiThumb을 함께 만들어 보지 않겠냐고 물었습니다. 코드 리뷰, 단위 테스트, 지속적 통합 같은 건강한 소프트웨어 엔지니어링 practices를 배울 좋은 기회가 될 것 같았습니다. Jeet은 흔쾌히 승낙했고, 우리는 두세 달이면 끝날 거라 생각했던 여정을 시작했습니다.

Raspberry Pi로 구동하다

Raspberry Pi는 취미 활동을 위해 만들어진 작고 저렴한 컴퓨터입니다. 사람들은 Raspberry Pi로 미래형 스마트 미러를 만들고, 오래된 비디오 게임을 구동하며, 전기 스케이트보드를 운전하기도 했습니다.

Raspberry Pi

저도 지난 몇 년간 Raspberry Pi를 가지고 놀았지만, 소프트웨어 쪽 사람이라 값싼 장난감 서버 이상으로는 써본 적이 없었습니다. 애호가 커뮤니티에서 Raspberry Pi가 사랑받는 가장 큰 이유는 가전제품과의 뛰어난 연동성 때문입니다.

다양한 센서와 연동 가이드 덕분에 Raspberry Pi는 GreenPiThumb에 자연스러운 선택이었습니다. Raspberry Pi를 쓰면 하드웨어 기능을 배우고, 도대체 저 “GPIO 핀”이 무엇인지도 마침내 알아낼 수 있을 것 같았습니다.

MOSFET에 녹아내린 브레드보드

Raspberry Pi와 미스터리한 GPIO 핀

또 다른 Raspberry Pi 가드닝 봇을 왜 만들까?

우리가 Raspberry Pi 기반 가드닝 봇을 만들겠다고 생각한 첫 사람들은 당연히 아니었습니다. 우리보다 먼저 나온 멋진 프로젝트로는 PiPlanterPlant Friends가 있었고, 그 외에도 여러 프로젝트가 있었습니다.

우리가 직접 만들어 보기로 한 이유는 두 가지였습니다. 직접 만드는 게 재미있기도 하고, 우리 봇의 소프트웨어를 일급 관심사로 만들고 싶었기 때문입니다.

대부분의 Raspberry Pi 프로젝트는 전자공학에는 능하지만 전문적인 소프트웨어 경험은 없는 애호가들이 만듭니다. 우리는 그 반대가 되고 싶었습니다. 소프트웨어는 훌륭하지만 하드웨어는 간신히 동작하고 가끔은 너무 뜨거워져 브레드보드를 녹일 정도인 쪽으로요.

GPIO 핀

“불이 날 것 같은” 문제가 있을 법했던 초기 프로토타입

GreenPiThumb의 코드는 오픈소스이며 다음과 같은 특징을 갖추고 있습니다:

  • 완벽한 단위 테스트
  • 코드 커버리지 추적
  • 지속적 통합
  • 디버그 로깅
  • 철저한 문서화 – README와 코드 주석 모두
  • 스타일 가이드의 일관된 준수
  • 설치 도구

하드웨어 아키텍처

GreenPiThumb 배선도

GreenPiThumb 배선도 (다운로드 가능한 파일)

Raspberry Pi는 디지털 신호를 읽습니다. 그래서 아날로그 센서를 직접 읽을 수는 없습니다. 저희는 MCP3008 아날로그-디지털 변환기를 사용해 아날로그 토양 수분 센서와 조도 센서로부터 디지털 값을 얻습니다.

DHT11 센서는 공기의 온도와 습도를 감지합니다. 디지털 신호를 출력하므로 Raspberry Pi에 바로 연결할 수 있습니다.

마지막으로 12V 워터 펌프가 있는데, Raspberry Pi는 5V까지만 출력할 수 있어 12V 전원 어댑터MOSFET과 직렬로 연결해 펌프에 연결했습니다. Raspberry Pi는 MOSFET을 디지털 스위치처럼 사용해 펌프를 끄고 켤 때 회로를 끊거나 연결합니다.

소프트웨어 아키텍처

GreenPiThumb 소프트웨어 아키텍처

GreenPiThumb 소프트웨어 아키텍처

GreenPiThumb 백엔드

백엔드는 GreenPiThumb의 무거운 일을 담당합니다. 다음과 같은 역할을 하는 Python 앱입니다:

  • 물리 센서 관리(토양 수분, 온도 등)
  • 워터 펌프 켜고 끄기
  • 데이터베이스에 이벤트와 센서 측정값 기록

GreenPiThumb 웹 API

웹 API는 GreenPiThumb의 상태와 이력에 관한 정보를 제공하는 HTTP 인터페이스입니다. GreenPiThumb 데이터베이스를 얇게 감싼 래퍼로, 모든 내용을 JSON으로 변환해 웹 애플리케이션이 더 쉽게 이해할 수 있도록 합니다.

GreenPiThumb 웹 대시보드

웹 대시보드는 GreenPiThumb의 현재 상태를 보여주고 시간에 따른 센서 측정값 그래프를 만듭니다.

GPIO 핀

저희 Raspberry Pi로는 인터넷에 공개된 웹 서버 역할을 감당하기가 다소 벅차서, 로컬 대시보드와 동일한 정적 미러를 마련해 두었습니다:

배포

GreenPiThumb을 Raspberry Pi 장치에 배포할 때 Ansible이라는 오픈소스 IT 자동화 도구를 사용합니다.

GreenPiThumb에 필요한 모든 소프트웨어를 배포하기 위해 커스텀 GreenPiThumb Ansible 설정(Ansible 용어로는 “role”)을 만들었습니다. 이 Ansible role은 GreenPiThumb 백엔드와 프론트엔드 코드는 물론 GreenPiThumb이 의존하는 서드파티 소프트웨어 구성 요소까지 다운로드하고 설치합니다.

몇 가지 명령어만으로 새 Raspberry Pi 장치에서 이 도구를 사용해 몇 분 안에 GreenPiThumb 소프트웨어 전체를 실행할 수 있습니다.

가는 길의 난관들

GreenPiThumb은 예상보다 훨씬 오래 걸려 1년 넘게 진행되었습니다. 몇 주씩 진행을 멈추게 만든 난관들 때문이었습니다. 아래에 좀 더 흥미로웠던 장애물들을 정리했습니다.

물 분배

다른 Raspberry Pi 가드닝 프로젝트들은 흙 위에 물을 어떻게 뿌리는지에 대해 언급하지 않는데, 아쉽게도 저희도 아직 해결하지 못한 문제입니다.

처음으로 화분에 물을 펌핑했을 때 튜브가 한 지점으로만 가는 가는 물줄기를 쏘아 그 부분만 완전히 흠뻑 젖고 나머지 흙은 마른 채 남았습니다. 고무 튜브를 화분 안쪽 벽을 따라 둥글게 감고 구멍을 뚫는 방법을 고려했지만, 흙 중앙 부분까지 물이 충분히 도달할지 확신할 수 없었습니다. 샤워 헤드를 써보려 했지만 튜브에 방수가 되게 고정하면서 물줄기 방향을 제어하는 방법을 알 수 없었습니다.

결국 저희는 “마구 뿌리고 기도하기” 방식을 택했습니다. 아파트를 둘러보다 문제를 해결할 만한 물건을 무작위로 집어 든 데서 나온 해결책이었습니다. 작은 주방용 고무장갑의 손가락 한 부분을 잘라 고무줄을 두 겹으로 단단히 감아 물 튜브에 고정하고, 바느질 바늘과 손톱깎이로 장갑에 구멍을 잔뜩 뚫었습니다.

펌프를 켜자 잘라낸 장갑 손가락이 즉시 튜브에서 튕겨 나가 아파트 벽 전체에 물을 뿌렸습니다. 다시 고정하되 이번에는 고무줄이 앞으로 밀려나지 않도록 바로 앞에 안전핀을 꽂았습니다.

물 분무기(정면)물 분무기(측면)

주방 장갑으로 만든 물 분배기

가장 우아한 해결책은 아니지만 대체로 동작은 합니다.

가드닝은 어려울 리 없었다

GreenPiThumb에서 가장 큰 도전은 전자공학일 거라 예상했습니다. 가드닝은 그리 어렵지 않아 보였습니다. 특히 강낭콩은 튼튼한 식물로, 기본적인 원예 기술만 있으면 키울 수 있다고들 합니다.

그런데 저희에게는 그 기본적인 원예 기술조차 없었습니다. GreenPiThumb은 실내 정원을 돌보는 인간의 역할을 자동화하려는 것이지만, 무언가를 자동화하려면 인간이 “정상”이 무엇인지 알아야 합니다. 물을 너무 많이 주는지 너무 적게 주는지 판단하기 어려웠던 이유는 저희 스스로도 물을 얼마나 줘야 하는지 전혀 몰랐기 때문입니다. 그래서 결국 이렇게 원예 스너프 필름을 만들게 되었습니다:

수분 측정이 얼마나 어렵다고?

가장 골치 아팠던 문제는 흙이었습니다.

GreenPiThumb을 만들 때 저희는 물을 주는 날에는 토양 수분이 올라가고 물을 주지 않는 날에는 내려갈 거라 예상했습니다. GreenPiThumb의 역할은 단순히 측정값이 일정 임계값 아래로 떨어질 때마다 물을 추가해 적정 수분 수준을 유지하는 것이면 될 터였습니다.

아래에는 비싸고 복잡한 모델링 소프트웨어를 활용해 저희가 상상했던 토양 수분 패턴을 시각화했습니다:

토양 수분 패턴

상상 속 토양 수분 패턴

잘못된 측정값

흙은 저희와 협조하지 않았습니다. 초기 빌드에서는 토양 수분 측정값이 95%에서 100% 사이를 오가다 서서히 약 99.5%로 수렴했습니다. 토양 센서를 빼서 여러 매질에 대해 테스트했습니다. 공기, 물, 젖은 종이 타월, 손, 완전히 마른 흙이었습니다. 이 모든 대상에서는 그럴듯한 값이 나왔지만, 수분이 조금이라도 있는 흙에서는 센서 값이 거의 100%까지 치솟았습니다.

토양 수분 수치

토양 수분 측정값, 원래 수분 센서

처음에는 Dickson Chow의 Plant Friends 토양 프로브를 사용했지만, 나중에 SparkFun 토양 센서로 교체했습니다. 새 센서는 축축한 흙에서 82%라는 값을 보였고, 물을 준 직후에는 85%로 뛰어올랐습니다. 하지만 몇 시간 안에 다시 82%로 내려가 며칠 동안 그대로 유지되었습니다. 센서는 3시간 전에 물을 준 흙과 5일 동안 물을 주지 않은 흙을 구분하지 못하는 듯했습니다.

토양 수분 수치

토양 수분 측정값, SparkFun 수분 센서

내 흙이 고장 난 것 같다

Miracle-Gro 흙

혹시 흙 탓일지도 모릅니다. 저희 화분용 흙은 Miracle-Gro의 미리 혼합된 제품으로, “물이 쉽게 스며드는 포뮬러”를 특징으로 합니다. 좀 수상하지 않나요? 분명 이건 절대 마르지 않는 악마의 유전자 조작 흙입니다. 그래서 불쌍한 토양 센서들이 그토록 혼란스러웠던 것입니다.

저희를 농락하지 않을 흙이 필요했기에 이 유기농 화분용 혼합토를 구매했습니다. 테스트로 플라스틱 컵에 유기농 흙을 채우고 물을 준 뒤 바닥에 구멍을 뚫어 물이 빠지게 한 다음, GreenPiThumb 화분의 흙 상태와 동일하게 만들기 위해 3일 동안 그대로 두었습니다. 3일이 지나 두 종류의 흙에서 모두 센서를 테스트했습니다.

똑같은 값이 나왔습니다. 각각 82%였습니다. 그러니 흙 탓은 할 수 없었습니다…

포기하기

아이디어가 바닥나자 GreenPiThumb에 영감을 준 프로젝트들을 다시 살펴보았습니다. 그들은 이 문제를 어떻게 해결했을까요?

Plant Friends는 아예 물을 펌핑하지 않습니다. PiPlanter는 토양 수분을 측정하지만 수분 수준과 관계없이 고정된 일정에 따라 물을 줍니다. 검색을 통해 토양 수분만을 기준으로 물을 준다고 주장하는 몇몇 Raspberry Pi 가드닝 프로젝트를 찾았지만, 어느 곳도 소스 코드를 공개하거나 결과 데이터를 공유하지 않았습니다. 따라서 수분 수준에 기반해 물을 주는 것은 불가능하며, GreenPiThumb은 물리적 세계의 불가피한 한계 속에서 할 수 있는 최선을 다하고 있다고 가정해도 무방하다고 느꼈습니다.

결국 저희는 하이브리드 시스템으로 전환하기로 했습니다. 이제 GreenPiThumb은 흙이 너무 건조해지거나 마지막으로 물을 준 지 7일이 지났을 때 물을 줍니다.

최종 결과물

아래는 완성된 GreenPiThumb 빌드의 사진들입니다:

GreenPiThumb 전체 시스템GreenPiThumb 전체 시스템
GreenPiThumb 전자 장치GreenPiThumb 펌프GreenPiThumb 물탱크

타임랩스가 이 과정에서 가장 재미있었던 부분입니다. 이것은 첫 번째 강낭콩 배치(R.I.P.)의 타임랩스입니다. 식물이 머리 위 클로즈업 앵글보다 얼마나 빨리 자라는지 미처 깨닫지 못했습니다. 결국 식물의 전체 생장 과정을 더 잘 담을 수 있는 더 큰 플렉시블 마운트로 교체했지만, 원래 구성으로도 성장 초기 며칠의 멋진 타임랩스를 건질 수 있었습니다:

두 번째 배치에서는 카메라를 성장 과정 내내 정확히 같은 위치에 두었습니다. 지금까지의 두 번째 배치 진행 상황은 다음과 같습니다:

배운 점

세상에 쉬운 일은 없다

이 프로젝트는 간단히 두세 달이면 끝날 줄 알았지만, 예상과 달리 1년 넘게 걸렸습니다. 세상에 쉬운 일은 없기 때문입니다.

오래전에 소프트웨어 에세이스트의 대가인 Joel Spolsky에게서 배운 교훈이며, 앞으로도 수많은 소프트웨어 프로젝트에서 다시금 배우게 될 교훈일 것입니다.

전자공학: 기초부터 시작하기

아두이노 스타터 키트

GreenPiThumb을 시작할 당시 전자공학에 대한 제 지식은 고등학교 물리 시간의 희미한 기억에 기반한 것이 전부였습니다. 아두이노 스타터 키트를 사서 튜토리얼을 하나씩 따라 하며 전자공학의 기초를 다졌습니다.

이 튜토리얼들은 꽤 재미있고 유용했습니다. 쉬운 내용부터 시작해 점진적으로 더 고급 주제로 나아가는 구성이 잘 되어 있었습니다. 전자공학에 관심 있는 초보자라면 이 키트를 추천합니다.

하드웨어는 개별적으로 테스트하기

함께 소프트웨어 프로젝트를 해본 몇몇 사람들은 제 코딩 스타일을 “지나치게 꼼꼼하다”거나 “지나치게 깐깐하다”고 표현했습니다. 저는 제 코딩 스타일을 “엄격하다”고 생각하는 편입니다. 저희는 GreenPiThumb의 소프트웨어 부분을 먼저 구현하면서 각 소프트웨어 구성 요소를 하나하나 엄격하게 피어 리뷰하고 테스트했습니다.

하드웨어에 관해서는 전혀 엄격하지 않았습니다. 다소 무모했고, 웃을 정도로 순진했다고 해도 과언이 아닙니다. 하드웨어 구성 요소를 테스트하던 원래 방식은 GreenPiThumb 소프트웨어의 기본 버전을 작성하고, 테스트 보드에 모든 센서를 연결한 뒤 실행해서 어떤 결과가 나오는지 보는 것이었습니다.

아무 것도 나오지 않았습니다. 아무 것도 나오지 않은 이유는 그 전략이 하드웨어를 테스트하는 데 형편없는 방법이었기 때문입니다. 시스템의 모든 전자 부품은 부품 자체가 불량이거나 잘못 설치되어 고장 날 가능성이 있습니다. 모든 것을 한 번에 연결하면 어느 부분이 고장 났는지 파악할 방법이 없습니다.

시간이 지나면서 센서를 개별적으로 테스트하는 법을 배웠습니다. 각 하드웨어 구성 요소마다 독립적인 진단 스크립트를 만들었습니다. 이제 하드웨어를 조금이라도 손보면 가장 먼저 진단 스크립트를 실행해 정상적인 값이 나오는지 확인합니다. 새로운 하드웨어가 동작하지 않을 때는 멀티미터를 사용해 체계적으로 근본 원인을 찾습니다. 멀티미터는 훨씬 일찍 샀어야 했습니다. 가격은 13달러에 불과했지만 수많은 시간의 좌절과 머리를 싸매는 일을 덜어줄 수 있었을 것입니다.

소스 코드

부품 목록

아래 표는 GreenPiThumb을 만드는 데 사용한 장비들입니다. 저희 모델을 쉽게 따라 할 수 있도록 정확한 부품을 공유하지만, 이들 중 다수는 기능적으로 동일한 다른 제품으로 교체할 수 있는 범용 부품입니다.

GreenPiThumb 필수 부품

공용 전자 부품

아래 항목들은 여러 프로젝트에 두루 쓸 수 있는 일반적인 전자공학 도구와 부품들입니다. 저희는 전자 장비가 하나도 없어서 구매했던 것들이며, 완전성을 위해 포함했습니다:

원예 용품

선택 부품

  • 서드 핸드 납땜 툴
    • 처음에는 이 기본 클램프 스탠드로 시작했지만 위치를 잡고 조정하기가 어색했습니다. 플렉시블 모델은 몇 배 더 비쌌지만 납땜 작업을 더 간단하고 쾌적하게 만들어 주었습니다.
  • 플렉시블 카메라 마운트
    • 카메라를 고정하기에 좋습니다. 길고 유연해서 좋은 앵글과 거리를 찾기에 다양한 선택지를 제공합니다.
  • PEX 튜브 커터
    • 물 튜브를 깔끔하게 자를 수 있습니다.
  • 디지털 멀티미터
    • 기본 멀티미터 하나쯤은 꼭 구매하시길 강력히 권장합니다. 이 제품 자체가 특별한 것은 아니지만 저희에게는 든든하게 제 역할을 해주었습니다.
  • 파이 카메라 마운트
    • Raspberry Pi 카메라를 위의 플렉시블 마운트 같은 표준 1/4인치 카메라 마운트에 부착할 수 있게 해줍니다.
  • 파이 카메라 연장 케이블(1m)
    • Raspberry Pi 카메라를 Raspberry Pi 본체에서 멀리 떨어뜨려 배치해야 할 때 필요합니다.
  • 케이블 타이
    • 튜브나 배선을 제자리에 고정할 때 사용합니다.

감사의 말

이 프로젝트에 도움을 주신 분들께 큰 감사를 전합니다:

  • 하드웨어 측면에서 GreenPiThumb에 큰 영감을 준 PiPlanter 2 프로젝트의 Devon Bray
  • 하드웨어 레퍼런스로 도움이 되었을 뿐 아니라 프로젝트 전반에 걸쳐 많은 격려를 보내준 Plant Friends 프로젝트의 Dickson Chow
  • 이 글의 편집을 도와준 Nicole Michaelis
  • 배선 문제로 막혔을 때 도움을 준 /r/raspberry_pi 레딧 커뮤니티

원문은 Michael Lynch님이 에 게재했습니다.

이 글은 muse-spark-1.2-contributor 모델을 사용해 번역했습니다.