Vitaly
Продолжаем биться с калибратором

Как оказалось, корректно снять характеристику мотора (зависимость оборотов от напряжения) не так просто.

  • Те шумы скорости, которые пофик при реальной работе, в калибраторе довольно сильно мешают.
  • Определить что скорость стабилизировалась (перед началом измерений), тоже тот еще квест.

В общем, вместо того чтобы семимильными шагами писать калибровку ПИД-а, буксуем на предыдущем этапе.

  • Пока на тестовых данных сделали апроксимацию графика полиномом. С виду симпатично.
  • Думаем, как детектить что скорость выросла и перестала меняться.

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

Продолжаем изобретать калибровку ПИД-а

Как обычно, повылазили новые нюансы 😃. Рассказываю.

Во-первых, вычисление скорости переписали через свертку за период. Старый способ оказался шумноват для тонких вещей. Во-вторых, мы забыли компенсировать нелинейную характеристику мотора (это добавило проблем ПИД-у). Я залил на гитхаб новые файлы с реальными данными и графиками.

К счастью, снять характеристику мотора не сложно - просто плавнo наращиваем фазу триака и меряем скорость в 20 точках. Ну а потом интерполятором накладываем коррекцию.

Теперь по ПИД-у. Стандартные методы (через отклик на прямоугольный импульс) выдавали фигню, видимо из-за отсутствия коррекции. Надо будет проверить после доработки калибратора. Но есть план Б - имитировать ручную настройку, когда коэффициенты ПИД-а крутятся до возникновения автоколебаний.

Правда, есть вопрос, как обнаруживать автоколебания без сложной математики. Пока в голову пришел такой способ. Подаем на мотор напряжение без ПИД-а и вычисляем дисперсию скорости (стандартная сигма), чтобы определить порог шума. Потом включаем ПИД, и если дисперсия больше - значит начались автоколебания.

Еще надо понять время таких измерений (фактически период автоколебаний, который зависит от времени торможения мотора). Наверное пока просто забьем секунды три - должно хватить для всех моторов подобного типа, чтобы понять, есть автоколебания или нет. Никто ж не будет маховик на мотор ставить.

На неделе продолжим.

Еще немного математики по калибровке

github.com/speedcontrols/ac_sc_grinder/…/doc

Обновил подробности про калибровке параметров моторов. Сейчас калибруется все, кроме ПИД-а. С ним надеюсь что на неделе тоже закончим. А пока резюме по той практике, которая фигово вписывается в теорию.

Сопротивление и индуктивность мотора

Во-первых, когда мотор остановлен, можно легко насытить железки тестовым импульсом. В итоге мы подаем только 10% от полупериода синусоиды.

Во-вторых, вычисляемые R и L зависят от длины поданного импульса (смотрите по выложенным файлам с выборками). Сопротивление на минимальном импульсе в полтора раза больше чем на максимальном. Придумать правдоподобную модель сходу не получилось (одному аллаху известно, что там со щетками). В итоге просто используем результаты с 10% импульса.

Нормализация скорости

Значение скорости ОЧЕНЬ шумное.

  • Есть шумы в пределах одного периода. Давятся медианным фильтром длины 32. Увеличение до 64 картину особо не меняет.
  • Результат между разными периодами синусоиды тоже сильно скачет. Обычно это давит медленный ПИД и инерция мотора. Но при калибровке надо об этом позаботиться отдельно - собрать данные с разных периодов сети, и тоже взять медиану.

И еще, в прошлый раз я писал про управление триаком, когда ток запаздывает относительно напряжения. К измерялкам это относится в полном объеме - если на полной скорости прихватить данные с хвоста предыдущей полуволны, будет “пичалька”. Мы поступили очень просто - добавили проверку, чтобы измерялка игнорировала первые 25% синусоиды (1/2 полупериода). Обычно сдвиг фазы не больше 10%, так что решение вполне надежное.

Пока всё. Как пойдут дела с ПИД-ом даже загадывать не возьмусь. У верен что сделаем, но не знаю как именно. На практике обычно лезут такие нюансы, что любая фантази пассует 😃. Сначала выставим коэффициенты вручную, а потом будем смотреть, какие формулы дадут что-то похожее.

Еще раз про управление мотором через симистор

Как обычно, новые кровавые подробности 😃 . Сегодня отладили новый медианный фильтр, эмулятор EEPROM и стали ковырять калибраторы.

Выплыл досадный косяк в управлялке триаком. Изначально симистором рулили короткими импульсами (через оптрон), откладывая нужный кусок синусоиды. И все было бы хорошо, если бы нагрузкой была простая лампочка. Но там же ж блин моторчик, у которого смещен ток.

В итоге триак закрывается не когда напряжение падает до нуля, а позже. Поэтому на макимуме следующий импульс идет когда триак все еще не до конца закрылся, и на следующем полупериоде он тупо не открывается. Короче, внешне фигня выглядит так: на максимуме начинается фигня, и на минимуме мотор тоже не полностью стоит. Жопа.

Видимо надо убрать химию с испульсами на оптроне, и держать его открытым полностью до конца периода. В надежде что триак сам откоммутируется как ему потребно. Из потенциальных косяков - в диапазоне 95%-100% ручка будет выдавать максимум. Ну и минимум тоже сместится с 10% на 20%. Считать реальное отставание тока можно (чтобы убрать смещение), но IMHO ненужный гимор. Будем чинить по-быстрому. Уж очень хочется поскорее зарелизиться.

Сейчас в репе уже залит код калибраторов R/C и скорости. Так что еще небольшой рывок, и они оживут. Останется только написать калибратор ПИД-а, но напарник клялся что там все относительно прозрачно.

Регулятор, промежуточные итоги.

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

Жду когда доедут новые платы и понемногу готовлюсь к тому, чтобы прибить историю коммитов в репе (в отладочной ветке многовато мусора от творческих метаний).

На завтрашнюю отладку уже заготовлены новые куски кода:

  • Скользящий медианный фильтр (для считалки скорости). Помимо того что “это красиво”, позволит гарантировать отсутствие переполнений на не калиброванном девайсе.
  • Считалка сопротивления и индуктивности двигателя.

Вроде сюрпризов не ожидается, и останется только добить калибровку коэффициента масштабирования скорости и настройки ПИД-a.

Немного математики по AC-коллекторникам

github.com/speedcontrols/ac_sc_grinder

В папку с документацией добавились аналитические формулы и модели для scilab. К понедельнику дочистим код и можно будет переходить к автокалибровке. Обратите внимание, подобной инфы в понятном виде в интернетах нет. Люди лепят алгоритмы “по наитию” и с “магическими коэффициентами”, а такое прокатывает только до первой производной. Хотелось бы внести окончательную ясность по данному вопросу. И для себя лично, и чтобы следующие падаваны не собирали слухи из мутных источников, а юзали готовую и годную математику. С гарантированным результатом. В серьезном подходе ведь главное - не просто код слепить, а гарантии, что он будет работать должным образом.

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

Второй важный момент - мы предполагаем, что на подобных “мелких” моторах статор не входит в насыщение (для мощных коллекторников переменного тока все ровно наоборот, но там уже есть датчики оборотов и подобные регуляторы и не актуальны).

Итак, в папке с документацией у нас есть:

  • Формулы вычисления скорости.
  • Модели для scilab, где можно эти формулы покрутить и посмотреть ошибки.
  • Данные с реального девайса, и скорость, посчитанная по этим данным.

Нас конечно интересуют реальные данные. Тот кусок, когда ток начинает расти (симистор открылся) и пока напряжение не станет равно нулю (потому что отрицательное мы мерить не умеем).

Как видно по табличкам, мы живем не в идеальном шарообразном мире, поэтому исходные данные и производную тока знатно колбасит (обмотки же переключаются). Но если отбросить явную лажу и усреднить, то на практике работает. Наверное стоит туда воткнуть более формальный медианный фильтр, но руки пока не дошли.

Регуль, прогресс...

Прогресс пока в основном на макетке, но хорош. Комрад переписал формулу вычисления скорости, заменив стрёмную свертку на более полноценное выражение с производной. Сообщил, что теперь обороты держатся намного стабильнее во всем диапазоне (для одних и тех же коэффициентов ПИД-а). Был скользкий момент с насыщением магнитного потока (если поток не линейный, то формулы просто так не сократить), но, хвала всем богам, его либо нет, либо им можно пренебречь без последствий.

То есть теперь, чтобы определить скорость, достаточно двух соседних отсчетов (два - чтобы производную тока определить). Единственный нюанс - во время включения симистора производная слишком большая, и стоит игнорировать данные. Теперь осталось внимательно перепроверить на реальном моторе, вписываемся ли в нужную точность, и будем “отливать в граните”. Проверять надо на минимальной скорости, 3000rpm (~10% от макимума):

  • Сколько нужно выпилить отсчетов в начале (примерный критерий - пока производная тока не станет <= 0).
  • Сколько нужно выпилить отсчетов в конце (чтобы не делить на слишком маленький ток, который может вызвать погрешность).

Если после выпиливания головы и хвоста останется хотя бы пара рабочих отсчетов - значит все зашибись. Думаю, все будет пучком, т.к. макетка пашет.

После этого можно будет считать девайс рабочим при фиксированных коэффициентах конфига, и переходить к автокалибровке. Там колея уже накатанная, проблем не предвидится. А всякую техническую лабуду по запуску калибровки ручкой и эмуляцию eeprom через flash я уже написал.

На потом (после релиза) останется тема с ограничением мощности/тока, и попытка привернуть более дохлый процессор (Cortex-M0 без аппаратного деления). С практической точки зрения это нафик надо, просто хочется чисто для себя разобраться, если будет время.

"Клавиатура" для регулятора бормашинки

Ну что ж, регулятор с новой платой и прошивкой ожил, но надо уточнять математику. Если выставить ПИД на большой скорости, то там стоит как влитой, но на малых не хватает (просадка, потом восстановление за 2 сек). Если выставлять ПИД на малой скорости - то на малой держит железно, а на большой уже начинает дергаться.

Я не хочу пока фантазировать о причинах такого поведения, т.к. придерживаюсь простого принципа - если есть явно кривой код, то надо его сначала выпрямить, а потом разбираться с остальным. Потому что когда кривых мест несколько, то они накладываются, и разбираться в причинах - не рациональная трата времени. А исправлять еще есть что:

  • Грубовато сократили формулу вычисления скорости.
  • Есть накладки с точностью на математике с фиксированной точкой, и погрешность не поддается нормальной оценке.
  • Остались “магические константы” (зависят от параметров двигателя).

Что можно на эту тему предпринять?

  • Напарник пообещал за выходные еще раз расписать формулы в Scilab, чтобы быстро подставлять реальные значения тока/напряжения и оценивать погрешность.
  • Все-таки неплохо бы иметь автокалибровку - мерить сопротивление, индуктивность, коэффициент нормализации скорости, и подбирать коэффициенты ПИД-а.

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

Исправления в регуляторе

easyeda.com/speed/AC-speed-control-for-grinder

В прошлый раз писал, что в регуляторе концы с концами слегка не сошлись. Бывает. Для тех кто не занимается профессиональным проектированием приводов, ниже подробности. Возможно кому-то они будут полезны.

АЦП

Не учел импеданс цепочки, через которую меряется входная синусоида. В итоге измерялку слегка перекосило. Выпилил резистор между делителем и входом АЦП, не нужен он. Заодно, на всякий случай, поставил защитную сборку из диодов шодки. В основном от отрицательного напряжения, чтобы не юзать внутренние защитные диоды микросхемы (меньше шансов, что отрицательной напругой перекосит мультиплексор АЦП). Не уверен, что в такой защите есть смысл, но сборка копеечная, места почти не занимает.

Если делаете высокоомные делители и АЦП работает на максимальной частоте - загляните в datasheet, чтобы избежать сюрпризов. АЦП в микроконтроллерах очень хорошие, но все-таки не “идеальные шарообразные” с бесконечным импедансом.

Triac

Не знаю, что там временами прошибает, сам ключ или симистор оптрона, но мелкий снаббер решает проблему с периодическим открыванием на полный период. Обычно для расчета используют app note от Fairchild, но мне больше понравился Panasonic Application Note 030, Driving Triacs with Phototriacs. Очень просто и доходчиво. Хватило всего 1нФ, чтобы убрать косяки. Так что можно спокойно делать снаббер из smd компонентов.

Сам оптрон заменил с MOC3023 на MOC3052 - у него рабочее напряжение до 600 вольт. Ну и не забываем, что резисторы 0805 имеют рабочее напряжение 150 вольт (кратковременно до 300), поэтому их надо ставить по 2 штуки последовательно.

В принципе все эти правки можно сделать и на старой плате.

Zero cross detector

В софте считалась длина положительного и отрицательного полупериода независимо, поэтому поэтому из-за перекоса АЦП получался не симметричный результат, и симистор рулился криво. Надо считать положительную волну + полный период, а дальше вычислять коррекцию (полуразность положительной и отрицательной части). Хотя после исправления цепочки АЦП это не особо актуально. Сейчас разбег в пределах 1 тика (при частоте 17 килогерц).

Софт

Стыдно признаться, но софт по структуре стал больше похож на ардуину. То есть, когда в main делается бесконечный цикл с кучей логики. Вообще, так обычно пишут либо полные бакланы, либо профессионалы, которые очень хорошо понимают зачем они так поступают 😃. Надеюсь что тут второй случай 😃.

Я никогда не скрывал, что не люблю С и что текущий код делается “на скорую руку”, пока Rust не станет готов для эмбедов. Поэтому не стали втаскивать сюда RTOS ради одного единственного места с отправкой сообщений. Сделали по рабоче-крестьянски.

Раньше прерывания шли после каждого отсчета АЦП, и это было накладно. Теперь сделали иначе - прерывания идут после накопления 8 отсчетов, и дальше запускается обработка. То есть, АЦП тактирует и основную логику, вместо таймера. Не очень красиво, но для конкретного примитивного проекта сойдет. Кому интересно - в коде навалом комментариев с пояснениями.

По ресурсам нагрузка получилась около 50%, так что кроить с экономией питания особого смысла нет.

Что еще

Судя по чудесам с симистором, всё-таки стоит поставить фильтрующий конденсатор на сетевое питание. Только на плате для него с местом не очень. В оригинале конденсатор висит на мягких выводах над потенциометром. Наверное пока сделаю так же. Не буду рисовать на схеме, просто напишу в инструкции чтобы выпаяли со старой платы и припаяли к точкам, куда приходят провода питания.

Еще нашел на али плоские штыри и клеммы шириной 2.6мм (как на моторе), чтобы подключить через них питание. Если делать один регулятор, то проще припаять провода напрямую. А если пачку, и надо быстро переткнуть платы для проверки, то с разъемами удобнее. Все подробности добавил на гитхаб в инструкцию по сборке.

Посмотрели где что греется. Больше всего - микросхема сетевого стабилизатора. Ради интереса заменил LNK302DN на LNK306DN (обычно у более мощных микросхем ключи получше). Посмотрим, уменьшит это нагрев или нет. В любом случае, все сделано по спецификации, работать точно будет.

Еще на отладочный разъем добавил пины nRST и SWO. Это очень специфичная вещь, только для отладки. Но контакты ничего не стоят, и пусть лучше болтаются без дела, чем если для какого-то особо хитрого случая понадобится еще раз переделывать плату.

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

Сегодня знакомый обещал зафиксить измерялку тока (который из-за операционника никогда не падает ровно до нуля), и есть шансы что стабилизатор оборотов оживет. Там еще под вопросом ограничитель мощности, но он по большому счету нафик не нужен - делали больше для себя, чтобы понять как лепить составной ПИД. Возможно и правда вместо мощности лучше ток ограничивать - потом разберемся. Но в любом случае, регуль будет нормально работать и без этого блока.

Новости отладки регулятора скорости

Жизнь не перестает удивлять. Помимо всяких рабочих моментов в регуляторе вылезли вещи которые сложновато вообразить:

  • Симистор иногда сам открывается на весь полупериод. Хотя он понтовый 3Q snubberless (bta16-cwrg).
  • Прерывания ADC (после каждой выборки из 4 каналов), несмотря на передачу данных через DMA, съедают подозрительно много ресурсов. На остальное уже не хватает.

Это немного неожиданно, но не фатально. Будем лечить.

  • К симистору временно привернули снаббер (и он сразу заработал как надо). Дальше будем заменять управляющую опторазвязку MOC3023 на MOC3052. Натыкался в интернетах на такой странный рецепт.
  • Логику выборки из АЦП переделаем. Будем выгребать по DMA в цикле сразу 16х4 отсчетов, с прерыванием на середине и конце. А вместо таймера - поллинг внутри main (кривовато конечно, но в данных обстоятельствах приемлимо).

Победа всё ближе 😃

Регуль для бор-машинки: о фильтрации сигналов и т.п.

github.com/speedcontrols/ac_sc_grinder (точную ссылку на файл и строчки не даю, т.к. по окончании отладки будем чистить историю).

Практика показала, что сигнал на выходе АЦП имеет свойство прыгать, и поэтому есть смысл чистить резкие скачки. Делается это обычно медианным фильтром. К сожалению, мне не удалось найти готовых быстрых библиотек с учетом особенностей эмбедов, поэтому желающим советую смотреть тут (вариант от Ekstrom). Мне не очень понравилось, что над быстрой имплементацией надо “думать”, чтобы понять как она работает. Поэтому решил пойти другим путем - разобраться с truncated mean (или как его там). Кто забыл школьные лабораторки по физике, напомню:

  • Считаем дисперсию измерений (среднеквадратичное отклонение от среднего арифметического).
  • Отбрасываем все, что вылезло за пределы допустимого и усредняем еще раз.

У меня на глаз получилось что при 8 отсчетах и отклонении 1.1*sigma выходит вполне приличный результат. По затратам - 2 полных прохода по массиву данных (в данном случае - по кольцевому буферу). На первом проходе считается среднее арифметическое и дисперсия, на втором - отбрасывается лишнее и усредняется остаток. Итого:

  • Оптимизированное truncated mean чуть медленнее оптимизированной медианы (меньше чем в полтора раза), но код намного понятнее.
  • Есть “встроенный усреднятор”, который теоретически должен скакать меньше медианы. На самом деле не факт и вопрос филосовский.
  • Затраты на вычисления стабильные.
  • Если процессор с навороченными кешами - тут только чтение, запись вообще отсутствует.

Теперь про сами измерения. Есть нюансы с точностью измерения напряжения и тока, когда они переходят через ноль. С практической точки зрения, получилось так:

  • Симистор открывается слегка не симметрично на положительной и отрицательной полуволне. Надо мерять не только длину полуволны, но и длину полного периода, а потом смотреть расхождение и компенсировать разницу.
  • В новой схеме (в отличие от макетки) применили усилитель для токового шунта, а у него выход никогда не становится 0 (есть малюсенькое смещение, хоть операционник и специализированный). В коде напряжение можно сравнивать с 0, а ток - нет. Ну тоже примерно понятно как лечить.

Пока все. Победа близка 😃

Продолжение квеста с регулем бормашинки и PlatformIO

Переписали математику в регуле на фиксированную точку. В принципе неплохо вышло. “Сложных” делений осталось 3 штуки на итерацию. Это когда F16 (sign + 15 bits + 16 bits) делим на F16. Если надо делить на целое число - это обычное целочисленное деление. Умножение F16 на F16 и так быстрое. При условии, что процессор поддерживает аппаратное умножение и деление, операции с фиксированной точкой сводятся к ним довольно эффективно. Кому интересно - смотрите исходники github.com/PetteriAimonen/libfixmath. Еще надо было считать арккосинус, чтобы “линейно” откусывать “напряжение” от синусоиды, это просто забил в таблицу, сразу с нужным смещением и масштабом.

Проца на глаз жрется около 25-40%. Это при частоте квантования 40 килогерц. Есть подозрение, что частоты хряпнули с изрядным запасом, но кроить пока не хочется. Если будет настроение - попробую привернуть еще медианные фильтры к АЦП. Была еще мысль запустить всё это на совсем дохлом кристалле типа stm32f030c6t6 (он аж на пол бакса дешевле, гы), но видимо не судьба. Там нема аппаратного деления, а ковыряться с оптимизациями некогда - другие проекты ждут. Кому охота поупарываться из спортивного интереса - исходники открыты.

Дальше частично разобрались с выхлопом отладчика. Иногда при отладке хочется выводить сообщения. Лепить их в UART/USB конечно можно, но давно уже не модно. Сейчас все современные кристаллы имеют разухабистые отладочные интерфейсы, и выхлоп printf модные пацаны гонят по тому же шлангу, что шьют фирмварь. Всего вариантов есть 3:

  • через semihosting - медленный, но работает через самый дешевый stlink, по 4-проводному SWD.
  • через SWO - быстрый, но надо более аккуратно выбирать программатор (тоже дешевый), плюс требует дополнительный пин, который я продолбал из-за нехватки места
  • Через RTT (segger) - надо либо китайский J-Link с проприетарным софтом, либо ручками собирать openocd, т.к. патч с поддержкой еще не не приняли.

Пояснять все эти умные слова не буду, подробности есть в гугле.

В общем, на скорую руку прилепили semihosting. Он хоть с подвывертами, но пашет. А больше такой мелкой плате и не надо. Потом может еще проверим SWO и если получится - добавлю где-нибудь сбоку недостающие пины для любителей отладки. Флаги сборки в PlatformIO пришлось добавлять через питоновский скрипт, правда в нем всего 2 строчки.

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

Что отложили до лучших времен (некогда совсем):

  • Автокалибровку мотора.
  • Web Wizard для быстрой кастомизации параметров.

Тут все просто - модель бормашинки одна, можно константы забить. А с остальным как-нибудь потом разберемся, если реально будет надо.

Ныряем глубже в С на эмбедах. Общие впечатления.

github.com/speedcontrols/ac_sc_grinder

Закончили первый проход структурирования прошивки для регуля бормашинки. Всплыли новые подробности. Если писать на плавучке, то производительности не хватает. Ну не то чтобы кто-то надеялся, но при грамотном подходе с низкоуровневых оптимизаций никто не начинает. IMHO в долгосрочной перспективе гораздо важнее сначала сделать правильную архитектуру. В принципе можно было бы плюнуть, и поставить более дорогой stm32, но захотелось вспомнить детство и разобраться (с фиксированной точкой и т.п.).

Я как-то рассчитывал, что с PlatformIO быстро подключу нужные библиотеки и все будет хорошо. Ага, щаз…

  • Библиотеки с фиксированной точкой имеют левые привязки к фреймворкам, и просто не собираются.
  • В библиотеках эмуляции EEPROM куча левых define-ов, которые не переопределить.

Короче, возвращаемся к стандартному сишному аду, когда в проект копируются внешние исходники и что-то в них правится. Чуда не случилось.

Вообще я как-то привык, что качеством кода можно (и нужно) управлять. Например, я отношусь прошивке на С как к временному явлению (пока не готов rust), и не хочу глубоко нырять в освоение фреймворков. То есть, в проекте очень серьезно структурируется бизнес-логика (data flow), а самый нижний уровень лепится на скорую руку. Эдакий осознанный профессиональный говнокодинг. И тут выясняется, что с библиотеками (на нижнем уровне) до сих пор ад. Грустно.

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

Кстати, вот интересно, когда наличие FPU станет обязательным во всех микроконтроллерах. Мы уже пришли к тому, что 32-битный ARM с целочисленным умножением и делением - это нормально и совсем недорого. Еще бы плавучку, и можно было бы заниматься именно разработкой логики, не отвлекаясь на оптимизации.

Лет 20 назад я гордился тем, что умею оптимизировать код с учетом особенностей процессора. Со временем пришло понимание, что гордиться можно более интересными вещами 😃. Глупо тратить больше половины времени на то, чтобы держать в голове низкоуровневые оптимизации. Это когда проект один, можно с ним возиться до посинения всю жизнь. А когда их много, и надо везде успеть, то упарываться с низкоуровневыми оптимизациями не рационально. Тем более если за это никто не заплатит 😃.

Новости нодеки

dev.rcopen.com

Что готово:

  • Форум.
  • Диалоги (бывшая “личка”). Все переделано в современные чаты, лимиты убраны.
  • Блоги. Надо поправить огрехи в дизайне и cut-ы. В бложиках унифицирован внешний вид, категории переделаны в теги.
  • Клубы, аналогично блогам. Кроме того, у клубов теперь можно указать местоположение, но общую сводную карту пока не делали (чтобы искать ближайшие площадки).
  • Поиск.
  • Альбомы (бывшие аттачменты). Размеры фоток увеличены, лимиты пока убраны. Надеюсь лимиты не появятся, но я буду думать, как помешать заливать чужие картинки из интернетов (например, не дам постить аттачменты в некоторых темах курилки).
  • Профили, кроме просмотра опубликованного. Даты рождения при импорте специально похерены. Надо указать заново, и не обязательно точно (типа личные данные не собираем). Местоположение указывается на карте, чтобы текстом не писали всякую фигню. Текстовое название будет искаться автоматически (либо точное, либо примерно что рядом)

Что дальше:

  • Барахолка. Будет “новая вишневая”. Старая импортнется в архив, но объявления надо будет создать заново.
  • Статистика написанного, в профиле.

Уверенной черепахой летим к успеху 😃. Если мне не изменяет память, то где-то в феврале я сказал что с форумом покончили и остальные части будут клепаться быстро под копирку. Ну в принципе не соврал.

В разделе отзывов создал кучу тем (начинаются на “[nodeca feedback]”), замечания приветствуются.

Немного домашней пайки

Собрал платы со всякими новомодностями. Спустя хренову кучу лет с тех пор как забросил заниматься электроникой. Ниже фотки и впечатления.

Паста через трафарет наносится прикольно.

Стоит ли оно того (примерно +10$ к общей цене)? Фик знает. Если собирать несколько плат, то с трафаретами повеселее. Хотя у меня платы регулей двусторонние, на вторую сторону давил пасту из шприца, не переломился. С трафаретами есть нюанс - надо не жлобиться, вываливать побольше пасты и наносить все шпателем за один проход. Иначе на мелких микросхемах контуры расплывутся и будут перемычки. Я вот затупил, и в итоге все три микроконтроллера пришлось выправлять паяльником.

По расходу пасты. Были мысли, что неплохо бы собрать остатки после нанесения и засунуть обратно в шприц. Посчитал - не стоит лишняя возня тех денег. Даже если “не экономить”, высохнет все равно быстрее чем кончится. А если собирать несколько плат - перерасход на общем фоне совсем копеечный. Кто мало паяет - просто берите мелкую фасовку.

Трафареты почистил сразу. Просто протер салфеткой в изопропиловом спирте.

Далее. Кинул платы на термостолик и задул феном. Сомневаюсь, что делал правильно - выдержки не хватило долго и плавно феном размахивать. Так что, возможно все эти красоты дохлые, хе-хе.

Обратите внимание на микроконтроллер. Вагон перемычек. Даже странно, что эта беда обошла мелкий операционник в левом нижнем углу. Пришлось заливать флюсом и вычищать паяльником. Еще не разобрался, какими жалами что лучше делать, поэтому детали пропустим. А вот про флюсы скажу. У меня меня линейка отечественных CyberFlux - я знал что штука достойная, но теперь и на практике убедился.

Есть смысл проверить пайку на дефекты. Микросхемы с мелким шагом проще всего оказалось смотреть под микроскопом (самом голимом китайском, 10x), хотя раньше я топил за мобильник. К мобильнику надо нормальный штатив (не трипод за 2 бакса), чтобы ничего не тряслось. С этим я потом отдельно разберусь. Кроме микросхем есть смысл осмотреть по бокам резисторы и конденсаторы, там иногда образуются шарики припоя. В принципе ерунда, но я на всякий случай отковырял.

Дальше дискретные компоненты.

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

Да, тут пропустил один шаг - запайку деталей с обратной стороны. Пасту наносил шприцем (во-первых трафарета не было, во-вторых все равно плату нормально не закрепить). Дроссель и конденсатор паял тоже вручную. С конденсатором как-то долго провозился, наверное не разобрался с паяльником (температуру не калибровал, все равно через неделю более удобный приедет). Надо будет вникнуть - паять ли такой крупняк феном или ставить в корпусе под дырки, для нормальной пайки паяльником. Времени на эксперименты не было.

  • контроллер reflow-паялки. По мотивам uReflow (и при активном участии автора). Этим не знаю когда получится нормально заняться. Собрал за компанию, руку набить.

Насчет пайки крупняка (который в дырочки продевается). Пробовал всяко разно - и без флюса, когда припой флюсованный и подается прямо в место пайки, и сначала мазать флюсом а припой цеплять паяльником. Честно говоря, мне проще сначала флюсом намазать. Да и не те объемы, чтобы кроить.

Отмывка. Вообще у меня все флюсы безотмывочные. Но выплыл нюанс - они не твердеют и не сохнут. Платы липкие 😃. Особенно после того как обляпал микроконтроллеры. Пришлось отмывать. Тем более что платы для бормашинок планируется покрыть лаком, чтобы не перемкнуло какахенами, которые засасывает крыльчатка во время работы. Отмывал в мелкой УЗ мойке, жижей Solins FA+. Отмылось сурово, вместе с надписями на ручке резистора, подписями на TSP-05 и верхней крышкой предохранителя. Кому они очень дороги - имейте в виду.

Пока всё. Дело регуляторов движется 😃 . Медленнее чем хотелось бы, но первый скоро должен пойти в народ.

Шаблон для паяльной пасты

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

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

Выровнять шаблон вроде с десятой попытки получается. Готовлюсь к новым ощущениям - продавливанию пасты и чистке. Ну и запаяю конечно, с китайском столиком для подогрева. Там уже можно будет результат сфоткать нормально, в новом софтбоксе. Большую доску волохать было лень.

Погонял китайские термостолики. Всё печально.

Погонял 2 столика из трех, о которых писал раньше.

  • Есть заметный разброс между нагревателями и центром
  • Скорость остывания без вентиляторов ~ 0.1С/сек

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

Буду пытаться сделать на кассете из кварцевых ИК ламп - видел на ютюбе как подобную лихо обкладывают конструкционным профилем. Правда в темах про самопальные паяльные станции мне сказали, что у кассет кривые расстояния до отражателей, но выбирать не приходится. Сделать правильный конструктив с нуля точно не осилю, а дальше разберемся.

Специалисты по ТАУ есть?

Настало время приводить прошивку регуля бормашинки во вменяемое состояние. С красивыми блок-схемами, формулами и т.п. Без “магических коэффициентов”, которые так любят программисты от сохи. Начали бодро, но тут полезло…

Вот есть абстрактный регулятор скорости, который умеет мерять все что происходит в моторчике (обычном, не асинхроннике). Допустим, мы хотим просто стабилизировать обороты. Тут все просто - ставим ПИ(Д), заводим на него уставку, реальную скорость, и радуемся. Методики настройки стандартного ПИД-а известны и просты. Д-компоненту вообще херим, чтобы не заморачиваться.

Теперь, добавим “маленькое” условие - хочется ограничить максимальную потребляемую мощность, чтобы не спалить мотор. Вроде бы мелочь, и практически никогда не “используется”. Но при попытке построить схему регулятора выходит какой-то ад. Можно конечно поступить тупо в лоб - поставить 2 последовательных ПИД-а, но радости настройки это никому не прибавит. У нас ведь какая цель? Чтобы юзеру было легко. Если для защиты надо еще пару параметров крутить - это плохо, очень.

Хочется что-то простое, не требующее дополнительных усилий в настройке. Т.к. ограничение мощности работает с тем же режимом, что регулировка скорости (и с тем же мотором), то “на глаз” должны прокатить те же параметры ПИД-а. Дальше, по логике, простых вариантов два:

  • Используем один ПИД, но пытаемся завести на вход 2 сигнала через хитрый микшер
  • Используем 2 одинаковых пида, и коммутируем выходы как Min(out1, out2). Типа, кто больше ограничил скорость, тот и прав.

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

Кто-нибудь знает простое готовое решение? Ключевой момент - ПРОСТОЕ (не требующее отдельной ручной настройки для ограничения мощности).

Дешевые принтеры этикеток - Epson & Brother

Поговорим о принтерах, которые печатают на 12мм ленте термопереносом. Очень годная опция, подписывать коробочки и колбочки. Есть смысл рассматривать 2 варианта:

На мой взгляд, всякие рамочки и т.п. это полная хрень, и реально нужно только печатать 1-2 строки текста по середине ленты. Поэтому сразу привел 2 самые дешевые позиции из 2 самых популярных фирм. Цена 50-70$. С локализованной клавиатурой, что важно. Названия могут слегка плыть от года к году, но суть не меняется.

Что надо знать в общих чертах:

  • IMHO “независимый” девайс удобнее. Но есть и просто печатающие коробки к компьютеру. За пару лет эпизодического использования, желания печатать через компьютер у меня не возникло.
  • Нужна локализованная клавиатура. Поэтому покупать на алиэкспрессе не стоит. К тому же, заметной экономии не будет.
  • Работать от блока питания можно, но от батареек удобнее.
  • IMHO нет смысла брять всякие навороченные наборы с сумками и т.п. Я б ориентировался на то, чтобы оставить только сам принтер, заправленный батарейками, а остальное выкинуть - только место занимает и цену повышает.

Теперь пробежимся по конкретным девайсам. Brother PT-H105 у меня был довольно долго.

Плюсы:

  • Ну совсем дешевый.
  • Печатает шустро.

Минусы

  • Уродская раскладка клавиатуры. Особенно ощущается после компьютера.
  • Размер шрифта нормально не уменьшить. Только если в 2 строки.
  • Батарейки AAA (которые мельче пальчиковых, дохловатые).
  • Нет индикатора заряда батарей.
  • В комплекте только тестовая (укороченная) кассета. Хотя ее хватает прилично.
  • Нема подсветки.
  • Дисплей “однострочный”. Набивать две стороки можно, но не верх удобства

Теперь про Epson LW400. Завел недавно, когда в бразере засорилась пепельница закончилась кассета. Честно говоря, от нефик делать.

Плюсы:

  • Условно-нормальная раскладка клавиатуры.
  • Батарейки AA.
  • Индикатор заряда батарей.
  • Есть подсветка (можно выключить).
  • Дисплей “многострочный”, тексты с переводом строк достаточно наглядны.
  • Полная кассета в комплекте (по крайней мере, в моем).
  • Покомпактнее бразера.

Минусы

  • Подороже Brother.
  • Скорость печати ниже (вообще пофик, но раз заметил - написал).
  • Размер шрифта выставляется получше чем в Brother, однако надо заново выбирать, когда переключаетесь с 1 строки на 2 и обратно. Я реально не понимаю, почему нельзя просто сделать опцию “печатать мелким шрифтом”, бред какой-то.

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

Расходники (ленточки)

  • На али ~ 4 бакса с доставкой ePacket. Здесь от 10 баксов за аналогичный нонейм. Выбор за вами.
  • Одной полной кассеты хватит надолго. Больше 2 брать нет смысла.
  • Есть разноцветные ленты. Я сдуру закупил, наверное потому что дешево. Теперь вот не могу понять зачем.
  • Мне “повезло” и на желтой ленте для эпсона не было сзади насечки, чтобы легко отдирать подложку. Без насечки теоретически можно, но проще выкинуть. Больше нигде такого брака не было.

Короче, на местные расходники не ведитесь, если за это хотят дополнительных денег. Закажите потом 1-2 кассеты на али. Цветные смысла нет, только поиграться.

Вроде бы это все, что есть смысл знать о принтерах этикеток для домашнего применения 😃.

Еще раз о конструктиве самопальной reflow-паялки

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

Если вдруг захотите крупнее - найдёте сами, это намного проще. Столиков было много, но я выбирал только компактные, с правдоподобной термоизоляцией и низкой ценой (включая доставку). Заказал все три, проверю, отпишусь какой именно надо брать. Может даже получится нижний бокс целиком заменить пластиковым, сэкономив по высоте. В общем, надо девайсы в руках покрутить, и проверить как нагрев тянут.

Обратите внимание, в названиях столов часто пишут, что они для снятия экранов телефона. Не обращайте внимания, смотрите на мощность. 300 ватт 10х10см должно хватить на пайку, хоть и впритык.

Флюсы и припои для плат

Обнаружил чудесный канал про флюсы. Оказывается, для безотмывочных флюсов есть куча нюансов, когда тычешь паяльником (не выдерживаешь термопрофиль безконтактной пайки). Человек не поленился, замерил сопротивление на тестовых стендах. Ну и о припоях там немного есть. Жалко, что нет итоговых табличек сравнения (видео смотреть долго), но оно того стоит.

Если подводить итоги - китайские флюсы и припои относим в корзину, и покупаем отечественные CyberFlux или RusFlux. Ну и припой наш ПОС-61 (либо какой-нибудь немецкий Felder, если фасовка не нравится и цена не критична). Флюсы по деньгам не дороже китайских, но характеристики гарантированы и очень круты.

Чем заменить китайскую пасту в шприцах - пока не нашел. Допустим, перефасовать можно руками, а вот где брать мелкие количества - не понятно. На производстве уважают SMTservice, но там фасовка от пол кило. В розницу видел баночную Multicore, но фик знает как и сколько она в магазине лежала - сомневаюсь что в охладителе. В общем, пасту пока оставляю китайскую. Там флюс феном нормально прогревается, и особых сюрпризов по сопротивлению ждать не приходится. Для хобби сойдет.

PS. Мой новый заказ с исправленными платами и трафаретами уже выпустили с таможни. Примерно через неделю постараюсь написать, каково это юзать трафареты вручную.

PlatformIO + esp8266, для конфигурилки девайсов

github.com/speedcontrols/wifi-configurator

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

Есть некоторые сомнения в правильности кода, но я на сях уже давно не писец. Пока получилось сделать:

  • Captive portal
  • Раздачу вебни
  • Конфиг для настроек сети

Вполне достаточно, чтобы поковырять юзабельность. Честно говоря, создалось впечатление что синхронный вебсервер как-то спотыкается через раз, и лучше с него свалить на асинхронный. Правда тогда надо будет обкладывать UART блокировками, чтобы в него никто не ломанулся писать одновременно. Таким образом, из хвостов остаются:

  • Software UART и проброс команд в вебню и обратно (дефолтный UART отдан под логи, не факт что их реально вырубить полностью, да и не хочется без них).
  • Синхронный вебсервер => асинхронный, плюс блокировки UART.

В предыдущей записи я ляпнул про ручную установку clang для PlatformIO и похоже напутал. Шланг нужен только для разработчиков, если хотят нормальное автодополнение при наборе текстов. Если только прошивать - можно шланг не ставить.

Под вопросом - что делать с бинарниками фирмвари. В принципе, если тулза (PlatformIO) умеет и собирать и шить, то не вижу особых проблем. Версии в репе протегированы. Но другим может больше нравится, когда релизы лежат в отдельной папке с красивым названием - пока не понял, это реально полезно или старпёрские заморочки, на которые лучше забить.

PlatformIO - прикольно для кодинга под микроконтроллеры

platformio.org

Продолжим топить за разработку эмбедов. Мне понадобилось разобраться, на чем нынче делать код чтобы хорошо и удобно было всем. Основные претензии конечно к управлению c/c++ проектами, но и про юзеров тоже забывать нельзя - им надо как минимум залить прошивку в девайс.

Очень хотелось все делать на rust-е, но для эмбедов он будет окончательно готов только к осени, а ждать нельзя. Поэтому пришлось разбираться, что можно сколхозить на сях. Самым толковым кандидатом оказался “типа IDE” platform.io, который массово нахваливали в интернетах. Должен сказать, нахваливали не зря:

  • Оно есть под все платформы (Win / Mac / Linux).
  • Оно умеет сносно прописывать зависимости от внешних библиотек.
  • Оно умеет прошивать чипы и само детектит COM-порт программатора, что весьма приятно.
  • Есть готовые конфиги для тонны популярных железок, не критично но приятно.
  • Там еще какая-то разухабистая клюква для отладки, но не разбирался - особо не надо.

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

Мы сейчас с комрадом пытаемся облагородить черновик регуля бормашинки, и пока от platform.io впечатления положительные. Так что кому интересно - вполне стоит поковырять.

Downtime 30 часов

www.hetzner-status.de/en.html#8842 у хетцнера зафакапилось питание аж в 3 сараях. Ничо так, масштабненько. Тем не менее, 10 лет такой фигни не было, так что паниковать рано. Ящетайу, что проще раз в 10 лет извиниться, чем вкладывать тонны бабла в реплики и бегать между хостерами 😃.

Но бакапы конечно надо подкрутить, чтобы в другой датацентр уезжали. Я пока не понял, во что мне обойдутся “безлимитные аплоады” - какие объемы данных надо будет бакапить и как.

Кастинг программеров stm32 на Rust, в опенсорсы

Посоны, я не могу успеть везде, поэтому ищу желающих поучаствовать в современных и модных молодежных проектах - прошивках для регулятора скорости и reflow-паялки.

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

В общем, есть желание потренироваться на подопытных проектах, по мере возможности улучшить мир и приобрести бесценный опыт. Концепция такова:

  • Пишем на Rust, т.к. там есть нормальный пакетный менеджер и не потребуется забивать репозиторий тоннами внешних библиотек.
  • Rust дает гарантии статической безопасности, что очень круто для эмбедов. Не надо париться что где-то профукается указатель, освобождение памяти и т.п. Ну и вообще язык весьма хорош.
  • Возможно, надо будет доколбасить некоторые библиотеки (но основные типа HAL / RTOS для stm32 уже есть есть)
  • Всякую кастомизацию, типа генерации прошивок через веб я сделаю, отвлекаться не понадобится.

Сами железки, естественно, с меня. Могу еще попробовать подкинуть каких-то денег, но учтите, что меня в первую очередь интересуют те, кто хочет прокачивать свои скилы в современном программирование эмбедов, а не эксперты по скоростному говнокодингу. Проекты некоммерческие, делаются для души (как и все что я разрабатываю последние много лет). Поэтому делать хреново нет смысла. Контроль качества на мне, и делать плохо я просто не дам.

Кому интересно и время/опыт позволяет - пишите в личку, попробуем договорится.

PS. Про Rust можно поискать в гугле, а конкретно для эмбедов лучше всего поковырять трекер тут: https://github.com/rust-lang-nursery/embedded-wg.

This site will not work without javascript!
This site will not work if cookies are completely disabled.
Site is offline