[Перевод] Проект «часов Уизли» с демонстрацией местоположения членов семьи

588e859bed270b828069cce6f3e16cdd.jpg

Я хотел удивить жену на Рождество. Она — рыжая, фанат «Гарри Поттера», а ещё и мать; всё это вдохновило меня на создание «часов Уизли». Идею я придумал в феврале, поэтому у меня было 10 месяцев на разработку и создание проекта.

Для людей, незнакомых с Гарри Поттером и семейством Уизли, поясню, что у семьи магов Уизли есть волшебные часы, которые показывают не время, а местоположение членов семьи, для каждого из которых есть своя стрелка. Вот отрывок из книги «Гарри Поттер и Кубок огня» (Дж. Роулинг, 2000):

Миссис Уизли взглянула на напольные часы, стоявшие в углу. Гарри они понравились. Если вы хотели узнать, который час, они бы вам совсем не пригодились — однако оказывались весьма полезными для кое-чего другого. У них было девять золотых стрелок, на каждой из которых было выгравировано имя одного из членов семейства Уизли. На циферблате были не цифры, а описания мест, где мог находиться каждый из членов семьи. Там были «дом», «школа», «работа», а также «в пути», «потерялся», «больница», «тюрьма»; в том месте, где у обычных часов должна была быть цифра »12», значилось «смертельная угроза». Восемь стрелок указывали на «дом», а стрелка мистера Уизли, самая длинная, всё ещё показывала на «работу».

«О, а вот и ваш отец едет!» — внезапно сказала она, вновь посмотрев на часы. Стрелка мистера Уизли вдруг начала крутиться, переходя от «работы» к «в пути», а через секунду вздрогнула и остановилась на отметке «дом» вместе со всеми остальными, и все услышали, как он зовёт их с кухни.


Для превращения волшебных часов в реальные потребовалось провести исследовательскую работу. У меня большой опыт программирования, однако я лишь недавно начал писать код, двигающий что-то в физическом мире. В 2018 году я начал вести наш местный клуб любителей робототехники FRC от компании FIRST, и познакомился с миром моторов и энкодеров.

2fc403a6f62c9c2954ea4dd903f7b81b.png
Блок-схема обновления данных на часах Уизли

Я разбил проект с часами на несколько подпроектов, с которыми уже можно было работать, и начал с отслеживания местоположения. Сначала я использовал мобильное приложение Find My Phone от Apple, поскольку все ближайшие члены моей семьи пользуются айфонами. Но потом перешёл на Life360, поскольку их API оказалось более дружественным для использования третьими лицами, и позволило мне добавить и родственников жены, которые живут с нами и пользуются телефонами на базе Android. Ещё до начала сборки и программирования мне пришлось убедить всех их поставить себе Life360 и пользоваться им. К счастью, все согласились. Жена сделала это по соображениям безопасности, так и не узнав о моём секретном плане по приготовлению сложного сюрприза на Рождество.

Следующей проблемой стало создание часов с несколькими стрелками. Я наивно предполагал, что подобные штуки существуют, и мне придётся только купить что-то подобное и просто впихнуть туда собственные контроллеры моторов. В итоге я остановился на использовании концентрических латунных трубок из магазинов для хобби. Шестерёнки к трубкам я приделал хомутами из ServoCity.com.

Для поворота стрелок я решил использовать сервоприводы-лебёдки с возможностью многократных поворотов. Я купил у Adafruit и спаял 16-канальную плату расширения Raspberry Pi Servo HAT и начал делать прототип. И примерно в тот момент меня охватило радостное возбуждение, поскольку я понял, что всё это сработает.

Затем мне нужна была программа, преобразовывающая необработанные данные по местоположению в определённые состояния часов Уизли. Я решил сделать систему автоматизации Home Assistant посредником между данными о местоположении от Life360 и подсчётом состояния часов. Это усложнило систему в целом, однако позволило мне перевалить груз интеграции Life360 (и потенциальные изменения API в будущем) на плечи Home Assistant. Отслеживание конкретных точек подключения людей к WiFi позволяет мне точнее определять их местоположение в доме. Когда, к примеру, чей-то телефон подключается к уличному роутеру, система знает, что человек в «саду».

f1687a7b05657b074e752f27ed421d04.jpg
Панель Home Assistant

Прописав правила для Home Assistant, я получил панель управления, где были перечислены все состояния часов Уизли. Теперь мне нужно было лишь использовать эти данные для передвижения стрелок часов.

Home Assistant — проект автоматизации дома с открытым кодом, с приоритетом на локальное хранение данных и управление. Этим он отличается от большинства систем автоматизации IoT, требующих соединения с интернетом и хранящих ваши данные в облаке.

Учитывая, что состояния часов уже вычислялись на самом Home Assistant, а Raspberry Pi и контроллеры серво стояли в часах, мне нужно было придумать, как передавать данные от Home Assistant к часам Уизли. Я выбрал протокол MQTT, популярный для использования в IoT, и хорошо поддерживаемый в Home Assistant. Я добавил в Home Assistant автоматизацию для отправки сообщений MQTT при любом изменении статуса часов. На стороне приёмника я написал демона на Python, weasleyclockd, слушающего поток событий MQTT и соответствующим образом передвигающего стрелки.

Я добавил циферблату информативности, чтобы там было больше данных, чем просто «дома» или «потерялся». В секторах «потерялся» и «в пути» положение стрелок от указанных значений пропорционально тому, насколько далеко от дома находится человек. Можно с первого взгляда понять, близко ли к дому человек, или он в ближайшем магазине, или за сто километров отсюда.

Для облегчения читаемости стрелки размещены в шахматном порядке, чтобы не толпиться в таких секторах, как «дом». Сектор «дом» поделён на две части — основной дом и второе здание, магазин.

В проекте важную часть занимает рисунок циферблата. Я нашёл красивый постер часов Уизли от автора Minalima. Этот автор нарисовал множество официальных рисунков для фильмов про Гарри Поттера.

Делая эти часы, я пытался представить, каким должен быть их корпус. Я понимал, что лучше всего было бы повторно использовать антикварные часы. Или же можно было сделать корпус самому, однако опыта работы краснодеревщиком у меня не было. В принципе это было возможно, но я знал, что результаты моей первой работы меня не устроят. Каминные часы, которые я видел в местном антикварных магазинах в Снохомише, Вашингтон, были слишком малы для механизма часов и циферблата. А затем мне улыбнулась удача.

Мы с женой ездили на остров Уидби и забрели в магазин Good Cheer Thrift Store в Лэнгли. У них продавались напольные часы, размер которых, на первый взгляд, подходил и для механизма, и для циферблата. Однако я совсем не был готов к их покупке. У меня не было с собой размеров циферблата и механизма. И со мной была моя жена, для которой предназначался этот сюрприз. Поэтому я просто запомнил этот момент, и решил, что мне обязательно нужно купить такие часы

Дома, вооружившись всеми измерениями, я начал прочёсывать eBay в поисках напольных часов. Это было непростой задачей. Рабочие часы стоили дорого. Никто не хотел заниматься их пересылкой. Как только я находил какие-то подходящие мне часы, обязательно оказывалось, что они продаются самовывозом из Флориды.

Через три месяца мы с женой решили всей семьёй снова съездить на остров Уидби. Мы снова обедали в Лэнгли, и я быстро метнулся в тот магазин. Напольные часы всё ещё стояли там! Их даже уценили до $165. Такое удачное стечение обстоятельств нельзя было упускать, поэтому я попросил жену не задавать вопросов, поскольку всё это было частью сюрприза. Я купил часы, и мы погрузили их в уже забитый фургон Honda Odyssey. Теперь она уже поняла, что что-то намечается.

Ещё более сложной задачей, чем корпус часов, оказалось придумать, как сделать стрелки. Я сначала хотел либо печатать их на 3D-принтере, либо вырезать из латуни. Мне повезло, что в этом вопросе у меня дома есть парочка собственных экспертов. Увидев потрясающие распечатанные стрелки на сайте Printable Props, я решился на 3D-печать. Наш сын Алекс как раз закончил школьный курс по Advanced CAD, сдав экзамен на сертификат по Solidworks на отлично. Я загрузил его изготовлением стрелок, и они получились прекрасно. За 3D-печать отвечал мой тесть Рон. Он работает с 3D-принтером в нашей команде робототехники, и служит нашим местным экспертом по этому вопросу. В завершение работы над стрелками я покрасил их краской металлик и для контраста добавил чёрного.

dff43b50dc1f82c8762fc3e5551225e3.gif
Перемещения семьи в течение дня

0afa96c9b0d3868588e5861dd29275f4.gif
Расстояние от дома

Мне очень хотелось похвастаться возможностями часов, но в разгар самоизоляции никто от дома далеко не уезжал. Для решения этой проблемы я написал программу, отправлявшую записанные последовательности сообщений MQTT. Я мог симулировать события и заставить стрелки часов двигаться так, будто люди ездили туда-сюда.

588e859bed270b828069cce6f3e16cdd.jpg
Законченные часы

b1f76fccf97e44f5ceb2beabeee2e909.jpg
Поставили на кухне

В итоге мне удалось держать весь проект в тайне. Но я не успел с ним к Рождеству. Поэтому на праздниках мне пришлось продемонстрировать часы в нерабочем, статичном состоянии. Мне удалось навести внешний лоск, и моя жена была удивлена и обрадована.

Ещё два месяца ушло на окончательную доделку — печать комплектующих на 3D-принтере, установку механизма, печать и покраску стрелок, и подстройку ПО.

Проект вроде бы завершён, но мне хочется внести ещё несколько улучшений. Планирую собрать часы с шестью-семью стрелками, и автоматизировать бой часов.

Перефразируя Артура Кларка: «Любая достаточно продвинутая IoT-интеграция неотличима от волшебства».

Во втором поколении часов Уизли мне бы хотелось изменить следующее:

  • Разработать и напечатать шестерёнки, цепляющиеся к латунным стержням напрямую.
  • Использовать моторы с энкодерами.
  • Вырезать стрелки из латуни, чтобы освободить место для большего количества стрелок.

Ссылки на мой журнал разработки, фотографии и программы:

© Habrahabr.ru