Сегодня вечером завершил рисование принципиальной схемы и начал разводку печатной платы.
Схема:

Дальше )
Я решил уже выделить наработки по термомониторингу в отдельный проект. Там сейчас: простейшая прошивка для работы с двумя датчиками, даталоггер для нее, схема печатки под термодатчики для ЛУТа, зачатки схемы основных контроллеров и разведение ног в кубе.
На начальном этапе проектирования, кстати, этот куб очень удобен, т.к. наглядно видишь, что на каких ногах висит (а то было у меня уже, когда я на используемые USART'ом ноги пытался I2C вкорячить). Если бы этот куб еще код инициализации нормальный умел генерировать (а не ту бредопортянку, что делает), вообще сильно сократил бы начальный этап разработки. Зато он генерирует удобный отчет, который можно распечатать и иметь перед глазами наглядно все распределение периферии.
Сегодня я отлутил и спаял плату для второго термодатчика. Коллега на работе дал мне кусок стекла для чистоты эксперимента (все-таки, датчики к стеклу будут клеиться, правда, не совсем такому). Я приклеил датчики к стеклу, и стал копить статистику.

Дальше )
Таки дошли у меня наконец-то руки испробовать эти датчики в действии. Набросал код.
Сразу наткнулся на дурость проектирования: если после команды "начать измерение" произвести считывание, датчик вернет 0 вместо того, чтобы сказать NACK. И в дальнейшем тоже будет возвращать 0. Т.е. нужно выдерживать после считывания паузу где-то в 10мс. Поллинг невозможен. Ну, да ладно: буду поочередно всем датчикам грозди слать команду "считай", потом по прошествии 10мс после последней команды поочередно читать. Надо еще подумать, чем коммутировать I2C. Пока думаю это делать дешевым мультиплексором на 8 каналов (не знаю, правда, получится ли).
По ходу работы наткнулся еще и на то, что я отЛУТил платки, не проверив предварительно в кикаде правильность. И прозевал две перемычки! Как ни странно, один датчик работает нормально, невзирая на это (хотя закоротить на +3.3В ногу выбора режима I2C вместо SPI нужно обязательно). Второй шалит в SCL, похоже пытается все-таки SPI делать (или я его спалил, когда паял). Напаять блямбу из припоя не помогло (либо не припаялась она нормально — попробуй к такому корпусу что-нибудь подпаяй; надо даже неиспользуемые ноги выводить подальше дорожками).
На будущее надо заЛУТить и спаять еще хотя бы одну платку, чтобы можно было проанализировать, насколько точны показания датчиков. Плохо только, что измерение температуры при их помощи требует расчетов по полиномам, т.е. STM32F042 стопроцентно этого делать не сможет — придется в начале работы с сервера запрашивать калибровочные коэффициенты всех датчиков, запоминать их, а затем уже преобразовывать.
И еще одна бяка: STM32F042 наглухо блокирует I2C в случае обнаружения другого мастера на шине, спасает только переинициализация. Надо читать мануал, почему такая гадость происходит.
Потихоньку осваиваю F0, все-таки, надо будет разработать систему мониторинга температуры ГЗ БТА. Пока я не спаял платку для термометра, взял первый попавшийся в коробке девайс на I2C — датчик температуры/влажности HTU21-D. Я с ним, кстати, еще ни на STM32, ни на STM8 не работал.
Пару вечеров убил в обнимке с мануалом и даташитом. Позавчера скомпилялось, и я довольный пошел спать. Вчера была ночная экскурсия — не до этого, а сегодня решил прошить.
Делал, кстати, под STM32F030 — у меня две таких макетки и всякие дикие эксперименты стараюсь с ними проводить (хоть STM32F042 у меня с двукратным запасом, не хочется перепаивать на nucleo, когда флеш сдохнет). Прошиваю — и тишина в USART. И тут до меня доходит: у 20-ногого F030 PA9 и PA10 делят функции USART и I2C! Пришлось переделывать под STM32F042, и для начала научиться работать на нем с USART.
Потом решал проблему с зависанием на проверке while(!(I2C1->ISR & I2C_ISR_TXIS)), когда на линии нет ничего (даже подтягивающих резисторов). Оказалось, что в данном случае флаг не появляется вообще! Пришлось везде, где есть такие проверки, внедрить таймаут в 5мс. Ну, а потом я раскомментировал весь код и, как ни странно, все с первой же попытки завелось! Правда, я вместо умножения на 10 в вычислении влажности выполнил операцию деления. Но теперь все ОК, код на гитхабе.
В терминал 1 раз в секунду выдается то значение влажности, то температуры:
Temperature: 259/10 degrC
Humidity: 324/10 %

В комнате один термометр с гигрометром (тоже, наверное, на подобном чипе) и часы с термометром. Первый показывает 24°C и 37%, второй показывает 23°. Подогрев чипа по умолчанию отключен — похоже, либо саморазогрев у него такой, либо нагло врут в даташите про точность в 0.3°C!

Теперь надо будет спаять минимальную платку для TSYS01 и заняться им.
В рамках бодания с таймером на STM32F030 родил морзянку: фразы, пришедшие по USART1 (до '\n') выпискиваются в коде Морзе пищалкой, висящей на PA6 (TIM3CH1). Короткое видео паршивого качества.

STM32F030

Jan. 27th, 2017 02:06 am
Оказывается, STM32F030 значительно отличается от F042. Я-то думал, что у всей нулевой линейки общие черты одинаковы, ан нет: здесь несколько иная схема тактирования, нет HSI48 и еще кое-какие отличия.
Еще чуть текста )
P.S. так как было решено запустить в штатную эксплуатацию all-sky Sbig-340, я начал пилить утилиту для ее поддержки. К сожалению, в интернете негусто информации: в найденном описании протокола (она работает на RS-232 — уж большего извращения придумать невозможно!) отсутствует добрая половина команд (судя по информативному отклику на тупой перебор символов), там даже не было написано о команде включения подогрева стекла камеры (ее я нашел в чьей-то утилите, написанной на питоне).
Более подробно про это напишу, когда хотя бы до стадии альфа дойду (без демона, но с полным управлением). В бете уже будет демонизация и запуск в штатную эксплуатацию. В релиз можно будет добавить дебайеризацию (но ее можно и сторонними утилитами делать).
В попытке выяснить, кто же виноват, и что с этим делать, я собрал в кучу заголовочные файлы от ST с инициализацией от opencm3 и сделал "безбиблиотечную" среду.
Для проверки деления набросал «мыргалку», которая либо равномерно мигает диодом с периодом 4 секунды (если надета перемычка между землей и PA12), либо морзянит "SOS".
arm-none-eabi-gcc, собираемый кроссдевом в генте на этом примере обломался: как только я снимал перемычку, микроконтроллер уходил в глубокие раздумья.

Гугол подсказал мне, что эта проблема возникала далеко не у меня одного. И решения ее стандартным gcc просто нет! Но есть пропатченные тулчейны. Отсюда я скачал тулчейн, распаковал директорию в /opt и попробовал.
Теперь в директории arm-none-eabi/lib/thumb появились раздельные библиотеки для разных архитектур ARM. Вот эта строчка Makefile
LDLIBS		+= $(shell $(CC) $(CFLAGS) -print-libgcc-file-name)
позволяет слинковаться с правильной библиотекой (v6-m/libgcc.a). В итоге деление работает без проблем!

Жаль, что в генте так плохо с разработкой под микроконтроллеры!
сделаю свою среду под STM32F0. Возможно, со временем и под F1 запилю. USB, lwIP и прочих библиотек (правда, кроме файловых систем: я так и не нашел кодов простого модуля для работы с EXT2 или любой другой ФС, не имеющей дурацких ограничений vfat и в то же время не требующей десятка килобайт бинарника тупо для поддержки базовых операций) в интернете полно — за 2-3 вечера каждую, думаю, можно прилепить как-нибудь.
Для начала надо будет создать из ld-скриптов, болтающихся на просторах интернетов, и базового набора ST'шных "сниппетов" что-то рабочее. Как минимум — удалить ассемблерный startup-файл и system_stm32..., да подшаманить с ld-скриптами.

Надеюсь, вечера за 3-4 базовую надстройку слеплю.
Уже полдня бьюсь с АЦП через ПДП. На стадии вывода значений возникают непонятные зависания. Что только не делал. И вдруг: бамц, озарение! Если убрать математические операции (деление, умножение, взятие остатка), никакого зависания нет. А как только я пытаюсь отобразить значение, вылезает ошибка.

То ли микроконтроллер дохлый, то ли какая-то хитрость есть в том, чтобы STM32F042 научить целочисленной арифметике кроме сложения и вычитания...
Добавил в коллекцию еще один сниппет.
Казалось бы, в USART через DMA ничего особенного нет, но по сравнению с STM32F103 у нулевой серии есть замечательное прерывание USART: "character match".
В этом примере DMA организует прием-передачу данных (причем на прием стоит двойная буферизция), а прерывание character match позволяет определить, было ли окончание строки. Если было, то выставляется соответствующий флаг и буфера меняются местами; если же не было, то при переполнении буфера DMA прием возобновляется в тот же буфер и выставляется флаг overflow.
Принятая строка возвращается обратно "задом наперед", а каждые ~5 секунд выводится еще и надпись "dummy text". Например, если написать
Привет
Аргентина манит негра
1234567
на выходе получим:
тевирп
dummy text
арген тинам анитнегрА
dummy text
7654321
Потратив часть вечера на патч модуля ядра нетбука (вчера я сдуру думал вообще ядро обновить, но сегодня одумался и только ch341.ko пересобрал; странно, кстати, что этот патч тянется еще с третьего ядра, но даже в моем 4.4.21 его "из коробки" нет).
А потом руки таки дошли до STM32F042. Структуру репозитория я переделал, раскидав примеры по поддиректориям (в F0 лежат примеры для нулевой серии, в F1, соответственно, для F103). Сдуру забыл, что в гите нет удобной "ртутной" штучки под названием addremove, после коммита и пуша старые файлы остались. Пришлось делать
git add -A
и еще раз коммит и пуш.
Примерчик совсем простой: мигает зеленым светодиодом с частотой 4Гц или 1Гц (если установить перемычку между землей и ногой PA12). Дальше надо заняться ШИМом, I2C и UART. Очень жаль, что не разведен USB на платке. Придется колхозить на проводках.

P.S. Дропбокс, на котором я храню все эти вещи (для синхронизации между компьютерами) сдулся. Видимо, я переполнил доступный объем. Яндодиск тормозит жутчайшим образом, а гуглодрайв надо вручную синхронизировать. Но, что поделать — больше дропбоксоподобных вещей, но со значительно большим лимитом я не знаю.

P.P.S. В очередной раз подумал, что geany сильно не хватает плагина, позволяющего работать автодополнению по файлам, указанным в каком-нибудь конфиг-файле. Чтобы не нужно было 100500 файлов держать открытыми. Можно, конечно, свернуть подавляющее большинство нужных мне вещей из opencm3 в один файл, но он же будет совершенно нечитабельным!
Закончил железяку и оформил в коробочку из-под селедки. Вот такая штука получилась:

Дальше )
Попросили меня написать эмулятор сигналов от джиповского датчика коленвала (человек поменял мотор на тойотовский, теперь надо состыковать "мозги" джипа с двигателем, чтобы они таки считали, что двигатель работает). Написал под STM32. Так как частоты там небольшие, я не заморачивался с генерированием сигналов в режиме ШИМ+DMA, генерирую тупым ногодрыгом в прерываниях таймера. Сравнил осциллограмму с приведенными в интернете — вполне совпадает. Если будет нормально работать, следующим этапом будет сбор данных от тойотовского датчика (правда, там не Холл, а индуктивный — возможно, придется на входе еще операционник лепить).
Стал подбирать элементы, чтобы на макетке спаять минимальную обвязку (две кнопки, два светодиода и ключ на 2N7000, чтобы случайно порт мелкоконтроллера не спалить). Опять оказалось, что нужных резисторов у меня на работе нет. В обед дома надо будет захватить.
Сейчас погуглю, какие наиболее популярные номиналы стоит прикупить, да закажу на алиэкспрессе (0.65 баксов за 300 резисторов 0805, думаю, номиналов 10 прикуплю).
Сегодня у нас выходной (курбан-байрам), поэтому весь день я посвятил хронометру (таки в пятницу уже все должно работать "в бою"). Сопряжение с детектором лазера сделал на опторазвязке PC817C: для ограничения тока через светодиод воткнул килоомный резистор, коллектор фототранзистора подключил ко входу МК (нога подтянута к земле через внутренний резистор на 50кОм) и подтянул резистором 4.7кОм на +3.3В. Сейчас испытал (были подозрения, что резистор на 4.7к не вытянет до уровня лог.1). Все нормально сработало. Вот код на гитхабе.

Итак, теперь МК имеет пять каналов регистрации событий (все нормально подтянуты к земле через внутренние резисторы): событие0 — для кнопки (мало ли — хотя бы так зафиксировать, если вдруг лазеры не сработают), а события1..4 — для четырех каналов лазеров. В реальности будем использовать только 1 лазер на старте и 2 лазера на финише. Но можно было бы, скажем, разнести на некоторое расстояние лазеры на финише и измерять еще и скорость, с которой велосипедист пронесся на финише.

TODO: все-таки, надо бы как-нибудь довести эту фиговину до ума, чтобы она синхронизировалась СМС-ками. Но для этого надо автоматом отождествлять номер велосипедиста. Скажем, активной RFID-меткой, либо еще как-нибудь.
В попытках установки arm-none-eabi-gcc на ноутбук, которые постоянно заканчивались неудачами, я обнаружил, что бинарники таки откуда-то взялись (видимо, это был stage1 в crossdev, тогда зачем нужен stage2?).
Чтобы попытаться проверить, будет ли компиляться, я взял один из старых проектов и обнаружил, что у меня и opencm3 на ноутбуке нет.
ОК, скачал с гита и обнаружил, что там очень много нововведений (скажем, оно не собирается вообще, т.к. есть поддержка cortex-m7, а в arm-none-eabi-as этой архитектуры нет!).
ОК, подправил Makefile. Скомпилял. Запускаю make install и вижу, что фигвам! Нет такой цели (если что, раньше была).
ОК, копирую ручками. Запускаю make в своем проектике и вижу ошибки: кое-какие функции и глобальные переменные не определены. По-диагонали смотрю примеры и вижу: API довольно-таки сильно переломаны. Нежданчик, да. Обычно когда такое делают, автору отрывают руки, то называют как минимум по-новому (скажем, поломали gtk2, получили gtk3 — зато понятно, что этой дрянью пользоваться нельзя; аналогично с культями — когда из qt2 сначала qt3 запилили, а потом вообще в бешеный ужас превратили).

☹ Внес необходимые правки. Все скомпилилось, но бинарник аж на 2кБ больше стал (между 8кБ и 10кБ таки есть заметная разница, и обвинить в этом более свежую версию gcc вряд ли возможно).

☺ К счастью, на компьютере осталась старая версия opencm3, которая собралась, установилась по make install и скомпилировала мой проектик. И бинарник даже немного меньше получился. Конечно, рано еще радоваться: надо проверить, будет ли оно работать, но уже выводы можно сделать.

Выводы: пока использовать старую версию opencm3, но постараться послать далеко и надолго ее авторов. Либо делать что-то свое, либо искать что-то стабильное, где не будут ломать API!
Итак, повторение-матючение закончилось, и я написал простой интерфейс управления фотоаппаратом посредством STM32F103: код на гитхабе. Заодно обновил материалы здесь.
Рабочее место

Для выполнения минимальных действий нужно не так-то и много команд. Но сначала — как подключить объектив.
Продолжение )
Т.к. для подключения более приличного экранчика с параллельной шиной данных мне понадобится сравнительно шустро работать с GPIO, а у меня нет девборд с "жирными" STM32, где есть FSMC, нужно как-то имитировать эту самую FSMC. Я попробовал два способа: с таймером и с DMA (код поместил в репозиторий stm32samples, директории GPIO_TIM и DMA_GPIO).
немного кода )
Результаты неутешительные: хоть и есть режим GPIO под гордым названием GPIO_MODE_OUTPUT_50_MHZ, на деле все не так. Наибольшая скорость, которую я достиг с ПДП, составляла около 6.25МГц (т.к. у меня китайский клон Saleae Logick, ему я на таких скоростях не поверил, что, кстати, сделал правильно: брехал он изрядно, а посмотрел на осциллографе). У пинания портов GPIO в прерывании таймера по понятным причинам (обработчик прерывания длится дольше периода таймера) скорость еще меньше: не выше 1.1МГц.
Таким образом, передавать данные по параллельной шине с STM32F103 на скоростях выше 6МГц можно и не рассчитывать!
За вечер портировал библиотечку для работы с экранчиком на STM32 (код на гитхабе).

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

Подготовка


Дальше (+больше фото) )

July 2017

S M T W T F S
      1
23 4 5 6 78
9 101112 131415
16171819 202122
23242526272829
3031     

Syndicate

RSS Atom

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 20th, 2017 02:42 pm
Powered by Dreamwidth Studios