Симптомы: · 3D-принтер перестал понимать, когда у него выходной · слово «финальная версия» потеряло смысл · девушка на пвз угощает чаем как родного
Назначено лечение: Закончить хотя бы один прототип.
Пациент: Начал переделывать предыдущий.
═══════════════════════
🤖 Всем лимонов! 🍋🍋🍋 После первой части многие спрашивали, где же сам робот. Один из комментариев вообще был прекрасен:
«А части-то зачем? Хоть прототип покажи.»
Ну что ж... сами напросились. 😄
Сегодня будет то, что обычно остаётся за кадром. Те самые фотографии, которые сначала хочется удалить, а спустя время понимаешь — именно с них всё и началось.
Если сейчас Кубобот выглядит примерно вот так...
Кубобот01 Аккумуляторный
...то первые прототипы были вовсе без корпуса. А первые корпуса были похожи на нечто странное и бесформенное (у самого первого было сплошное лицо с вырезом больше экрана). ____________________________________________ После первой эйфории наступил момент, когда идею пришлось превратить во что-то, что можно взять в руки.
В голове всё выглядело предельно просто. Маленький корпус, экран, плата... Ну что тут может пойти не так?
Как выяснилось позже — примерно всё.
Определившись с наполнением кубобота, и кое как написав код который просто моргает глазками, я сел моделировать корпус. Выбрал для себя минимальный размер под OLED 0.96" дисплей - 31мм по внешним стенкам. До этого мне казалось, что куб — одна из самых простых геометрических фигур. Оказалось, это мнение существует ровно до тех пор, пока не пытаешься запихнуть внутрь экран, плату, разъём USB, датчики, провода и при этом сделать так, чтобы крышка ещё и закрывалась.
Первый напечатанный вариант выглядел... оптимистично. На экране компьютера он казался аккуратным и современным. В руках же напоминал что-то среднее между корпусом сигнализации и экспериментом начинающего моделиста.
Но зато он был настоящий.
И это ощущение сложно описать. То, что ещё неделю назад существовало только в голове, вдруг оказалось у тебя на ладони. Начиная многие проекты, которые не уходили дальше бредборда, держать маленький кубик, который моргает было поистине победой.
Пусть кривоватое.
Пусть с щелями и неровной печатью.
Зато своё. Это действительно греет мне душу по сей день. ___________________________________ Дальше началась самая настоящая война за миллиметры.
Каждый новый корпус был почти идеальным. Почти.
То экран выпирал на миллиметр так что не прилегала лицевая пластина. То плата неожиданно упиралась в стенку. То USB-разъём оказывался настолько глубоко, что подключить кабель можно было разве что пинцетом.
Самое смешное, что после каждой такой доработки внутренний инженер уверенно говорил:
— Ну вот теперь точно всё.
Через пару часов начиналась печать следующей «финальной версии».
три первых корпуса. самый нижний с fuzzy skin
В какой-то момент рабочий стол перестал быть рабочим столом и превратился в археологические раскопки электроники. Тут лежит дисплей, там какие-то винтики, рядом катушка пластика, а где-то под этим всем, если очень повезёт, можно было найти компьютерную мышку. Уже позже выделил под свои изыскания отдельный стол.
Когда корпус наконец перестал разваливаться от одного взгляда, настало время оживить робота.
Я собрал навесным монтажом все внутренности и впервые подал напряжение.
Казалось бы, два светящихся прямоугольника. Что в них особенного?
Но кубобот уже смотрел на меня, как будто осознавая себя в этом мире. С немым вопросом почему он голый и висит на крокодиле для пайки
Именно тогда впервые поймал себя на мысли, что делаю уже не просто электронное устройство.
Я делаю маленького друга.
Затем уже ценой больших усилий смог укомплектовать это всё в небольшой кубик со стороной в 31мм. Не самое лучшее расположение компонентов, но на то он и прототип чтобы быть невзрачным, но рабочим.
Потом были эксперименты с цветами корпусов.
Честно говоря, я не знаю зачем вообще это делал, не имея готового продукта. Просто взял у сына мотки его PLA пластика для 3д ручки и напечатал несколько тестовых корпусов.
Зато стало ясно, что Кубобот совсем по-разному воспринимается в разных цветах. Один выглядит как серьёзный гаджет, другой — как игрушка, третий вообще словно просится кому-нибудь в подарок.
Знаете, что меня удивило больше всего?
Я был уверен, что основная сложность окажется в электронике. Или в программировании.
Но больше всего времени неожиданно съел именно корпус.
Снаружи кажется, будто это просто маленький пластиковый кубик.
А внутри каждый миллиметр приходится буквально отвоёвывать. Внешне корпуса не отличались ничем. Зато внутри постоянно были изменения в расположении элементов для расположения платы и прочей требухи.
Именно тогда я понял простую вещь: самые незаметные детали обычно требуют больше всего времени.
Сейчас я иногда специально открываю фотографии первых прототипов.
Не чтобы посмеяться.
Хотя... иногда и чтобы посмеяться тоже.
Скорее чтобы напомнить себе одну простую мысль.
Любой проект, который в итоге выглядит аккуратно, когда-то выглядел так, что показывать его людям было немного неловко.
И знаете что?
Наверное, это совершенно нормально. В следующей части расскажу больше о тонкостях программной части, о дальнейшем развитии и расширении линейки. Которе, само собой, привели с собой новые трудности. И всё это ради того, чтобы два маленьких голубых квадрата начали казаться чуть более живыми.
А как думаете вы? Что оказалось самым сложным в разработке?
Что получится, если скрестить Warhammer, Arduino, и старый принтер.
Что, Зачем и Почему?
Для ЛЛ:
Самодельный механизм в стилистике Warhammer 40 000, задача которого перекладывать листы в обратном порядке и вести подсчёт. Нужен для любительской типографии.
У User10939331 есть хобби - изготовление книг. Для переплёта уже давно изготовлены самодельные машины, но сегодня речь не про них.
1/2
Речь о старом техпроцессе, который хотелось вернуть к жизни.
Итак, поехали:
С тех времён, когда типографское хобби у меня только начиналось, осталось несколько старых принтеров, которые были великолепны во всех отношениях: простота, неубиваемость, отсутствие чипов, лёгкость обслуживания и ничтожная стоимость тонера.
Это LaserJet-ы 10xx серии.
Но пара существенных недостатков, стала в итоге причиной постепенного перехода на более профессиональный класс техники - отсутствие двухсторонней печати, и необходимость вручную перекладывать в обратном порядке стопку листов для печати на задней стороне.
Да, существует возможность менять очерёдность печати программно, но она вечно приводила к путанице, особенно при большом количестве тетрадей. К тому же, редко, да метко, принтеры захватывали два листа одновременно, из-за чего вся партия распечаток отправлялась в шреддер.
Внезапное вдохновение подсказало мысль, сделать устройство, избавляющее от необходимости переслюнявливать пачки распечаток, и ведущее подсчёт листов в стопках.
В очередной раз услышав от жены коронную фразу:
В голове что-то щёлкнуло, и мозаика сложилась.
Преисполнившись вдохновением, для начала оформил проект на бумаге, стараясь по возможности придерживаться как нормативов единой системы конструкторской документации, так и стилистики Warhammer 40000 в оформлении текста.
Если уже борщить - то на полную катушку.
Документация в общем виде
Отдельно составил реестр всех контактных соединений, цветовой маркировки, таблицы выходных состояний, и распечатал программный код с комментариями. Если когда-нибудь придётся возвращаться к проекту для ремонта или модификации, то деменция уже не станет помехой.
1/5
Схемотехнический справочник со словарём терминов
Базовый конструктив построен на фундаменте Ардуинки, оптическом сенсоре, и паре реле, коммутирующих полярность питания 12в электромотора.
1/3
Конструкторская документация.
Матёрые радиолюбители могут справедливо упрекнуть, что такую задачу любой пионер мог реализовать на несимметричном мультивибраторе, из пары транзисторов, а индикацию выводить через сегментный индикатор, на схеме сдвигового регистра.
И в целом будут правы, но расчёты и распайка займут раза в 3 больше времени. Механизм задумывался (и реализовался от старта до финиша) как проект на 3 вечера
В качестве исходного донора аппаратной части взял потроха от какого-то HP-шного струйного принтера. Кинематика построена вокруг единственного электромотора, который в зависимости от полярности питания работает либо на механизм захвата листа, либо на его протяжку.
Нужный момент, когда лист уже подхвачен из стопки, должен определяться по сдвигу шторки, открывающей прохождение сигнала оптическому сенсору. К сожалению, плата с сенсором на доноре отсутствовала, поэтому по быстрому распаял датчик с обвязкой на куске картона, ввиду дефицита текстолита.
"Плата" пропитана цапонлаком, и проблем с ней не возникнет, а ублюдочность монтажа скрыта от глаз.
На заднюю крышку уместился блок питания, (в котором пришлось подобрать резистор обратной связи), для выдачи стабилизированных +5 и +12в, плата с коммутационными реле, и колодкой для подключения звёзд GND и VCC, и плата с Ардуинкой.
Учитывая почтенный возраст источника питания, выпаял и проверил ESR всех конденсаторов, коммутацию питания вывел на отдельную плату, чтобы ненужные токи не бегали через микроконтроллер. Питание Ардуинки вывел непосредственно в пин +5, в обход внутреннего стабилизатора.
Разумеется, обвязка катушек реле выполнена с использованием защитных диодов, и керамики, (не отмеченной на схеме). Индуктивность не будет шляться где-попало.
Предусмотрительно присобачил нормально замкнутый концевик, в месте будущей установки выходного лотка. Он должен подниматься, открывая доступ для загрузки, и работа двигателя в этот момент должна прерываться.
Лицо изделия - индикатор.
В запасах нашёлся дисплей формата 16х2, от старого японского программатора, начала 80-х годов, с совершенно потрясающей янтарной подсветкой и красивыми встроенными шрифтами.
Но выбор этого индикатора добавил кучу проблем:
Нестандартный, 15-пиновый коннектор, затрудняющий использования платы-адаптера, для лёгкого подключения двумя проводами через I2P.
Отсутствие русских символов в CGROM-ереликтового контроллераHD44780.
Крохотная память, способная хранить в CGRAM и одновременно выводить на экран только 8 "попиксельно" отрисованных пользовательских символов.
Но на мой взгляд, плюсы использования именно этого индикатора превышают потенциальные неудобства его пусконаладки. Подключить пришлось шлейфом, использовав кучу контактов микроконтроллера, но в блоке индикации всё равно смонтированы кнопки сброса и продолжения, так что коса больших затруднений не вызвала.
Программная часть.
С аппаратной частью практически всё готово, и настало время быдлокода. Вооружившись инфарктным количеством кофе, и обзаведясь слегка изменённым сознанием, сопровождаемым приятным тремором, приступил к программной реализации запланированного функционала.
Программировать я практически не умею, но простота синтаксиса, и море доступных примеров дают возможность написать пускай и уродливый, но вполне работоспособный код даже обезьяне. Вроде меня
1/8
Исходный код, полностью и с комментариями.
Скетч использует 13224 байт (40%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 1409 байт (68%) динамической памяти, оставляя 639 байт для локальных переменных. Максимум: 2048 байт.
Итоговый скетч раздулся до двух тысяч строк кода, (включая комментарии и отладочные сообщения через serial) и отнял почти сутки жизни, зато удалось реализовать:
Русские символы, в специфическом дизайне, соответствующем оригинальным винтажным шрифтам дисплея.
Автоматический режим сна при бездействии.
Программное избавление от дребезга контактов, вызывающее ложное многократное повторение сигнала.
Ручное управление реверсом двигателя.
Счётчики текущей операции и ведение глобальной статистики.
Режим самодиагностики и самоочистки, при застревании бумаги.
И самое главное:
Тридцать одно сообщение, выводимое на экран, в стилистике Warhammer.
Изготовление корпуса
Моё представление о промышленном дизайне достаточно консервативное: функционал определяет форму. Это означает, что в проекте не будут использоваться декоративные кишочки, проводочки и узелочки, которые так любят многие самодельщики, добавляя окончание -панк к таким творениям.
Только цветовая триада медь/графит/красный, и минимум бесмысленных украшательств.
Любой проект, который выходит за рамки формата "собрано на коленке", неизбежно упирается в поскрёбывание по сусекам, в поисках листового материала для сборки корпуса. К сожалению, в закромах, несмотря на видимость изобилия, подходящего материала нужного размера толком не нашлось. Под "проект на выходные" не хотелось ехать закупаться, поэтому, мучительно преодолевая жадность, решил использовать пару листов, которые лежали пятый год без дела.
Собственно, "сусеки"
Графитонаполненный политетрафторэтилен, он же фторопласт-4, он же PTFE или Тефлон.
С одной стороны, совершенно абсурдно использовать материал с космическими свойствами, и космической же стоимостью не в контексте изготовления втулок скольжения. Но с другой стороны, в месте, откуда я эти листы экспроприировал, 10-мм фторопласт пилили болгарками, и использовали для изготовления условно многоразовых табличек, примотанных проволокой к поддонам с продукцией.
Простейший способ изготовления прямоугольного корпуса - соединить шпильками верхнюю и нижнюю крышку, и затем обшить его по периметру. Это позволяет избежать лишних трудозатрат с поиском, резкой и гибкой крупноформатного листового материала.
Заранее подготавливаю все монтажные и резьбовые отверстия, не забывая про запас стыковочных диаметров на подгонку.
Лицевые поверхности, после шлифовки 120-240-320-400 приобретают свойства SoftTouch покрытия, это одновременно и плюс (на ощупь) и минус, (на камеру выглядит грязновато) Ворсинки, неразличимые невооружённым взглядом, укладываются в том же направлении, после касания, где прошла рука.
Торцы листов после раскроя не шлифую, они будут полностью скрыты наружными панелями.
Когда две базовые плоскости готовы, выставляю общую высоту, ориентируясь на ходовой зазор панели выходных прижимных роликов, и становятся известными размеры боковых и лицевых пластин.
Входной лоток на этом этапе решаю оставить как есть.
Так как в запасе имеются огрызки нержавейки, 20х20см, раскладываюю сварочный пикник, и настраиваю аппарат на тестовом образце.
1/2
По результату получившегося шва, мелькает мысль о том, что пора бы прекращать вы%%ываться, и такая техническая возможность сразу же предоставилась.
Прохлопал остаток аргона в баллоне, и пришлось заваривать лицевые панели электродами.
Самое неприятное в процессе работы с 304 нержавейкой - отверстия, и их зенковка.
Изготавливаю выходной лоток, из подходящей по размеру алюминиевой плиты, и пары каких-то под руку подвернувшихся мебельных профилей. Соединение на заклёпки.
Лицевую поверхность оформляю бесполезнейшей из покупок жены - "тефлоновым ковриком для гриля", заодно протестировав работу клеевого спрея на теоретически несклеиваемом материале.
С левого торца подгоняю штифт для концевого выключателя.
Лицевые панели после окраски. Дефекты геометрии по месту сгиба оставляю как есть, без шпаклёвки эпоксидкой. Перфекционизм часто приводит к творческому онанизму, срывая запланированные сроки выполнения.
Начало сборки корпуса. Зазор на переднем срезе закрывается тем же профилем, оставив пару миллиметров люфта для свободной работы механики.
Без сквозной посадки шпилек можно было обойтись, нарезав глухую резьбу с внутренней стороны, но фторопласт - капризный материал.
Сверло, едва коснувшись, начинает режим самоподхвата, и без сверлильного станка с ограничителем глубины, шансы на успешное выполнение такой задачи стремятся к нулю.
Внутренние радиусы лицевых панелей решил не закрывать, без WIG сварки слишком большой шанс искорёжить геометрию тепловыми деформациями.
Сборка контрольной панели. Единственная деталь, которую принял как есть, несмотря на явный концептуальный диссонанс с общим стилем геометрии.
Радиусы в отдельных функциональных элементах, (при хорошем дизайне), должны гармонически сочетаться друг с другом, а здесь рубленная остроугольная форма.
Но желания мучиться с нержавейкой, прогрызая окошко для индикатора, не было, а готовая алюминиевая коробка в наличии имелась. Поэтому вынужденный компромисс.
Последняя панель, монтаж кнопки питания.
И слегка обескураживающая картина, с мешаниной входов/выходов/управления/питания.
В этот момент поблагодарил себя, за составление документации. Когда все цепи расписаны заранее, не нужны даже бирки на коннекторах.
Классическую перевязку жгутов делать не стал, для этого пришлось бы подгонять длину проводов и перепрессовывать большую часть наконечников.
Наношу Священный Елей гальванический контактный состав из графита, замешанного с цапонлаком на заднюю панель. После трёх слоёв покрытие становится равномерно матовым, а графит запечатывается под слоем лака, и не пачкает руки.
Традиционно, вкладываю всю документацию внутрь корпуса, и закручиваю последний болт. Заодно крашу тем же составом и боковые стенки панели управления.
Время последнего штриха - Печать Чистоты. Распечатываю Литании и декоративную часть.
О том, как в домашних условиях, без проблем и спец. оборудования сделать выборочную металлизацию - я уже подробно описал в этом посте.
Лимит Пикабу на фотографии в посте ограничен 50, поэтому функционал работы сделал в формате видеоролика, в шапке поста.
Продублирую видео альтернативным плеером, если с Youtube имеются проблемы:
P.S. Ничего не рекламирую, зарабатываю на кусок хлеба сам, донаты не прошу, услуги и подписки не предлагаю, спасибо за внимание. .
P.P.S. Прошу прощения у трёх сотен подписавшихся на меня человек, ожидающих продолжения серии восстановления вкладышей turbo, ориентировочно со следующей недели проект продолжается.
Пациент: Инженегр-любитель Возраст проекта: 0 дней Диагноз: "Да чего там сложного" Стадия заболевания: Энтузиазм Симптомы: · открыто 48 вкладок, некоторые из них даже по делу · YouTube уже предлагает пайку · корзина на маркетплейсе растёт быстрее зарплаты Назначено лечение: Не начинать новые проекты. Пациент: Лечение проигнорировал.
═══════════════════════
🤖 Всем лимонов! 🍋🍋🍋
Есть у меня одна проблема. Я совершенно не умею вовремя останавливаться. Стоит взглядом слегка так зацепиться за что-либо, особенно если это касается хардвара, то маленький такой человечек на плече (возможно, красный и с рогами) начинает нашептывать:
— Да чего там сложного...делов на 20 минут, туда и обратно.
И каждый раз одно и то же Обычно все заканчивается еще на стадии проекта на бумаге, но иногда это перерастает в метры проводов на столе, километры документации на экране и недоумевающие возгласы жены:
— Это ещё что такое?
Ответ не зависит от стадии проекта и его наполненности: не знаю. Но оно мне надо.
Вообще люблю делать всякие проекты своими руками. Не потому, что так дешевле. Обычно как раз наоборот. Даже правильнее сказать – всегда наоборот. Просто есть какое-то странное удовольствие — сначала неделю разбираться, как всё устроено, потом месяц делать то, что можно было купить за пять минут. Это как выращивать картошку в огороде: дешевле в магазине, но важен сам процесс. Так вкуснее. Кажется, многие меня сейчас поймут. И вот однажды вечером сижу я за компьютером. Работаю, отвлекаюсь, снова работаю... Обычный вечер. Вместо ленты в инстаграме листаю ленту на озоне. И так случайно площадка начинает все больше подкидывать разных модулей и микросхем. И все это на фоне умиротворяющей тишины летней ночи под стрекотание сверчков. Тусклый свет от лампы, дабы не будить попугая падает на клавиатуру. Всё на своих местах. Статично. Постоянно.
Некий дзен сохранялся около часа. Потом меня осенило:
Мне захотелось, чтобы рядом жил маленький робот.
Не помощник, не умная колонка и не очередной модный гаджет. А именно маленький персонаж. Такой, который иногда улыбается, иногда недовольно смотрит на тебя, а иногда просто молча сидит рядом. Чтобы рабочий стол выглядел... живым.
Звучит немного странно?
Мне тоже тогда так показалось.
Первая мысль была вполне разумной:
«Наверняка кто-нибудь уже сделал нечто подобное»
Полез искать. И чем дольше искал, тем сильнее понимал: именно такого робота, которого хочется поставить рядом с монитором, почему-то не существует. Были варианты, похожие на мою идею, но им не хватало чего-то неуловимого. Каждый экземпляр был излишне вычурным и не подходил на роль тихого друга. В этот момент внутренний инженер свесил ноги с плеча (нет, он точно не красный и без рогов):
— Ну...
— Что?
— А давай сбацаем?
Вот знаете, бывают фразы, после которых жизнь неожиданно делает резкий поворот? Эта была именно такой. Я тогда ещё не знал, что через пару дней мой стол начнёт выглядеть так, будто на нём взорвался магазин радиокомпонентов, а в пвз буду ходить чаще чем моргаю. Но это уже совсем другая история.
В следующей части покажу, как выглядел самый первый прототип. Спойлер: сейчас бы вряд ли признался, что именно с него всё началось.
Пост состоит из 2 частей. Общая система управления для 5D кинотеатра и исполнительная часть smell-o-vision.
Для управления внешними устройствами используется программа MultiFunPlayer. Пока про нее не узнал планировал использовать писк в правом канале аудиодорожки. Для воспроизведения используется MultiFunPlayer версии 1.31.3 и MPC-BE версии 1.7.3. В настройках MPC-BE нужно включить дистанционное управление.
Для аудио/видеофайла должен быть составлен файл funscript. Аудио/видеофайл воспроизводится MPC-BE. MultiFunPlayer синхронизируется с MPC-BE и подхватывает funscript с темже именем файла и лежащий в тойже папке. MultiFunPlayer в нужный момент времени отправляет команды в COM порт.
Пример funscript.
{
"version": "1.0",
"inverted": false,
"range": 90,
"actions": [
{ "at": 0, "pos": 0 },
{ "at": 1000, "pos": 10 },
{ "at": 2000, "pos": 20 },
{ "at": 3000, "pos": 30 },
{ "at": 4000, "pos": 40 },
{ "at": 5000, "pos": 50 },
{ "at": 6000, "pos": 0 },
{ "at": 7000, "pos": 0 },
]
}
После "at": указывается таймкод в миллисекундах. После "pos": указывается значение от 0 до 100 которое будет отправлено внешнему устройству. Первая и последняя строка могут быть не выполнены. Если устройств несколько то для управления каждым используется свой файл funscript и к названию файла дописывается канал (еще не пробовал использовать). По умолчанию используется канал L0. Чтобы MultiFunPlayer не давал лишние команды нужно переключить интерполяцию в Step и отключить Auto-home.
MultiFunPlayer отправляет в COM порт команды на языке T-code. Я использую настройки COM порта типичные для устройств на Arduino: скорость 9600, формат данных 8N1.
Пример строки T-code:
L01000I100
L0 канал (L группа каналов, 0 номер канала в группе), 1000 значение(от 0000 до 9999), I100 время выполнения(не используется).
"pos": 0 соответствует L00000
"pos": 10 соответствует L01000
"pos": 20 соответствует L02000
"pos": 90 соответствует L09000
"pos": 100 соответствует L09999
Для упрощения прошивки Arduino я жду по UART букву L, R, V или A (группа каналов) и читаю следующие за ними 2 цифры (номер канала и 1 разряд значения). Так на каждый канал можно получить 10 дискретных значений.
"pos": 0 соответствует L00
"pos": 10 соответствует L01
"pos": 20 соответствует L02
"pos": 90 соответствует L09
Во время инициализации MultiFunPlayer и Arduino возможны ложные команды поэтому нужно предусмотреть выключатель блокирующий работу исполнительных устройств.
Исполнительная часть smell-o-vision.
Прошивка написана в ArduinoIDE 1.8.19 (последняя версия не требующая интернет для установки и работы). 3D модели делались в OpenSCAD
Состоит из 5 вентиляторов направленных в сторону зрителя. Используются осевые вентиляторы 80X25 12V. Провода + вентиляторов соединены вместе. Перед вентиляторами установлены картриджи.
Держатель картриджа
Код OpenSCAD
$fn=100;
difference()
{
union()
{
translate([-45,-45,0])
cube([90,90,4]);
}
union()
{
union()
{
translate([-71.5/2,-71.5/2,0])
cylinder(d=5.5,h=4);
translate([71.5/2,-71.5/2,0])
cylinder(d=5.5,h=4);
translate([-71.5/2,71.5/2,0])
cylinder(d=5.5,h=4);
translate([71.5/2,71.5/2,0])
cylinder(d=5.5,h=4);
}
cylinder(d=78,h=4);
}
}
difference()
{
cylinder(d=87,h=20);
cylinder(d=83,h=20);
}
Средний соединитель вентиляторов
Код OpenSCAD
$fn=100;
difference()
{
union()
{
translate([-45,-75,0])
cube([110,150,4]);
}
union()
{
union()
{
translate([-71.5/2,-71.5/2,0])
cylinder(d=5.5,h=4);
translate([71.5/2,-71.5/2,0])
cylinder(d=5.5,h=4);
translate([-71.5/2,71.5/2,0])
cylinder(d=5.5,h=4);
translate([71.5/2,71.5/2,0])
cylinder(d=5.5,h=4);
cylinder(d=78,h=4);
}
translate([0,-100,0])
union()
{
translate([-71.5/2,-71.5/2,0])
cylinder(d=5.5,h=4);
translate([71.5/2,-71.5/2,0])
cylinder(d=5.5,h=4);
translate([-71.5/2,71.5/2,0])
cylinder(d=5.5,h=4);
translate([71.5/2,71.5/2,0])
cylinder(d=5.5,h=4);
cylinder(d=78,h=4);
}
translate([0,100,0])
union()
{
translate([-71.5/2,-71.5/2,0])
cylinder(d=5.5,h=4);
translate([71.5/2,-71.5/2,0])
cylinder(d=5.5,h=4);
translate([-71.5/2,71.5/2,0])
cylinder(d=5.5,h=4);
translate([71.5/2,71.5/2,0])
cylinder(d=5.5,h=4);
cylinder(d=78,h=4);
}
translate([55,-57,0])
cylinder(d=4.5,h=4);
translate([55,57,0])
cylinder(d=4.5,h=4);
}
}
Крайние соединители вентиляторов
Код OpenSCAD
$fn=100;
difference()
{
union()
{
translate([-45,-25,0])
cube([90,50,4]);
}
union()
{
translate([0,-50,0])
union()
{
translate([-71.5/2,-71.5/2,0])
cylinder(d=5.5,h=4);
translate([71.5/2,-71.5/2,0])
cylinder(d=5.5,h=4);
translate([-71.5/2,71.5/2,0])
cylinder(d=5.5,h=4);
translate([71.5/2,71.5/2,0])
cylinder(d=5.5,h=4);
cylinder(d=78,h=4);
}
translate([0,50,0])
union()
{
translate([-71.5/2,-71.5/2,0])
cylinder(d=5.5,h=4);
translate([71.5/2,-71.5/2,0])
cylinder(d=5.5,h=4);
translate([-71.5/2,71.5/2,0])
cylinder(d=5.5,h=4);
translate([71.5/2,71.5/2,0])
cylinder(d=5.5,h=4);
cylinder(d=78,h=4);
}
}
}
Картриджи сделаны из фильтров респиратора Исток. От фильтра оставлен только корпус и пластмассовые решетки. Внутри лежит ватный диск пропитанный ароматизатором. Картриджи нужно хранить в герметичных контейнерах. Экспериментально выяснено что в корпусе должно быть много свободного места и свободный проход воздуха.
Прошивка Arduino. Для управления вентиляторами использован релейный модуль с инверсными входами. HIGH выключение вентилятора, LOW включение вентилятора.
void setup()
{
Serial.begin(9600);
pinMode(13, OUTPUT); //fan1
pinMode(12, OUTPUT); //fan2
pinMode(11, OUTPUT); //fan3
pinMode(10, OUTPUT); //fan4
pinMode(9, OUTPUT); //fan5
digitalWrite(13, HIGH);
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, HIGH);
digitalWrite(9, HIGH);
}
byte key=0;
byte group=0;
byte channel=4;
void loop()
{
if (Serial.available())
{
byte in = Serial.read();
if(in=='L')
{
key=1;
group=1;
}
if(key==1)
{
if(in=='0')
{
key=2;
channel=0;
}
}
else if(key==2)
{
key=3;
if(group==1&channel==0)
{
//smell-o-vision code
if(in=='0')
{
digitalWrite(13, HIGH);
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, HIGH);
digitalWrite(9, HIGH);
}
if(in=='1')
{
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, HIGH);
digitalWrite(9, HIGH);
digitalWrite(13, LOW);
}
if(in=='2')
{
digitalWrite(13, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, HIGH);
digitalWrite(9, HIGH);
digitalWrite(12, LOW);
}
if(in=='3')
{
digitalWrite(13, HIGH);
digitalWrite(12, HIGH);
digitalWrite(10, HIGH);
digitalWrite(9, HIGH);
digitalWrite(11, LOW);
}
if(in=='4')
{
digitalWrite(13, HIGH);
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, LOW);
}
if(in=='5')
{
digitalWrite(13, HIGH);
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, HIGH);
digitalWrite(9, LOW);
}
//smell-o-vision code end
}
}
}
}
Соответствие команд и вентиляторов
"pos": 0 выключает все вентиляторы
"pos": 10 включает вентилятор 1
"pos": 20 включает вентилятор 2 "pos": 30 включает вентилятор 3 "pos": 40 включает вентилятор 4 "pos": 50 включает вентилятор 5
Между включение вентилятора и тем как воздух дойдет до лица есть задержка. Решить эту проблему можно включая вентилятор заранее или расположив более компактный вариант исполнительного устройства ближе к лицу (работа над этим уже идет). Планирую сделать и другие устройства работающие синхронно с видео (имитатор климата, трясущееся кресло ...)
Если захотели повторить и код из поста не работает попробуйте его не скопировать а перепечатать.
Я давно увлекаюсь Arduino, но постоянно сталкиваюсь с одной проблемой: когда скачиваешь чужой скетч, половину кода не понимаешь. Где тут пин? Какая задержка? А если я хочу поменять светодиод с 13-го пина на 9-й — где это искать?
Или начинаешь учить Arduino, а там куча непонятных слов: pinMode, digitalWrite, delay... Глаза разбегаются.
В общем, я решил сделать себе помощника и написал визуальный редактор кода.
Как это работает
Ты просто вставляешь свой скетч в левое окно, нажимаешь кнопку — и справа появляется тот же код, но уже интерактивный.
Вместо просто int ledPin = 13; ты видишь:
int [ledPin] = [13]
Где квадратные скобки — это поля для ввода. Кликнул по 13 — поменял на 9. Кликнул по ledPin — переименовал в myLed. И всё!
Что можно менять прямо в редакторе
Тип переменной — хочешь сделать не int, а float или String? Пожалуйста, выпадающий список!
Имя переменной — переименуй как хочешь.
Значение — поменяй пин, задержку, текст.
Режимы пина — OUTPUT, INPUT, INPUT_PULLUP — выбирай из списка.
Состояние — HIGH или LOW.
Задержку — можешь написать просто 500, а можешь delayTime / 2 — редактор понимает выражения.
Условия в if и while — редактируй прямо в строке.
Циклы for — каждую часть цикла можно поменять отдельно.
И всё это автоматически обновляет код внизу. Скопировал готовый код — вставил в Arduino IDE — залил на плату.
Недавно нашел фотки дипломного проекта. Угадайте что это хотя бы чисто теоретически (нет это не кальян, хотя хотелось бы) и рассказывайте что у вас было
Всем привет! Решил, что тема достаточно узкая и техническая, чтобы кому-то в 3D-печатном сообществе зайти.
Сделал сушилку для филамента сам, потому что жаба душила покупать — и не пожалел (много текста)
Главный экран, с выбором программы для сушки
Короче, дело было так: филамент у меня, как у всех, постепенно тянул влагу из воздуха, печать начинала потрескивать и плеваться, а покупные сушилки на маркетплейсах либо стоят как небольшая почка, либо по факту греют коробку "на глазок" без нормального контроля температуры. Ну и как человек, у которого руки чешутся, я решил — а почему бы не собрать свою. С экраном, вебом, профилями под разные пластики и вообще по-нормальному.
Осторожно: дальше много технических подробностей и рассказ про то, как я спалил пару деталей по пути.
Что внутри
Мозги — Wemos D1 Mini на ESP8266. Дёшево, есть WiFi из коробки, чего ещё для счастья надо.
Начинка:
PTC-нагреватель 12V 100W — гоняется через силовой модуль, никакого "включил напрямую и молись"
Два датчика SHT31 (не один!) — специально поставил два в разных точках камеры, чтобы видеть реальный разброс температуры, а не верить одной точке
Два вентилятора 4020 — гоняют воздух через нагреватель по кругу
Отдельный вытяжной вентилятор — периодически проветривает камеру, выгоняя влажный воздух наружу
OLED-дисплей и энкодер — управление без веба, если вебом лень пользоваться
Корпус — обычный герметичный контейнер IKEA на 10.6 литра, никакого хитрого 3D-печатного корпуса, зачем плодить сущности
Зачем два датчика температуры, а не один
Вот тут реально было интересно. Поставил два SHT31 в разных концах камеры — и оказалось, что разброс температуры по камере при установившемся режиме составляет ~0.8°C (один датчик показывал 64.6°C, второй 65.4°C). Немного, казалось бы, но это подтвердило то, что я подозревал: одна точка измерения — это не то же самое, что реальная средняя температура по всему объёму, особенно если филамент лежит не прямо под нагревателем.
Как грею — не просто "вкл/выкл"
Сначала было банальное реле "грей пока не дойдёт, потом выключи, потом снова грей" — классический bang-bang контроль. Получалось довольно кривое колебание температуры вокруг заданной. Переделал на пропорциональное управление мощностью нагревателя в зависимости от того, насколько далеко от целевой температуры:
Разница с уставкой Мощность нагревателя больше +2°C 0% от 0 до +2°C 30% от -3 до 0°C 70% меньше -3°C 100%
Стало на порядок стабильнее, без рывков и перегрева.
Вытяжка — тоже не просто "раз в N минут"
Изначально вытяжной вентилятор просто включался каждые 10 минут на 10 секунд, весь цикл сушки одинаково. Но подумал — а ведь влага же не линейно уходит из пластика, в начале сушки испарение самое активное, а к концу цикла филамент уже почти сухой и особо нечего выгонять. Так что сделал убывающую схему по времени:
первые 50% времени сушки — вытяжка каждые 3 минуты на 20 секунд
следующие 25% — каждые 5 минут
последние 25% — каждые 10 минут
По ощущениям (и по графику влажности в вебе) — работает куда логичнее, чем фиксированный интервал на всю сессию.
Веб-интерфейс
Через браузер (телефон/комп) можно:
выбрать профиль (PLA/PETG/ABS/Custom), время и температуру
следить за температурой и влажностью в реальном времени, отдельно по обоим датчикам
смотреть график всего сеанса сушки — отдельно температура, отдельно влажность
ставить на паузу, менять температуру на лету, вручную дёргать вытяжку
заливать обновления прошивки по воздуху (OTA), без разборки корпуса ради USB
А ещё — что оказалось внезапно полезным — устройство теперь всегда поднимает свою точку доступа WiFi, даже если рядом нет вообще никакого роутера. Утащил сушилку на работу, где с интернетом не очень — подключился телефоном прямо к самой сушилке и рулю ей без всякой сети. Мелочь, а приятно.
Про грабли (куда без них)
Спалил один MOSFET (IRLZ44N), перепутав ножки Drain/Source. Горит нагреватель без остановки — весёлый вечер был.
Так же спалил Wemos d1 mini, один раз.
Тот же IRLZ44N норовил открываться сам по себе без резистора между Gate и Source, пока ESP не подключена — тоже не сразу понял, в чём дело.
В итоге перешёл на готовые модули MOSFET-драйверов (типа D4184) — со встроенной обвязкой, вообще никакой головной боли, надёжно работают прямо от 3.3V.
Проверял вытяжной вентилятор: команда с веба вроде срабатывает (лампочка на плате гаснет — значит сигнал реально идёт), а вентилятор физически не крутится. Долго думал на прошивку, оказалось — банально переломаны провода питания (кусок остался от старой светодиодной ленты, светодиодные провода для силовых соединений — так себе решение, не повторяйте).
На главном экране иногда вылезали натуральные иероглифы вместо процента влажности. Грешил на переполнение памяти, на глюки датчика — а по факту оказалось, что просто индикатор WiFi и цифры влажности рисовались на экране друг поверх друга. Классика "баг там, где не ищешь".
Итог
Работает стабильно уже который месяц, сушит PLA за 3-4 часа при 55°C, PETG за 5 часов при 65°C, ABS/ASA — 6 часов при 80°C. Полёт нормальный.
Температуру в 55С нагоняет за 7 мин, в 65С уже за 11 минут. Довольно таки быстро.
Кстати, отдельная маленькая победа: заказывал самоклеящуюся пробку 2мм толщиной — обклеил ей контейнер изнутри. Копейки стоит, клеится без проблем, а разница ощутимая: потери тепла заметно упали, нагреватель стал реже включаться на полную мощность, чтобы держать температуру. По сути, простое утепление — а результат как от апгрейда железа. Так что если у кого-то тоже самодельная сушилка в обычном пластиковом контейнере — маленький, дешёвый и практически бесплатный лайфхак.
Если кому-то интересно повторить — могу выложить исходники прошивки, схему подключения и вообще все подробности. Пишите в комментах, если надо — соберу подробный гайд по сборке отдельным постом.
ИТОГ: по деньгам вышло не сильно дешевле чем Crerality на 2 катушки, но сильно интересней. Приобрел опыт с прошивками ардуино, приобрел опыт пайки. Да и вообще довольно интересное это занятие оказалось.
Как ИИ‑ассистент меняет игру в Arduino/ESP32‑разработке.
Код — не проблема. Вместо бесконечного копипаста из форумов я получаю полностью готовый, отлаженный C/C++ скетч, написанный под конкретный набор библиотек (ESPAsyncWebServer, Max72xxPanel, EEPROM и т.д.). Всё, что обычно занимает часы (подбор функций, исправление конфликтов, написание конвертеров — например utf8rus), появляется в ответе за пару минут.
Код — не проблема.
Оптимизация и надёжность.
Неблокирующий тайминг (millis() вместо delay()) – сервер обслуживает веб‑клиентов и одновременно скроллит текст.
Сохранение настроек в EEPROM – параметры (текст, скорость, яркость, шрифт) живут после перезагрузки.
Поддержка кириллицы – AI генерирует собственный конвертер UTF‑8 → CP1251, так что русские строки работают «из коробки».
Быстрый прототип без кода вручную. Всё, что обычно требуют часы экспериментов и отладки, можно собрать через цепочку запросов к чат‑боту. Я задаю задачу, получаю готовый проект, загружаю в Arduino IDE и проверяю работу – без единой строки, написанной мной.
Экономия времени и уверенность.
От идеи до работающего прототипа — минуты, а не недели.
Меньше «потерянных» часов на поиск библиотек, исправление ошибок компиляции и чтение даташитов.
Непрерывный «мозговой штурм»: можно сразу добавить новые функции (эффекты, меню, OTA‑обновления) – AI генерирует их на лету.
Вывод: ИИ‑ассистент превращает микроконтроллерную разработку из «борьбы с низкоуровневым кодом» в «конструирование функционала». Он пишет и оптимизирует код, рисует схему, учитывает особенности железа и даже добавляет русскую кириллицу. Для любого, кто хочет быстро собрать сложный проект на Arduino или ESP32, такой помощник – не игрушка, а реальный ускоритель разработки.
Надеюсь информация будет полезно! Спасибо за внимание, Всем добра!