четверг, 17 апреля 2025 г.

Что внутри аккумулятора от китайского электроинструмента

В интернете часто ругают китайский электроинструмент, но его цена в разы отличается от именитых брендов вроде Bosch или Makita и не стоит ожидать от него аналогичного качества. Для эпизодического использования его надёжности вполне хватает.

Лично меня интересует вопрос безопасности его использования, а наиболее "слабым" элементом китайском электроинструменте является аккумулятор. В комплекте инструмента приложили два одинаковых аккумулятора на 21 В и 2 Ач.

Форма этого аккумулятора напоминает аккумуляторы от Makita. Далее будет разборка, тестирование ёмкости и некоторые выводы о его качестве.

понедельник, 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

суббота, 5 апреля 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.

Грабли при обновлении 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 через которую делается тонкий тюнинг приложений и нет простого способа отказаться от использования этой опции.