Hacker News

Surely you have ultra-wideband radios on your bins too?

쓰레기통에도 초광대역 무전기를 달아보셨나요?

Home Assistant가 수거 일정뿐 아니라 쓰레기통을 실제로 내놓았는지도 알도록 UWB 태그와 고정 앵커를 만든 프로젝트입니다. 거리 측정부터 저전력 펌웨어, 무선 업데이트, 알림 자동화까지 구현하고 실제 수거 과정에서 확인한 한계도 기록했습니다.

AI 요약

Home Assistant는 수거할 쓰레기통 종류와 날짜를 알려주지만, 실제로 쓰레기통을 집 밖에 내놓았는지는 알지 못합니다. 글쓴이는 이 상태까지 자동으로 확인하려고 UWB(ultra-wideband) 앵커 하나와 배터리 태그 여섯 개를 만들었습니다. 쓰레기통별 수거 일정은 기존 Waste Collection Schedule 통합이 관리하고, BinRange는 무선 신호로 각 쓰레기통의 위치 상태를 보탭니다. 취미 프로젝트지만 하드웨어, 펌웨어, MQTT, Home Assistant 자동화와 3D 프린팅 케이스까지 다룹니다.

RSSI 대신 UWB로 거리 측정

처음에는 저렴한 Bluetooth 태그의 RSSI(수신 신호 강도)로 쓰레기통이 가까이 있는지 추정했습니다. 하지만 벽, 주차된 차, 신호 반사, 안테나 방향, 배터리 전압에 따라 신호 세기가 달라져 거리 추정이 불안정했습니다. UWB는 신호 세기로 거리를 짐작하는 대신, 장치 사이를 오가는 전파의 시간을 측정합니다. 주변 환경의 영향을 없애지는 못하지만 거리 판단을 더 직접적으로 할 수 있습니다.

목표는 정확한 좌표를 구하는 게 아니라 쓰레기통이 보관 장소에서 충분히 멀어졌는지 확인하는 것이었습니다. 따라서 우선 앵커 하나를 설치하고 10m 경계 안쪽을 Home, 바깥쪽을 Out으로 판정했습니다. Makerfabs ESP32-WROVER/DW3000 보드 두 개로 시험했을 때, 약 10m 거리에서 보드를 눕힌 상태의 측정 성공률은 37%였고 세워 두자 100%로 올랐습니다. 더 느리고 프리앰블이 긴 무선 설정도 처음 설정에서 발생한 문제를 줄였습니다.

줄자로 잰 거리가 10.1m일 때 평균 측정값은 약 10.09m였고 표준편차는 3cm였습니다. 초기 보정에서는 오차가 2cm 미만인 결과도 나왔지만, 이를 모든 방향과 위치에서 보장하는 정확도로 보지는 않습니다. 야외에서는 대략 30m까지 측정이 안정적이었고, 더 먼 거리에서는 신호가 끊겼습니다. 기록된 최장 거리는 37.28m였으며 중간에 측정 공백이 있었습니다. 차가 전파 경로를 막으면 신호가 완전히 사라질 수도 있었습니다.

태그 하드웨어와 저전력 동작

태그로는 nRF52833 프로세서, DW3110 UWB 무전기, LIS3DH 가속도를 넣은 KKM K4W를 사용했습니다. 전원은 교체형 CR2477 코인셀입니다. 개발 보드 두 개 가격은 배송비를 포함해 미화 123.64달러였고, 샘플 태그 열 개와 프로그래밍 지그, 배송에는 330달러가 들었습니다. 글쓴이는 태그에 직접 펌웨어를 올릴 수 있는지 확인한 뒤 제품을 골랐습니다. 제조사가 제공하는 기능이나 배터리 수명 주장은 자체 펌웨어를 쓸 예정이어서 판단 기준이 아니었습니다.

가속도 센서의 인터럽트를 nRF에 연결해 태그가 움직이지 않을 때는 프로세서를 오래 재우고 무선 송신도 멈추게 했습니다. 기본 설정은 정지 상태에서 10분마다 확인하는 방식이었지만, 설치한 태그는 Home Assistant에서 30분 간격으로 바꿨습니다. 움직임이 감지되면 5초 간격으로 보고합니다. 배터리 전압과 활동량은 기록 중이지만, 아직 수개월이나 수년 단위의 수명을 확정할 만큼 관찰하지 못했습니다. 이전 Bluetooth 태그는 CR2045 배터리로 약 2년간 작동했고, 글쓴이는 더 큰 CR2477과 낮은 보고 빈도를 고려해 2년 이상을 예상한다고 답했습니다. 다만 실제 수명은 더 지켜봐야 합니다.

MQTT 연동과 무선 펌웨어 업데이트

앵커는 측정값을 MQTT로 전달하고 Home Assistant는 태그별 장치를 자동으로 발견합니다. 별도의 BinRange 서버나 클라우드 서비스는 필요하지 않습니다. MQTT 연결이나 Home Assistant가 중단되어도 무선 거리 측정은 계속됩니다.

태그를 설치한 뒤 매번 분해해 프로그래밍 지그에 연결하지 않도록, 앵커에서 Bluetooth로 서명된 펌웨어 업데이트를 보내도록 만들었습니다. 업데이트 실패에 대비해 이전 애플리케이션을 보관하고, 태그가 새 이미지로 실행된 뒤 자체 상태를 확인해야 성공으로 처리합니다. 손상된 이미지, 전송 중단, 전원 차단 시점, 워치독 복구, 앵커가 없는 상황을 시험했습니다. 여섯 번째 태그를 추가할 때는 Bluetooth 라이브러리의 저장 공간이 페어링한 기기 수가 아니라 동시 연결 수에 맞춰져 있어 문제가 생겼습니다. 이를 고쳐 기존 태그를 지우지 않고 새 태그를 페어링했습니다. 설치된 앵커와 태그 여섯 개는 무선으로 업데이트했지만, 연결 재시도가 필요했던 사례가 있어 완전한 무인 업데이트라고 판단하기에는 근거가 부족하다고 설명합니다.

상태 표시와 수거 알림

Home Assistant는 수거 전날 오후 6시와 9시에 내놓을 쓰레기통을 묶어 알리고, 다음 날 오전 6시에도 아직 Home 상태인 쓰레기통이 있으면 다시 알립니다. 수거일 오후 6시에는 여전히 Out인 쓰레기통을 가져오라고 알립니다. 측정값이 없다는 이유만으로 쓰레기통을 내놓지 않았다고 단정하지 않도록 했고, 수거 차량이 실제로 비웠는지도 시스템이 확인할 수 없다고 구분합니다.

비워진 사실을 추정하려고 움직임과 수거 시간만 쓰지는 않았습니다. 태그의 가속도로 기준 수직 자세에서 90도 넘게 기울어진 상태가 일정 시간 이어지면 tipping 이벤트를 기록합니다. 통신이 끊겨도 이벤트를 보관했다가 앵커와 다시 연결되면 발생 후 경과 시간을 전달합니다. Home Assistant는 수거 대상이고 Out으로 확인된 쓰레기통에서 최근 tipping 이벤트가 오면 비워졌다고 추정합니다. 이벤트는 60초 동안 모아 알림을 묶고, 저장 상태를 이용해 중복 알림을 막거나 Home Assistant 재시작 뒤 복구합니다.

첫 실제 시험에서는 정원 쓰레기통이 오전 7시 5분쯤 움직여 10m 경계를 넘었고, 오전 10시 25분쯤 다시 감지됐습니다. 태그는 오전 9시 27분쯤 발생한 tipping 이벤트를 보관하고 있었지만 Home Assistant에 도착했을 때는 약 58분이 지나 있었습니다. 자동화의 허용 시간인 30분을 넘겨 ‘방금 비워짐’ 알림은 전송되지 않았습니다. 앵커의 MQTT 장애는 확인되지 않았고, 수거 위치에서 해당 태그의 신호가 끊긴 이유는 아직 밝혀지지 않았습니다.

이 경험 뒤에는 마지막으로 관측한 상태와 통신 상태를 따로 표시하도록 바꿨습니다. Out으로 확인한 뒤 신호가 끊겨도 Home Assistant 재시작을 거쳐 ‘추정상 Out’ 상태를 유지합니다. 반면 마지막으로 Home에 있을 때 신호가 끊기면 어디로 이동했는지 확인한 적이 없으므로 Unknown으로 처리합니다. Out 상태를 집 안으로 되돌리려면 경계 안쪽에서 새 측정값이 필요합니다.

케이스와 실제 설치

앵커 케이스는 OpenSCAD로 설계하고 PLA로 출력했습니다. 처음에는 나사로 고정하려 했지만 조립이 번거롭고 보드가 흔들렸습니다. 나사 없이 고정하도록 위치 결정 핀과 출력물 자체의 스프링을 만들었고, 뚜껑에는 여러 얕은 걸쇠를 적용했습니다. 깊은 걸쇠는 삽입할 때 뿌리 부분이 부러졌습니다. 최종 설계는 바닥과 뚜껑의 벽을 겹치고 얕은 걸쇠를 여러 개 두는 방식입니다. 앵커는 전원 장치와 함께 실외 전기함 안에 벽걸이로 설치했습니다. 모든 쓰레기통에 태그를 부착했지만, 각 수거 위치의 통신 범위와 배터리 수명, 야외 케이스 내구성, 알림 전달은 앞으로 여러 차례 수거 주기를 관찰해야 합니다.

Hacker News 반응

  • @jcomp — 재미있게 읽었습니다. 글을 써서 올려주셔서 감사합니다.
    • @simonjgreen — 감사합니다. 실내 초기 시험 때 사진을 더 찍어둘 걸 후회합니다. 이런 일을 더 잘 기록해야 하는데, 글을 쓰려고 생각할 때면 이미 늦었습니다.
  • @mikestew — 수거 차량의 기계 팔을 조작하는 운전자가 쓰레기통을 트럭 안에 떨어뜨리면 어떡하나요? 스포일러를 드리자면, 통은 다시 꺼내지 않고 이제 쓰레기가 됩니다. 제가 쓸 거라면 태그 가격이 더 내려가야 합니다. :-)
    • @simonjgreen — 그런 일이 누군가에게 일어났다는 얘기는 들어본 적이 없습니다! 다행히 태그는 개당 5파운드뿐입니다. 비용 대부분은 WROVER 보드와 프로그래밍 지그에 들어갑니다. 제조사가 만든 지그는 꽤 직접 만든 물건처럼 보입니다.
    • @minnowguy — 통 전체가 사라진 건 아니지만, 몇 주 전에 작업자가 재활용 쓰레기통의 경첩 달린 뚜껑과 바퀴 두 개를 벗겨냈습니다. 사진을 보내자 새 통을 보내줬습니다.
  • @qurren — 첫 반응은 비전 언어 모델(VLM)을 써봤느냐는 것이었습니다. 예전에는 문이 제대로 닫혔는지, 밥솥 전류가 흐르는지, 차고 문이 열렸는지 확인하려고 Home Assistant에 Zigbee 센서를 잔뜩 연결했습니다. 배터리 교체와 불안정한 연결을 관리해야 했습니다. 요즘은 카메라 이미지를 로컬 LLM에 보내 차고 문이 열렸는지 묻는 편이 정신 건강에 훨씬 낫습니다. 고양이가 바닥에 토했는지, 식물이 돌봄이 필요한지도 확인합니다. 현관 카메라가 이미 있다면 쓰레기통이 나왔는지 물어보면 됩니다. 이미지를 클라우드로 보내기 싫다면 로컬 방식도 있습니다.
    • @simonjgreen — 이 아이디어가 꽤 마음에 듭니다. 비전 모델을 많이 써보진 않았습니다. 오래전에 OpenCV와 Processing으로 실험했는데, 그 뒤로 많이 달라졌네요. 다음 주말 프로젝트가 생긴 것 같습니다.
    • @evan_ — 저도 Home Assistant 설정에서 이렇게 해결했습니다. 초인종 카메라 이미지를 Anthropic API에 보내 쓰레기통이 어디에 있는지 묻고, JSON 응답으로 어떤 통이 보이는지 확인합니다. 수거 일정에 해당하는 통이 밖에 있으면 알림을 보냅니다. 수거 뒤 제자리로 가져오는 알림도 보내되, 이미 가져왔으면 생략합니다. 내부 LED 색을 바꾸는 ‘Bindicator’도 만들었습니다. 카메라 각도 때문에 통 위치를 분명히 판단하지 못하면 알림을 보내므로, 가끔 불필요한 알림이 옵니다.
    • @timothyb89 — Home Assistant 장비에서 Frigate를 실행합니다. Frigate+ 모델은 로컬에서 쓰레기통을 식별하고 애드온을 통해 개수를 Home Assistant 엔티티로 내보냅니다. Waste Collection Schedule과 자동화를 조합해 수거 전날 통을 내놓지 않았으면 알리고, 다음 날 아직 들여놓지 않았으면 다시 알립니다.
    • @Eduard — Zigbee 장치 배터리는 3년에 한 번 정도 갈면 됩니다. 카메라 배터리는 얼마나 자주 바꾸나요, 아니면 전원선을 연결하는 보기 싫은 설치를 받아들이나요? 집을 감시할 카메라는 몇 대나 설치해야 하나요? IP 카메라도 불안정할 수 있습니다. 사적인 공간의 영상을 클라우드 LLM에 계속 보내는 건 오웰이 말한 감시 사회 같습니다. 고양이가 토했는지 확인하려고 매분 LLM을 호출하나요?
    • @qurren — 보안과 고양이 관찰용 카메라는 어차피 필요합니다. 카메라가 센서 100개 역할을 할 수 있으니 깔끔하게 설치하는 수고를 감수합니다. 로컬 GPU 서버를 쓰고 보안 영상은 로컬 NVR에 저장합니다. 클라우드로 보내지 않습니다. 움직임이 감지될 때만 다시 확인하고, 그 뒤에는 안전망으로 15분마다 확인합니다.
  • @georgemcbay — 2019년에 뉴욕 지하철 7호선에 UWB 위치 측정을 추가하는 회사에서 일했습니다. 제가 작성한 코드는 Raspberry Pi 3 Compute Module과 UWB 장치를 결합한 장비에서 실행됐고, 열차에 설치해 선로 옆 비콘을 측정했습니다. 열차가 정해진 선로 중 하나에 있다는 조건 덕분에 대부분 두 비콘만으로 위치를 유일하게 정할 수 있었습니다. 위치 데이터는 2차원이 아니라 측량한 선로와 비콘을 ECEF 좌표로 기록한 3차원이었습니다. 폭설이 오면 신호가 반사돼 시간차 측정에서 직접 경로 신호를 구별하기 어려워지는 점이 가장 큰 문제였습니다.
  • @walrus01 — 글에서 battery와 life를 검색했는데 배터리가 얼마나 가는지 자세한 설명을 찾지 못했습니다. 배터리 종류와 수명, 충전 여부 같은 정보를 더 듣고 싶습니다. 집 자동화에 일회용 배터리를 쓰는 장치를 이미 많이 두고 있어 더 늘리고 싶지 않습니다. 일부 장치에는 PoE 케이블을 연결하고 임의의 DC 전압으로 바꾸는 방안도 살펴보고 있습니다.
    • @simonjgreen — 글에서 앞으로 몇 주 동안 관찰하겠다고 썼습니다. 이전 BLE 태그는 CR2045 하나로 약 2년 갔습니다. 이번에는 훨씬 큰 CR2477을 쓰고 보고 간격도 낮췄으니 2년 이상을 예상합니다.
  • @fennecbutt — 이 작업에 UWB가 필요해 보이진 않습니다. Bluetooth 비콘과 RSSI면 되지 않나요? BTLE 5.6쯤에는 센티미터 단위 위치 측정이 내장돼 있고 전력도 아주 적게 쓴다고 알고 있습니다.
  • @aenis — 제 경우에는 외부 카메라가 쓰레기통을 보도록 했습니다. 통마다 색이 달라 이미지의 색을 간단히 분석하고, 직사광선에 따른 색 변화도 고려해 어떤 통이 길가에 있는지 판단합니다. LLM 시대 전부터 만들었고 pyscript에서 실행합니다. 잘 작동하며 배터리도 유지 관리도 필요 없습니다.
  • @TrackerFF — 이 문제라면 카메라 한두 대면 충분하다고 생각합니다. 예전에 움직이는 장비가 구조물 안에서 언제 어디에 있는지 파악하는 프로젝트에 참여했습니다. 결국 카메라와 객체 탐지만 썼습니다. AlexNet이 나오기 전이어서 전통적인 머신러닝을 다뤘습니다.
  • @fwip — 더 싼 방법은 진동 센서입니다. 쓰레기를 넣을 때 생기는 짧은 진동은 무시하고, 수거 전날 밤 길게 진동하면 내놓은 것으로 봅니다. 수거일의 큰 진동은 차량이 비운 것으로 처리하고, 나중에 다시 길게 진동하면 집으로 가져온 것으로 처리하면 됩니다.
  • @elromulous — 정확한 위치가 아니라 거리를 측정하는 방식이라면 사람이나 반려동물의 일상 활동을 기록하는 데 쓸 수 있습니다. 정밀한 위치 정보로 요리, 냉장고 방문, 화장실 이용, 운동, 침대에서 보내는 시간, 수면 여부와 전반적인 활동량을 알아내 건강 변화를 살필 수 있습니다.

원문: sjg.io / 번역·요약: Trawling