[Перевод] Кот в колесе: как узнать, с какой скоростью и в какую сторону бегают котики

Да, это точно кот, а не большой чёрный хомяк. Оказывается, некоторые кошки тоже не прочь понаворачивать круги в колесе. Владелец кота по имени 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 может питать их напрямую.

На картинке ниже все части на своих местах. Если смотреть под этим углом, магниты проходят сенсоры с правой стороны. 

Программное обеспечение

Проект Arduino на GitHub 

Основной процесс довольно прост: инициируйте прерывание каждый раз, когда на одном из пинов датчика сигнал становится высоким, и запускайте функцию обновления. Функция обновления просматривает три последних показания:, а именно, порядок следования датчиков 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, который он установил в тот день, когда я включил автоматический дозатор лакомств. С тех пор кот немного остепенился.

Заключение

В целом, у меня довольно энергичный кот. Он не бенгал и не какая-то другая экзотическая порода, просто очень чёрный домашний кот.

Следующий проект в списке — автоматический дозатор лакомств, чтобы мотивировать кота на пробежки.

© Habrahabr.ru