Русский
Русский
English
Статистика
Реклама

Самоделка

Из песочницы Взгляд в прошлое. Технология 18 века

26.08.2020 00:05:55 | Автор: admin
image

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

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

Идея


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

Принцип действия


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

image

Переключение пара производится золотниковым клапаном. Он перемещается в своём отдельном цилиндре и перенаправляет пар в ту или иную часть рабочего цилиндра.

image

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

imageimage

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

image

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

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

Постройка


К сожалению, найти каких-то запчастей столь забытых технологий крайне сложно. Пришлось делать всё с нуля. Пришлось даже освоить литьё алюминия. Все запчасти были полностью выдуманы и изготовлены на месте, мной. За материалами ходил в пункт металлоприема, так что всё получилось почти бесплатным. Я посчитал, что самым понятным и интересным форматом изготовления, настройки и испытания парового двигателя, будет снять небольшой видео материал. Так проще объяснять и сразу показать на реально существующих деталях. Прошу, к вашему вниманию первые 3 серии.Напишите, что вы об этом всём думаете. Мне интересно ваше мнение, буду рад вашим советам.

Создание рамы мотоцикла:


Изготовление парового двигателя 1 серия:


Изготовление парового двигателя 2 серия:


Жду ваших комментариев.
Подробнее..

Энергия старого мира

04.09.2020 20:08:16 | Автор: admin
image

Введение


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

image

Теперь нужно решить энергетический вопрос. И тут начинаются основные отличия от двигателей внутреннего сгорания (ДВС). В таких двигателях бензин, смешиваясь с воздухом, попадает в цилиндр двигателя и при воспламенении этой воздушно-топливной смеси выделяется энергия. Расширившиеся продукты горения давят на поршень, производя работу. Но вот у паровых машин, энергия рождается не в двигателе. Она рождается в котле. Котёл производит пар, который в свою очередь и будет давить на поршень нашего двигателя. Эту древнюю энергию нам и требуется обуздать!

Устройство


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

Существует два основных типа котлов: классический и прямоточный. Первый тип чаще всего использовался для работы паровых машин. Его можно описать как железный резервуар, в который врезана топка. Топливо горит в топке, обогревая воду в резервуаре. Вода в нём начинает кипеть и создаётся пар под давлением. Такой тип использовался на паровозах и всех первых паровых машинах:
image
У классических котлов есть как преимущества, так и недостатки. Преимущества заключаются в том, что для создания давления пара не требуется каких либо насосов, так как накопленная энергия воды может ещё долго снабжать двигатель паром даже при отсутствии огня. Такие котлы не очень требовательны к качеству воды. Паровозы заправляли самой обычной водой из речек, родников, колодцев и прочее.
Прямоточный котёл можно представить как длинную, компактно свёрнутую трубку, обтекаемую пламенем, в которую насосом закачивают воду. Такой тип котла обладает целым рядом преимуществ:
  1. Позволяет создавать пар большего давления при меньшей массе и небольшому объёму котла.
  2. Из-за того, что в трубке не так много носителя, такой котёл считается более безопасным (не запасается большое количество энергии).
  3. Быстрый выход на режим, так как не нужно прогревать большое количество воды.

Для лёгкого понимания работу такого котла можно представить в упрощённой форме:
image

Создание прямоточного котла


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

Итог


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

image

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

image

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

imageimageimage

я понял, что у меня слишком маленький котёл (длина обогреваемой трубки), в следствие этого при увеличении производительности, вода просто не успевала испаряться и вылетала вместе с паром в двигатель. От такого эффекта пропадает КПД всей установки, так как расширение воды слишком мало или не происходит вовсе. Увеличить длину котловой трубки уже задача не такая простая. Но и на этом моё горе не закончилось.
Во время очередных испытаний, я мучил аппарат, заставляя его работать, но состояние двигателя начало резко ухудшаться и в какой-то момент он заклинил. На этот раз, просто остудить его снегом, не помогло. Снова понадобилась капитальная переборка. Результаты вскрытия показали, что расплавились все фторопластовые кольца и даже алюминиевый поршень от нагрева расширился настолько, что начал задирать цилиндр. И это оказалось фатальной проблемой. Дело в том, что при большом расходе, данный котёл не успевал производить должное количество пара, а при маленьком расходе, он создал пар такой энергии, что просто вышел из строя весь двигатель. И не удивительно. Ведь выходные трубки котла были раскалены докрасна. То есть пар, достигал температур, порядка 600-700 *С. Как мы знаем, фторопласт распадается при 400*С. Для меня, это и стало последней каплей! Мне уже хотелось получить работоспособный мотоцикл, а я погряз в каких-то бесконечных проблемах! Нужно было переделывать в котле почти всё. И в этот-то момент я понял, что, несмотря на неоспоримые преимущества прямоточного котла, это изделие весьма не простое и требует тонкого расчёта, дополнительного регулирующего оборудования, да и насос съедал не малую часть вращательной энергии. Сложилось чёткое понимание, что, если бы я делал классический котёл, то ни одной из этих проблем просто не возникло бы!
Небольшое видео про мучения с прямоточным котлом:



Классический котёл


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

Изготовление


На металлоприёмке я нашёл какой-то ресивер или болон из-под пропана с толщиной стенки 3-4 мм, так что габариты котла уже были заданы жёстко.
Если сильно заморачиваться с массивной и эффективной топкой, то останется мало места для самой воды (носителя). Если топка будет слишком маленькой, то у нас не будет достаточной энергии для более менее удовлетворительной крейсерской скорости, ну и сам процесс нагрева котла займёт слишком много времени.
И вот, что я придумал. Топка будет подвержена сдавливанию огромным давлением, поэтому решено было сделать её простой, сквозной и круглого сечения. Под это пошла обычная труба 100 мм. Для увеличения КПД нашей топки (теплообменника), были врезаны 12 поперечных сквозных трубок.
image
Я посчитал это очень выгодным, так как они обтекались бы пламенем и выхлопными газами под прямым углом,
image
а вода внутри них циркулировала бы под естественным эффектом конвекции. Это позволит сохранить максимальный объём воды в котле, а для нас это запас хода. И, как бонус, такую топку было легко врезать в резервуар. Следовало всего лишь сделать два отверстия по обоим краям.
image
Для контроля давления установил небольшой манометр. Температуру носителя контролировать не обязательно, так как она напрямую связана с давлением и явно не выходит за критическую отметку (400*С). Давление в котле решил сделать как у реальных паровозов 16 bar. Предохранительный клапан настроил на 18 bar. Теперь осталось его опрессовать. Это своего рода проверка на прочность. Котёл наполняется доверху водой и накачивается повышенное давление. Сначала, я это делал оставшимся от предыдущей котловой системы, насосом из доводчика, но сжимать такой насос при давлении более 20 bar, оказалось не простой задачкой (очень хорошо, что мы теперь можем отказаться от такого узла, ведь он забирал уйму мощности на себя). Оказалось, что опрессовывать удобнее всего углекислотным огнетушителем. Им я без труда создал давление в котле в 25 bar (это был максимум моего манометра) и, выждав несколько минут, приступил к настройке предохранительного клапана.
image

Итог


Котёл получился на славу. Даже давление в 25 bar оказалось ему нипочём. Он даже не начал хрустеть. Предохранительный клапан (использовал от компрессоров) срабатывал чётко, хоть и ронял давление с 18 до 9. Этот для нас очень не выгодно, но он будет срабатывать только в тех случаях, когда сам за давлением не уследишь. Так что, до его срабатывания лучше не доводить. Это будет бессмысленное выбрасывание ресурсов.

Пламя


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

Изготовление


На металлоприёмке нашёл отличные, маленьких размеров, нержавеющие бачки. Судя по их форме и синей окраске, это кислородные баки от какого-то пассажирского самолёта. Я собрал несколько таких бачков в батарею и объединил магистралями подачи газа и заправки. Объём каждого бачка примерно 1.7 л, а значит, можно будет везти с собой запас топлива более 5л. жидкого газа. Согласитесь, не плохой запас энергии.

image

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

imageimage
Эксперимент (рис А)Пламя с не прогретой горелки (рис В)Правильный режим, прогретая горелка

Поэтому подавать газ, в нашу горелку, следует плавно, чтобы она успела прогреться.
Испытания котла прошли как по маслу. Заправил примерно 35 л воды, горелку вывел на полную мощность и ждал. Через 14 минут вода закипела, и давление потихоньку начало подниматься. Примерно через такое же время в котле было 16 bar.
Для управления подачей пара, я использовал простой водопроводный шаровой кран, который отлично справлялся и с температурой, и с давлением. В них используется тот же самый фторопласт, так что проблем, думаю, не будет.
Для интереса, я решил открыть кран на полную и посмотреть на нашу энергию. Струя пара долетала до соседних гаражей и создавала шум взлетающей ракеты. При этом я ощутил силу реактивной тяги, пришлось даже придерживать котёл, чтобы он не начал летать по всей улице. Я был очень доволен!

image

В котле подобного типа запасается огромное количество энергии. Спуская пар в течение 5 секунд через отверстие дюйма, давление в котле упало всего лишь наполовину. Дело в том, что при уменьшении давления, смещается и точка кипения воды. То есть вода начинает кипеть и без подогрева, всего лишь от уменьшения давления. Этот эффект будет работать до тех пор, пока температура воды не упадёт до 100 *С. Это для нас приятная новость. Значит, можно будет долго ездить и с выключенной горелкой.
Но есть и один не совсем для меня понятный эффект. При активном выпускании пара при давлении менее 5 bar, начинает вылетать вода. Я предположил, что она кипит столь интенсивно, что в своём неистовом бурлении долетает до сухопарника и подхваченная потоком пара улетает наружу. Для эксперимента я слил часть воды, оставив уровень 20%. Эффект конечно уменьшился, но всё равно остался. Неужели вода подпрыгивает в котле на 30-40см? Если честно, с этим я пока так и не разобрался. Такая вот небольшая загадка.
Ну да ладно! Функционал готов, пора собрать наш аппарат!

Стиль


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

image

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

imageimage

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



Испытание парового мотоцикла
Гаражные испытания полностью готового парового мотоцикла, оснащённого котлом классической конструкции, прошли на удивление гладко. Пока я его строил, в комментариях к видеороликам, люди рекомендовали много правильных и умных вещей. По ходу дела, некоторые из них я применял и в итоге они отлично себя показали. Так, например, при прогреве двигателя паром, в нём конденсируется много воды, которая блокирует поршень и может привести к гидроудару. Люди предложили сделать маленькое отверстие с резьбой, с помощью которого можно было бы выпускать пар и сливать сконденсировавшуюся воду, тем самым быстро его прогревать. Потом, заглушить его винтиком и спокойно сразу ехать.
На удивление, самая первая попытка проехать на полностью готовом мотоцикле, прошла без каких либо проблем. Как говорится, сел и поехал. Покатавшись немного перед гаражом, я понял, что для меня этого не достаточно и я хочу больше. Разумеется, чтобы замерить все параметры, увидеть слабые места, ощутить и понять этот аппарат, нужна прямая, пустая, бесконечная трасса. Поэтому пришлось вывести мотоцикл за город и спокойненько со всем этим разобраться.

image

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

Видео отчёт. Испытания парового мотоцикла



Заключение


Когда задумывал строить этот паровой мотоцикл, я рассуждал так: вот сделаю его, как нибудь это всё проедет и, удовлетворив все свои инженерные интересы, поставлю его дома напротив дивана в качестве эстетического элемента, навсегда. Но нет! Теперь это наоборот не даёт мне покоя. Я хочу его изучать, модернизировать, переделывать и побивать его же рекорды, хочу определить его максимум, понять всё, на что он способен! Конечно, в рамках этой концепции.
Первое с чего начну, это переделаю систему переключения пара на классическую. Мне стало интересно, какова будет разница. И ещё, при последующих испытаниях нужно будет поиграть с настройками. Добиться максимальной скорости, подобрав наиболее правильное опережение впуска пара. Ещё, хочу поэкспериментировать с разными видами топлива.
Видимо грядёт большая модернизация. Так что, если наш паровоз собирался уйти на пенсию и отсидеться где-нибудь в музее, тут я его сильно разочарую! У него впереди ещё длинное, тяжелое, но интереснейшее будущее!
Подробнее..

Перевод Как я превратил свой стол с регулировкой высоты в стол с Интернетом вещей

12.12.2020 16:04:40 | Автор: admin
В этой статье я покажу, как я превратил свой стол с ручной регулировкой высоты в автоматизированный стол с Интернетом вещей. Я расскажу, как подобрать размеры и запустить моторы, а также как подключить ваше устройство IoT к Google при помощи Heroku в качестве публичного интерфейса.

Если коротко, у этого проекта две особенности. Первое: стол подключается из Google Smart Home к Heroku с помощью голосовых команд, и второе: Heroku и собственно стол общаются по протоколу Интернета вещей MQTT. MQTT хорошее решение для Интернета вещей, а также для преодоления некоторых других препятствий, с которыми нам придётся столкнуться.

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

Тот самый столик


Аппаратная часть


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

Важность крутящего момента


Заказав нужные привод и ремень, я начал искать на Amazon мотор с высоким крутящим моментом. И о, чудо! я нашёл много подходящих двигателей! Или мне так показалось Купив маленький моторчик, около месяца я ждал его прибытия из Китая. Я был так взволнован, когда моторчик, наконец, приехал! Не мог дождаться выходных, чтобы, наконец, собрать всё воедино и получить мой моторизованный стол.

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

Я включил моторчик, напряжение на своём настольном источнике питания и ничего не произошло. Несколькими мгновениями позже мотор начал вращаться и скрежетать зубцами приобретённого ремня. Из этого я извлёк два урока: ремень, очевидно, не справляется со своей работой, а надпись Мотор в высоком крутящим моментом не означает Я могу поднять всё на свете. Второй урок: надо смотреть, какого размера моторчик в сравнении с пальцами. Мой оказался крошечным!



Слева на фото мотор и ремень. Вверху справа прикреплённый к столу мотор (позже вы увидите больше о происходящем). Внизу справа мотор в положении на столе.

Подходящий мотор


Чтобы выбрать подходящий мотор, нужно было рассчитать, какой крутящий момент требуется для поднятия столешницы. Я был удивлён тем, насколько просто сделать это.

$T = F * r$


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

Что ж, плечо рычага у меня было (это рукоятка стола), нужно было только рассчитать силу, которая легко повернула бы плечо рычага. Я нагрузил стол, привязав к ручке кувшин для молока и постепенно добавлял в кувшин воду, пока рычаг не начал вращаться. Повернув ручку кверху с наполненным кувшином я убедился, что вес легко поворачивает ручку. Я выяснил, что длина плеча рычага составляет 11 см, а требуемая сила 4 фунта. Подставив эти цифры в формулу, я выяснил, что мотор должен выдавать крутящий момент не менее 19,95 кг/см. И начал искать его.

Я решил переделать стол необратимым образом. Мне было известно, что проходящий через середину стола стержень полый. Поискав двухвальный мотор, я мог разрезать стержень и пересобрать его с мотором в середине. Купив два мотора с крутящим моментом 20 кг/см, я гарантировал, что крутящего момента для поднятия стола достаточно.

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


Два верхних фото полностью установленные на стол моторы. Два нижних фото - интегрированный стержень, с помощью моторов проходящий по длине стола.

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

Однако позвольте уточнить, что стол был медленным. Я снял видео, чтобы показать другу, как работает стол, но ему пришлось включить ускорение времени на видео, чтобы не смотреть 5 минут, как стол меняет положение столешницы.

Обороты важны. Окончательная версия


Наконец я понял, что всё сводится к двум вещам: крутящему моменту и оборотам. Нужно было найти мотор с достаточным количеством оборотов при уже известном крутящем моменте.

Это было не так сложно. Хотя я не нашёл двухвалового мотора, зато нашёл прямоугольный редуктор, которая превращает мотор с одним валом в двухвальный мотор.

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


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

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

Bluetooth


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

Итак, теперь я приобрёл плату контроллера мотора, плату для Bluetooth Nordic NRF52, сенсоры для измерения расстояния и начал возиться с прошивкой контроллера.

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

В качестве краткого введения: ESP32 написана на C++ с помощью библиотек Arduino для взаимодействия с приложением BLE Terminal на телефоне. Установка и конфигурирование BLE довольно сложны. Для начала нужно создать все характеристики для значений, которые вы хотели бы контролировать через BLE. Думайте о характеристике, как о переменной в вашем коде. BLE оборачивает переменную во множество обработчиков для получения и установки значения этой переменной.

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

Для регулировки высоты столешница имеет определяющий текущую высоту встроенный в нижнюю часть сенсор TFMini-S LiDAR. Это забавный сенсор: он называется LiDAR, хотя на самом деле это лазер. Он использует оптику и светодиод, чтобы определить время полёта ИК-излучения. Так или иначе, сенсор определяет высоту стола. Затем контрольная плата определяет разницу между текущей высотой и запрашиваемой высотой и запускает мотор, который вращается в нужном направлении. Некоторые основные части кода приведены ниже, но вы можете увидеть весь файл здесь.

void setup(){   Serial.begin(115200);   Serial2.begin(TFMINIS_BAUDRATE);   EEPROM.begin(3); // used for saving the height presets between reboots   tfminis.begin(&Serial2);   tfminis.setFrameRate(0);   ledcSetup(UP_PWM_CHANNEL, PWM_FREQUENCY, PWM_RESOLUTION);   ledcAttachPin(UP_PWM_PIN, UP_PWM_CHANNEL);   ledcSetup(DOWN_PWM_CHANNEL, PWM_FREQUENCY, PWM_RESOLUTION);   ledcAttachPin(DOWN_PWM_PIN, DOWN_PWM_CHANNEL);   state_machine = new StateMachine();   state_machine->begin(*t_desk_height, UP_PWM_CHANNEL, DOWN_PWM_CHANNEL);   BLEDevice::init("ESP32_Desk");  ...   BLEServer *p_server = BLEDevice::createServer();   BLEService *p_service = p_server->createService(BLEUUID(SERVICE_UUID), 20);   /* ------------------- SET HEIGHT TO PRESET CHARACTERISTIC -------------------------------------- */   BLECharacteristic *p_set_height_to_preset_characteristic = p_service->createCharacteristic(...);   p_set_height_to_preset_characteristic->setCallbacks(new SetHeightToPresetCallbacks());   /* ------------------- MOVE DESK UP CHARACTERISTIC ---------------------------------------------- */   BLECharacteristic *p_move_desk_up_characteristic = p_service->createCharacteristic(...);   p_move_desk_up_characteristic->setCallbacks(new MoveDeskUpCallbacks());   /* ------------------- MOVE DESK UP CHARACTERISTIC ---------------------------------------------- */   BLECharacteristic *p_move_desk_down_characteristic = p_service->createCharacteristic(...);   p_move_desk_down_characteristic->setCallbacks(new MoveDeskDownCallbacks());   /* ------------------- GET/SET HEIGHT 1 CHARACTERISTIC ------------------------------------------ */   BLECharacteristic *p_get_height_1_characteristic = p_service->createCharacteristic(...);   p_get_height_1_characteristic->setValue(state_machine->getHeightPreset1(), 1);   BLECharacteristic *p_save_current_height_as_height_1_characteristic = p_service->createCharacteristic(...);   p_save_current_height_as_height_1_characteristic->setCallbacks(new SaveCurrentHeightAsHeight1Callbacks());   /* ------------------- GET/SET HEIGHT 2 CHARACTERISTIC ------------------------------------------ */  ...   /* ------------------- GET/SET HEIGHT 3 CHARACTERISTIC ------------------------------------------ */  ...   /* ------------------- END CHARACTERISTIC DEFINITIONS ------------------------------------------ */   p_service->start();   BLEAdvertising *p_advertising = p_server->getAdvertising();   p_advertising->start();   xTaskCreate(       updateDeskHeight,     // Function that should be called       "Update Desk Height", // Name of the task (for debugging)       1024,                 // Stack size       NULL,                 // Parameter to pass       5,                    // Task priority       NULL                  // Task handle   );}

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

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

Итак, наконец у меня был стол, который делал всё, что я хотел. Я мог сохранить высоту в пресеты и извлечь высоты из памяти, чтобы установить стол в мои любимые положения. Я применял BLE Terminal на моём телефоне и компьютере, так я мог посылать сообщения в сыром виде моему столу и контролировать его позицию. Это работало, но я знал, что битва с BLE только начинается.


Голый интерфейс bluetooth Всё, что оставалось на данный момент, научиться писать приложения под iOS

После всего этого моя жена сказала кое-что, что изменило весь проект: А что, если сделать управление твоим голосом?.

Кроме крутости и добавления нового устройства к списку Google Assistant отпала необходимость писать приложение под iOS, чтобы управлять столом. И больше не нужно было доставать телефон, чтобы отрегулировать высоту. Ещё одна маленькая победа!

Добавление Интернета вещей


Теперь поговорим об апгрейде стола до управления голосом через Google Smart Home и как подружить его с Wi-Fi.

Добавить Wi-Fi было достаточно просто. Я заменил микроконтроллер Nordic NRF52 на ESP32 со встроенным WiFi. Большая часть софта была переносимой, потому что была написана на C++, а оба устройства могли программироваться с помощью Platform.IO и библиотек Arduino, включая tfmini-s, написанную мной для измерения текущей высоты стола.

Ниже показана архитектура системы взаимодействия стола с Google Smart Home. Давайте поговорим о взаимодействии между мной и Гуглом.



Итак, Bluetooth был включён. Пришло время выяснить, как взаимодействовать с Google Smart Home. Эта технология контролировала дом с помощью Smart Home Actions. В её действиях интересно то, что сервис действует как сервер OAuth2, а не как клиент. Большая часть проделанной с сервером работы была связана с реализацией приложения OAuth2 Node.js Express, которое добирается до Heroku и взаимодействует как прокси между Google и моим столом.

Мне повезло: была достойная реализация сервера с помощью двух библиотек. Первая библиотека node-oauth2-server, была найдена здесь. Вторая библиотека express-oauth-server для подключения Express была найдена здесь.

const { Pool } = require("pg");const crypto = require("crypto");const pool = new Pool({   connectionString: process.env.DATABASE_URL});module.exports.pool = pool;module.exports.getAccessToken = (bearerToken) => {...};module.exports.getClient = (clientId, clientSecret) => {...};module.exports.getRefreshToken = (bearerToken) => {...};module.exports.getUser = (email, password) => {...};module.exports.getUserFromAccessToken = (token) => {...};module.exports.getDevicesFromUserId = (userId) => {...};module.exports.getDevicesByUserIdAndIds = (userId, deviceIds) => {...};module.exports.setDeviceHeight = (userId, deviceId, newCurrentHeight) => {...};module.exports.createUser = (email, password) => {...};module.exports.saveToken = (token, client, user) => {...};module.exports.saveAuthorizationCode = (code, client, user) => {...};module.exports.getAuthorizationCode = (code) => {...};module.exports.revokeAuthorizationCode = (code) => {...};module.exports.revokeToken = (code) => {...};

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

const express = require("express");const OAuth2Server = require("express-oauth-server");const bodyParser = require("body-parser");const cookieParser = require("cookie-parser");const flash = require("express-flash-2");const session = require("express-session");const pgSession = require("connect-pg-simple")(session);const morgan = require("morgan");const { google_actions_app } = require("./google_actions");const model = require("./model");const { getVariablesForAuthorization, getQueryStringForLogin } = require("./util");const port = process.env.PORT || 3000;// Create an Express application.const app = express();app.set("view engine", "pug");app.use(morgan("dev"));// Add OAuth server.app.oauth = new OAuth2Server({   model,   debug: true,});// Add body parser.app.use(bodyParser.urlencoded({ extended: false }));app.use(bodyParser.json());app.use(express.static("public"));// initialize cookie-parser to allow us access the cookies stored in the browser.app.use(cookieParser(process.env.APP_KEY));// initialize express-session to allow us track the logged-in user across sessions.app.use(session({...}));app.use(flash());// This middleware will check if user's cookie is still saved in browser and user is not set, then automatically log the user out.// This usually happens when you stop your express server after login, your cookie still remains saved in the browser.app.use((req, res, next) => {...});// Post token.app.post("/oauth/token", app.oauth.token());// Get authorization.app.get("/oauth/authorize", (req, res, next) => {...}, app.oauth.authorize({...}));// Post authorization.app.post("/oauth/authorize", function (req, res) {...});app.get("/log-in", (req, res) => {...});app.post("/log-in", async (req, res) => {...});app.get("/log-out", (req, res) => {...});app.get("/sign-up", async (req, res) => {...});app.post("/sign-up", async (req, res) => {...});app.post("/gaction/fulfillment", app.oauth.authenticate(), google_actions_app);app.get('/healthz', ((req, res) => {...}));app.listen(port, () => {   console.log(`Example app listening at port ${port}`);});

Кода довольно много, но я объясню основные моменты. Два используемых для сервера маршрута OAuth2, это /oauth/token и /oauth/authorize. Они применяются для получения нового токена или обновления истекших токенов. Далее нужно заставить сервер реагировать на действие Google. Вы заметите, что конечная точка /gaction/fulfillment указывает на объект google_actions_app.

Google отправляет запросы на ваш сервер в определённом формате и предоставляет библиотеку, помогающую обработать эти запросы. Ниже приведены функции, необходимые для связи с Google, а весь файл целиком лежит здесь. Наконец, есть конечная точка /healthz, о которой я расскажу в конце статьи.

Конечная точка /gaction/fulfillment использует промежуточное ПО под названием app.oauth.authenticate(), тяжёлая работа по обеспечению работы сервера OAuth2 была направлена на то, чтобы работало это промежуточное ПО. Оно проверяет, что токен-носитель, предоставленный нам Google, ссылается на существующего пользователя и не истёк. Далее маршрут отправляет запрос и ответ объекту google_actions_app.

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

const { smarthome } = require('actions-on-google');const mqtt = require('mqtt');const mqtt_client = mqtt.connect(process.env.CLOUDMQTT_URL);const model = require('./model');const { getTokenFromHeader } = require('./util');mqtt_client.on('connect', () => {   console.log('Connected to mqtt');});const updateHeight = {   "preset one": (deviceId) => {       mqtt_client.publish(`/esp32_iot_desk/${deviceId}/command`, "1");   },   "preset two": (deviceId) => {       mqtt_client.publish(`/esp32_iot_desk/${deviceId}/command`, "2");   },   "preset three": (deviceId) => {       mqtt_client.publish(`/esp32_iot_desk/${deviceId}/command`, "3");   },};const google_actions_app = smarthome({...});google_actions_app.onSync(async (body, headers) => {...});google_actions_app.onQuery(async (body, headers) => {...});google_actions_app.onExecute(async (body, headers) => {...});module.exports = { google_actions_app };

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

Когда вы впервые добавляете действие Google в свой аккаунт Smart Home, вы заметите, что Google сначала отправляет запрос синхронизации, а затем опрашивающий запрос, чтобы получить целостное представление о ваших устройствах. Последний запрос это запрос на выполнение, который Google сообщает вашим устройствам, чтобы они что-то делали.

Особенности (trait) устройства Google Smart Home


Google использует особенности устройства для предоставления элементов пользовательского интерфейса управления вашими устройствами в Google, а также для создания коммуникационных шаблонов голосового управления. Некоторые из особенностей включают в себя следующие настройки: ColorSetting, Modes, OnOff, and StartStop. Мне потребовалось некоторое время, чтобы решить, какая особенность будет лучше всего работать в моём приложения, но позже я выбрал режимы.

Вы можете думать о режимах как о выпадающем списке, где выбирается одно из N предопределённых значений или, в моём случае, предустановки высоты. Я назвал свой режим высота, а возможные значения предустановка один, предустановка два и предустановка три. Это позволяет мне управлять своим столом, говоря: Эй, Google, установите высоту моего стола в предустановку один, и Google отправит соответствующий запрос на выполнение в мою систему. Вы можете прочитать больше об особенностях устройств Google здесь.

Проект в деле


Наконец, Google Smart Home и мой компьютер начали общаться. До этого для локального запуска сервера Express я использовал ngrok. Теперь, когда мой сервер наконец заработал достаточно хорошо, пришло время сделать его доступным для Google в любое время. Значит, нужно было разместить приложение на Heroku это поставщик PaaS, упрощающий развёртывание и управление приложениями.

Одно из главных преимуществ Heroku режим дополнений. С дополнениями очень просто добавить CloudMQTT и сервер Postgres для приложения. Ещё одно преимущество использования Heroku простота сборки и развёртывания. Heroku автоматически определяет, какой код вы используете, и создаёт/развёртывает его для вас. Вы можете найти более подробную информацию об этом, прочитав о Heroku Buildpacks. В моём случае всякий раз, когда я отправляю код в git remote Heroku, он устанавливает все мои пакеты, удаляет все зависимости разработки и развёртывает приложение, и это всё простой командой git push heroku main.

Всего в несколько кликов CloudMQTT и Postgres стали доступны моему приложению, и мне нужно было использовать только несколько переменных среды, чтобы интегрировать эти сервисы с моим приложением. Heroku не потребовал денег. Однако CloudMQTT сторонним дополнение за $5 в месяц.

Я считаю, что необходимость в Postgres не нуждается в комментариях, но CloudMQTT заслуживает больше внимания.

Из Интернета в частную сеть. Сложный способ


Есть несколько способов предоставить доступ к приложению или, в моём случае, устройству Интернета вещей. Первый открыть порт в моей домашней сети, чтобы вывести устройство в Интернет. В этом случае моё приложение Heroku Express отправит запрос на моё устройство, используя публичный IP-адрес. Это потребовало бы от меня иметь публичный статический IP-адрес, а также статический IP-адрес для ESP32. ESP32 также должен был бы действовать как HTTP-сервер и всё время слушать инструкции от Heroku. Это большие накладные расходы для устройства, получающего инструкции несколько раз в день.

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

Внутри дырокола происходит многое, и я не до конца понимаю происходящее. Однако, если вам интересно, есть несколько интересных статей, объясняющих больше. Вот две статьи, которые я прочитал, чтобы лучше понять дырокол: Википедия и статья из MIT, написанная Брайаном Фордом и другими.

Из Интернета в частную сеть через IoT


Я не был очень доволен этими решениями. Я подключил много смарт-устройств в дом, и мне никогда не приходилось открывать порт на маршрутизаторе, так что переадресации портов не было. Кроме того, пробивка дыр кажется гораздо более сложной, чем то, что я ищу, и лучше подходит для сетей P2P. В результате дальнейших исследований я обнаружил MQTT и узнал, что это протокол для IoT. Он обладает некоторыми преимуществами, такими как низкое энергопотребление, настраиваемая отказоустойчивость, и не требует переадресации портов. MQTT протокол типа издатель/подписчик, это означает, что стол подписчик определённого топика, а приложение Heroku издатель этого топика.

Таким образом, Google связывается с Heroku, этот запрос анализируется, чтобы определить запрошенное устройство и его новое состояние или режим. Затем приложение Heroku публикует сообщение на сервере CloudMQTT, развёрнутом как надстройка на Heroku, с указанием столу перейти к новой предустановке. Наконец, стол подписывается на топик и получает сообщение, опубликованное приложением Heroku, наконец, стол настраивает свою высоту в соответствии с запросом! В файле googleactionsapp вы заметите, что есть функция updateHeight, которая публикует один номер в топике MQTT для определённого идентификатора устройства. Вот так приложение Heroku публикует в MQTT запрос на перемещение стола.

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

void setup(){ Serial.begin(115200);... tfminis.begin(&Serial2); tfminis.setFrameRate(0);... state_machine = new StateMachine(); state_machine->begin(*t_desk_height, UP_PWM_CHANNEL, DOWN_PWM_CHANNEL); setup_wifi(); client.setServer(MQTT_SERVER_DOMAIN, MQTT_SERVER_PORT); client.setCallback(callback);...}

Когда стол загружается, мы сначала запускаем связь между TFMini-S датчиком расстояния чтобы получить текущую высоту стола. Затем мы настраиваем конечный автомат для движения стола. Конечный автомат получает команды через MQTT, а затем отвечает за согласование запроса пользователя с фактической высотой стола, считываемой датчиком расстояния. Наконец, мы подключаемся к сети Wi-Fi, подключаемся к серверу MQTT и настраиваем обратный вызов для любых данных, получаемых по теме MQTT, на которую мы подписаны. Ниже я покажу функцию обратного вызова.

void callback(char *topic, byte *message, unsigned int length){ ... String messageTemp; for (int i = 0; i < length; i++) {   messageTemp += (char)message[i]; } if (messageTemp == "1") {   state_machine->requestStateChange(ADJUST_TO_PRESET_1_HEIGHT_STATE); } if (messageTemp == "2") {   state_machine->requestStateChange(ADJUST_TO_PRESET_2_HEIGHT_STATE); } if (messageTemp == "3") {   state_machine->requestStateChange(ADJUST_TO_PRESET_3_HEIGHT_STATE); }...}

Конечный автомат регистрирует изменение состояния, полученное в теме MQTT. Затем он в основном цикле обрабатывает новое состояние.

void loop(){ if (!client.connected()) {   reconnect(); } client.loop(); state_machine->processCurrentState();}

Основной цикл выполняет несколько задач: во-первых, он повторно подключается к серверу MQTT, если еще не подключён. Затем обрабатывает все данные, полученные через топик MQTT. Наконец, код отрабатывает, перемещая столешницу в нужное место, запрошенное в топике MQTT.

Вот и всё! Стол полностью управляется голосом и обменивается данными с Google для получения команд!

Последние заметки


Последняя конечная точка, о которой я не упоминал, конечная точка / healthz. Это связано с тем, что Google ожидает, довольно быстрого ответа, и загрузка приложения Heroku при каждом запросе в моём случае не работает. Я установил службу ping для проверки связи с конечной точкой /healthz каждую минуту, чтобы служба оставалась работоспособной и была готова ответить. Если вы планируете сделать что-то подобное, помните, что на это будут израсходованы все бесплатные часы на стенде. Сейчас всё нормально: это единственное используемое на Heroku приложение. Кроме того, за 7 долларов в месяц вы можете перейти на тарифный план Herokus Hobby с поддержкой постоянной работы приложения.

Создание устройства IoT связано с большими накладными расходами в начале. Я сконструировал оборудование, построил схему управления, настроил сервер MQTT, написал сервер Express OAuth2 и научился взаимодействовать с Google Smart Home через действия. Первоначальные накладные расходы были огромными, но я чувствую, что многого добился! Не говоря уже о том, что сервер MQTT, сервер приложений Express OAuth2 и Google Smart Home Actions можно использовать для другого проекта. Умные дома мне интересны, и я могу попытаться расширить свой репертуар IoT-устройств, включив в него датчики, отслеживающие происходящее вокруг моего дома и сообщающее об этом через MQTT. Датчики для мониторинга почвы, температуры и датчики света будет очень интересно мониторить и анализировать.

Что дальше?


Высота столешницы сейчас измеряется в лучшем случае ненадёжно. Я использую в целом работающим инфракрасным датчиком расстояния TFMini-S. Замечено, что высота стола немного меняется в течение дня, когда меняется окружающее освещение в комнате. Я заказал датчик угла поворота, чтобы подсчитать обороты стержня, проходящего через стол. Это должно дать мне движения точнее в любое время дня. У меня также есть доступ к серверу, который я размещаю в подвале. На нём я могу исследовать собственный сервер Mosquitto MQTT, Node-RED и Express-приложения OAuth2, если захочу хостить что-то сам. Наконец, сейчас вся электроника лежит прямо на моём столе. Я планирую организовать устройства так, чтобы все было красиво и аккуратно!


image



Подробнее..

Поведениеметр

28.12.2020 14:06:07 | Автор: admin
Я специально добавил хаб читальный зал, так как конкретных схем, ПО и чертежей тут не будет, зато будет сказ о том, как проект выходного дня растянулся на 2 недели. В общем, нет ТЗ результат ХЗ.
Предпосылка. Не знаю, или кризис 4х 5и лет, или непростой 2020, но поведение дочки стало резко портится. Дома еще ничего, а на занятиях мрак. С другой стороны, в развивающем клубе, куда она ходит, есть аналоговый поведениеметр (не знаю, как он правильно называется, пусть будет так), представляющий из себя 5и этажный многоподъездный домик, где каждому ребенку выделен именной подъезд и звездочка, которую ставят от 1 до 5 уровня. Эту же игру мелкая принесла домой, нарисовав на бумажке клеточки, но ставит всегда звезду на верхний этаж, вне зависимости от реального поведения. Ладно, надо это геймифицировать, используя тягу к лидерству, подумал я и решил сделать цифровой измерительный прибор. В результате получилось вот такое, как ни странно, работает:
image
Работает именно по назначению. За месяц использования удалось немного откорректировать поведение в лучшую сторону. Если интересно, как на такой простой проект ушло больше недели,

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

добро пожаловать!

Конечно, про несколько недель я слукавил, непосредственно активная работа заняла пару дней, но шла она с невероятным скрипом, с фейлами просто на ровном месте.
Первый вариант родился, когда я проходил мимо очередного рисунка домика со звездой на крыше. Берем досочку, к ней крепим 3 подходящие полупрозрачные емкости, которые планировал подобрать в ближайших хозтоварах, светодиодов у меня коробка, случайно на порядок ошибся, когда на Али заказывал, собираем. Выглядеть это должно было как то так:
image
Прошу прощения, вообще нет таланта рисовальщика. Из электроники PIC12F508, пару герконов, батарейка и несколько десятков строк на Ассемблере. Управлять предполагалось волшебной палочкой с закрепленным на конце магнитом (да, справа была попытка нарисовать волшебную палочку). Подносим к левому геркону отнимаем балл, к правому добавляем. Итого, из 6 GPIO контроллера 3 на светодиоды, 2 на герконы, 1 свободный. Внутренняя подтяжка GPIO к U+, по сути на плату надо будет поместить только 1 контроллер и токоограничивающие резисторы для светодиодов. Эта конструкция родилась за пару минут в голове и оказалась неприемлемой к сборке в текущих условиях, несмотря на свою простоту. Как так?
Вначале была досочка. Это в нашем доме есть все необходимое, а на съемной квартире не смог найти даже заготовку. Еще нужна ножовка, желательно лобзик, дрель, шлифовальная машина, ладно, шкурка подойдет, морилка, лак и хоть какой то уголок, где можно намусорить локально, не получив люлей от жены. Рассматривал вариант поездки к коллеге, у которого частный дом и все необходимое есть, но отрывать человека от дел, согласовывать время Не оправдано. До своего дома пилить почти 1000км, с пересечением границы. Досочка в минус, ищем другое решение.

Просто соединить подходящие корпуса, найденные в хозяйственном магазине. Но поход по ближайшим не дал ничего стоящего. И как соединить все красиво? МГТФ чудесный провод, но соединять только им не эстетично. Термоусадка? Убожество! Еще есть очень красивый аудиокабель, проложенный от усилителя к колонкам и его с запасом. Обычный, не аудиофильский. Но мне надо несколько проводов, а выдергивать из него жилы и пропихивать МГТФ сомнительно. Стоп, где-то уже видел такое. Рыбка из капельницы:

Сейчас понимаю, что иметь этих рыбок в доме большое горе, но в детстве мы хвастались такими поделками, не понимая, почему они есть не у всех К счастью, теперь купить капельницу можно в ближайшей аптеке, что и было сделано. Попробовал окрасить йодом получилось. Дело за корпусами индикаторов и электроники
Первоначально 3D печать не входила в планы, но отсутствие подходящих корпусов + приблизительно сложившийся вид готового изделия заставили поменять намерения. Создал простой проект:

И запустил пробную печать одного фонарика. До этого все шло хорошо От идей до первой печати прошел день, но малая стала выяснять, а что делает папа? Пришлось рассказать. И получить первую правку к ТЗ:
Пап, а лампочек надо не 3, а 5, как в школе!
Ок, все равно все корпуса под индикаторы идентичные, напечатаю 5. Но, похоже, на этом этапе дочурка договорилась с нечистой силой и все пошло наперекосяк. Тем более разговор состоялся в Хэллоуин. Шутка. Я старый атеист и в чудеса не верю, но все же
Контроллер. Уже 5 GPIO задействованы под светодиоды, остается 1, который работает только как вход (или reset). Конечно, можно сделать что то подобное, высвободив еще 1 GPIO, даже подключив 6 светодиодов, но это увеличит количество проводов между индикаторами, что неудобно (подтягивающие резисторы на вход не рисовал):

Комбинируя на P0 единицу или ноль, а на P1, P2 1/0/Z, можно зажечь требуемый светодиод. Но, как сказал выше, неохота протягивать лишние провода в итак маленькие отверстия трубки от капельницы. Надо искать другое решение, которое просто смотрело на меня. ИК пульт от ресивера, которым не пользовался (пультом). Порывшись в хламе, наткнулся на давно купленные ИК приемники TSOP2138, с использованием которых хотел сделать временное управление освещением в доме (не успел, переехал) и по счастливой случайности перевезенные на съемную квартиру. Честно, никогда не работал с ИК пультами. Так получилось. И с Ethernet работал, и с SpaceWire, SRIO всякими, не говоря про каноничные UARTы, SPI, I2C, даже ISA застал, а ИК пригодился впервые. Немного погуглив, выяснил, что есть 2 основных протокола, известные как Philips и NEC. Первый использует манчестерский код, второй ШИМ. ШИМ проще декодировать, особенно когда у тебя всего 512 слов ПЗУ и 25 байт ОЗУ на все, но пульт работал по протоколу Philips. К счастью, нашел еще один, абсолютно ненужный пульт от игрушечного китайского проектора, который использовал NEC стандарт. Определял протоколы просто подключив к ИК приемнику питание, подтяжку и осциллограф. Так как PIC12 не имеет внутрисхемной отладки, отлаживал на PIC16F819, учитывая ограничения двенашки. Как ни странно, ушло на написание с отладкой меньше часа времени, завелось почти без косяков, кроме одного. Фронт импульса от датчика чуть затянут, пришлось подкрутить тайминги. Вроде все нормально, но тут я решил посчитать (вообще, это надо делать еще на этапе идеи).

Вылез первый черт из табакерки.

Планировал питать устройство от 2х щелочных батареек AA. Потребление вроде небольшое. Чуть меньше 8мА. Но и емкость щелочной батарейки в районе 2000 mA/h. Конечно, я хотел потихоньку уменьшать яркость индикаторов при простое, но как не крутил, время работы ограничено 2-3 неделями, что очень мало. Аккумуляторы не вариант. NiCa имеют напряжение 1.2В, то есть надо уже 3, Литиевые дикий оверхед, к которым еще надо контроллеры заряда / разряда делать. Решил питать от сети, хорошо что есть много компактных AC/DC 5V, 800mA преобразователей. Остается один вопрос, как сохранять текущий показатель поведения при отключении питания? К сожалению, встроенного EEPROM данный контроллер не имеет, FLASH сам перешивать не может. Ставить резервную литиевую 3.3V батарейку или ионистор? Вариант хороший, но контроллер должен определять пропадание основного питания, отключить светодиоды и уйти в глубокий сон. А у него уже не осталось свободных выводов.*
*Хорошая мысля приходит опосля.
Пока писал текст, придумал как решить проблему. Если подать питание на ИК приемник и его резистор подтяжки от сетевого источника, поставив обратный диод, то 0 на входе GPIO в течение длительного времени, нескольких сотен миллисекунд, будет сигнализировать про пропадание питания. Так же, ИК приемник не будет потреблять ток от резервной батарейки.

Хотел применить сдвиговый регистр. По ногам хватает, уже можно подключить 8 светодиодов, тем самым добавив анимацию для самой верхней звездочки, но лишние детали сводят на нет основное преимущество мелкого (SO8) контроллера компактность и простоту платы. Решил оставить отладочный PIC16F819, самый маленький, который был в наличии. У него есть встроенная EEPROM, проблема с сохранением состояния после пропадания питания решена.

Чертик второй, от куда не ждали.

Один корпус, состоящий из чаши, крепежа светодиодов и крышки был напечатан. Детали неплохо подошли (это я так думал) друг к другу, можно печатать серию. Учитывая, что все детали печатались разным пластиком, прозрачный SBS для крышки, белый PET-G для держателя и черный PET-G для чаши, решил печатать тем, что было вставлено вчера. Черным PET-G. Единственное, перед очередной печатью серии решил почистить и отрегулировать стол. Дело обычное. Промыл, отрегулировал зазоры, нанес лак для лучшего прилипания и поставил деталь на печать. Не тут то было. Плохая адгезия к столу. Перепроверил калибровку оного все Ок. Печать, если и начиналась, то через несколько слоев деталь отлипала, а кайма разворачивалась в спираль. Такое уже было при недостаточной экструзии. Как с ней воевал даже написал статью. Хорошо, проверил и почистил ролики экструдера, вроде все красиво. Проблема не исчезла. Стал грешить на фильеру (в простонародье сопло). Заменил. Нииихрееенааа. Горло? Вполне. Игрался с пластиками, давно не печатал, забыл поставить очиститель филамента, могла попасть и пригореть пыль. Разбираю, чищу. Пробки нет, все чисто. Собираю обратно. Это писать быстро, а в жизни все делалось в промежутках пока компилируется, короче прошла неделя. А результата 0. Последняя надежда проверка калибровки экструдера. И это сработало. Сбилась уставка шага подачи. Как? Не знаю. Покораптились данные в EEPROM. Как тут в черную магию не поверить??? Ладно, дальше все 3D печатные работы пошли как по маслу.

Китайский чертило, или как он в той мифологии называется?

Пока принтер потихоньку шуршит своими шаговиками, решил потратить время компиляции на сборку светодиодов. Распаковал мешок красных ледиков, стал потихоньку монтировать. Начал с красной пластины. Дело не быстрое, если делать в фоне. Проверить светодиод, если брак установить, все, пластину можно выкинуть. Аккуратно приклеить его суперклеем, после установки всех светодиодов аккуратно припаять токоограничивающие резисторы и вывести точки питания. К концу рабочего дня (много кодил, редко компилил), красная пластина была готова. Решил проверить, как это будет выглядеть в корпусе и измерить ток, на сколько он соответствует расчетному. Так виртуозно матом давно не ругался. Нет, все светодиоды ярко светились, ток почему то был меньше расчетного. Но чистым красным они горели от силы 0.5с, далее переливаясь в зеленый, голубой и промежуточные цвета. Китайский продавец дважды накосячил. Вместо мешочка сверхъярких оранжевых светодиодов положил голубые, на это я успел высказать свое фе, вместо обычных красных переливающиеся со встроенным контроллером, даже не знаю, где их применить, кроме новогодней гирлянды. Но нет худа без бобра. Если с них снимать питание на 100мкс, то контроллер светика успевает сбросится и постоянно горит красный. А ШИМить (312.5Гц период) фонарики все равно собирался. Теперь у меня уже 2 мешка ненужных светодиодов.

На этом основные неприятности закончились. Из мелких: детали не все хорошо подошли. Из небольших углублений держателя светодиодов не удалось полностью извлечь поддержки, что усложнило монтаж. Пришлось высверливать отверстия держателя, а в шипы чаши вплавлять направляющие из медной проволоки, после чего клеить. Корпус для платы не получилось сделать из PLA бронзового цвета. Его остаток протух. Пластик стал ломким и не хотел слипаться. Слетел драйвер цветного принтера, когда собрался распечатать картинки. В заключение сдохла TF карта с G-code файлами моделей для 3D. Но самоделку доделал!

Фото этапов сборки
Собственно, сам корпус индикатора:


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


Отладка прошивки:

Обратите внимание, сетевой источник установлен, но имеется разрыв по + питания. Сделано это по соображениям безопасности, отладка выполнялась при питании от лабораторного источника, подключение сетевого питания осуществлялась перед сборкой в корпус. Желаю не сгорать на pet проектах!

Плата крайне простая, совсем капля МГТФа:


Все готово к сборке:

В качестве отражателя пригодилась крышка от термоконтейнера, в котором лежала очень вкусная еда

Фикс бага конструкции при помощи проволоки:


Готовый результат в начале статьи.

P.S.

Чертежи, схемы и прошивку не выкладываю, так как первые не совершенны, вторых вообще нет, только в голове и списке распайки GPIO, а прошивка без всего этого бессмысленна. Да и мало кто в DIY проекте сейчас будет писать на Ассемблере. Это меня укусило серийное производство электроники, где экономится каждая копейка. Первоначальный проект, на дощечке, особенно используя Ардуино с готовыми библиотеками, можно сделать за день. А мне охота было заняться тем, что называется словом, недопустимым правилами сайта. Надеюсь, сама идея Вам понравилась
Подробнее..

Обнажённая электроника бесплатные фото без СМС и регистрации

20.08.2020 16:15:21 | Автор: admin


Привет, Интернет. В процессе работы над проектом Nude Electronics Art я сделал достаточно качественные фотографии электронных плат и решил поделиться ими со всеми. Вы можете скачать их бесплатно на сайте Pixabay, в том числе для коммерческих целей. Коллекция будет потихоньку пополняться, в том числе и видеороликами.
В статье я немного расскажу про свой проект Nude Electronics, но для начала рекомендую
посмотреть видео с работами. Под катом много фотографий.

Основная идея Nude Electronics это создание художественных работ из электронных деталей. Начал я с изготовления подвесок (кулонов) из печатных плат, залитых прозрачной эпоксидной смолой.



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


Модель NE-6223 Свадьба (Wedding). Размер 25x25 мм, 2019

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

Уточнение

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


Модель NE-3232 Сакура (Sakura). Размер 35x35 мм, 2020

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


Модель NE-8483 Wylsacom тестирует Android (Wylsacom is testing Android). Размер 35x35 мм, 2020

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


Модель NE-3793 Канал Wylsacom (Wylsacom Channel). Размер 25x35 мм, 2020

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


Модель NE-2737 На лугу пасутся КО... (Without English translation). Размер 35x35 мм, 2020

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


Модель NE-7766 Большой Магазин (The Big Store). Размер 25x50 мм, 2020

На многих работах показан вид сверху на какую-то местность, как на карте.


Модель NE-6657 Городской пляж (City beach). Размер 25x50 мм, 2020

Хотя некоторые работы лучше вообще не пытаться осмыслить.


Модель NE-6511 Мысли (Thoughts). Размер 25x25 мм, 2018


Модель NE-9221 Пандемия (Pandemic). Размер 25x35 мм, 2020

Некоторые работы связаны между собой.


Модель NE-4057 Идеальность (Ideality). Размер 25x50 мм, 2018
Модель NE-9494 Реальность (Reality). Размер 25x35 мм, 2018


Модель NE-7353 Похолодание (Cold snap). Размер 25x35 мм, 2018
Модель NE-3573 Оттепель (Thaw). Размер 25x35 мм, 2018

Номера моделей я определял рандомно с помощью специальной программы, написанной в LabVIEW 2020 Community Edition (просто хорошо знаю эту систему).

Схема программы

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



На данный момент я решил не продавать эти работы, потому что дёшево отдавать не хочется, а за дорого никто не возьмёт. Буду создавать свою коллекцию, пока не надоест, а там посмотрим. По плану у меня создавать более крупные и детальные работы. Также хочу попробовать встроить рабочие схемы на солнечных батареях, хотя долговечность таких работ будет значительно меньше.
Ещё раз оставлю ссылку на все работы: Nude Electronics Art.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru