eddy_em: (Default)
Хоть ардуина - редкостная дрянь, но благодаря ей появилась уйма приложений под андроид, позволяющих через bluetooth-uart модуль контролировать разную нагрузку. На спектакль понадобилось включать/выключать несколько групп "звезд". Вариант с кнопками я сразу отмел, т.к. неудобно в полной темноте их искать. А вот хорошо бы кому-нибудь, стоящему за сценой (или даже сидящему на балконе), при помощи андроидоприложения всем этим рулить. Погуглив, нашел "bluetooth control 8-lamp". Установил - внешне оно. Протокол элементарнейший.
Сначала подключил к bluetooth-модулю преобразователь UART<>USB на ch340g. Посмотрел в терминале - работает. ОК, полез на антресоль в поисках миниатюрной девборды. Нашлась такая - на 20-ногом STM8S103. Немного подергал старый сниппет 'blink', а потом довольно шустро у меня получилось вот это. Правда, таймер4 сходу не заработал (подозреваю, что его просто нет, а я в своем заголовочном файле это не учел), но лезть в даташит было лень, сделал мигалку набортным светодиодом на таймере1 (в принципе, эта мигалка и не нужна особо, но пусть мигает - показывает работоспособность). И еще было непонятно: вот это не заработало. Я уж и так, и эдак пробовал, но компактный доступ к разнородным ногам на массивах почему-то не получилось сделать (на STM32 подобное очень даже работает). Пришлось делать дикий case.
Теперь остается нарисовать схемку с транзисторами и понижайкой с 12 на 5В, развести плату для девборды и изготовить ее. А потом распаять светодиоды на длинных проводах… Думаю, группы по 5-6 белых светодиодов вполне ярко будут светить от 12В.
eddy_em: (Default)
У STM8S нет возможности настроить ногу Tx UART'а в режиме open-drain! А ведь натыкался на это уже года три назад (судя по хитрому коду для уймы передатчиков на одной шине).
Придется код править... (на всякий случай, конечно, можно еще и по Шоттки впилить.
P.S. Fixed! Код на гитхабе обновил.
eddy_em: (Default)
Протестировал управлялку униполярными двигателями (для реанимации SCORPIO), все работает нормально. Вот такой стенд:

позволяет проверить все необходимые вещи для одной платы. Завтра стенд расширю, чтобы можно было еще две платы подключить и отлаживать все в куче, а потом уже можно будет на SCORPIO это переносить, но сначала сделать еще одну штуку. Штука эта — для управления двигателя в левом нижнем углу фото: чтобы гарантированно не было пропусков шагов, я решил сварганить вот такой колхоз. На заднюю часть вала насадил 200-градационный диск оптического энкодера. Управление, наверное, на STM32F030 сделаю, здесь много ног не потребуется. А вообще, пора переходить с этого колхоза на нормальные моментные приводы: пусть многооборотный сервик "самостоятельно" свое положение и отслеживает!
Описание протокола )
eddy_em: (Default)
Вот этим массивом (весь код):
static const U8 usteps[8] = {0b1000, 0b1010, 0b0010, 0b0110, 0b0100, 0b0101, 0b0001, 0b1001};

как и раньше пытаюсь генерировать импульсы для движения униполярного шаговика (единичка поджимает соответствующую ногу дарлингтона к земле, и через данную обмотку идет ток). Крутится, но, зараза, делает 4 шага на каждый прогон массива.
Что за ядрена вошь? Раньше все ОК было. То ли лыжи не едут…
Уже вроде бы все нормально работает: и режим ускорения при старте (для съезда с фиксатора положения турели), и концевики как надо обрабатываются, и оба мотора независимо работают в пределах разумных скоростей... А вот надел на валы по муфточке, нарисовал маркером полосочку и...
eddy_em: (Default)
Сейчас на работе испытал, что там у меня с измерением тока. Алгоритм простой: АЦП непрерывно (на наименьшей скорости) молотит данные с ACS712 (185мВ/А, серединка на 2.5В, но по пути на диоде Шоттки оседает немножко + стоит RC-фильтр 4.7кОм/0.1мкФ), в течение нескольких периодов вычисляется минимальное и максимальное значение. Это и выводится по запросу.
Без нагрузки получается минимум около 500, максимум около 518, похоже, Шоттки надо выпаять, т.к. эта зараза работает как генератор. Не помню, вообще зачем я его туда впихнул (то ли думал МК питать от 3.3В..)!
Втыкаю лампочку 20Вт — фигвам! Вообще ноль реакции (хотя, с шумом в 20ADU обнаружить 3ADU сложновато).
Втыкаю кофейник на 700Вт. Максимум в районе 664ADU, минимум (WTF!!!) в районе 639. Как? Куда делась отрицательная полуволна (релюшка-то явно как диод работать не может)??? Постоянная времени RC-цепочки — в районе 0.5мс, т.е. в 40 раз меньше периода — так значительно повлиять на результаты измерений она не могла.
Если взять среднее значение, то получается ток около 3.6А, что не очень далеко от искомого (3.2А), но ведь амплитуда должна быть в корень из двух раз больше действующего значения!!!
Да и шум какой-то уж очень большой: RC-цепочки по идее должно хватать, чтобы в покое ничего не было.

Пошел выпаивать Шоттки и проверять еще раз.

UPD: выпаял Шоттки, с шумами без нагрузки ничего не изменилось!!! Вот же…
eddy_em: (Default)
Таки вымучил сегодня дома розетку! На первой плате, с которой и работал, были спалены обе опторазвязки, управляющих симисторами — вот ничего и не получалось. Со второй все намного лучше. Постоянка 12В через симистор включается, ток измеряется (правда, всего лишь 38ADU на 1А получается, на переменке это, понятно, будет получше: 38*2*sqrt(2)=107ADU). Целых 20ADU составляет размах ошибки. Надо было более грамотно разводить: измерять еще и напряжение на Vcap, тогда было бы значительно лучше.
Код и схема на гитхабе. В коде еще есть немного косяков, но базовый функционал и так работает.
eddy_em: (Default)
Для этой операции, необходимой довольно-таки часто (особенно для микроконтроллеров: скажем, мелкую картинку во флеш записать или кусочек звукового файла), обычно пишутся велосипеды вроде такого:
hexdump -e '20/1 "0x%02x, " "\n"' testbin
0x0d, 0x19, 0x32, 0x44, 0xc9, 0xc9, 0xc9, 0x92, 0x24, 0x3b, 0x3b, 0x3b, 0x45, 0x46, 0x46, 0x6a, 0xc4, 0x88, 0x11, 0x84,
....

потом это ручками правится и все здорово.
Однако, наткнулся на SO на замечательный совет: использовать vim (точнее, утилиту, идущую с ним):дальше )
eddy_em: (Default)
Эту неделю я еще в отпуске, поэтому на работу хожу вяло: по 6-7 часов в день. Сегодня мне в мастерских выдали уже почти готовый корпус фотометра для Z-1000, с полчаса я убил, отмывая его от грязи и машинного масла. Пока деталей не хватает, поэтому разместить внутренние элементы не могу еще, но уже можно прикинуть, как подрезать валы, и отдать их в мастерские. Чертежи всех внутренних элементов я сегодня отнес, глядишь, недели за 2-3 сделают (если, конечно, материала хватит; у нас в мастерских просто беда с дюралью: остались буквально обрезки!).
А за выходные я сделал еще 8 печатных плат (к четырем, изготовыленным до отъезда в Абхазию) для управления двумя униполярными шаговыми двигателями:

Дальше )
eddy_em: (Default)
Сегодня утром я добил прошивку платформы (обновлю на гитхабе позже, лень мне в эти выходные на работу идти, тем более после экскурсий на БТА). И оно таки заработало!
Час назад, когда я еще проводил последнюю экскурсию, прибор привезли вешать на БТА.
Вот в таком хаосе всю последнюю неделю находилось мое рабочее место:

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

Дальше )
eddy_em: (Костерок)
Я еще где-то в июне подготовил код софтового I2C, но только вчера вечером руки дошли протестировать на железе. С таймингами я, конечно, намучился, а еще хуже было с порядком изменения состояния ног SDA и SCL (т.к. между последовательными сменами состояния возникали интервалы до 0.5мкс — все-таки, у меня еще и прерывания разные работают, то иногда получалось так, что в конце переданного байта "самопроизвольно" возникал STOP).
Но вроде бы со всем разобрался, выложил код на примере работы с SI7005. Кстати, заметил неплохую "очепятку": почему-то я везде humidity называл pressure (то ли забыл, что датчик не давление, а влажность измеряет, то ли с другим его поначалу перепутал). В этом коде все исправлено: команда 'H' запускает измерение влажности (результат выводится в виде H*10), а команда 'T' измеряет температуру (результат выводится в виде T*100).

Теперь при желании можно на основе "вольтметра" на STM8S003 сделать термометр-гигрометр.
eddy_em: (Костерок)
Наконец-то добил я аппаратный I2C на STM8: мало того, что из ERRATA несколько "патчей" внести пришлось, так еще и кое-какие косяки свои исправить. Еще я долго бился, пытаясь понять, почему у меня ожидание кое-каких флагов отваливается. Оказывается, sdcc до gcc еще расти и расти: если аргумент макроса не окружить скобками, то он превращается в пустоту...
Вот код на гитхабе, на сосфорже, соответственно, тоже зеркало лежит.

Т.к. поверенных барометров и термометров у меня при себе нет, протестировать качество показаний этого датчика не по чем.
eddy_em: (Костерок)
Сейчас закончил преобразование "термометра", позволяющего подключить до 14 DS18x20 к трехразрядному китайскому "вольтметру" на STM8. Код можно посмотреть здесь.
Переделка совсем несложная (выпаиваются несколько деталюшек, а один резистор перепаивается с одного места в другое, если под рукой нет 0603 на 4.7кОм — с 10-килоомным при коротких проводах все тоже вполне работает):
15.04.23_22:01:26
Схемка переделки

Чуть текста )
eddy_em: (Костерок)
(написал бы вчера, но почти двое суток интернета не было в поселке)

Потихоньку мои сниппеты для STM8 разрастаются. Чтобы переделать "вольтметр" в термометр на 1-wire (кстати, можно и простое термореле сделать на трехсимвольном "вольтметре" — у него свободных ног достаточно),понадобилась поддержка 1-wire. Все, что в интернете находил, было реализовано совершенно некрасиво: ногодрыгом с жуткими задержками (по сути, операция опроса термодатчика везде делалась блокирующей, что не очень хорошо для таких вещей, как динамическая индикация, опрос клавиатуры и т.п.).
Я сделал на таймере: у трехсимвольного "вольтметра" как раз второй канал compare/capture таймера TIM2 используется как аналоговый вход для измеряемого напряжения, т.е. модифицировать будет проще всего. И Вот, что получилось. Пока что код непричесанный, содержит много отладочной информации + не до конца допиленный.

Что уже реализовано:
  • опрос одного-единственного датчика с командой Skip ROM,

  • вывод температуры в тысячных долях °C,

  • сохранение ROM-кода подключенного датчика в EEPROM (т.к. я рассчитывал на STM8S003, то, несмотря на то, что у 105-го, на котором я тренируюсь, 1кБ EEPROM, датчиков максимум 14, т.к. у 003-го всего лишь 128Б),

  • поочередный опрос всех датчиков с сохраненным ROM и выдача температуры.

Что еще нужно реализовать (UPD 08.04):
  • убрать тысячные (т.к. точность DS18 ниже плинтуса, там даже округление до целых градусов — многовато, по-хорошему, надо в сторону ближайшей тройки, а то и четверки округлять), (сделано), теперь по крайней мере не так в глаза бросается; вот, например, для "устаканившихся" трех B20 и одного (четвертого) S20: 23.6, 23.5, 23.4, 23.5. А то и вообще: 23.6, 23.6, 23.4, 24.0...

  • добавить возможность удаления ROM несуществующих датчиков, (сделано)

  • перенести весь код на "вольтметр".


Потом еще хочу с DHT11/DHT22 научиться работать. Но у них совсем все уныло, т.к. только 1 датчик на линию можно вешать. Да и точность там ну совсем жуткая, даже DS18 фору даст!

А еще надо бы закончить с реализацией аппаратного 1-wire (через таймер с DMA) на STM32.
eddy_em: (Костерок)
Сегодня утром написал вольтметр на 4 разряда:
код на сосфорже, схема.

Алгоритм элементарный: раз в миллисекунду обновляется очередная цифра на экране индикатора + заносится очередное значение, полученное АЦП, в буфер из девяти чисел. Как только буфер заполняется, вычисляется медиана (18 операций сравнения/перестановки) и прибавляется к значению U (инкрементируя соответствующий счетчик). Один раз в 300мс происходит обновление измеренного значения: U усредняется, умножается на 3300 (3.3В — амплитуда питания, 10 — коэффициент делителя, 100 — т.к. напряжение в сотых долях Вольта считается) и сдвигается вправо на 10 разрядов (т.к. АЦП 10битный). Измерение на тестовом источнике 5/12В показало, что вполне нормально данные согласуются с измерением на обычном вольтметре (с точностью до LSB, равного 0.03В).
eddy_em: (Костерок)
Этим "ночером" я срисовал схемы еще двух вольтметров:
3digit_voltmeter
Трехсимвольный

4digit_voltmeter
Четырехсимвольный

Дальше )
eddy_em: (Костерок)
На "казусе" попросили снять протоколы. Снял.
Снимаю данные по I2C
Вот так это происходило


Китая мать! )

UPD:
К сожалению, чип оказался залоченным от чтения. Но и почему-то не получилось ничего вместо существующей прошивки записать. На "казусе" посоветовали на Vcap припаять микрофарадный кондей. Попробую. Но, боюсь, что не поможет: есть подозрение, что китайцы научились делать одноразовые STM8S003.
eddy_em: (Костерок)
Вчера я занимался "реверсом" пятизначного вольтметра (buyincoins), (ebay). Конечно, я так и не понял, зачем китайцы запихнули туда 5 знаков, если он и 4 вряд ли сможет точно во всем диапазоне (0..30В), но захотелось для него прошивку написать.
Реверсинг 5-значного вольтметра; тест на 12В
Вот и сам вольтметр, тест на 12В

Проведенный на кухне вечер дал плоды: я нарисовал в кикаде схему, а также определился с логикой работы. Остается "всего лишь" написать прошивку. Результаты — в репозитории stm8samples на сосфорже и гитхабе. Под катом — файл README с некоторыми пояснениями.
Схема вольтметра

README )
eddy_em: (Костерок)
Я решил вечерком сделать очередное приближение к своему сверлильному микростаночку для печатных плат: поуправлять шаговым двигателем от старого оптического привода. Для этого использовался пришедший сегодня с ибея двойной H-мост на L9110s (еще я купил десяток этих мостов, чтобы всю систему управления станочком спаять) и давно уже купленная (покупал по-дешевке у китайца, который только-только раскручивался, сейчас уже у него цены такие же, как у всех) макетка на STM8S105.

Фото + видео )

June 2025

S M T W T F S
123 4567
891011121314
15161718192021
22232425262728
2930     

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 10th, 2025 11:44 am
Powered by Dreamwidth Studios