Мультитул для разработчика электроники

f64b6dc1af70552c639297d661f54f03.jpeg

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

Идея проста — заменить генераторы частоты, терминалы RS-485 и CAN одним самодостаточным прибором, этаким мультитулом для разработчика. В этой статье расскажу о том, что за девайс я собрал.

Предыдущие версии

Самой первой версией была макетка с двумя таймерами 555, которые управляли транзисторами (к питанию/к земле). Этой платой я периодически пользовался пол года, пока она не сломалась. Перемычки и переменные резисторы (на схеме нарисован постоянный) позволяли менять частоту ШИМ. Свои задачи плата выполняла, но это прям временное решение. Эта плата имитировала сигнал с генератора и датчик Холла. Существуют уже готовые подобные модули, но они мне не подходили по диапазону частот. 

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

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

Вторая попытка была на базе bluepill (STM32F103), содержала три транзистора, реле и RS-485. Наличие микроконтроллера позволяло точно задавать параметры работы ШИМ и производить опросы по RS-485, но для изменения параметров необходимо было перезаписывать код, а это не удобно. 

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

Версия 3

Версия 3

Техническое задание

Исходя из желаемого функционала и недостатков предыдущих попыток, я выписал все свои хотелки, которые реализую в следующем устройстве:

  • Два ШИМ с напряжением до 24 В, до 10 кГц. Питание будет осуществляться от внешних источников. Этими выводами я обычно проверяю работу счетчиков, механизмов захвата частоты и прочего

  • Два ШИМ с подтяжкой на землю (имитация концевых выключателей, датчиков Холла), до 10 кГц

  • Наличие RS-485. Должен быть реализован простой терминал, который позволяет отправить и принять сообщение с заданной скоростью

  • Аналогично для CAN

  • Возможность легко регулировать параметры ШИМ

  • Форм фактор планшета, сенсорный дисплей.

Определение конструкции

Почесав репу и выпив литр чая, я начал подбирать комплектующие. Для управления я решил использовать сенсорный 7 ми дюймовый дисплей DWIN (конкретно DMG80480C070_04WTC). Причина выбора — простота работы с ним: прошивка собирается в специальной программе от производителя, общение с микроконтроллером происходит по UART. Минимум временных затрат на получение результата.

Дисплей, который год ждал в шкафу своего звездного часа

Дисплей, который год ждал в шкафу своего звездного часа

В качестве транзисторов я решил использовать интеллектуальные ключи от infineon (BSP76E6433HUMA1 и BTS462T). Они имеют встроенные драйвер управления и защиты. С ключами из этой серии я уже успешно работал в другом проекте и мне они понравились. Единственный нюанс — нужна минимальная нагрузка, не получится подключить вывод просто к осциллографу и посмотреть, какой частоты ШИМ.

Над микроконтроллером долго думать тоже не пришлось. В прошлом году я опробовал серию STM32G0, которая мне очень понравилась, поэтому в этом приборе решил использовать камень побольше — STM32G4. Я давно хотел познакомится с этим семейством и пет-проект отлично подходит для этого.

Работать девайс будет от блока питания на 12В (LP-340). Часто использую такие в своих стационарных проектах.

Корпус под 3д печать.

Разработка печатной платы

Схема принципиальная

Схема принципиальная

Рассмотрим содержимое платы подробнее:

Преобразователь питания на базе SCM1301ATA от MORNSUN понижает входные 12В в 5В, которыми идут на дисплей. Далее 5В преобразуются в 3.3В с помощью LDO (LDK130M33R). На входе питания стоит самовосстанавливающийся предохранитель.

Интерфейсы связи представлены микросхемами ADM3485EARZ и MCP2551T-I/SN. К ним добавлены защитные диоды и терминальные резисторы.

Обвязку микроконтроллера я взял из «Getting started with STM32G4 Series». Вывод BOOT я повесил на pls, функционалом которого в итоге не пользовался. Сейчас он просто подтянут к GND. 

Дисплей к микроконтроллеру подключен через согласователь уровней 3.3В — 5В на базе 2х nmosfet и нескольких резисторов. Скорее всего, можно было обойтись и без них, но я решил перестраховаться.

Два ключа на питание и столько же на землю. 4 вывода banan на корпусе для выхода ШИМ и еще 2 (обозначены IN) для входа источника питания.

На схеме есть разъем для мигания светодиодами в случае активной передачи по CAN и RS485, но их почти не видно, так как все происходит слишком быстро, поэтому использовать эту часть я перестал.

Плата получилась размером 60×50 мм, что довольно много для такого небольшого количества компонентов. Габариты в основном обусловлены разъемами с трёх сторон. Планировалось, что одна сторона платы с клеммниками будет доступна для подключения снаружи устройства, а другие использоваться для внутренних соединений (дисплей, выводов banana и светодиодной индикации).

Корпус

То, на что я потратил больше всего времени — это корпус. Его я изготавливал методом fdm 3д печати. Моими принтерами были проверенный Ender 3 Pro, на котором я печатал шильдики, и Creality K1, на нем я печатал все основные элементы корпуса.

Скрытый текст

Ender 3 со мной уже лет 5–6, и из десятка станков, с которыми я работал, этот самый приятный в эксплуатации. Я установил на него Titan aero и skr mini, в итоге он обошелся мне в 20к суммарно. Второй принтер — creality K1, появился у меня недавно, это мой первый опыт общения с klipper и я всё ещё учусь с ним работать. Принтер очень быстрый, но как он будет себя вести в длительной эксплуатации — пока не знаю. Стоил он на распродаже всего 37к. Оба принтера не стал бы советовать новичкам, так как первый устарел, а второй сложный.

Изначально я хотел распечатать корпус из ABS, после зашлифовать и покрасить, но мелкие вытянутые элементы получались с трудом. Из PLA вышло лучше, чем из ABS или PETG, поэтому решил использовать его (PLA FDplast).

Лицевая панель

Лицевая панель

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

Раньше я всегда печатал прямоугольные коробки и первые варианты этого устройства были такими, но за прямые углы неудобно браться руками и само устройство выглядело так, как будто его вырубили топором, поэтому я добавил скруглений. Теперь он имеет большое количество сглаживаний и поверхностей под углом, что не очень правильно для печатной детали, так как усложняет процесс изготовления. Панели я печатал лицевой частью вверх, чтобы все изгибы поверхностей были без поддержек, пожертвовав качеством внутри. Дабы скрыть слоистость модели на наклонных граня, я выставил высоту слоя 0.12 мм для передней панели, а заднюю нарезал на стандартных 0.2 мм.   

Нарезка задней панели в слайсере. Поддержки (зеленые) при таком расположение детали занимают треть от объема всей печати.

Нарезка задней панели в слайсере. Поддержки (зеленые) при таком расположение детали занимают треть от объема всей печати.

Для удобства я добавил две ножки сзади корпуса, как на клавиатурах, что позволяет поставить «Луч» под углом в примерно 35 градусов. Изначально я делал одну большую ручку, как показано на картинке ниже, но она оказалась неудобной. К тому же, эта ножка съедала много пространства внутри корпуса и не обеспечивала надежной фиксации.

Quadratisch. Praktisch. Gut! с одной большой ножкой

Quadratisch. Praktisch. Gut! с одной большой ножкой

Итоговый вариант с двумя ножками

Итоговый вариант с двумя ножками

Для вывода контактов PWM и IN я использовал гнезда BANANA PL2493, которые я разместил наверху устройства. Держаться они за счет комплектных гаек и фиксатора резьбы. 

Панель banana

Панель banana

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

Тут я уже всерьез начал задумываться о приобретении двухэкструдерного принтера, который отлично подходит для таких задач. Краткое пояснение: это принтер, имеющий два независимых экструдера, позволяющие печатать деталь из двух разных пластиков. Самый простой пример — делать буквы другого цвета сразу внутри детали. (как например на панельках на терминалах для покупки билетов на электричку из Москвы). Но мой коллега предложил очевидную и рабочую идею — печатать не буквы, а вырезы под них, и это сработало.

Мои попытки в печать шильдиков. Сверху самые первые, внизу уже итоговые

Мои попытки в печать шильдиков. Сверху самые первые, внизу уже итоговые

Как изготовить такую панельку? Все просто, я чертил пластину толщиной 1.6 мм, в ней вырезал необходимые мне слова. После этого, во время нарезки модели в prusa slicer я находил первый слой, который должен печататься другим цветом, и ставил на нем маркер смены пластика, это кнопка »+» рядом с номером слоя. В других слайсерах эта функция тоже доступна.

Скрин из prusa slicer. После нажатия на кнопку программа автоматически красит две половинки модели в разные цвета

Скрин из prusa slicer. После нажатия на кнопку программа автоматически красит две половинки модели в разные цвета

С такой настройкой ставлю на печать, по окончанию первой половины модели принтер запросит смену пластика, после чего доделывает вторую часть. Easy!

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

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

Финальный корпус. Итоговые габариты - 202.5х117.4х35 мм

Финальный корпус. Итоговые габариты — 202.5×117.4×35 мм

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

Промежуточные варианты корпуса (большая часть)

Промежуточные варианты корпуса (большая часть)

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

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

Работа с дисплеем DWIN

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

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

Создавая новый проект в среде DGUS, необходимо выбрать разрешение дисплея, сгенерировать шрифт и загрузить заранее нарисованные в графическом редакторе фоновые изображения. Каждое изображение — отдельное рабочее поле. Заготовленные элементы уже должны иметь все необходимые поля и надписи. Конечно можно добавить их и в этой программе, но инструментов тут немного. Я подготовил 3 изображения с полями для ШИМ, CAN и RS-485 и две картинки с клавиатурами.

Первое окно - настройки режима работы ШИМ выводов

Первое окно — настройки режима работы ШИМ выводов

Создав проект с фоновыми изображениями, начинаем добавлять поверх рисунка интерфейс управления. На каждую нарисованную кнопку приходится два поля — первое поле отображает переменную (Data variables), а второе поле вызывает клавиатуру для ввода (Data Input).

Каждый элемент меню сохраняет свое значение в выделенной для него переменной, расположение и объем которой указывается пользователем. Адрес VP (0x) это место в памяти дисплея, куда будет записываться значение этого поля, для пользовательских переменных он начинается с 0×5000. Так же настройки позволяют задать минимальное и максимальное значение переменной и указывают на клавиатуру для ввода. Подробно про настройки можно прочитать тут.

Клавиатура это отдельное фоновое изображение (в моем случае 3 и 4). Напрямую попасть в эти области нельзя, но при нажатие поля «Data Input» клавиатура появляется на экране. Поле «Keyboard settings» как раз отвечает за то, откуда будет вызвана клавиатура и в какую часть экрана. Я использую две клавиатуры — для ввода цифр и текста. Первая используется для ШИМ и вводит числовое значение. Вторая же вводит символы от 0 до f. Так-же присутствуют кнопки выхода из клавиатуры и стирания предыдущего символа.

Клавиатуры

Клавиатуры

Для отображения введенного значения используется поле «Data variables», которое показывает содержимое указанного адреса. Это поле я ставлю поверх предыдущего, чтобы отображать значение внутри кнопки для ввода.

Первое окно дисплея с элементами интерфейса

Первое окно дисплея с элементами интерфейса

В правой части экрана, поверх Гаечки, находится кнопка перелистывания страницы. Они перелистываются только в одну сторону, что в случае всего трех страниц приемлемо.  

В DGUS есть функция «Data auto-uploading», включив которую, мы будем получать сообщение каждый раз, когда пользователь изменяет состояние ячейки памяти. Это позволяет нам не опрашивать дисплей постоянно, а просто ждать от него соответствующей команды, в которой будет указано, куда и что написал пользователь. 

Остальные страницы дисплея сделаны похожим образом, отличие только в том, что местами можно вводить текст (ввод в hex). 

Работа дисплея

Работа дисплея

В целом, разработка такой простой программы для DWIN не имела больших сложностей, но были нюансы, про которые надо упомянуть:

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

  2.  Очень раздражает пищалка. Ее можно отключить командой с контроллера, что я покажу далее

  3. Дисплею требуется время на включение, поэтому в начале работы прошивки stm32 стоит задержка на полторы секунды

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

Работа с микроконтроллером

Прошивку для STM32G4 я делал в STM32IDE, библиотека HAL. В проекте используется два UART, CAN, несколько таймеров и GPIO.

Полупустой контроллер ждет следующей версии проекта

Полупустой контроллер ждет следующей версии проекта

В первую очередь рассмотрим инициализацию дисплея, которая представляет из себя ожидание в 1.5 секунды и отправки команды отключения пищалки:  

void sound_off (void)
{
	uint8_t data_tx[10];
	data_tx[0] = FRAME_HEADER_H;
	data_tx[1] = FRAME_HEADER_L;
	data_tx[2] = 0x07;
	data_tx[3] = DWIN_WRITE_VAR;
	data_tx[4] = 0x00;
	data_tx[5] = 0x80;
	data_tx[6] = 0x5A;
	data_tx[7] = 0x00;
	data_tx[8] = 0x00;
	data_tx[9] = 0x30;
	HAL_UART_Transmit(&huart3, data_tx, 10, 0xFFF);
}

Глобально задача контроллера выглядит так — он получает команду по UART, после чего обрабатывает ее и делает что-то с ШИМ, RS-485 или CAN. Еще контроллер может получить сообщение по интерфейсам и должен будет отправить их дисплею. Получается, что задачи всего 3: получить сообщение по UART (дисплей), по RS-485 или по CAN.

Под эти три задачи я завел кольцевые буферы, каждый под свою задачу. Кольцевой буфер позволяет удобно обрабатывать полученные сообщения (хороший пример тут https://istarik.ru/blog/stm32/151.html). Сообщения в кольцевой буфер принимаются в соответствующих прерываниях.  

Основной цикл программы выглядит довольно просто — контроллер висит в ожидании какой-нибудь посылки:

while (1)
 {
	  if (byte_available(2) > 1)
		  receiveCAN();
	  if (byte_available(1) > 5)        // минимальная посылка 6 байт
		  analysisMessage();
	  if (byte_available(0) > 1)
		  receiveRS485();
}

Если приходит сообщения с дисплея, то его необходимо разобрать и вычленить из него полезную информацию. Передача от DWIN выглядит например так:   0×5A A5 06 83 50 24 01 01 90

Где байты номер:

  • 0,1 — стандартное начало сообщения от DWIN

  • 2 — количество байт

  • 3 — тип команды (0×82 — запись, 0×83 — чтение)

  • 4,5 — адрес VP (элемента дисплея), с которым происходит взаимодействие

  • 6 — количество адресов VPs (words) для чтения

  • 7… — данные

Если идет работа со строкой, то по окончанию будет еще два или три байта 0xFF.

Данная команда означает, что пользователь изменил переменную, записанную по адресу 0×5024 (частота PWM 4) на значение, равное 0×190. Все довольно просто.

Функция analysisMessage () разбирает полученное сообщения и переинициализирует необходимую периферию. Две остальные функции, receiveCAN и receiveRS485, переводят полученные снаружи устройства команды в символы и отправляют на дисплей в соответствующее поле.

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

Выводы

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

Первая реальная задача - проверяю, корректно ли записывается во FLASH захватываемая частота и время работы

Первая реальная задача — проверяю, корректно ли записывается во FLASH захватываемая частота и время работы

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

Дисплей DWIN и среда DGUS. Они позволяют действительно быстро создать интерфейс, удовлетворяющей меня сейчас, но как реализовать на нем новые хотелки — вопрос открытый. Терминалы необходимо переделать, чтобы они могли показывать поток приходящих сообщений, а не только самое последнее.

Проект вызывает огромное желание добавить в него всякого, например хочется сделать ряд PBS с цифровыми выводами и стандартными интерфейсами, типа SPI\I2C\UART. Еще мечтаю реализовать возможность задавать порядок действий, типа «отправь сообщение, подожди 5 секунд и включи ШИМ». Да и сохранение параметров работы на дисплее тоже бы не помешало добавить, вбивать каждый раз одну и ту же скорость RS-485 неудобно.

Очень надеюсь, что в следующем году смогу выложить сюда статью о новой версии своего прибора. Всем спасибо за внимание!

Репозиторий проекта: https://github.com/FamNuven/Ray

P.s. pcb файл платы выкладывать не стал, так как она с парой ошибок.

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

© Habrahabr.ru