Да, это точно кот, а не большой чёрный хомяк. Оказывается, некоторые кошки тоже не прочь понаворачивать круги в колесе. Владелец кота по имени Cygnus (Лебедь) решил немного усовершенствовать кошачье беговое колесо и прикрутил к нему систему мониторинга. Рассказываем, как работает устройство и какие интересные факты о кошачьей активности можно из него извлечь.
А на что вы готовы ради своих котиков?
Кот в колесе. Начало
Это колесо One Fast Cat я получил от подруги, которая не смогла научить своих кошек им пользоваться. Лебедь молод, активен и падок на угощения, поэтому заставить его бегать в колесе было несложно.
Мне очень хотелось выяснить, до какой скорости он разгоняется (спойлер: почти до 22,5 км в час), как часто он бегает и как ему больше нравится крутить колесо: по часовой стрелке или против.
Аппаратное обеспечение
Система довольно проста. Сначала я приклеил маленькие магниты к пластиковым деталям на внешней части колеса:
По всей окружности колеса расположено 16 пластиковых зажимов, но в силу лени я использовал только 8 из них. Серебряный диск — это магнит, закрепленный на термоклей. Чтобы зафиксировать момент прохождения магнита я использовал пару датчиков 3144E Hall-effect:
Технически, для измерения скорости мне нужен был только один датчик. Но я хотел измерять ещё и направление, а датчики всё равно дешевые. Идея проста: два датчика расположены близко друг к другу, а магниты (относительно) далеко друг от друга. Если при прохождении колеса мы получаем сигналы AB------AB------AB, то колесо движется в одном направлении. Если BA------BA------BA, то в другом направлении.
Вот полностью собранная система:
Штука, похожая на стул, надевается на одну из опор колеса. На неё установлен ESP8266, который я использовал в качестве контроллера, а также небольшой угловой элемент, мимо которого будут проходить магниты. Все детали регулируются, чтобы установить разумное расстояние до магнитов (я выяснил, что нормальным будет 5-10 мм). Файлы STL для 3D-принтера прилагаются: база NodeMCU , кронштейн для датчика и платформа для датчика.
Входные данные для чипа ESP берутся с цифрового пина выхода (D0) каждого датчика; помимо этого требуются только питание и заземление. Датчики потребляют так мало энергии, что ESP может питать их напрямую.
На картинке ниже все части на своих местах. Если смотреть под этим углом, магниты проходят сенсоры с правой стороны.
Программное обеспечение
Основной процесс довольно прост: инициируйте прерывание каждый раз, когда на одном из пинов датчика сигнал становится высоким, и запускайте функцию обновления. Функция обновления просматривает три последних показания: а именно, порядок следования датчиков A-B-A или B-A-B. Когда среднее значение находится в верхнем 75-м процентиле времени между первым и последним прерыванием, вполне вероятно, что последние два показания являются одним и тем же магнитом, проходящим мимо датчиков в том или ином направлении.
Когда у меня есть модель A------BA или B------AB, я могу просто посмотреть на последнее показание, чтобы определить направление (по часовой стрелке или против часовой стрелки), а ещё могу определить скорость, глядя на разницу во времени между первым и последним показаниями (от A до A или от B до B). Окружность колеса около 3,4 м, то есть длина каждого отрезка составляет 425 мм (напомню, что я использовал 8 магнитов, распределённых по окружности), так что мне просто нужно разделить это значение на время, чтобы получить скорость. Если время составило, скажем, 250 мс, то Лебедь двигался со скоростью 425мм/250 мс = 1,7 м/с или 6,1 км в час.
Попутно я немного обработал данные, получив пиковую скорость, общую продолжительность и простую гистограмму результатов.
Я хотел хранить данные в легкодоступном месте. Для этой цели я использовал скрипт Google Apps, он позволяет добавить каждый запуск в новую строку электронной таблицы. Должен признаться: я использовал ChatGPT, чтобы в нём разобраться! Я достаточно хорошо знаю Javascript, но не API Google. Это сработало, и я смог настроить шаблон сценария. Я пишу строку JSON и размещаю ее на URL-адресе «веб-приложения». Самым сложным было получить поддержку SSL, работающую на чипе ESP; в конце концов я обнаружил, что BearSSL справился со своей задачей. Сценарий приложения таков:
function doPost(e)
{
var param = JSON.parse(e.postData.contents);
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("log");
var date = new Date();
if (param.message == 'startup')
{
var misc = "host=" + param.name + " buildDate=" + param.build.date + " buildTime=" + param.build.time;
sheet.appendRow([date, param.message, '', '', '', '', '', '', '', '', '', misc]);
}
else if (param.message == 'run')
{
sheet.appendRow([
date,
param.message,
param.speed.peak_mph,
param.speed.ave_mph,
param.dir,
param.dur,
param.histo['80-100'],
param.histo['60-80'],
param.histo['40-60'],
param.histo['20-40'],
param.histo['0-20'],
misc]);
}
else if (param.message == 'test')
{
sheet.appendRow([date, param.message, '', '', '', '', '', '', '', '', '', param.misc]);
}
else
{
sheet.appendRow([date, 'unknown', '', '', '', '', '', '', '', '', '', e.postData.contents]);
}
return ContentService.createTextOutput(JSON.stringify({ status: 'success' })).setMimeType(ContentService.MimeType.JSON);
}
О, и на ESP есть небольшой telnet-сервер с несколькими простыми командами. Легко реализовать с использованием библиотек Arduino.
Результаты
Этот кот много бегает! Вот типичный небольшой всплеск активности:
Время | Сообщение | Пиковая скорость (миль/час) | Cредняя скорость (миль/час) | Направление | Продолжительность | Гистограмма 80-100 | Гистограмма 60-80 | Гистограмма 40-60 | Гистограмма 20-40 | Гистограмма 0-20 |
14.02.2023 11:48:35 | бег | 6.840 | 2.132 | по часовой стрелке | 9.300 | 6.335 | 4.320 | 3.128 | 2.222 | 0,959 |
14.02.2023 11:48:52 | бег | 6.555 | 2,182 | по часовой стрелке | 9.086 | 5.800 | 4.495 | 3.103 | 2,178 | 1,016 |
14.02.2023 11:49:20 | бег | 10.042 | 2,775 | по часовой стрелке | 13.266 | 9,563 | 6.516 | 4.200 | 2,788 | 1,093 |
14.02.2023 11:49:38 | бег | 5.274 | 1,788 | по часовой стрелке | 5.281 | 5.230 | 4.291 | 2,728 | 1,783 | 0,692 |
14.02.2023 11:50:04 | бег | 4.627 | 2.124 | по часовой стрелке | 4.445 | 4.168 | 3,666 | 2.291 | 1,781 | 1,185 |
Как видите, забеги не очень продолжительные — обычно около 5-10 секунд за раз. Но пока он в среднем делает около 50 пробежек в день. Бегать предпочитает по часовой стрелке, но не всегда; соотношение сейчас примерно 2/3.
Следующие данные представлены в режиме реального времени, поэтому выводы ниже могут быть устаревшими.
Лебедь, кажется, совершает много медленных прогулок со скоростью 3-5 км в час, но есть много хороших спринтов > 21 км/ч. Я видел и 24 км/ч в предыдущих данных.
Я сова (сплю примерно с 3:00 до 11:00), и вы можете видеть, что Лебедь в основном начинает бегать сразу после того, как я ложусь спать и после того, как просыпаюсь (чаще последнее). Пока не увидел данные, я не понимал, что кот довольно активен с 4 до 6 утра!
Лебедь обычно совершает довольно короткие пробежки, хотя есть и достаточно длительные прогулки. В любом случае, кошки не созданы для марафонов.
Большинство коротких пробежек — от 5 до 15 секунд. Но некоторые длятся больше минуты!
Когда я писал это, Лебедь предпочитал бегать по часовой стрелке примерно 60% времени, а 40% — против.
Наконец, количество пробежек в день: на данный момент это около 50, хотя и с некоторыми отклонениями. Его текущий рекорд — 118, который он установил в тот день, когда я включил автоматический дозатор лакомств. С тех пор кот немного остепенился.
Заключение
В целом, у меня довольно энергичный кот. Он не бенгал и не какая-то другая экзотическая порода, просто очень чёрный домашний кот.
Следующий проект в списке — автоматический дозатор лакомств, чтобы мотивировать кота на пробежки.