14 апреля 2025

Перестала вращаться боковая щётка пылесоса Iclebo Omega

 На прошлой неделе заметил что левая боковая щётка робота-пылесоса Iclebo Omega вся в пыли. Перед этим пылесос несколько раз останавливался с ошибкой C5 (перегрузка щёток), но визуально щётка ничем не была блокирована и после перезапуска уборка продолжалась. При очередном включении обратил внимание что левая щётка не вращается, но пылесос не выдаёт ошибку о перегрузке.

После разборки стало ясно что моторчик боковой щётки вышел из строя, т.к. при при подаче на него напряжения 3 В с лабораторного блока питания (перед этим его разъём нужно отключить от основной платы) он не вращался. Замер сопротивления обмоток мотора мультиметром показал обрыв.

На моторчике есть маркировка RC500-FN/18260A/DV, но поиск по интернет магазинам выдавал только похожие моторчики. На одном из форумов нашёл информацию что пылесос питает этот мотор напряжением 3 В.

10 апреля 2025

Как показывать версию прошивки из Git для PlatformIO

Пример показа версии прошивки из Git для PlatformIO.

В platformio.ini файл добавляем новый дефайн (в моём случае это BUILD_VERSION) а его значением делаем результат команды, которая выдаёт версию из Git

build_flags = !echo -DBUILD_VERSION='\"'$(git describe --always --tags)'\"'

В самом коде используем BUILD_VERSION в нужных местах

void scpiIdentify(SCPI_C commands, SCPI_P parameters, Stream& interface) {
    interface.print(F("Andrei Tataranovich,Power Monitor,,"));
    interface.println(BUILD_VERSION);
}

Пример ответа на команду SCPI *IDN?

*IDN?
Andrei Tataranovich,Power Monitor,,v0.2.0-1-g81a681a

Если суффикс слишком длинный, то его можно сократить добавив в команду git аргумент --abbrev=4


Вы можете следить за обновлениями блога с помощью Atom/RSS и Telegram.

05 апреля 2025

Тестирование измерителя ёмкости аккумуляторов

Очередная запись о проекте измерителя ёмкости аккумуляторов, который уже перерос свою изначальную функцию. В текущей прошивке есть режимы для ручного заряда и разряда аккумуляторов, режим монитора и управление с компьютера по протоколу SCPI (Standard Commands for Programmable Instruments).

После включения устройство переходит в режим главного меню

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

В настройках задаётся напряжение окончания разряда и по его достижении внешняя нагрузка будет отключена от аккумулятора. Этим режимом я пользуюсь когда нужно разрядить аккумуляторы для длительного хранения или измерить ёмкость аккумуляторов которые не подходят к Liitokala Lii-500.

27 марта 2025

Компенсация потерь на защите от обратной полярности

 Ранее я описывал схему защиты АЦП INA226 от обратной полярности которую я добавил в измеритель ёмкости аккумуляторов

Результатом стала погрешность измерений напряжения из-за падения напряжения на сопротивлении R1 при протекании через него тока. Этот ток складывается из обратных токов диода шоттки D1 и стабилитрона D2 а также тока через вход АЦП INA226 (он незначительный, но не равен нулю).

Если сравнить показания напряжения INA226 с показаниями точного мультиметра (в моём случае это Agilent U3402A с заявленной точностью по постоянному напряжению ± 0,012% + 5), то получается заметная погрешность

В первой колонке напряжение измеренное с помощью Agilent U3402A, во второй колонке - измерения напряжения INA226 и в третьей колонке - погрешность измерения если принять показания U3402A за эталон.

26 марта 2025

Очередное усыхание Docker Hub

 Всего через 5 дней (с 1 апреля 2025) Docker Hub вводит новые лимиты на скачивание образов. Изначально их планировали вводить с 1 марта 2025, но сдвинули на один месяц:

  • 10 скачиваний в час для неавторизованных пользователей
  • 100 скачиваний в час для авторизованных пользователей с бесплатным аккаунтом

Сейчас действуют такие лимиты (посмотреть их можно через Wayback Machine):

  • 100 скачиваний за 6 часов для неавторизованных пользователей
  • 200 скачиваний за 6 часов для  авторизованных пользователей с бесплатным аккаунтом

Количество скачиваний учитывает запросы к манифесту (/v2/*/manifests/*), для multi-arch образов будет два запроса вместо одного.

Образы которые участвуют в программах Docker Sponsored Open Source и Docker Verified Publisher не должны учитываться в этих лимитах.

Новых лимитов скорее всего не хватит чтобы даже мелкий kubernetes кластер пережил апгрейд нод. Если вы используете образы с DockerHub в своих окружениях, то стоит задуматься над использованием зеркал (например Amazon ECR Public Gallery) или загрузить нужные образы в локальный registry до того как это станет проблемой.

В GCP Cloud Build и GKE используется кеширование популярных образов Docker Hub через использование mirror.gcr.io:

Google Cloud services such as Cloud Build and Google Kubernetes Engine automatically check for cached images before attempting to pull an image from Docker Hub.


Вы можете следить за обновлениями блога с помощью Atom/RSS и Telegram.

Грабли при обновлении ingress-nginx до 1.12.1

Вчера срочно обновлял ingress-nginx до 1.12.1 (версия чарта 4.12.1) после новости о критической уязвимости CVE-2025-1974 и наступил на грабли - релиз обновился, но все существующие ingress'ы потеряли привязку к IP адресу балансировщика.

Полез смотреть events в кластере, но там ничего криминального не нашлось. В логах ingress-nginx контроллера присутствовали ошибки вида

E0325 12:26:36.275715       7 store.go:938] annotation group ConfigurationSnippet contains risky annotation based on ingress configuration

но сходу у меня не сложилась связь этих ошибок с отсутствием привязки к IP адресу. А вот когда попробовал пересоздать один из ingress'ов всё стало на свои места

Error: INSTALLATION FAILED: admission webhook "validate.nginx.ingress.kubernetes.io" denied the request: annotation group ConfigurationSnippet contains risky annotation based on ingress configuration

Во всех ингресах присутствовала аннотация nginx.ingress.kubernetes.io/configuration-snippet через которую делается тонкий тюнинг приложений и нет простого способа отказаться от использования этой опции.

25 марта 2025

Алгоритм подсчёта отданной ёмкости аккумулятора

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

Напряжение на аккумуляторе будет изменяться по мере разряда или заряда, а ток будет изменяться при разряде на резистивную нагрузку или по мере заряда аккумулятора.

В этом случае подойдет суммирование отдельных интервалов - график измерений тока и напряжения разбивается на промежутки:

  • ёмкость в ампер-часах будет Cah = I1 * t1 / 3600 + I2 * t2 / 3600 + ... + In * tn / 3600, где I1, I2, ..., In - измерения тока в конце каждого интервала и t1, t2, ..., tn - длина каждого интервала в секундах.
  • ёмкость в ватт-часах будет Cwh = I1 * t1 / 3600 * V1 + I2 * t2 / 3600 * V2 + ... + In * tn / 3600 * Vn, где I1, I2, ..., In - значения тока в амперах в конце каждого интервала и t1, t2, ..., tn - длина каждого интервала в секундах, а V1, V2, ..., Vn - значения напряжения в вольтах в конце каждого интервала.

Достоинства:

  • подходит для изменяющихся напряжения и тока.

Недостатки:

  • точность зависит от длины интервала t.
  • точность измерения ёмкости в ампер-часах снижается если напряжение изменилось внутри интервала.

Вы можете следить за обновлениями блога с помощью Atom/RSS и Telegram.