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

Diy-проекты

Онлайн встреча о Global Distributed Environmental Hackathon

05.10.2020 00:21:04 | Автор: admin

Привет, Хабр,
я член Brmlab Hackerspace в Праге и студент Чешского технического университета.

Приглашаю вас присоединиться к онлайн-встрече, посвященной организации распределенного глобального экологического хакатона для популяризации и продвижения гражданского хактивизма, хакер- и мейкер-спейсовв, D-I-Y / D-I-W-O науки и техники: https://meet.jit.si/sota

Подробнее ознакомиться с моей концепцией глобального экологического распределенного хакатона можно по ссылке: https://docs.google.com/presentation/d/1XnscTNm4SMzbRTsd1fQpPNg_4e2urOJKLeUXhk1uRRM

Принять участие в митапе можно по ссылке https://meet.jit.si/sota в 20:00 [пражское время GMT+2] в понедельник [5.10.20].

Подробнее..

Проект длиной в 8 лет знал бы ни за что не ввязался свой 2-тактный мотор

31.07.2020 22:07:35 | Автор: admin
Когда-то давно я понял, что мне мотора Иж Планета не хватает и я решил радикально модифицировать его сделать собственный цилиндр. По ходу сменился даже мотор. За его время я успел закончить школу, поступить в один вуз, вылететь и каким-то чудом перевестись в другой и отучиться там еще 5 лет и все равно я закончил и его уже два года назад. Знал бы я, что так оно растянется, наверное, не ввязался бы. Поскольку мы воспринимаем время относительно прожитого в сознательном возрасте, то для меня оно растянулось на половину прожитого времени.

Прошло уже 6 лет с момента выхода первой и последней заметки по этому проекту(Свой 2-тактный мотор. CR620 рекомендуется к ознакомлению). Тогда я остановился из-за проблем с аутсорсом в металлообработке. Кто не может, кто не хочет, кто делает бесконечно долго, кто и детали назад возвращать не хочет. А город в котором я живу имеет славную промышленную историю и был центром Петровской индустрии 18-века, но от славного прошлого ныне остался один корень в названии города и несколько действующих предприятий, на которых занято порядка единиц процентов населения. А сейчас не 90-е и даже не 00-е, когда можно было договорится с человеком с завода чтобы он что-то такое эдакое для тебя сделал. Теперь у них есть работа и КПП на входе, как я потом узнал номинальное. Вся эта история с передачей деталей где они лежат, а не делаются, поиск новых мест и тому подобное блуждание длилась несколько лет. Оказалось, что отлить сложную алюминиевую отливку у сарая на родительской даче я смог, а обработать, что не выглядело проблемой изначально нет.


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



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

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

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



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

Введение


К настоящему времени в двухтактных двигателях с кривошипно-камерной продувкой применяются системы управления сечением и/или фазой выпускного порта. Данные системы обеспечивают сглаживание кривой мощности. Изменение фазы или сечения выпускного порта выполняется с помощью заслонки, расположенной в выпускном канале. Ее положение зависит от оборотов коленчатого вала. Привод заслонки бывает пневматическим, механическим или электрическим. Например, на моторе мотоцикла Yamaha TZ500 при высоких оборотах, около 10500 мин-1, значение фазы выпуска составляет 202deg, а на низких около 180deg. На рисунке представлена конструкция мощностного клапана фирмы Yamaha.



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



В отличие от выпускного порта, каналы продувки характеризуются еще и углами выхода: горизонтальными и вертикальными. В случае пятиканальной продувки обычно получается четыре ненулевых и различных горизонтальных угла и пять (по два на 1-4 каналы и один на 5-й) вертикальных.


Горизонтальные углы продувочных каналов: A, B, C, D


Вертикальные углы основных каналов продувки

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

Авторы [A. Graham Bell. Two-Stroke Performance Tuning. Haynes Publishing, 1999.] утверждают, что во время продувки возникают колебания с собственной частотой $f_{пр}$:

$f_{пр} = \frac {c_{зв }} { 2 \pi* \sqrt { \frac { V_{кшк}}{S_{пр}^2}*( {l_{пр} + 0,187[a_{пр}+h_{пр}])}} }, (1) $

где:
$с_{зв}$ скорость звука в продувочном канале;
$V_{кшк}$ объем кривошипной камеры без учета объема продувочных каналов;
$l_{пр}$ средняя длина продувочного канала;
$S_{пр}$ средняя площадь поперечного сечения продувочного канала;
$a_{пр}$ ширина среднего поперечного сечения канала;
$h_{пр}$ высота среднего поперечного сечения канала.
Выражение $(l_{пр} + 0,187[a_{пр}+h_{пр}])$ представляет собой поправку, учитывающую влияние входной части продувочного канала.
Эта собственная частота, $f_{пр}$, должна быть равна:

$2 f_{пр} = \frac {3n} { \phi _{пр}}, (2) $

где:
$n$ чистота оборотов коленчатого вала двигателя;
$\phi _{пр}$ фаза продувки.
Таким образом, из выражения (2) следует, что собственная частота колебаний, возникающих во время продувки, прямо пропорциональна частоте оборотов двигателя, но правая часть выражения (1) не зависит от частоты вращения коленчатого вала. Поэтому продувка оптимально работает лишь в узком диапазоне оборотов, а для расширения рабочего диапазона необходимо внести зависимость от оборотов в правую часть выражения (1). Проще всего это сделать, введя зависимость средней площади поперечного сечения продувочного канала от оборотов. Чтобы не вносить нежелательных завихрений в поток газа в продувочном канале, желательно изменять сечение каналов продувки, меняя их количество. Например, с помощью золотников, перекрывающих некоторые каналы продувки. В рамках данного проекта предлагается перекрывать золотниками дополнительные каналы продувки.


Золотники в каналах продувки: левый полностью открыт, правый закрыт

Влияние данного решения было исследовано с помощью компьютерного моделирования продувки в пакете программ SolidWorks Flow Simulation. Продувка выполнена при постоянной разнице давлений между входом в каналы продувки и выходом из выпускного канала. Поршень считался неподвижным и находящимся в нижней мертвой точке. Процессы впуска и выпуска не учитывались. Разница давлений была выбрана из разницы объемов под поршнем в нижней и верхней мертвой точке и составляла 0,6 кг/см2. Из-за указанных выше допущений, результаты расчета в этом стационарном приближения можно рассматривать как качественные без количественной оценки. Поскольку, например, разделить во времени или пространстве процессы выпуска и продувки нельзя. В этом и заключается главная трудность для компьютерного моделирования двухтактных двигателей с кривошипно-камерной продувкой.

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


Траектории 2000 частиц при открытых золотниках в дополнительных продувочных каналах (пятиканальный режим)


Траектории 2000 частиц при закрытых золотниках в дополнительных продувочных каналах (трехканальный режим)

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


Заслонка мощностного клапана(МК) в опущенном состоянии


Продувки при закрытых золотниках в дополнительных каналах продувки и опущенной заслонке МК

Разработка моделей


На основании информации (таблица), полученной входе изучения цилиндров мотоциклов Kawasaki KX500, Honda CR500, Yamaha YZ490 и CZ 514, были выбраны фазы продувки и выпуска соответственно равные 125deg и 186deg, с полностью закрытым мощностным клапаном фаза выпуска уменьшается до 156о. Число продувочных каналов выбрано равным пяти и выпуск из двух основных окон и двух дополнительных портов. На впуске был установлен лепестковый клапан.
Ход поршня, мм Длина шатуна, мм Высота выпускного окна, мм Высота продувочного окна, мм Фаза выпуска, град. Фаза продувки, град.
Honda CR500 79 144 34 15.5 180.1 119.5
Yamaha YZ490 82 137 37.8 16.8 188.5 123.7
Cezet type 514 72 130 32 17 183.4 131.5
Kawasaki KX500 86 145 36.5/40 17 180.1/189.3 121.3
Проект CR724 79 144 26/36 17 156/185.8 125.3

Примечание: Если в ячейке указаны два параметра высоты выпускного окна или фазы выпуска, то первая относится к состоянию с полностью закрытым МК, а вторая с открытым.

После замеров сопрягаемых с цилиндром элементов базового двигателя было выполнено создание трехмерной твердотельной модели газораспределительных каналов и сопряженных с ними полостей. Все чертежи были выполнены с использованием пакета программ SolidWorks.


Твердотельная модель газораспределительных каналов

Начало именно с твердотельной модели каналов позволяет минимизировать число толстых мест отливки и уменьшить ее массу. На следующем шаге вокруг модели каналов была построена оболочка с толщиной стенок 4-6 мм и нижним крепежным фланцем.


Оболочка каналов без выреза модели каналов

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


Твердотельная модель цилиндра без выреза модели каналов

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




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

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

Проект длиной в 8 лет знал бы, ни за что не ввязался свой 2-тактный мотор

01.08.2020 02:11:11 | Автор: admin
Когда-то давно я понял, что мне мотора Иж Планета не хватает и я решил радикально модифицировать его сделать собственный цилиндр. По ходу сменился даже мотор. За его время я успел закончить школу, поступить в один вуз, вылететь и каким-то чудом перевестись в другой и отучиться там еще 5 лет и все равно я закончил и его уже два года назад. Знал бы я, что так оно растянется, наверное, не ввязался бы. Поскольку мы воспринимаем время относительно прожитого в сознательном возрасте, то для меня оно растянулось на половину прожитого времени.

Прошло уже 6 лет с момента выхода первой и последней заметки по этому проекту(Свой 2-тактный мотор. CR620 рекомендуется к ознакомлению). Тогда я остановился из-за проблем с аутсорсом в металлообработке. Кто не может, кто не хочет, кто делает бесконечно долго, кто и детали назад возвращать не хочет. А город в котором я живу имеет славную промышленную историю и был центром Петровской индустрии 18-века, но от славного прошлого ныне остался один корень в названии города и несколько действующих предприятий, на которых занято порядка единиц процентов населения. А сейчас не 90-е и даже не 00-е, когда можно было договорится с человеком с завода чтобы он что-то такое эдакое для тебя сделал. Теперь у них есть работа и КПП на входе, как я потом узнал номинальное. Вся эта история с передачей деталей где они лежат, а не делаются, поиск новых мест и тому подобное блуждание длилась несколько лет. Оказалось, что отлить сложную алюминиевую отливку у сарая на родительской даче я смог, а обработать, что не выглядело проблемой изначально нет.


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


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

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

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


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

Введение


К настоящему времени в двухтактных двигателях с кривошипно-камерной продувкой применяются системы управления сечением и/или фазой выпускного порта. Данные системы обеспечивают сглаживание кривой мощности. Изменение фазы или сечения выпускного порта выполняется с помощью заслонки, расположенной в выпускном канале. Ее положение зависит от оборотов коленчатого вала. Привод заслонки бывает пневматическим, механическим или электрическим. Например, на моторе мотоцикла Yamaha TZ500 при высоких оборотах, около 10500 мин-1, значение фазы выпуска составляет 202deg, а на низких около 180deg. На рисунке представлена конструкция мощностного клапана фирмы Yamaha.


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


В отличие от выпускного порта, каналы продувки характеризуются еще и углами выхода: горизонтальными и вертикальными. В случае пятиканальной продувки обычно получается четыре ненулевых и различных горизонтальных угла и пять (по два на 1-4 каналы и один на 5-й) вертикальных.


Горизонтальные углы продувочных каналов: A, B, C, D


Вертикальные углы основных каналов продувки

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

Авторы [A. Graham Bell. Two-Stroke Performance Tuning. Haynes Publishing, 1999.] утверждают, что во время продувки возникают колебания с собственной частотой $f_{пр}$:

$f_{пр} = \frac {c_{зв }} { 2 \pi* \sqrt { \frac { V_{кшк}}{S_{пр}^2}*( {l_{пр} + 0,187[a_{пр}+h_{пр}])}} }, (1) $

где:
$с_{зв}$ скорость звука в продувочном канале;
$V_{кшк}$ объем кривошипной камеры без учета объема продувочных каналов;
$l_{пр}$ средняя длина продувочного канала;
$S_{пр}$ средняя площадь поперечного сечения продувочного канала;
$a_{пр}$ ширина среднего поперечного сечения канала;
$h_{пр}$ высота среднего поперечного сечения канала.
Выражение $(l_{пр} + 0,187[a_{пр}+h_{пр}])$ представляет собой поправку, учитывающую влияние входной части продувочного канала.
Эта собственная частота, $f_{пр}$, должна быть равна:

$2 f_{пр} = \frac {3n} { \phi _{пр}}, (2) $

где:
$n$ чистота оборотов коленчатого вала двигателя;
$\phi _{пр}$ фаза продувки.

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


Золотники в каналах продувки: левый полностью открыт, правый закрыт

Влияние данного решения было исследовано с помощью компьютерного моделирования продувки в пакете программ SolidWorks Flow Simulation. Продувка выполнена при постоянной разнице давлений между входом в каналы продувки и выходом из выпускного канала. Поршень считался неподвижным и находящимся в нижней мертвой точке. Процессы впуска и выпуска не учитывались. Разница давлений была выбрана из разницы объемов под поршнем в нижней и верхней мертвой точке и составляла 0,6 кг/см2. Из-за указанных выше допущений, результаты расчета в этом стационарном приближения можно рассматривать как качественные без количественной оценки. Поскольку, например, разделить во времени или пространстве процессы выпуска и продувки нельзя. В этом и заключается главная трудность для компьютерного моделирования двухтактных двигателей с кривошипно-камерной продувкой.

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


Траектории 2000 частиц при открытых золотниках в дополнительных продувочных каналах (пятиканальный режим)


Траектории 2000 частиц при закрытых золотниках в дополнительных продувочных каналах (трехканальный режим)

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


Заслонка мощностного клапана(МК) в опущенном состоянии


Продувки при закрытых золотниках в дополнительных каналах продувки и опущенной заслонке МК

Разработка моделей


На основании информации (таблица), полученной входе изучения цилиндров мотоциклов Kawasaki KX500, Honda CR500, Yamaha YZ490 и CZ 514, были выбраны фазы продувки и выпуска соответственно равные 125deg и 186deg, с полностью закрытым мощностным клапаном фаза выпуска уменьшается до 156о. Число продувочных каналов выбрано равным пяти и выпуск из двух основных окон и двух дополнительных портов. На впуске был установлен лепестковый клапан.
Ход поршня, мм Длина шатуна, мм Высота выпускного окна, мм Высота продувочного окна, мм Фаза выпуска, град. Фаза продувки, град.
Honda CR500 79 144 34 15.5 180.1 119.5
Yamaha YZ490 82 137 37.8 16.8 188.5 123.7
Cezet type 514 72 130 32 17 183.4 131.5
Kawasaki KX500 86 145 36.5/40 17 180.1/189.3 121.3
Проект CR724 79 144 26/36 17 156/185.8 125.3

Примечание: Если в ячейке указаны два параметра высоты выпускного окна или фазы выпуска, то первая относится к состоянию с полностью закрытым МК, а вторая с открытым.

После замеров сопрягаемых с цилиндром элементов базового двигателя было выполнено создание трехмерной твердотельной модели газораспределительных каналов и сопряженных с ними полостей. Все чертежи были выполнены с использованием пакета программ SolidWorks.


Твердотельная модель газораспределительных каналов

Начало именно с твердотельной модели каналов позволяет минимизировать число толстых мест отливки и уменьшить ее массу. На следующем шаге вокруг модели каналов была построена оболочка с толщиной стенок 4-6 мм и нижним крепежным фланцем.


Оболочка каналов без выреза модели каналов

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


Твердотельная модель цилиндра без выреза модели каналов

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




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

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

Свой 2-тактный мотор дела литейные

12.08.2020 18:08:51 | Автор: admin
В прошлой части был показан процесс разработки модели цилиндра. В этой речь пойдет о его материализации. На момент начала этой работы у меня имелся опыт литья нескольких сотен мелких деталей из алюминия и мучительной отливки прошлой версии цилиндра, которая так и не была закончена. Ее удалось отлить лишь с пятого или шестого раза, уже и не помню А ведь на каждый комплект одноразовых форм приходилось тратить около месяца работы. Проблема была в захвате воздуха литниковой системой при заливке металл захватывал воздух, который образовывал пустоты в теле. Какие только литниковые системы я не пробовал, какие только советские литейные талмуды не читал все было без толку. И так бы продолжалось и далее пока я не решил испробовать радикальное решение проблемы наклонный под 30-45 к вертикали литник большого сечения. С ним отливка сразу получилась как нужно.



Осенью 17-го года товарищ позвал меня с ним участвовать в конкурсе умник, поскольку сам он уже участвовал, а второй раз нельзя. По сему грант выдают де-юре 0,5Мруб на два года без какой-либо отчетности о растратах, хотя де-факто на руках оказывается 4/5 от общей суммы. Так уж повелось, что на эти деньги принято покупать самобеглую повозку. Я же хотел иначе и согласился с условием потратить деньги на развитие мастерской и, по-крайней мере, купить фрезерный станок. Как я понял, это в планы моего коллеги не входило и в дальнейшем разговор не поднимался. Позже я узнал, что был найден другой прокси. Данный факт задел мое самолюбие, и я решил, что у меня будет свой грант со станками и оснасткою. Оставалось найти проект, в котором будет что-то протаскиваемое в тематику, и тут как нельзя лучше подвернулся тянувшийся на тот момент около пяти лет CR620/724. На тот момент у меня были готовые модели цилиндра 724см и сопутствующей мелочевки и кроме того возможность реализовать это своими силами 3D-печать, технология литья, рабочая литниковая система для таких сложных отливок и токарный станок. Я решил, что грант пойдет на косвенные траты по проекту, а делаться будет, в основном, за свой счет. В случае победы я получал жесткие сроки, с коими у меня проблема. Заявка прошла. Необходимость показать какие-то железяки на защите проектов вынудила меня ускорится.

Экспозиция дана и теперь настало время перейти непосредственно к технической части.

Процесс изготовления литейной оснастки


Методы литья бывают как с многоразовой модельной оснасткой, так и с одноразовой. Модельная оснастка нужна для получения литейных формы. Заливка металла производится в литейные формы, которые тоже бывают многоразовые (металлические, в основном при использование литья под давлением). Литейная форма состоит из внешней формы и внутреннего стержня, задача которого сформировать полости в отливке. В данном проекте было использовано литье в землю, то есть в одноразовые литейные формы, состоящие из смеси минералов.
Для применения многоразовой модельной оснастки необходимо в процессе проектирования отливки учитывать проблему извлечения элементов литейных форм из модельной оснастки (многоразовая модельная оснастка аналогичного цилиндра, стержень(крайний справа) и отливка(по центру) показана на главной картинке статьи). Часто, например, картер мотоциклетного двигателя и его крышки, для получения литейных форм достаточно четырех деталей модельной оснастки (две полуформы наружной поверхности и две для стержня). Однако, для цилиндра двухтактного двигателя, из-за сложной геометрии внутренних полостей, нужен набор из примерно двух десятков деталей модельной оснастки. А поскольку в рамках данной работы не ставится цель получить много одинаковых отливок, то было принято решение использовать одноразовую модельную оснастку.

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


Модель отливки цилиндра

Для получения отливки было использовано литье по выплавляемым моделям. В этом случае модельная оснастка представляет собой модель отливки из легкоплавкого материала (литейного воска или подходящего пластика). В данном проекте был использован пластик PLA (полилактид), покуда он в отличие от многих других имеет явную температуру плавления, после которой его вязкость резко уменьшается, что позволяет ему легко вытечь из литейной формы, в отличии от ABS, который имеет недостаточно низкую вязкость до, по-крайней мере, 300С. При прокаливании остатки пластика сгорают с образованием незначительного количества твердых отходов, которые, в отличии от ABS пластика, не сцеплены со стенками литейной формы и легко выдуваются сжатым воздухом. При нагреве ABS до 700-800С без хорошего доступа кислорода образуются твердые тела, сцепленные с формой, которые потом портят отливку.
Для литья по этой технологии важным является газопроницаемость литейной формы, ибо в ней все равно остаются вещества, переходящие в газовую фазу при нагреве до температуры расплава. В случае плохой газопроницаемости материала литейной формы в отливке образуются газовые пузыри, что является одной из наиболее частых причин брака в литейном деле.
Пластиковая модель отливки цилиндра была изготовлена путем трехмерной печати. Однако, размер области печати принтера меньше габаритов отливки, из-за чего пришлось разбить ее на составные элементы. Изготовление всех остальных деталей было выполнено с помощью этого же процесса.


Разбиение модели отливки цилиндра для трехмерной печати

Изготовление модели цилиндра двигателя и его литейных форм


Модель была напечатана слоем 250мкм из PLA пластика и состояла из двадцати частей. Все части модели отливки печатались с 10% заполнением. Компоненты модели были собраны на центрирующих штифтах и склеены, а стыки между ними заделаны литейным воском. Без заделки стыков на отливке будут повторены щели между ними, которые тяжело вычищаются от остатков формовочной смеси и являются концентраторами напряжения. В модели были выполнены технологические отверстия в рубашку охлаждения. Эти отверстия создают дополнительные опоры для непрочного, в силу своей геометрии, стержня рубашки охлаждения. Иначе во время заливки он может расколоться от неравномерного нагрева и его осколки будут увлечены течением расплава, что уже приводило к браку похожих отливок. Любое повреждение литейных форм при заливке порождает свободные частицы, которые всегда портят отливку. Поэтому лучше сделать технологические отверстия в удобных местах, чем потом придумывать как заварить дефект где-то внутри.

Материалом для литейных формы служил просеянный песок фракции 0,63мм в смеси с натриевым жидким стеклом в пропорции 4/1. Формовочную смесь необходимо тщательно утромбовать и уделить особое внимание каналам в отливке. Перед захоронением модели с заполненными каналами в формовочную смесь желательно снять небольшой слой смеси с выходов каналов она успевает начать твердеть на воздухе и после литейная модель может расколоться по этим поверхностям, чего-бы не хотелось. После завершения формовки для затвердения смеси ее необходимо через проколы продуть углекислым газом. CO разрывает связь между оксидом натрия и оксидом кремния в жидком стекле и SiO сцепляет песчинки между собой.

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


Собранная модель отливки

Литник был выполнен наклонным под углом 45 к вертикали.


Проверка сопряжений литейных форм

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


Прокаленная литейная форма

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


Для заливки был использован силумин марки АК9ч, поскольку он обладает хорошей прочностью и жидкотекучестью, низкой литейной усадкой и является классическим выбором для изготовления цилиндров и блоков двигателей с чугунными гильзами. Слитки были разделены на небольшие, влезающие в тигель фрагменты, и расплавлены в плавильной печи(печь самодельная, могу осветить конструкцию). Когда расплав прогрелся до температуры на 20С ниже температуры заливки, из печи была извлечена нагретая до 300С литейная форма, которая оставалась нагретой с прокалки, и установлена в подготовленную кирпичную опалубку.
Пространство между формой и опалубкой было засыпано песком для предотвращения вытекания расплава из возможных трещин, а стыки компонентов формы были заделаны формовочной смесью. Заливка была выполнена при температуре расплава в 740С. Больно ответственный момент для мыслей о картинках и отвлекаться на другого человека с фотоаппаратом тоже не хочется Когда отливка остыла, форма была разбита, стержень выбит, а остатки формовочной смеси, находящиеся в труднодоступных местах, были вымыты мойкой высокого давления. Литниковая система была отрезана, технологические отверстия в отливке были заварены, а сама отливка прошла искусственное старение без предварительной закалки согласно ГОСТ 1583-93.
Фотографий заливки увы нет.


Отливка цилиндра

Вместо заключения


По проекту будет использован низ двигателя картера Honda CR500. Картер был модифицирован для расширения продувочных каналов, юбки гильзы большего диаметра и переноса шпилек. В проект цилиндра была заложена возможность увеличения хода поршня до 95мм в новом картера, из-за опасения повреждения родного картера.

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

Прошлые части:
Часть нуль: Свой 2-тактный мотор. CR620
Часть первая: Проект длиной в 8 лет знал бы, ни за что не ввязался: свой 2-тактный мотор
Подробнее..

История создания Аркадных автоматов для серьезного заказчика с несерьезным дизайнером

04.11.2020 08:17:24 | Автор: admin
НачалоНачало

Всем привет! В этой статье я расскажу историю создания двух Аркадных автоматов с играми для них, и попутно ответим на вопросы:

- Как сделать то, чего никогда не делал

- Как установить LED панель на 32 дюйма куда угодно

- Как найти дизайнера и потерять покой

- Важные уроки жизни: Сжатые сроки. Грабли для каждого?

Глава 1. Воодушевляющее начало

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

Чем он примечателен? США снова дружат с Кубой, Skyrim уже 4 года, а Плутон застукали нагишом. Я же в тот далекий год получил интересный заказ на изготовление двух аркадных автоматов для крупной сети квестовых комнат. До него все автоматы делались для себя и исключительно как хобби.

Переговоры с заказчикомПереговоры с заказчиком

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

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

Классический корпусКлассический корпус

Первый автомат должен иметь корпус схожий с классическим, управление в виде 5 кнопок, начинкой из PC и экраном в 19 дюймов. Просто и надежно. Смотрим дальше.

Cocktail TableCocktail Table

Второй автомат заказчик хотел видеть в корпусе Cocktail table с элементами управления с двух сторон, начинкой из PC и огромной LED панелью в 32 дюйма. Вот оно! Как поется в песне - Лучше корпуса может быть только корпус, который еще не собирал. Венцом на этом аппарате должна стать LED панель на 32 дюйма в горизонтальном положении. Это интересно!

Qix (1981)Qix (1981)

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

Второй автомат станет гордым обладателем наследия игры QIX 1981 года. Механику оставляем, остальное наше. Необходимо аккуратно открыть всю картинку на экране. Запомнить и дальше по квесту.

Успеть за 37 днейУспеть за 37 дней

Определим основные задачи:

- Спроектировать и собрать два Аркадных автомата

- Разработка двух игр, работающих последовательно и в связке с оборудованием квест комнаты

- Сделать проект за 37 дней

К умопомрачительному сроку изготовления для полноты картины стоит добавить один несущественный нюанс. Каждый день просрочки равен штрафной неустойке в 4000 рублей. Какая ерунда по сравнению с чувством сборки ранее неизведанного корпуса и возможностью установить LED панель на 32 дюйма в Аркадный автомат.

Глава 2. Приступаем к работе

Комплектующие под управлениеКомплектующие под управлениеСхема подключенияСхема подключения

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

Игры для автоматовИгры для автоматов

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

Признаюсь, игры я делать не умею. Всех, кто связан с программированием считаю магами и волшебниками. Как сделать то, что не умеешь? Есть 100% работающий метод, записывайте. Найти профессионалов и доверить работу им. Не будем спорить с опытом предков и поступим так же. Нашел братьев Белорусов с игровой студией, скинул им ТЗ и после многочисленных правок и доработок игры были готовы. Задачу интеграции игр с помощью протоколов в систему квест комнаты и возможность удаленного управления администратором тоже реализовали.

Cocktail TableCocktail TableКлассический корпусКлассический корпус

Движемся дальше. Корпуса. Вопросов по классическому Аркадному автомату не было. Берем наш любимый корпус в виде Bartop, фаршируем его ПК железом и добавляем к нему стойку. Не забываем про модульность конструкции, верхняя часть при необходимости легко снимается со стойки.

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

3D модели автоматов3D модели автоматов

Наглядные 3D модель автоматов, которые можно покрутить повертеть. Удобно. Берем несколько листов МДФ на 16мм и отправляем на резку. МДФ это мощь, надежность и тяжесть! До сих пор не понимаю почему не использовал ЛДСП. Молодо зелено.

Глава 3. Если друг оказался вдруг

Примерка АртовПримерка Артов

Основной темой в оформлении автоматов была выбрана стилистика вселенной фильма Трон. Справедливо решив, что моего опыта на уроках ИЗО в 3 классе недостаточно я приступил к поискам профессионала в этом деле. Открыл фриланс биржу и отсортировав по нужным мне параметрам его нашел (не делайте так). Все было при нем. Огромный опыт, шикарное портфолио, работа с крупными брендами и т.д. Скинул ему ТЗ, уточнил цену и сроки. Оплатил и стал ждать чуда.

АртыАрты

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

Directed by...Directed by...

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

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

Глава 4. Результат и выводы

BartopBartopВ сборе со стойкойВ сборе со стойкойCocktail TableCocktail TableCocktail Table 2Cocktail Table 2УпаковкаУпаковка

Собираем корпус и клеим Арты. Фото сборки корпусов и нанесение Артов, к сожалению, не сохранились. Дальше было недолгое тестирование и шлифовка игр. Контрольные прогоны по взаимодействию с квест комнатой и упаковка перед отправкой. Не ругайте за отсутствие хороших финальных фото и видео, поставленные сроки совсем выбили из головы необходимость данных действий.

Мы успели. Успели за 37 дней спроектировать и собрать два аркадных автомата, один из которых в новом для нас корпусе. Разработать и наладить работу двух игр на них. Получили бесценный опыт работы с заказчиком и познакомились с великолепными людьми, настоящими профессионалами своего дела.

Я благодарен заказчику. За работу по договору, за внятные и четкие ТЗ, за адекватность и поддержку на всем этапе работы. Это прозвучит странно, но главная благодарность за сжатые сроки, именно не иллюзорная возможность попадать на 4к рублей каждый день, двигали проект вперед. Спасибо братьям Белорусам за игры, дизайнеру за жизненные уроки и Арты.

Какие уроки я усвоил для себя:

- Не бойтесь нового

- Соблюдайте условия договора и ТЗ

- Не судите людей по обертке

- Делегируйте работу профессионалам

- Ставьте реальные сроки

- Запускайте процессы параллельно, чтобы не тормозить разработку

Увидели ничем не занятое место? Установите туда LED панель на 32 дюйма. Спасибо что дочитали статью до конца и будьте счастливы!

Подробнее..

Начать заниматься роботами должно быть просто

09.11.2020 08:05:16 | Автор: admin

Введение


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

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



Интересно? Тогда начнём.


Возраст


Изначальная предполагаемая целевая аудитория дети примерно 7-10 лет, но уверен, что это может быть интересно и детям в возрасте до 99 лет и старше.

От себя лично могу добавить, что при определённой помощи данный процесс удалось успешно донести и повторить в классе из десяти детей в возрасте примерно 5-6 лет, пусть и с некоторыми упрощениями и абстракциями. Детям понравилось и это главное.

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

Полностью с нуля со всеми деталями можно собрать это примерно за 2-3 часа. Или чуть дольше если торопиться и что-то пойдёт не так.

Идея


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

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

Теория


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

Устройство робота можно свести к трём основным узлам:
Сенсоры (Sense) это сенсоры, которыми робот видит окружающий мир. В нашем случае это глаза робота, которые смотрят на дорогу.
Мозг (Plan) это та часть робота, которая получает информацию от сенсоров, обрабатывает и передаёт команды на исполняемые части.
Исполнители (Act) эти части робота непосредственно выполняют действия по командам, которые были получены от мозга.

Sense-Plan-Act
Sense-Plan-Act является уже устаревшей формулировкой, но в данном упрощённом варианте она вполне неплохо объясняет эти простые принципы.


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

Упрощённо полный путь сигнала можно представить в виде: глаза -> мозг -> мышцы -> ноги.

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

Реализация


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

Программная часть:


Алгоритм


Алгоритм до безобразия прост:
У робота впереди стоят два сенсора, которые смотрят на дорогу. Сенсоры могут различать светлое и тёмное по тому как отражается свет от поверхности.
Дорога выполнена в виде тёмной полосы, по которой робот едет.
Если оба сенсора видят светлое значит, мы идём по дороге, так как наша тёмная дорога проходит ровно между сенсорами.
Когда один сенсор видит тёмное, то дорога ушла вбок и мы делаем поворот колесо со стороны этого сенсора замедляется.
В случае когда оба сенсора видят тёмное, то это сигнал остановки.

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

Сам код можно посмотреть на github.com/nochkin/esp-line-follower.

Закачивание программы в мозг


Когда я вёл класс с 5-6-летками, то на все мозги предварительно была загружена нужная программа, что бы не тратить на это время во время класса.
Сам процесс закачивания программы в микроконтроллер не отличается от других Arduino-совместимых плат: установить плагин для ESP8266 (если ещё не установлен), подключить ESP8266 модуль по USB, открыть или скопировать скетч (файл .ino) и нажать Upload.
Тут есть более подробная инструкция установки поддержки ESP8266 в Arduino для тех, кто с этим пока не знаком:
github.com/esp8266/Arduino#installing-with-boards-manager

Железная часть:


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

Схема соединений


Примерная схема соединений получается такой:


Список основных компонентов:


  1. ESP8266 NodeMCU v2
  2. Motor Shield для NodeMCU v2
  3. Пара инфра-красных сенсоров
  4. Двух-колёсное шасси с моторами и колёсами
  5. Соединительные провода (Dupont wires) для сенсоров
  6. Дополнительные винты/гайки/крепления для установки сенсоров и контроллера на шасси
  7. Чёрная изолента для дороги (если поверхность достаточно светлая, то можно и синюю)

Общая стоимость всех деталей обычно не превышает $20.

Немного подробнее о компонентах:
  1. ESP8266 NodeMCU v2:

    Существует несколько вариантов ESP8266 NodeMCU модулей. Они не все совместимы друг с другом как электрически, так и механически.
    В данном проекте используется ESP8266 NodeMCU v2. Самый простой признак этот модуль использует CP2102 для USB интерфейса. Вариант NodeMCU на базе CH340G обычно шире физически и поэтому не подойдёт для драйвера моторов.
  2. Motor Shield для NodeMCU v2:

    Прелесть этого модуля тем, что NodeMCU плата вставляется в него и поэтому количество проводов в проекте сильно уменьшается.
    Существует только один вариант этого модуля на базе L293DD. Этой микросхемы достаточно как раз что бы раскачать двигатели на нашем шасси.
  3. Инфракрасные сенсоры:

    Данные модули представляют из себя светодиод (излучатель) и фотодиод (приёмник). По отражению робот может определить что он видит перед собой тёмную полосу или светлый пол.
    Я советую брать модули с подстройкой, что бы можно было отрегулировать чувствительность и уменьшить ложные срабатывания при определении светлого и тёмного.
    Советую заказать больше двух стоят они не много, но у них есть высокий риск сломаться при неосторожном обращении.
  4. Для шасси был выбран один из самых популярных и доступных вариантов на интернет просторах.
    В этом комплекте уже есть моторы со встроенными редукторами, колёса, держатель для трёх AA элементов и минимальный набор винтов и гаек что бы это всё собрать вместе.
    Как альтернативный вариант для питания, можно заменить держатель 3 * AA на держатель для одного литий-йоного элемента в формате 18650.
  5. Dupont провода.
    Провода надо с разъёмами мама-мама (female-female). Оптимальная длина примерно 20 см. Желательно что бы провода были разных цветов во избежании путаницы при подключении.
  6. Дорога

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


Сборка


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

  1. Небольшая подготовительная операция.
    a) Часто провода идут не припаянными к моторам. В этом случае надо их припаять. Это единственный момент где нужна пайка. Если нет вариантов, то можно кого-то заранее попросить припаять или попробовать самому прикрутить провода, но в случае прикручивания сложно сделать хороший контакт. Надо иметь это в виду.
    b) Модули драйвера двигателей могут идти с джампером на гребёнке с питанием (VIN-VM-NC) или без оного. В последнее время джампер не ставят, но сама гребёнка есть.
    Если есть джампер в закромах, то надо его поставить в позицию VIN-VM. У меня не было такого количества джамперов для всего класса и я просто припаял перемычку снизу платы.
    Конфигурация VIN-VM позволяет использовать один и тот же источник питания для моторов и для мозгов.

  2. Начнём со сборки самой платформы.
    Перед установкой компонентов я советую установить шестигранные крепления для модуля драйвера двигателей и инфракрасных сенсоров.

    Теперь установим держатели для моторов и сами моторы. Колёса лучше ставить в самом конце.
    Потом надо установить держатель для AA элементов. Провода пока соединять не надо. Выключатель я не устанавливал, так как на модуле драйвера двигателя уже есть выключатель.
    Часто в комплекте есть энкодеры (круглые диски с поперечными отверстиями по кругу), но в данном проекте они не используются, поэтому устанавливать не обязательно.
  3. Вставляем мозг робота на мышцы, то есть ставим модуль микроконтроллера на модуль драйвера двигателей.
    Важно соблюдать правильное направление, иначе будет взрыв мозга в виде белого дыма, на котором работает вся электроника в мире. Антенна на модуле микроконтроллера должна совпадать с нарисованной антенной на модуле драйвера.
  4. Привинчиваем бутерброд с мозгами и мышцами на шасси.


  5. Устанавливаем два инфракрасных сенсора так, что бы передатчик-приёмник смотрели вниз.
    Можно либо установить сами модули вертикально (но я не придумал как это сделать легко), либо подогнуть передатчик-приёмник на 90 градусов. Подгинать надо не спеша, что бы не отломать их случайно. Если есть время, то может быть проще просто перепаять как надо без риска отломать.

  6. Соединяем провода.
    На модуле драйвера есть восемь синих клемм. Достаточно ослабить их отвёрткой, что бы внутрь пролез провод и потом закрутить винт, что бы провод не выпадал и имел хороший контакт.
    Подключим питание на VIN и GND (VIN-красный, GND-чёрный). Важно соблюдать полярность и не перепутать плюс и минус.
    Подсоединим оба мотора на A-/A+ для левого и b+/B+ для правого. Тут тоже надо соблюдать полярность, но при ошибке мотор будет крутиться в другую сторону и в этом случае достаточно провода поменять местами в клеммах.
    Теперь соединим глаза. Тут я использую Dupont wire для удобства. Пожалуй, для детей (да и для некоторых взрослых) это самый сложный шаг. У каждого модуля сенсора есть три контакта плюс (VCC), минус (GND) и сигнал (OUT). Сложность в том, что на модуле драйвера эти сигналы стоят в другом порядке и важно проверить правильное соединение.
    Левый глаз робота идёт на группу 5, а правый глаз идёт на группу 6 (группы заданы в программе робота).


Первый пуск


Ставим наше творение на относительно светлый пол (главное, не на стол или куда-то ещё откуда он может упасть) и включаем кнопкой на модуле драйвера. Кнопка находится ближе к синим клеммам и рядом с VIN-VM-NC джампером.
На пустом относительно светлом полу робот должен ехать вперёд. Он может немного заворачивать вбок из-за асимметричности моторов или сборки, но это не так важно.
Если робот крутиться на месте как кот, играющийся со своим хвостом, то это означает то, что один из моторов с перевёрнутой полярностью. Провода этого мотора надо поменять местами на синих клеммах.
На случай если робот едет назад, то полярность надо поменять на двух моторах.
Бывает что один из моторов не крутиться вообще, обычно достаточно проверить соединение, так как бывает что провод слишком глубоко закручен в синюю клемму и прижим приходится на изоляцию от провода, а не на сам провод.

Проверка зрения


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

Дорога


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

Итог


Он видит. Он едет. Сам.

Это результат одного из проведённых классов по сборке с пяти-летними студентами:


А тут самое интересное запуск и проверка:




Небольшие потери
Конечно, не обошлось и без небольших потерь когда кто-то случайно наступил на соседнего робота во время восторга:


Подробнее..

Как сделать из планшетного USB-сканера сетевой с памятью, используя Raspberry Pi. Видеолекция с демонстрацией

23.11.2020 18:14:08 | Автор: admin
Раз уж сегодня посыпались публикации про Raspberry Pi, вставлю свои пять копеек. Выложил на днях на Youtube лекцию с демонстрацией, как из Raspberry Pi и USB-сканера сделать девайс для сканирования с сетевым диском, используя SANE, Samba и WiringPi, владея немного электрикой и bash-ем. Всё продемонстрированное эксплуатируется в реале, хоть и в несколько адаптированном виде. Интересующихся приглашаю посмотреть ну и покритиковать тут в комментах и карме. :)


Лекция получилась почти на 2 часа, так что, наверное, лучше смотреть прямо на Youtube; в описании к ролику есть оглавление. Возможно, при наличии времени дополню здесь текстом.
Приятного просмотра. :)
Подробнее..

NeoPixel ESP8266 PLYWOOD WALL LAMP BATMAN (part 1)

04.12.2020 20:21:06 | Автор: admin

Номинант на премию БОМЖ-ПРОЕКТ ГОДА 2020

Практически готовый светильникПрактически готовый светильник

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

P.S. Осторожно, много картинок!

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

Что ж, начнём.

  • Халтура состояла в изготовлении настенного светильника Бэтмен, с управлением по ви-фи с телефона

Введите описание картинкиВведите описание картинки
  • В виде заготовки под будущий светильник была принесена с помойки найдена куплена фанера толщиной 12мм и размером 1050х500мм:

"Сырец" под будущий настенный светильник"Сырец" под будущий настенный светильник
  • Нужный рисунок был распечатан на листах А4 и наклеен на фанеру для дальнейшей обводки контуров:

Прикладываем к фанере распечатанный рисунокПрикладываем к фанере распечатанный рисунокПосле подрезки и проклейки получаем готовый шаблон для обводки контураПосле подрезки и проклейки получаем готовый шаблон для обводки контура
  • В итоге светильник должен получиться примерно 900х470мм. После того как я обвёл края рисунка курвиметром старой шариковой ручкой, а потом уже прошёлся карандашом по выдавленной в фанере бороздке, у меня получилось что-то такое:

Фанера с нанесённым контуром будущего светильникаФанера с нанесённым контуром будущего светильника

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

  • Итак, после того, как контуры были нанесены, я взял ножовку и откромсал наиболее крупные куски фанерного листа:

Отрезая лишнееОтрезая лишнее

P.S.S.S Отдельной мастерской у меня в наличии тоже нет, работать на улице было нельзя из-за запрета выходить на улицу без ветсправок, а значит пришлось модернизировать свой компьютерный стол по последнему слову столярной техники. Для этого мне была выделена старая простыня (держали для гостей, не иначе), были взяты дешёвые китайские струбцины и ручной лобзик. Так закалялась сталь

  • После того как стол был подготовлен к работе, ручным лобзиком я начал удалять все лишние куски (Микеланджело, привет!):

Использование компьютерного стола под верстак. Идея так себе, ибо края в нескольких местах покрошились.Использование компьютерного стола под верстак. Идея так себе, ибо края в нескольких местах покрошились.Введите описание картинкиВведите описание картинкиТонкий слой деревянной пыли лёг на всё в радиусе комнаты, а "осколки" фанеры удачно легли в заранее подготовленный карман. Однако, для борьбы с пылью в какой-то момент я начал использовать пульверизатор. Помогало слабо, но лучше, чем ничего :)Тонкий слой деревянной пыли лёг на всё в радиусе комнаты, а "осколки" фанеры удачно легли в заранее подготовленный карман. Однако, для борьбы с пылью в какой-то момент я начал использовать пульверизатор. Помогало слабо, но лучше, чем ничего :)

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

Зубья полотна направлены от левого края в сторону рукояткиЗубья полотна направлены от левого края в сторону рукоятки

Всё очень просто:

  1. Ручной лобзик рассчитан на движение сверху вниз, значит рукоятка лобзика должна находиться снизу, за неё вы будете тянуть лобзик перпендикулярно подопытной поверхности.

  2. Раз ход лобзика сверху вниз, то и зубья должны смотреть вниз, в сторону рукоятки

  3. После того как определились с направлением, пришло время установить само полотно (полоска, которая имеет зубья и отвечает за пиление). Зажимаем один конец полотна в зажиме, ближнем к рукоятке. Располагаем полотно как можно ближе к зажимному винту и затягиваем его.

  4. Теперь ослабляем винт на другом конце лобзика, заводим полотно и вот тут надо слегка надавить на верхнюю гибкую часть и в таком положении затянуть винт с полотном. В результате, после того, как вы отпустите придавленный зажим, он вернётся на своё место, тем самым создав нужный натяг полотна. В противном случае полотно будет играть и постоянно рваться! (я это говорю после порванных 10-15 полотен :)

Ну-с, продолжим.

  • Извратившись максимально я смог дотянуться до всех удобных и неудобных мест, и моя заготовка стала выглядеть как-то так:

Готов нижний край заготовкиГотов нижний край заготовки
  • Внимательный читатель наверняка уже задался вопросом: А на кой там эти буквы? Когда ты их уже будешь красить? Отвечаю: Я не буду их красить, я буду их вырезать! Для этого вооружаюсь новой партией полотен для лобзика и в путь!

Время разделять иВремя разделять и собирать собиратьЗапаситесь терпением, оно вам пригодится :)Запаситесь терпением, оно вам пригодится :)
  • Спустя полтора-два дня резки получаю нужный мне результат:

Полностью выпиленная заготовка, сложенная "лицом" внизПолностью выпиленная заготовка, сложенная "лицом" вниз
  • Что ж, пришло время для самого интересного заливки всех пустот эпоксидной смолой! Не считайте за рекламу, но в условиях карантина и отсутствия денег лучиком света стали вот эти ребята, которые в течение 3 часов привезли смолу ко мне домой! Цена и качество меня очень порадовали! Взял сразу литр, получив колер в подарок!

Использованная в проекте эпоксидная смола оставила только положительные эмоцииИспользованная в проекте эпоксидная смола оставила только положительные эмоции
  • Для того чтобы залить светильник смолой, надо его подготовить. Для начала стянул все части с тыльной стороны огрызками МДФ (ничего другого в подъезде под рукой не оказалось):

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

Нарезаем пластиковый бокс на кускиНарезаем пластиковый бокс на кускиПеред фиксацией герметиком крепим пластиковые "заглушки" с фасадаПеред фиксацией герметиком крепим пластиковые "заглушки" с фасадаПримерный вид изделия перед нанесением герметикаПримерный вид изделия перед нанесением герметика
  • С тыльной стороны промазал пластиковые огрызки для надёжности ещё и герметиком. Однако, как показали дальнейшие события надо было не жалеть герметик и мазать его с фасада, тогда и растекание было бы локализовано намного лучше.

Некоторые части светильника всё равно имеют люфт, поэтому придавлены всем, что было под рукой во избежание смещенийНекоторые части светильника всё равно имеют люфт, поэтому придавлены всем, что было под рукой во избежание смещений
  • В общем и целом, вырезанные буквы я заклеил, и пришло время подумать над тем, как же закрывать периметр с высотой бортика в 12мм. На помощь вновь пришёл тот самый распущенный на огрызки бокс. А точнее крышка от него. На ней имеются впуклые и выпуклые полоски шириной 15мм на всю её длину! Это оказалось как нельзя кстати, я нарезал их с помощью канцелярского ножа:

Та самая крышка :)Та самая крышка :)Вот так и будем "зашивать" заготовку по периметруВот так и будем "зашивать" заготовку по периметру
  • Сначала думал крепить мелкими гвоздиками, но фанера в любой момент могла начать расщепиться (ну конечно же я предварительно делал отверстия под гвоздики ручной дрелью!), да и времени на это уходило просто мильярд лет. Вместо гвоздиков был взят герметик и на него посажены кусочки. Для надёжности всё ещё раз обклеил стронг скотчем. ПОМЕТКА: в следующий раз сделать фасадные куски пластика больше, чтобы они сильнее выступали за край, чтобы на них было удобно ставить бортик.

Ещё раз для надёжности всё проклеим строительным армированным и очень клейким скотчемЕщё раз для надёжности всё проклеим строительным армированным и очень клейким скотчемПроделаем то же самое с периметромПроделаем то же самое с периметром
  • Вот теперь можно организовать место под заливку. В комнате была найдена поверочная плита ровная поверхность и всё было подготовлено под заливку:

Чтобы потом не отдирать от линолеума эпоксидную смолу (в случае не самого удачного исхода), заранее подстелим под заготовку целую (читай - без дырок!) плёнкуЧтобы потом не отдирать от линолеума эпоксидную смолу (в случае не самого удачного исхода), заранее подстелим под заготовку целую (читай - без дырок!) плёнку

Замешал смолу в указанной в инструкции пропорции, залил Бэтса и стал ждать. Ждать пришлось 3 суток :)

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

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

Засим откланиваюсь. Ваш А.С.

Подробнее..

Перевод Как за 60 создать систему распознавания лиц с помощью Python и Nvidia Jetson Nano 2GB

02.03.2021 16:05:07 | Автор: admin
Теперь с помощью алгоритмов распознавания лиц и Python вы сможете с лёгкостью отслеживать всех людей, которые приближаются к вашей двери.Теперь с помощью алгоритмов распознавания лиц и Python вы сможете с лёгкостью отслеживать всех людей, которые приближаются к вашей двери.

Новый набор инструментов для разработчиков Nvidia Jetson Nano 2GB представляет собой одноплатный компьютер с графическим ускорителем стоимостью 59$, работающий под управлением программного обеспечения с искусственным интеллектом.

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


Что такое Nvidia Jetson Nano 2GB?

Jetson Nano 2GB это одноплатный компьютер с четырёхъядерным ARM-процессором 1,4 ГГц и встроенным графическим процессором Nvidia Maxwell. Это самая дешёвая модель Nvidia Jetson практически того же класса, что и одноплатный компьютер Raspberry Pi.

Компьютер Nvidia Jetson Nano 2GB имеет много общего с Raspberry Pi оба представляют собой одноплатные компьютеры на ОС Linux. Отличие состоит в том, что с целью ускорения работы моделей глубокого обучения модуль Nvidia Jetson оснащён 128-ядерным графическим процессором Nvidia и поддерживает программно-аппаратную архитектуру параллельных вычислений (CUDA).Компьютер Nvidia Jetson Nano 2GB имеет много общего с Raspberry Pi оба представляют собой одноплатные компьютеры на ОС Linux. Отличие состоит в том, что с целью ускорения работы моделей глубокого обучения модуль Nvidia Jetson оснащён 128-ядерным графическим процессором Nvidia и поддерживает программно-аппаратную архитектуру параллельных вычислений (CUDA).

Если вы уже знакомы с линейкой продуктов Raspberry Pi, то вам всё должно быть понятно. Единственным различием двух одноплатных компьютеров является то, что в Jetson Nano установлен графический процессор Nvidia. Компьютер может запускать приложения с ускорением вычислений на графических процессорах (например, модели глубокого обучения) намного быстрее, чем одноплатный Raspberry Pi, у которого нет графического процессора, способного работать с большинством технологий глубокого обучения.

Наборов инструментов для разработчиков с ИИ и модулями ускорителя существует множество, однако у продукта Nvidia есть перед ними одно важное преимущество он непосредственно совместим с библиотеками ИИ для настольных систем и не требует преобразования моделей глубокого обучения ни в какие специальные форматы для их запуска. Для ускорения вычислений на графическом процессоре в продукте Nvidia используются те же самые библиотеки CUDA, что и практически во всех базирующихся на Python системах глубокого обучения. Другими словами, вы можете взять существующую программу глубокого изучения на Python и запустить её на Jetson Nano 2GB (лишь немного её изменив) и в результате получить довольно сносную производительность (при условии, что ваше приложение сможет работать на 2 Гб оперативной памяти). Возможность взять код в Python, который был написан для мощнейшего сервера, и практически без изменений перенести его на автономное устройство стоимостью 59 долларов это ли не заманчиво?

В новом наборе инструментов Jetson Nano 2GB реализованы некоторые новые функции, которых не было в предыдущих версиях оборудования Nvidia. В первой модели Jetson Nano по непонятной причине не была реализована поддержка WiFi, данная же модель поставляется с подключаемым модулем WiFi, поэтому вам не придётся возиться с ethernet-кабелями. В новом модуле также был заменён вход по питанию установлен более современный порт USB-C, а также усовершенствованы некоторые возможности программного обеспечения. Теперь вам не нужно беспокоиться, например, о включении файла подкачки, модуль сделает это за вас.

Приобретение простого в использовании аппаратного устройства с настоящим графическим процессором обойдется вам менее чем в 60$ этот шаг со стороны Nvidia следует признать достаточно агрессивным. По всей видимости, этим они желают показать, что хотят составить прямую конкуренцию Raspberry Pi и пытаются захватить рынок образования / продуктов для программистов-любителей. Будет весьма интересно наблюдать, как на это отреагирует рынок.

Что ж, давайте приступим к сборке нашей системы

Как и при сборке любых аппаратных устройств, вначале нужно подобрать все необходимые детали:

1. Одноплатный компьютер Nvidia Jetson Nano 2GB (59$).

Продукт доступен для предварительного заказа (по состоянию на 5 октября 2020 г.). Сам продукт, как ожидается, будет выпущен в конце октября. Я не знаю, какую цену установит Nvidia на продукт после его релиза, но следует иметь в виду, что предыдущая модель Jetson Nano в течение нескольких месяцев после релиза была в дефиците.

Полная открытость: модуль Jetson Nano 2GB мне достался бесплатно за рецензию на продукты Nvidia, однако с Nvidia у меня нет ни финансовых, ни редакционных отношений. Вот как получилось, что мне удалось составить данную инструкцию до выхода продукта.

2. Адаптер питания с разъёмом USB-C (возможно, такой у вас уже есть?).

В новом компьютере Jetson Nano 2GB для питания используется разъём USB-C. Адаптер питания в комплект не входит, но у вас наверняка завалялся где-то лишний.

3. Камера: либо веб-камера с USB-выходом (возможно, у вас такая уже имеется?), либо камера Raspberry Pi Camera Module v2.x (прибл. 30$).

Если вы захотите поместить небольшую камеру в чехол, отличным выбором станет модуль Raspberry Pi Camera v2.x (примечание: модуль v1.x работать не будет). Приобрести их можно на Amazon или у множества реселлеров.

Некоторые веб-камеры с USB-выходом, например Logitech C270 или C920, прекрасно работают с Jetson Nano 2GB, так что, если у вас уже есть такая камера, можно, не задумываясь, использовать её. Ниже приводится неполный перечень USB-камер, которые должны работать.

Прежде чем торопиться покупать что-то новое, сначала проверьте: а может быть, вполне подойдут уже имеющиеся у вас USB-устройства? Не на всех из них может быть реализована поддержка драйверов Linux, но, возможно, вам удастся найти устройство с соответствующей поддержкой. Я подключил обычный адаптер HDMI-на-USB за 20$ (заказывал на Amazon), и он подошёл идеально. В качестве источника видеосигнала по HDMI мне удалось задействовать свою высококлассную цифровую камеру, причём без каких бы то ни было дополнительных настроек. Красота!

Вам понадобятся ещё несколько других компонентов, но, я полагаю, все они у вас уже есть в наличии:

  • Карта памяти microSD, на ней должно быть не менее 32 ГБ свободного пространства. На неё мы установим Linux. Если у вас имеется любая карта microSD, можете использовать её.

  • Устройство чтения карт microSD, с помощью которого мы установим на компьютер программное обеспечение Jetson.

  • Проводная USB-клавиатура и проводная USB-мышь. Эти устройства будут использоваться для управления Jetson Nano.

  • Любой монитор или телевизионный экран, на которые можно напрямую подавать сигнал HDMI (не через переходник HDMI-на-DVI). Монитор будет использоваться для визуального контроля ваших действий. Монитор вам потребуется для первоначальной настройки Jetson Nano (даже если потом Jetson Nano будет запускаться без монитора).

Загрузка программного обеспечения Jetson Nano 2GB

Перед подключением компонентов к Jetson Nano необходимо вначале загрузить образ программного обеспечения для Jetson Nano. Стандартный образ программного обеспечения Nvidia включает в себя Ubuntu Linux 18.04 с предустановленными Python 3.6 и OpenCV.

Ниже приводится инструкция по загрузке программного обеспечения Jetson Nano на SD-карту:

  1. Скачайте Jetson Nano Developer Kit SD Card Image на сайте Nvidia.

  2. Скачайте Etcher программу, которая запишет образ программного обеспечения Jetson на SD-карту.

  3. Запустите программу Etcher и используйте её для записи загруженного образа Jetson Nano Developer Kit SD Card Image на SD-карту. Это займёт приблизительно 20 минут.

Пора распаковывать остальное оборудование!

Подключаем всё что можно

Прежде всего выньте модуль Jetson Nano 2GB из коробки:

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

Затем к одному из USB-портов необходимо подключить входящий в комплект WiFi-адаптер с разъёмом USB:

После этого подключается камера.

Если используется модуль камеры Raspberry Pi v2.x, его необходимо подсоединить с помощью ленточного соединительного кабеля. Найдите разъём для ленточного соединительного кабеля на Jetson, поднимите крышку разъёма, вставьте в разъём кабель и закройте крышку разъёма. Убедитесь, что металлические контакты на ленточном соединительном кабеле смотрят внутрь радиатора:

Если используется веб-камера с разъёмом USB, просто подключите её к одному из USB-портов, порт ленточного кабеля для этого не нужен.

Теперь подключаем всё остальное:

  • подключите мышь и клавиатуру к USB-портам;

  • подключите монитор с помощью HDMI-кабеля;

  • подключите кабель питания USB-C, чтобы система могла загрузиться.

Если используется модуль камеры Raspberry Pi, в результате у вас получится примерно такая конструкция:

Если используется источник видео с USB, конструкция получится примерно такая:

При подключении кабеля питания начнётся автоматическая загрузка Jetson Nano. Через несколько секунд на мониторе появится экран инициализации Linux. Следуйте инструкциям на экране для создания учётной записи и подключения к WiFi. Все действия будут элементарные.

Установка необходимых библиотек Linux и Python для распознавания лиц

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

На рабочем столе Jetson Nano откройте окно LXTerminal и выполните следующие команды. Если система запросит пароль, нужно будет ввести тот же пароль, который был указан при создании пользовательской учётной записи:

sudo apt-get updatesudo apt-get install python3-pip cmake libopenblas-dev liblapack-dev libjpeg-dev

Вначале обновляем apt стандартный инструмент для установки программного обеспечения Linux, его мы будем использовать для установки других необходимых нам системных библиотек. Затем устанавливаем несколько Linux-библиотек, без которых наша программа не будет работать (эти библиотеки не предустановлены).

В последнюю очередь устанавливаем библиотеку Python face_recrecognition и её зависимости, в том числе библиотеку машинного обучения dlib. Это можно сделать автоматически, запустив единственную команду:

sudo pip3 -v install Cython face_recognition

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

Когда процесс завершится, ваш компьютер Jetson Nano 2GB с графическим ускорителем и программно-аппаратной архитектурой параллельных вычислений (CUDA) будет готов к распознаванию лиц. Теперь переходим к самому интересному!

Запуск демонстрационной версии приложения распознавания лиц для домофона

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

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

Сначала скачайте код. Полный код с комментариями я разместил здесь, однако вы можете поступить ещё проще загрузить код на Jetson Nano из командной строки:

wget -O doorcam.py tiny.cc/doorcam2gb

В верхней части программы необходимо отредактировать строку кода, чтобы указать, используете ли вы USB-камеру или модуль камеры Raspberry Pi. Файл можно изменить таким образом:

Вставка с кодомСледуйте инструкциям, затем сохраните код, выйдите из GEdit и запустите код:

gedit doorcam.py

На рабочем столе появится окно с видео. Каждый раз, когда новый человек будет подходить к камере, система будет регистрировать его лицо и рассчитает продолжительность нахождения такого человека перед дверью. Если один и тот же человек уйдет и вернётся через 5 минут или позже, система зарегистрирует новый визит и заново рассчитает продолжительность. Чтобы в любое время выйти из программы, нужно нажать на клавиатуре клавишу 'q'.

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

Превращаем систему в автономное аппаратное устройство

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

Одной из самых полезных особенностей современных одноплатных компьютеров является то, что все они поддерживают одни и те же аппаратные стандарты, в частности USB. Другими словами, у вас появляется колоссальный выбор дешёвых дополнительных устройств, например, сенсорных экранов и аккумуляторных батарей, которые можно приобрести на Amazon. Вы сами можете подобрать оптимальные компоненты по параметрам входа, выхода и мощности. Вот что заказал я сам (себе вы можете заказать что-то похожее):

7-дюймовый сенсорный HDMI-экран, способный запитываться от USB-порта:

И обычный зарядный батарейный блок (power bank) с выходом USB-C для подачи питания:

Давайте запитаем систему от блока аккумуляторных батарей и посмотрим, как она будет работать в автономном режиме. Подключите USB-аккумулятор вместо обычного сетевого зарядного устройства и подключите HDMI-экран к порту HDMI (для работы в качестве экрана) и к USB-порту (для работы в качестве входа мыши).

Всё работает идеально. Сенсорный экран работает как обычная USB-мышь без дополнительных настроек. Есть единственный недостаток: если Jetson Nano 2GB станет потреблять больше энергии, чем может выдавать USB-аккумулятор, быстродействие графического процессора может снизиться. Но и в том, и в другом случае результаты получаются вполне удовлетворительные.

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

Обзор кода Python для домофона

Хотите понять, как работает код? Давайте разберёмся.

Сначала в код необходимо импортировать библиотеки, которые мы собираемся использовать. Самые важные из них OpenCV (в Python она называется cv2), которую мы будем использовать для считывания изображений с камеры, и face_recognition, которую мы будем использовать для обнаружения и сравнения лиц.

import face_recognitionimport cv2from datetime import datetime, timedeltaimport numpy as npimport platformimport pickle

После этого нам нужно указать, как будет осуществляться доступ к камере, так как процесс получения изображения с модуля камеры Raspberry Pi работает иначе, чем процесс получения изображения с USB-камеры. Для этого нужно просто изменить эту переменную на True или False, в зависимости от оборудования:

# Set this depending on your camera type:# - True = Raspberry Pi 2.x camera module# - False = USB webcam or other USB video input (like an HDMI capture device)USING_RPI_CAMERA_MODULE = False

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

known_face_encodings = []known_face_metadata = []

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

У нас имеется функция, сохраняющая и загружающая данные об известных лицах. Это функция сохранения (save):

def save_known_faces():    with open("known_faces.dat", "wb") as face_data_file:        face_data = [known_face_encodings, known_face_metadata]        pickle.dump(face_data, face_data_file)        print("Known faces backed up to disk.")

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

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

def register_new_face(face_encoding, face_image):    known_face_encodings.append(face_encoding)known_face_metadata.append({        "first_seen": datetime.now(),        "first_seen_this_interaction": datetime.now(),        "last_seen": datetime.now(),        "seen_count": 1,        "seen_frames": 1,        "face_image": face_image,    })

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

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

def lookup_known_face(face_encoding):    metadata = None    if len(known_face_encodings) == 0:        return metadata    face_distances = face_recognition.face_distance(        known_face_encodings,         face_encoding    )    best_match_index = np.argmin(face_distances)    if face_distances[best_match_index] < 0.65:        metadata = known_face_metadata[best_match_index]        metadata["last_seen"] = datetime.now()        metadata["seen_frames"] += 1        if datetime.now() - metadata["first_seen_this_interaction"]                  > timedelta(minutes=5):            metadata["first_seen_this_interaction"] = datetime.now()            metadata["seen_count"] += 1    return metadata

В этой части кода мы делаем несколько важных вещей:

  1. Используя библиотеку face_recogntion, мы проверяем, в какой степени черты неизвестного лица совпадают с чертами лиц всех прошлых посетителей. Функция face_distance()выдаёт численное значение степени сходства между неизвестным лицом и всеми известными лицами чем меньше число, тем больше похожих лиц.

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

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

Остальная часть программы (это основной цикл) бесконечный цикл, в котором мы получаем кадры видео, смотрим на лица на изображении и обрабатываем каждое увиденное лицо. Это основная часть программы. Давайте проверим, как всё работает:

def main_loop():    if USING_RPI_CAMERA_MODULE:        video_capture =             cv2.VideoCapture(                get_jetson_gstreamer_source(),                 cv2.CAP_GSTREAMER            )    else:        video_capture = cv2.VideoCapture(0)

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

Итак, начинаем захватывать кадры с видео:

while True:    # Grab a single frame of video    ret, frame = video_capture.read()    # Resize frame of video to 1/4 size    small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)    # Convert the image from BGR color    rgb_small_frame = small_frame[:, :, ::-1]

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

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

Теперь мы можем обнаружить все лица на изображении и преобразовать каждое лицо в кодированное изображение. Это делается всего двумя строками кода:

face_locations = face_recognition.face_locations(rgb_small_frame)face_encodings = face_recognition.face_encodings(                     rgb_small_frame,                      face_locations                  )

Далее необходимо просмотреть каждое обнаруженное лицо и решить, принадлежит ли это лицо человеку, который был здесь в прошлом, или это был совершенно новый посетитель:

for face_location, face_encoding in zip(                       face_locations,                        face_encodings):metadata = lookup_known_face(face_encoding)    if metadata is not None:        time_at_door = datetime.now() -             metadata['first_seen_this_interaction']        face_label = f"At door {int(time_at_door.total_seconds())}s"    else:        face_label = "New visitor!"        # Grab the image of the face        top, right, bottom, left = face_location        face_image = small_frame[top:bottom, left:right]        face_image = cv2.resize(face_image, (150, 150))        # Add the new face to our known face data        register_new_face(face_encoding, face_image)

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

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

for (top, right, bottom, left), face_label in                   zip(face_locations, face_labels):    # Scale back up face location    # since the frame we detected in was 1/4 size    top *= 4    right *= 4    bottom *= 4    left *= 4    # Draw a box around the face    cv2.rectangle(        frame, (left, top), (right, bottom), (0, 0, 255), 2    )    # Draw a label with a description below the face    cv2.rectangle(        frame, (left, bottom - 35), (right, bottom),         (0, 0, 255), cv2.FILLED    )    cv2.putText(        frame, face_label,         (left + 6, bottom - 6),         cv2.FONT_HERSHEY_DUPLEX, 0.8,         (255, 255, 255), 1    )

Я также хотел вывести в верхней части экрана пополняемый список последних посетителей с указанием количества посещений вашего дома:

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

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

number_of_recent_visitors = 0for metadata in known_face_metadata:    # If we have seen this person in the last minute    if datetime.now() - metadata["last_seen"]                          < timedelta(seconds=10):# Draw the known face image        x_position = number_of_recent_visitors * 150frame[30:180, x_position:x_position + 150] =              metadata["face_image"]number_of_recent_visitors += 1        # Label the image with how many times they have visited        visits = metadata['seen_count']        visit_label = f"{visits} visits"if visits == 1:            visit_label = "First visit"cv2.putText(            frame, visit_label,             (x_position + 10, 170),             cv2.FONT_HERSHEY_DUPLEX, 0.6,             (255, 255, 255), 1        )

Наконец, мы можем вынести текущий кадр видео на экран и поверх этого кадра вывести все наши пояснения:

cv2.imshow('Video', frame)

Чтобы не утратить данные в случае программного сбоя, через каждые 100 кадров будем сохранять на диск список известных лиц:

if len(face_locations) > 0 and number_of_frames_since_save > 100:    save_known_faces()    number_of_faces_since_save = 0else:    number_of_faces_since_save += 1

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

Код запуска программы находится в самом низу:

if __name__ == "__main__":    load_known_faces()    main_loop()

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

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

Интересный факт: похожие системы отслеживания лиц установлены вблизи многих рекламных стендов с объявлениями на улицах и автовокзалах. Система определяет, кого из прохожих интересует данное объявление и как долго люди его изучают. Возможно, полчаса назад это прозвучало бы для вас дико, но вы ты только создали точно такую же систему всего за 60$!

Расширение возможностей программы

Данная программа пример того, как с небольшим количеством кода Python 3, запущенного на дешёвом одноплатном компьютере Jetson Nano 2GB, можно создать мощную систему.

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

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

Узнайте больше о платформе Nvidia Jetson

Узнайте больше о том, как создавать устройства с помощью аппаратной платформы Nvidia Jetson, запишитесь на новый бесплатный учебный курс Nvidia по Jetson. Более подробная информация приведена на сайте Nvidia. Вы также также можете посетить отличные общественные ресурсы, например сайт JetsonHacks.

Узнайте подробности, как получить Level Up по навыкам и зарплате или востребованную профессию с нуля, пройдя онлайн-курсы SkillFactory со скидкой 40% и промокодомHABR, который даст еще +10% скидки на обучение.

Другие профессии и курсы
Подробнее..

Метеостанция на максималках

05.03.2021 10:06:07 | Автор: admin

Про метеостанцию на Хабре писали не раз и не два, и наверное не с десяток раз. И вот настало моё время. Решил с вами поделиться своей.

Постановка задачи

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

Из всего того делаем выводы:

  • Нужно хранилище данных (сервер)

  • Датчики будем использовать разные и в разных местах, поэтому проще сделать систему модульной (IoT)

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

  • Так как мы будем собирать достаточно много данных, можно данными поделиться

Архитектура

Самым простым и популярным решением для метеостанции является Arduino, однако подружить с его домашней сетью - это дополнительные девайсы\шилды, лишние деньги и сложность, а значит - время. Поэтому из коробки проще использовать модуль уже со встроенным Wi-Fi, например ESP8266 (NodeMCU) с подключенными сенсорами. Это достаточно удобно, что один и тот же модуль можно использовать и дома, и за окном. При желании даже можно его использовать в качестве сервера.

Но почему бы не проставить в центр системы лучше что-то помощнее? Благо у меня пылится без дела Raspberry Pi первой ревизии (но и любая другая подойдёт). Внутренние датчики можно подключить, в принципе через GPIO и к малинке напрямую, но у меня роутер с малинкой в одной комнате установлен, а мониторить нужно другую. Если у вас такой проблемы нет - то можно от одной NodeMCU избавиться. Малинка будет получать данные от датчиков, сохранять их в базе данных и при необходимости отображать. Так же к GPIO Raspberry Pi можно подцепить LoRa - приёмник и получать данные от удалённых за пределами Wi-Fi сети датчиков (и вот они Arduino). Ну, и наконец, малинка будет отправлять данные в облако.

Итого, нам понадобится:

  • Raspberry PI

  • ESP8266 (2шт. + 1шт. опционально)

  • BME280 (2 шт.)

  • Часы реального времени DS1302 (опционально)

  • OLED-дисплей 128х64 на SH1106 (опционально)

  • Датчик дождя на компараторе LM373 (опционально)

  • УФ-датчик GY-VEML6070 (опционально)

  • Raspberry Pi Camera (опционально)

  • Arduino Nano (2 шт., опционально)

  • SX1278 (3 шт., опционально)

  • Магнитный компас с чипом QMC5883L/HMC5883L (опционально)

  • Датчик освещённости (светодиодный) с компаратором LM737 (опционально)

  • Датчики напряжения до 25V (опционально)

  • Датчики тока ACS712 (опционально)

Подключение SX1278 к Raspberry Pi

Для начала подключим к малинке радиомодуль.

Raspberry Pi

SX1278

3.3V

3.3V

GROUND

GROUND

GPIO10

MOSI

GPIO9

MISO

GPIO11

SCK

GPIO8

NSS/ENABLE

GPIO4

DIO0

GPIO22

RST

Соединяем пины Raspberry Pi и SX1278 как на картинке:

Замечание: для разных ревизий Raspberry Pi используются разное количество пинов, а значит и распиновки, смотрите документацию.

По поводу использования LoRa-модулей хочу обратить внимание на несколько моментов:

  • Перед подачей питания на модуль LoRa обязательно убедитесь, что к нему подключена антенна, иначе есть риск, что модуль сгорит!

  • На качество сигнала помимо антенны влияют правильные настройки, весьма важно, чтобы частоты приёмника и передатчика совпадали, а диапазон был свободен от шума (например игрушечных радиоуправляемых машинок)

Установка сервера

На Raspberry Pi загружаем Raspberry Pi OS Lite.

Далее устанавливаем статический адрес для нашей малинки:

sudo nano /etc/dhcpcd.conf

Добавляем\правим строки на наш желаемый IP и IP наш роутер

interfaceeth0# или wlan0 если малинка подключена по Wi-Fistaticip_address=192.168.0.4/24staticrouters=192.168.0.1staticdomain_name_servers=192.168.0.1. 8.8.8.8

Теперь включаем удалённый доступ через SSH, SPI (нужен для подключения LoRa), а так же Camera, если планируем её использовать.

sudo raspi-config

Включаем:

  • SSH (если собираемся подключаться по SSH, а не только через клавиатуру)

  • SPI (если собираемся использовать LoRa)

  • Camera (если собираемся использовать камеру)

Убеждаемся, что стоит автологин при загрузке:

Boot Options -> Console Autologin

Выходим из raspi-config, перезагружаем:

sudo shutdown -r now

Теперь у нас есть удалённый доступ к малинке, можем подключиться через ssh или можем продолжить через клавиатуру.

Вся логика сервера написана на Python3, поэтому ставим его:

sudo apt-get install python3.7

Теперь осталось загрузить собственно мой проект H.O.M.E.:

cd ~git clone https://github.com/wwakabobik/home.git

В качестве веб-сервера я выбрал flask, на Хабре есть отличная серия статей, поэтому я не буду останавливаться на подробностях при работе с ним.

Копируем контент из папки с сервером:

mkdir web-servercp -r home/home_server/* /home/pi/web-server/

Устанавливаем все зависимости:

cd web-serversudo python3.7 -m pip install-rrequirements.txt

Создаём базу данных из шаблона:

cat db/schema.sql | sqlite3 flask_db

Собственно всё, теперь можем запустить сервер:

cd /home/pi/web-server && sudo python3.7 app.py

Но мы же хотим, чтобы сервер запускался при загрузке Raspberry Pi?

Тогда в конце /etc/rc.local, перед exit 0, добавляем вызов bash-скрипта:

/home/pi/flask_startup.sh &

Копируем этот скрипт на место:

cd ~cp ~/home/bash/flask_startup.sh .

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

cp ~/home/bash/check_health.sh .

Добавляем в планировщик cron:

sudo crontab -e

задание:

1-59/5 * * * * /home/pi/check_health.sh

Немного о софте сервера

За запуск сервера отвечает app.py.

#!/usr/bin/env python3.7from multiprocessing.pool import ThreadPoolfrom flask import Flaskfrom db.db import init_appfrom lora_receiver import run_loraapp = Flask(__name__, template_folder='templates')  # firstly, start Flask# import all routesimport routes.apiimport routes.pagesimport routes.single_pageif __name__ == '__main__':    # Start LoRa receiver as subprocess    pool = ThreadPool(processes=1)    pool.apply_async(run_lora)    # Start Flask server    init_app(app)    app.run(debug=True, host='0.0.0.0', port='80')    # Teardown    pool.terminate()    pool.join()

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

В остальном архитектура типична для flaska: все возможные routes вынесены в отдельные файлы, все страницы хранятся в pages, а шаблоны в templates. Логика базы данных лежит в db, статичные файлы (картинки) в static, ну а в camera будем складывать картинки с камеры.

В итоге, текущие показания можно увидеть на dashboard страницах,

а графики и данные - на отдельных (графики рисует plotly).

Софт LoRa-ресивера

home_server/lora_receiver.py

from time import sleepimport requestsfrom SX127x.LoRa import *from SX127x.board_config import BOARDendpoint = "http://0.0.0.0:80/api/v1"class LoRaRcvCont(LoRa):    def __init__(self, verbose=False):        super(LoRaRcvCont, self).__init__(verbose)        self.set_mode(MODE.SLEEP)        self.set_dio_mapping([0] * 6)    def start(self):        self.reset_ptr_rx()        self.set_mode(MODE.RXCONT)        while True:            sleep(.5)            rssi_value = self.get_rssi_value()            status = self.get_modem_status()            sys.stdout.flush()    def on_rx_done(self):        self.clear_irq_flags(RxDone=1)        payload = self.read_payload(nocheck=True)        formatted_payload = bytes(payload).decode("utf-8", 'ignore')        status = self.send_to_home(formatted_payload)        if status:            sleep(1)  # we got the data, force sleep for a while to skip repeats        self.set_mode(MODE.SLEEP)        self.reset_ptr_rx()        self.set_mode(MODE.RXCONT)    def send_to_home(self, payload):        if str(payload[:2]) == '0,':            requests.post(url=f'{endpoint}/add_wind_data', json={'data': payload})        elif str(payload[:2]) == '1,':            requests.post(url=f'{endpoint}/add_power_data', json={'data': payload})        else:            print("Garbage collected, ignoring")  # debug            status = 1        return statusdef run_lora():    BOARD.setup()    lora = LoRaRcvCont(verbose=False)    lora.set_mode(MODE.STDBY)    # Medium Range  Defaults after init are 434.0MHz, Bw = 125 kHz, Cr = 4/5, Sf = 128chips/symbol, CRC on 13 dBm    lora.set_pa_config(pa_select=1)    assert (lora.get_agc_auto_on() == 1)    try:        lora.start()    finally:        lora.set_mode(MODE.SLEEP)        BOARD.teardown()

В этом коде главное - это получение пакета в событии on_rx_done - если пакет получен, нужно его декодировать.

Проверяем в send_to_home что payload[:2] равен ожидаемому коду датчика (я для простоты использую значения 0, и 1,), то отсылаем на сервер и спим секунду, чтобы пропустить повторные пакеты.Если нет, продолжаем получать пакеты.

API


Ключевое, что делает 99% времени сервер - это простой. Но в остальные 1% он отдаёт и получает данные, и за это, помимо отображения страниц через веб-интерфейс отвечает API.

Именно через Flask REST API мы будем посылать или получать данные от сенсоров.

home_server/routes/api.py

@app.route('/api/v1/send_data')def send_weather_data():    return send_data()@app.route('/api/v1/add_weather_data', methods=['POST'])def store_weather_data():    if not request.json:        abort(400)    timestamp = str(datetime.now())    unix_timestamp = int(time())    data = request.json.get('data', "")    db_data = f'"{timestamp}", {unix_timestamp}, {data}'    store_weather_data(db_data)    return jsonify({'data': db_data}), 201

Данные пишутся в лог:

В моём случае, если мы получили данные от датчика (получили POST запрос с верным JSON), то мы их сохраняем в БД. Так же, если мы получили GET запрос на отправку данных (send_data), то данные отправляем данные на облако.

home_server/pages/weather_station/send_data.py

def send_data():    data = get_last_measurement_pack('0', '1')    image = take_photo()    wu_data = prepare_wu_format(data=data)    response = str(send_data_to_wu(wu_data))    response += str(send_data_to_pwsw(wu_data))    response += str(send_data_to_ow(data))    response += str(send_data_to_nardmon(data))    send_image_to_wu(image)    copyfile(image, f'{getcwd()}/camera/image.jpg')    return response

Ах да, забыл упомянуть камеру. Если мы подключили камеру к Raspberry Pi, то можем отправлять или сохранять изображения погоды за окном. Для этого есть отдельный метод:

home_server/pages/shared/tools.py

from picamera import PiCamera<...>camera = PiCamera()<...>def take_photo():  camera.resolution = (1280, 720) # lower resolution to fit in limits  camera.start_preview()  sleep(5)  image = f'{getcwd()}/camera/image_{int(time())}.jpg'  camera.capture(image)  camera.stop_preview()  return image  

Внешние датчики

полные скетчи можно найти в home/iot

Самым удобным и простым модулем для любительской метеостанции является модуль BME280, объединяющий в себе термометр, датчик влажности и давления. Подключаем его по I2C к ESP8266:

Прошивать будем через Arduino IDE (как добавить ESP8266 написано, например, в этой статье).

iot/esp8266/weatherstation_in/weatherstation_in.ino

#include <ESP8266WiFi.h>#include <ESP8266HTTPClient.h>#include <Wire.h>#include <SPI.h>#include <Adafruit_BME280.h>#include <Arduino_JSON.h>Adafruit_BME280 bme; // use I2C interfaceAdafruit_Sensor *bme_temp = bme.getTemperatureSensor();Adafruit_Sensor *bme_pressure = bme.getPressureSensor();Adafruit_Sensor *bme_humidity = bme.getHumiditySensor();// Датчик не сказать, чтобы очень точный, поэтому добавляем корректирующие значенияfloat correction_temperature = -0.5;float correction_pressure = 15;float correction_humidity = 10;// подключаем Wifivoid connect_to_WiFi(){ WiFi.mode(WIFI_STA); WiFi.begin(wifi_ssid, wifi_password); while (WiFi.status() != WL_CONNECTED) {   delay(500); } Serial.println("WiFi connected"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); #endif}/* <> */// собираем данные с датчиковfloat get_temperature(){  sensors_event_t temp_event, pressure_event, humidity_event;  bme_temp->getEvent(&temp_event);  return temp_event.temperature + correction_temperature;}/* <> */// также точку росы можно вычислить до отправки на сервер, делаем это:float get_dew_point(){  float dew_point;  float temp = get_temperature();  float humi = get_humidity();  dew_point = (temp - (14.55 + 0.114 * temp) * (1 - (0.01 * humi)) - pow(((2.5 + 0.007 * temp) * (1 - (0.01 * humi))),3) - (15.9 + 0.117 * temp) * pow((1 - (0.01 * humi)), 14));  return dew_point;}/* <> */// Форматируем в строкуString get_csv_data(){  String ret_string = DEVICE_ID;  ret_string += delimiter + String(get_temperature());  ret_string += delimiter + String(get_humidity());  ret_string += delimiter + String(get_pressure());  ret_string += delimiter + String(get_dew_point());  return ret_string;}// Отправляем через HTTP, упаковав строку в JSON:void post_data(){  check_connection();  HTTPClient http;  //Declare object of class HTTPClient  String content = get_csv_data();  int http_code = 404;  int retries = 0;  while (http_code != 201)  {    http.begin(api_url); // connect to request destination    http.addHeader("Content-Type", "application/json");    // set content-type header    http_code = http.POST("{\"data\": \"" + content +"\"}");  // send the request    http.end();                        // close connection    retries++;    if (retries > max_retries)    {          Serial.println("Package lost!");      break;    }  }}// cобственно, повторяем это время от времени:void loop(){  post_data();  delay(cooldown);}

По умолчанию у меня стоит интервал в 5 минут, и я считаю, что DEVICE_ID = "0" внутренний датчик, а DEVICE_ID = "1" внешний.

Датчик дождя LM393+YL83Датчик дождя LM393+YL83

К внешнему датчику можно подключить так же датчики ультрафиолета (
GY-VEML6070) и датчик дождя (на компараторе LM393). YL-83 достаточно игрушечный вариант для реального измерения уровня осадков, по крайней мере без калибровки, но, на какое-то время сгодиться, потому что мне актуальность по уровню осадкам не сильно интересует. Ну, точнее интересует на уровне "на улице дождь" или "сухо". Так же, альтернативно, можно использовать аналоговый датчик ультрафиолета GY-8511, но тогда придётся выбирать между ним и датчиком дождя, так как аналоговый вход на NodeMCU только один. Датчик ультрафиолета можно использовать, например, для оценки эффективности солнечных панелей. Ну и просто показывает дни, когда лучше воспользоваться солнцезащитным кремом во время покоса газона.

Схема подключения к ESP8266 ниже:

Для этих датчиков соответственно добавим три функции:

iot/esp8266/weatherstation_out/weatherstation_out.ino

#include "Adafruit_VEML6070.h"Adafruit_VEML6070 uv = Adafruit_VEML6070();#define VEML6070_ADDR_L   (0x38) ///< Low addressRAIN_SENSOR_PIN = A0;/* <...> */#ifdef UV_ANALOG_SENSORvoid get_uv_level(){    int uv_level = averageAnalogRead(UV_PIN);    float uv_intensity = mapfloat(uv_level, 0.99, 2.8, 0.0, 15.0);    return uv_intensity;}#endif#ifdef UV_I2C_SENSORvoid get_uv_level(){return uv.readUV();}#endif#ifdef RAIN_SENSORvoid get_rain_level(){    int rain_level = averageAnalogRead(RAIN_SENSOR_PIN);    return rain_level;}#endif

NodeMCU удобно использовать, когда есть устойчивый Wi-Fi в зоне их действия. Конечно, ставить внешние датчики для погодной станции на крыльце - плохая идея, но оборудованная точка, отнесённая пару-тройку метров от дома - то, что нужно, а сигнала роутера в доме хватает за глаза.

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

  • Датчики температуры и влажности устанавливаются на высоте 2 м над землёй в метеорологической будке: это небольшой деревянный или пластиковый ящик (размером приблизительно 40х40х40 см) с белыми, отражающими свет перфорированными или жалюзийными стенками, а также солнцеводозащитным козырьком (крышка будки должна быть герметичной и иметь наклон для стекания осадков с будки).

  • Датчик ветра - на высоте 10-12 м над землёй (именно над землёй, а не на крышах зданий; в исключительном случае разрешается размещение дачтика ветра на крыше одноэтажного дома, так чтобы датчик возвышался над верхним краем крыши не менее чем на 2-3 м, а над поверхностью земли на 10-12 м).

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

  • Датчик атмосферного давления устанавливается в помещении вдали от окон и отопительных приборов. Атмосферное давление зависит от высоты над уровнем моря места, где производится измерение; поэтому требуется калибровка датчика давления перед его использованием. Для правильной установки прибора необходимо воспользоваться показаниями другого барометра или данными ближайшей метеостанции (с учётом разности высот, определённой по подробной топографической карте; 10 м подъёма соответствует уменьшению давления примерно на 1 мм рт.ст. или 1.3 гПа (мБ)).

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

Затем загрузим на него скетч, который будет отображать текущее время (ЧЧ:ММ) и в бегущей строке данные с метеостанции:

iot/informer/esp8266/informer/informer.ino

#include <ESP8266WiFi.h>#include <ESP8266HTTPClient.h>#include <Wire.h>#include <U8g2lib.h>#include <virtuabotixRTC.h>  // https://ampermarket.kz/files/rtc_virtualbotix.zip// RTCvirtuabotixRTC myRTC(14, 12, 13);// OLEDU8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);u8g2_uint_t offset;            // current offset for the scrolling textu8g2_uint_t width;             // pixel width of the scrolling text (must be lesser than 128 unless U8G2_16BIT is definedconst int string_length = 80;  // maximum count of symbols in marqueechar text[string_length];      // text buffer to scroll// Wi-Ficonst char* wifi_ssid = "YOUR_SSID";const char* wifi_password = "YOUR_PASSWORD";// APIconst String ip_address = "YOUR_IP_OF_SERVER";const String port = "YOUR_PORT";const String api_endpoint = "/api/v1/add_weather_data";const String api_url = "http://" + ip_address + ":" + port + api_endpoint;const int max_retries = 5;  // number of retries to send packet// Timers and delaysconst long data_retrieve_delay = 300000;const int cycle_delay = 5;unsigned long last_measurement = 0;void setup(void) {    Serial.begin(9600);    init_OLED();    init_RTC();}/* Init functions */void init_OLED(){    u8g2.begin();      u8g2.setFont(u8g2_font_inb30_mr); // set the target font to calculate the pixel width    u8g2.setFontMode(0);              // enable transparent mode, which is faster}void init_RTC(){    // seconds, minutes, hours, day of the week, day of the month, month, year    // раскомментируйте при прошивке, заполнив текущую дату и время, затем снова закомментируйте и прошейте ещё раз    //myRTC.setDS1302Time(30, 03, 22, 5, 19, 2, 2021); // set RTC time    myRTC.updateTime(); // update of variables for time or accessing the individual elements.}""" <...> """  String get_data(){    check_connection();    #ifdef DEBUG    Serial.println("Obtaining data from server");    #endif    HTTPClient http;    //Declare object of class HTTPClient      int http_code = 404;    int retries = 0;    String payload = "Data retrieve error";    while (http_code != 200)    {        http.begin(api_url);                // connect to request destination        http_code = http.GET();             // send the request        String answer = http.getString();   // get response payload        http.end();                         // close connection            retries++;        if (retries > max_retries)        {            break;            #ifdef DEBUG            Serial.println("Couldn't get the data!");            #endif        }                        if (http_code == 200)        {            payload = answer;        }    }    return payload;}void loop(void) {    // Check that new data is needed to be retrieved from server    if (((millis() - last_measurement) > data_retrieve_delay) or last_measurement == 0)    {        String stext = get_data();        stext.toCharArray(text, string_length);        last_measurement = millis();        width = u8g2.getUTF8Width(text);    // calculate the pixel width of the text        offset = 0;    }    // Update RTC    myRTC.updateTime();     // Now update OLED    u8g2_uint_t x;    u8g2.firstPage();    do     {        // draw the scrolling text at current offset        x = offset;        u8g2.setFont(u8g2_font_inb16_mr);       // set the target font        do         {                                       // repeated drawing of the scrolling text...            u8g2.drawUTF8(x, 58, text);         // draw the scrolling text            x += width;                         // add the pixel width of the scrolling text        } while (x < u8g2.getDisplayWidth());   // draw again until the complete display is filled            u8g2.setFont(u8g2_font_inb30_mr);       // choose big font for clock        u8g2.setCursor(0, 30);                  // set position of clock        char buf[8];                            // init bufer to formatted string        sprintf_P(buf, PSTR("%02d:%02d"), myRTC.hours, myRTC.minutes); // format clock with leading zeros        u8g2.print(buf);                        // display clock    } while (u8g2.nextPage());      offset-=2;                       // scroll by two pixels    if ((u8g2_uint_t)offset < ((u8g2_uint_t) - width))    {          offset = 0;                  // start over again    }      delay(cycle_delay);              // do some small delay}

В итоге результат работы выглядит так:

Соответственно в Raspberry Pi:

home_server/routes/api.py

@app.route('/api/v1/get_weather_data', methods=['GET'])def store_wind_data():    return send_data_to_informer()  

pages/weather_station/send.data

def send_data_to_informer():    data_in = get_last_measurement_pack('weather_data', '0', '0')    data_out = get_last_measurement_pack('weather_data', '0', '1')    pressure = int((data_in['pressure']+data_out['pressure'])/2)    formatted_string = f"IN: T={data_in['temperature']}*C, " \                       f"H={data_in['humidity']}% | " \                       f"OUT: T={data_out['temperature']}*C, " \                       f"H={data_out['humidity']}%, " \                       f"DP={data_out['dew_point']}*C | " \                       f"P={pressure} mmhg"    return formatted_string

Радиодатчики

Там, где не дотянуться Wi-Fi, нужно использовать альтернативные варианты передачи данных. В моём случае - это использование LoRa-модулей (в связке, например, с Arduino Nano.

Таких устройств у меня два - это датчик скорости и направления ветра (компас). Пока не буду останавливаться на этом в текущей статье, если будет интерес - напишу отдельно. Второе устройство - это вольтметр и два амперметра, для контроля работы ветряка, зарядки АКБ и потребления.

SX1278

Arduino Nano

3.3V

3.3V

GROUND

GROUND

MOSI

D10

MISO

D2

SCK

D13

NSS/ENABLE

D12

DIO0

D11

RST

D9

И, код, соответственно:

iot/arduino/*_meter/*_meter.ino

// Required includes#include <SPI.h>#include <LoRa.h>// LoRA configconst int LORA_SEND_RETRIES = 5; // сколько раз посылать сообщениеconst int LORA_SEND_DELAY = 20;  // задержка между пакетамиconst int LORA_POWER = 20;       // мощность передатчика на максимум const int LORA_RETRIES = 12;     // сколько раз пытаться инициализировать модульconst int LORA_DELAY = 500;      // задержка между попыткой инициализации// Инициализируем модульvoid init_LoRa() {    bool success = false;    for (int i=0; i < LORA_RETRIES; i++)        {        if (LoRa.begin(433E6)) // используем 433Мгц        {            success = true;            break;        }        delay(LORA_DELAY);    }    if (!success)    {        #ifdef DEBUG        Serial.println("LoRa init failed.");        #endif        stop(4);    }        LoRa.setTxPower(LORA_POWER);  // aplify TX power    #ifdef DEBUG    Serial.println("LoRa started!");    #endif  }#endif// Посылаем пакет с данными строкойvoid LoRa_send(power_data data){    String packet = DEVICE_ID + "," + String(data.avg_voltage,2) + ",";    packet += String(data.avg_current,2) + "," + String(data.avg_power,2) + "," +String(data.avg_consumption,2);    for (int i=0; i < LORA_SEND_RETRIES; i++)    {        LoRa.beginPacket();  // just open packet        LoRa.print(packet);  // send whole data        LoRa.endPacket();    // end packet        delay(LORA_SEND_DELAY);    }  }

Достаточно просто, не правда ли?

Облачные сервисы

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

from wunderground_pws import WUndergroundAPI, unitsfrom secure_data import wu_api_key, wu_reference_station_id""" ... """wu_current = wu.current()""" ... """wu_humidity=wu_current['observations'][0]['humidity'],wu_pressure=int(int(wu_current['observations'][0]['metric_si']['pressure'])/1.33),wu_dew_point=wu_current['observations'][0]['metric_si']['dewpt'],wu_wind_speed=wu_current['observations'][0]['metric_si']['windSpeed'],wu_wind_gust=wu_current['observations'][0]['metric_si']['windGust'],wu_wind_direction=wu_current['observations'][0]['winddir'],wu_wind_heading=deg_to_heading(int(wu_current['observations'][0]['winddir']))

Однако, если была возможность быстро получать данные, то почему бы ими не поделиться, подумал я? Данные в WU передаются через GET-запрос, поэтому для удобства предварительно подготавливаем данные

def prepare_wu_format(data, timestamp=None):    payload = f"&dateutc={timestamp}" if timestamp else "&dateutc=now"    payload += "&action=updateraw"    payload += "&humidity=" + "{0:.2f}".format(data['humidity'])    payload += "&tempf=" + str(celsius_to_fahrenheit(data['temperature']))    payload += "&baromin=" + str(mmhg_to_baromin(data['pressure']))    payload += "&dewptf=" + str(celsius_to_fahrenheit(data['dew_point']))    payload += "&heatindex=" + str(celsius_to_fahrenheit(heat_index(temp=data['temperature'], hum=data['humidity'])))    payload += "&humidex=" + str(celsius_to_fahrenheit(humidex(t=data['temperature'], d=data['dew_point'])))    payload += "&precip=" + str(data['precip'])    payload += "&uv" + str(data['uv'])    return payload

затем отправляем:

import requests""" ... """def send_data_to_wu(data):    wu_url = "https://weatherstation.wunderground.com/weatherstation/updateweatherstation.php?"    wu_creds = "ID=" + wu_station_id + "&PASSWORD=" + wu_station_pwd    response = requests.get(f'{wu_url}{wu_creds}{data}')    return response.content

В результате мы должны увидеть данные на своей метеостанции.

Тут нужно сделать ремарку, что все сервисы, включая WU требуют регистрации и часто получения API ключей. Вся конфиденциальная информация хранится в secure_data.py

# Geo Datalatitude =longitude =altitude =cur_location =# WEATHER UNDERGROUND DATAwu_api_key =wu_station_id =wu_station_pwd =wu_reference_station_id =# OPEN WEATHER DATAow_api_key =ow_station_id =# PWSWEATHER DATApwsw_station_id =pwsw_api_key =# NARODMON DATAnarodmon_name = narodmon_owner = narodmon_mac = narodmon_api_key = 

Заполняем значения и продолжаем :)

WeatherUnderground увы, работает на платной основе и полученный мной ключ действует всего лишь год. Поэтому, поискав альтернативы, я наткнулся на PWS Weather.

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

def send_data_to_pwsw(data):    pwsw_url = "http://www.pwsweather.com/pwsupdate/pwsupdate.php?"    pwsw_creds = "ID=" + pwsw_station_id + "&PASSWORD=" + pwsw_api_key    response = requests.get(f'{pwsw_url}{pwsw_creds}{data}')    return response.content

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

Ещё можно послать данные на OpenWeatherMap. Персональной страницы тут нет, а в ответ на исторические данные мы получим "средние" по больнице данные, но, почему бы и нет? Энтузиастам надо помогать. Для передачи показаний у OWM для PWS (personal weather station) своё API, но что-то я не нашёл готовой обёртки для него на python, поэтому написал свою.

В отличие американских WeatherUnderground и PWS Weather, использующих имперскую систему, разраработчики OpenWeatherMap из Латвии и используют метрическую систему (Си), поэтому для передачи показаний для них не используем конвертеры, а пишем данные сразу из базы данных, которые мы собрали с датчиков.

from openweather_pws import Stationdef send_data_to_ow(data):    pws = Station(api_key=ow_api_key, station_id=ow_station_id)    response = pws.measurements.set(temperature=data['temperature'], humidity=data['humidity'],                                    dew_point=data['dew_point'], pressure=data['pressure'],                                    heat_index=fahrenheit_to_celsius(heat_index(temp=data['temperature'],                                                                                hum=data['humidity'])),                                    humidex=humidex(t=data['temperature'], d=data['dew_point']))    return response

И, наконец, как вариант импортозамещения самый функциональный, позволяющий хранить в том числе данные с закрытых датчиков (например те же данные о температуре внутри дома) - Narodmon.

На сервисе достаточно богатое API, позволяющее не только передавать показания с датчиков, но и собирать информацию по геолокации, управлять самим устройством удалённо, так и социальные фишки вроде "поставить лайк" или отправить сообщение. Особо здорово, что сервис шлёт email'ы в случае проблем (например датчик не вышел на связь час), так и настраиваемые "проблемы" вроде превышения лимита на конкретном датчике. Но, как и в случае OWM я не нашёл полного API-wrapper для python, и опять написал свой. Теперь, чтобы отправить данные с датчиков, зовём:

def send_data_to_nardmon(data):    nm = Narodmon(mac=narodmon_mac, name=narodmon_name, owner=narodmon_owner,                  lat=latitude, lon=longitude, alt=altitude)    temperature = nm.via_json.prepare_sensor_data(id_in="TEMPC", value=data['temperature'])    pressure = nm.via_json.prepare_sensor_data(id_in="MMHG", value=(data['pressure']))    humidity = nm.via_json.prepare_sensor_data(id_in="HUM", value=data['humidity'])    dew_point = nm.via_json.prepare_sensor_data(id_in="DEW", value=data['dew_point'])    sensors = [temperature, pressure, humidity, dew_point]    response = nm.via_json.send_short_data(sensors=sensors)    return response

У данного сервиса есть одна дурацкая отличительная особенность, состоящая в том, что нельзя отправлять данные чаще чем раз в пять минут. Но на практике то ли у нас разные пять минут, то ли сайт подвисает, реально данные отправляются раз в 10-15 минут. Если всё сделано правильно, то увидим данные на сайте.

Немаловажным будет сказать, что для отправки данных следует "дёргать" ручку /api/v1/send_data пустым GET-запросом. Чтобы не изобретать велосипед, просто поручим это делать cron. Добавляем ещё одну строку:

*/5 * * * * /usr/bin/wget -O - -q -t 1 http://0.0.0.0:80/api/v1/send_data

А как же камера?

Пока никак. Сделанные фото можно передавать на WeatherUnderground. Это сделать несложно через ftp

from ftplib import FTPdef send_image_to_wu(image):    session = FTP('webcam.wunderground.com', wu_cam_id, wu_cam_pwd)    file = open(image, 'rb')    session.storbinary('image.jpg', file)    file.close()    session.quit()

Однако, даже просто вручную передать данные на WU у меня не получилось ни разу. Судя по форумам техподдержки, данная фича работает плохо и сбоит.

Альтернативной является передача изображения на narodmon.ru,

Собственно, время от времени (раз в полчаса) дёргаем ручку /api/v1/capture_photo (которая зовёт take_photo). Например, будем звать через cron этот bash-скрипт:

#!/bin/bashPATH_TO_PHOTO=`/usr/bin/wget -O - -q -t 1 http://0.0.0.0/api/v1/capture_photo`REQUEST='curl -F YOUR_CAM_KEY=@'$PATH_TO_PHOTO' http://narodmon.ru/post'RESULT=`$REQUEST` >/dev/null 2>&1

На сервисе сразу появится снимок:

Плюс, не забываем время от времени (например раз в семь дней) чистить старые изображения:

#!/bin/bash bash# Notes:# This file will remove all files in camera folder older than 7 days, just run in via cron periodically (i.e. daily).find /home/pi/web-server/camera/ -type f -mtime +7 -name '*.jpg' -execdir rm -- '{}' \;

Что дальше?

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

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

Подробнее..

Киберцветок

07.03.2021 00:21:34 | Автор: admin

Вдохновлялся идеей о ГМО-растении. https://nplus1.ru/material/2020/04/27/shining

Началось с того, что купил "в нагрузку" зелёные smd 0603 светодиоды. Появилась идея внедрить их в небольшое зелёное растение, чтобы получился внутренний свет. В таком виде не удалось реализовать, но что-то получилось.

Зелёный светодиод. https://roboshop.spb.ru/radio/led-0603-greenЗелёный светодиод. https://roboshop.spb.ru/radio/led-0603-green

Основные этапы

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

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

Схема Свецве. Светодиод заменён на 3 диода для корректного расчёта.Схема Свецве. Светодиод заменён на 3 диода для корректного расчёта.Плату даже травить не пришлось, просто на текстолите промежутки нарезал

Питание - бескорпусный li-ion аккумулятор на 700 мАч. Максимальный ток потребления 10 мА, так что хватает надолго. Плата зарядки аккумулятора по micro-USB тоже присутствует.

Куплен подходящий цветок драцена. У неё довольно широкие листья и растут по всему кругу, если смотреть сверху.

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

Электроника СвецвеЭлектроника Свецве

Светодиоды закреплены на листьях (тогда не рискнул я в хирургию) тонкими полосками скотча. Скотч никак не вредит листьям и не отклеивается от полива.

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

Вот так Свецве выглядит в темноте, а на свету - выключается. Как ночник - вполне хорошо, мягкий свет.

Свецве. работа в темнотеСвецве. работа в темнотеКрепление скотчемКрепление скотчем

Модернизация

Чего-то не хватало. Не все листья светились от трёх светодиодов, что похоже на уличную подсветку деревьев. В магазине для рукоделия купил прозрачную силиконовую леску 0,5 мм. Леска очень гибкая и вполне прозрачная, чтобы сделать световоды.

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

Световоды диной 70 - 100 ммСветоводы диной 70 - 100 ммПроцесс распихивания и крепления световодовПроцесс распихивания и крепления световодовСвецве. ИтогСвецве. ИтогСвецве. ИтогСвецве. Итог

Благодарю за внимание, а милых дам с праздником!

Подробнее..

Как мы с братом алмаз делали

15.03.2021 20:13:27 | Автор: admin

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

Предыстория и благодарности

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

К большей части рабочего оборудования нас естественно не подпускали и у самих мозгов хватало не трогать, но среди рабочего оборудования можно было пользоваться компьютерами (не подключенными к основному оборудованию связи и управляющим механизмам) и измерительными приборами, а вот сломанное было в полном распоряжении. Тогда не было модного слова утилизация, но и не было столько мусора, т.к. все разбиралось и пускалось в оборот, помню даже корки хлеба в хлебном магазине собирали, а уж детали аппаратуры тем более. Это были не только платы и целые стойки, бывало силовое оборудование и даже кое-какие механизмы. Нам давали разбирать такие классные штуки как ВКУ (видео-контрольное устройство что-то типа телевизора) и другую аппаратуру, в т.ч. высокочастотные приемо-передатчики, компьютеры и управляющие механизмы. Мы разбирали до последнего винтика и последней детальки, проверяли детали на исправность, сортировали и раскладывали по разным ячейкам в специальных ящичках. Даже металлические элементы самих стоек и провода использовались вторично (кое-какое оборудование создавалось на месте при необходимости). Мы были счастливы. Среди папиных коллег были интересные люди: лучшие инженеры и программисты (в те времена в связь абы-кого не брали, т.к. простой в пару минут уже грозил проблемами всему коллективу), там были классные технологи, лучшие механики, и кого там только еще не было, даже целый астроном дядя Боря, который про звезды мог все рассказать. А как иначе, ведь полностью автономный объект должны содержать разные (и самые лучше) специалисты из разных областей науки и техники. И они там были. Был там и шикарный ассортимент технической литературы: по аналоговой и цифровой электронике, по программированию, по микропроцессорной технике, механике, химии, физики. В общем рай для мальчиков с начала разговорной речи до 12 лет. В общем к этому возрасту на ассемблере мы говорили лучше чем на русском языке. Так же у нас был почти обязательный набор многих советских школьников: Юный техник, ЮТ-для умелых рук, Левша, А почему?, Радио, В помощь радиолюбителю, Моделист-конструктор и т.д. и т.п. Все что читалось в вышеуказанной литературе или было рассказано папиными друзьями почти обязательно пробовалось на практике. Кроме разных электронных схемок и механизмов мы варили стекло, делали кирпичи, плавили металлические сплавы, увлекались ракетомоделированием и другими шикарными интересностями, в общем всем, чем должен заниматься стандартный советский школьник. Всем этим людям и моему папе мы благодарны за знания и умения, благодаря им мы занимаем текущее социальное положение и неплохо зарабатываем. Большое спасибо им (в т.ч. начальникам, которые разрешали детей приводить на работу) за наше счастливое детство.

Случайность

Шло теплое лето 1991 года. Мне было 10 лет, а моему двоюродному брату Женьке 11 и мы проводили опыты с электролизом. Покрывали все подряд, тонким слоем всего подряд. От монеток до шишек с елок. Мы меняли материалы, пробовали разные варианты, анализировали получившиеся свойства, записывали в тетрадочку. Все шло по плану, но однажды углеродный электрод закоротил на второй контакт и немного нагрелся.

А напряжение было всего-то 3 Вольта (естественно постоянка, это же электролиз). Сразу вспомнили про лампочки и увеличили до 5В. Пошел дым (от электрода, БП был классный, он выдерживал и не такие издевательства) и появилась жидкость на электроде. Потом до 27В и электрод стал красным. Потом до 30В и электрод стал белым. После отключения он стал опять черным, но очень рыхлым. И тут мы вспомнили, что алмазы делаются при высоком давлении и высокой температуре. Было принято решение попробовать сделать свой алмаз, как позже очень очень точно сказал один известный электронно-механический философ и мизантроп Бэндер в Футураме: с блэкджеком и ....

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

Кое-какие эксперименты сейчас вспоминаем и холодным потом обливаемся, мозгов-то в том возрасте маловато такими делами заниматься. Видно кто-то сверху за нами приглядывал. С электричеством мы решили быстро и просто, т.к. нас был доступ к объекту рядом с местом проживания и туда приходит три фазы. Мы уже знали, что между нулем и фазой 220В, а между двумя фазами 380В. Было помещение для этого дела и даже разъединительный трансформатор. А нам нужно не надолго один имульс в милисекунды. Сейчас бы на такое не решились с текущим багажом знаний (надо внимательней следить за опытами детей!), но советский школьник должен уметь остановить вражеский танк и лучше не один. Мы решили, что самое тяжелое уже решили значит поперли дальше.

Создать полноценный пресс мы не могли, т.к. не было у нас материалов, которые обладали одновременно несколькими свойствами: доступность, термостойкость, негорючесть и не должны проводить электричество. Все доступное либо сгорит, либо расплавится, либо проводит электричество. Либо вообще все сразу. В нашем производстве бывало одновременно по несколько экспериментов, т.е. некоторые эксперименты мы делали, а другие уже в плане и разработке. Учитывая, то что мы сразу не могли заняться алмазом, мы делали дальше другие эксперименты. И вот момент мы занимались чем-то из гипса (уже не помню), накопали классной глины и делали поделки (кирпичики, посуду и т.п.), плавили корунд из добытого оксида алюминия . Мы тогда хотели большой рубин для лазера сделать, но не смогли найти жалкие 0,5% оксида хрома от объема оксида алюминия, а то маленького рубина из старого будильника не хватало для этой цели, поэтому решили сделать хотя бы корунд. В ходе этих экспериментов зародилась идея просто закрепить углеродную болванку на двух электродах и закатать это все в гипс или глину.

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

Исправляем ошибки и дубль два

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

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

Неожиданные результаты и сложности. Дубль три

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

Сказано сделано. Все пересобрали реактор и поставили диод в цепь. Встали за угол и подсоединили. Пыф - яркая вспышка. Реактор целый. Отлетели провода и испарился диод. Разобрали реактор кусочек углерода был почти целым.

Мы на верном пути. Дубль четыре и испытание полученного образца

Думали не долго, тут тонкое место очевидно.

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

Подробнее..

Маяк, ночник и конструктор для вашего ребенка (50 деталей, 3D печать)

16.03.2021 02:15:34 | Автор: admin
image

Добрый день, читатели.

Сегодня я хочу поделиться с вами своей разработкой, точнее не только своей, а сделанной совместно с моей 7-ми летней дочерью.

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

На что дочь ответила Я хочу ночник в виде маяка, и он должен проецировать звезды на потолок.

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

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

Цель ясна и надо приступать к реализации


Задача 1 выбрать образец
Перед каникулами, по вечерам, мы начали готовиться к предстоящей работе. Несколько вечеров просидели в google в поисках того единственного маяка, который мил сердцу и который хотелось бы взять за основу.
Среди огромного разнообразия Юле очень понравился этот маяк (ссылка на исходный сайт увы утеряна):

image

Задача 2 тест
Теперь перед нами встал вопрос хватит ли мощности у небольшого светодиода, для создания тени на потолке, с расстояния 2 метра? Для дочери это было самое увлекательное, одно только предложение поставить эксперимент её так вдохновило, что даже когда мы уже все узнали, она просила еще что-то проверить :)
Собственно с этим как раз и возникли нюансы. Классические светодиоды, коих огромное количество в любых магазинах и у меня в закромах, имеют направленный луч в 30 и чтобы тень создавалась, нужно опустить светодиод практически к основанию маяка. Но ведь у маяка источник света вверху! Благо у меня нашлась еще одна куча 3 миллиметровых светодиодов с углом 120 и теплым белым свечением это оказался самый подходящий светодиод.

Далее была поездка в Кронштадт, ведь нельзя проникнуться идеей создания маяка, если ты не увидел и не прочувствовал его. А в Кронштадте их аж 17! Поездка была отличная, мы погуляли по дамбе, но в самом городе замерзли, с трудом нашли место где купить чего-то теплого и на обратной дороге на КАД пробили колесо. Зато все точно запомнилось!

image

Задача 3 проектирование
Ну вот пришли каникулы и мы начали разработку. Я сидел в Solidworks и создавал детали, Юля сидела рядом и консультировала :) Выбирали оптимальную высоту, ширину основания и прочее. Процесс был очень увлекательный. Итого вышло 50 деталей.

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

Процесс сборки первых деталей
image
image
image
image


Задача 4 электронная начинка
Схему было решено сделать самой простой без транзисторов и всяких там переключателей. 2 готовых модуля модуль заряда литиевых аккумуляторов и сенсорная кнопка, которую мы решили спрятать под крышей входа.

Схема проще не бывает
image

Всё это, за исключением пайки, ребенок может собрать сам. Что касается электронной части, то я решил припаять только огрызки, а дальше дочь сама соединила элементы между собой на скрутку и маяк ожил на её глазах! Все модули размещаются в тамбуре модуль заряда приклеен на двухсторонний скотч на полу (есть отверстие для разъема micro-usb в задней стенке), а переключатель к крыше.


Макеты STL на thingiverse.com

Собственно мы и подошли к концу рассказа. Будем рады, если вы захотите повторить наш проект, а может даже раскрасите или сделаете экстерьер и выложите фотографии в комментариях.

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

Перевод Цифровая паяльная станция своими руками

16.03.2021 16:20:24 | Автор: admin

В этом посте мы будем делать в домашних условиях недорогую цифровую паяльную станцию Hakko 907! Она способна поддерживать переменную и постоянную температуру (до 525 C). Для создания паяльной станции потребуются несколько компонентов общей стоимостью всего 7 долларов (не считая блока питания, но можно использовать уже имеющийся блок питания). Мне не удалось найти подробные инструкции по созданию такой станции, поэтому я решил подготовить собственный туториал с подробным описанием процесса.


Технические характеристики

  • Станция предназначена для ручных паяльников Hakko 907.

  • Станция совместима с ручными паяльниками аналогичного типа.

  • Температурный диапазон: от 27 до 525 C.

  • Время прогрева: от 25 до 37 с (до 325 C).

  • Рекомендованный источник питания: 24 В, 3 А.

  • Мощность: 50 Вт (средняя).

Полная видеоинструкция

Схема сборки, разводка печатной платы, код и файлы стандартной библиотеки шаблонов доступны по ссылке.

Шаг 1. Обычные и цифровые паяльники

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

Обычные паяльники с регулятором температуры

Для регулирования температуры нагрева обычных паяльников существует простой и распространённый способ подключить в цепь питания регулятор температуры, ограничивающий мощность, подаваемую на нагревательный элемент. Такие регуляторы устанавливаются на продукты довольно часто. В своё время у меня была паяльная станция Weller с таким регулятором. И это было на самом деле очень удобно! Единственным недостатком такого способа является отсутствие замкнутого контура температурной обратной связи. В некоторых случаях температура паяльника будет меньше установленной регулятором, так как по мере пайки поглощающих тепло компонентов температура наконечника будет снижаться. Чтобы компенсировать падение температуры, можно повернуть регулятор, но, стоит прекратить пайку, температура снова повысится. Время разогрева паяльника можно несколько уменьшить, если повернуть регулятор в крайнее (максимальное) положение, а после разогрева повернуть его обратно.

Цифровая паяльная станция

Я предпочитаю третий способ самый любимый. Он довольно схож со способом использования паяльника с регулятором температуры, но при этом все действия выполняются автоматически с помощью PID-системы (системы с пропорционально-интегрально-дифференциальным регулятором). Говоря простым языком, такая автоматизированная электронная система управления паяльной станцией "поворачивает" ручку регулятора температуры за вас. Если система обнаружит, что температура наконечника паяльника опустится ниже установленного значения, система повысит мощность до значения, необходимого для выработки тепла на наконечнике паяльника. Если температура паяльника поднимется выше установленного значения, питание на паяльник перестанет подаваться, что приведёт к снижению температуры. С помощью такой системы ускоряется весь процесс пайки система постоянно включает и отключает нагревательный элемент паяльника и, таким образом, поддерживает постоянную температуру на его наконечнике. Поэтому при использовании цифровых паяльных станций паяльник разогревается значительно быстрее.

Шаг 2. Компоненты и материалы

В зависимости от того, где вы собираетесь купить компоненты станции, итоговая цена системы может оказаться разной (советую закупить компоненты на Aliexpress, так выйдет дешевле всего). Я ещё попробую выяснить, в каких именно интернет-магазинах можно приобрести самые дешёвые компоненты, и, возможно, внесу в ссылки некоторые изменения. Свои компоненты я приобрёл в местном магазине E-Gizmo Mechatronics Manila.Требуемые материалы:

  • Паяльник Hakko 907 (аналог за 3 доллара).

  • Программируемый контроллер Arduino Nano.

  • Понижающий преобразователь (MP2303 производства D-SUN).

  • Гнездовой 5-штырьковый DIN-разъём.

  • Гнездо для подключения внешнего источника постоянного тока (2,1 мм).

  • Источник питания 24 В, 3 A.

  • ЖК-дисплей 16X2 I2C.

  • Операционный усилитель LM358.

  • МОП-транзистор IRLZ44N (я использовал IRLB4132, он лучше).

  • Электролитический конденсатор 470 мкФ, 25 В.

  • Сопротивление 470 Ом, 1/4 Вт.

  • Сопротивление 2,7 кОм, 1/4 Вт.

  • Сопротивление 3,3 кОм, 1/4 Вт.

  • Сопротивление 10 кОм 1/4 Вт.

  • Потенциометр 10 кОм.

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

Рекомендованные технические характеристики МОП-транзисторов:

  • N-канальный МОП-транзистор логического уровня МОП-транзисторы логического уровня можно непосредственно подключать к штыревому соединителю логической платы (цифровому штырьку Arduino). Поскольку напряжение насыщения затвора ниже обычных напряжений Vgs стандартных МОП-транзисторов, на МОП-транзисторе логического уровня предусмотрен затвор для подачи напряжений насыщения 5 или 3,3 В (Vgs). Некоторые производители не указывают это в технических характеристиках. Это отражено на кривой зависимости Vgs от Id.

  • Значение Vds должно быть не менее 30 В это предельное значение напряжения МОП-транзистора. Мы работаем на 24 В, и, в принципе, значения напряжения Vgs 24 В должно хватить, но обычно, чтобы обеспечить стабильную работу, добавляется некоторый запас. Стандартное значение напряжения Vgs для большинства МОП-транзисторов составляет 30 В. Допускается использование МОП-транзисторов с более высокими напряжениями Vgs, но только в том случае, если другие технические характеристики не выходят за пределы диапазона.

  • Сопротивление Rds(on) 0,022 Ом (22 мОм): чем ниже, тем лучше. Rds(on) это сопротивление, формируемое на контактах стока и истока МОП-транзистора в состоянии насыщения. Проще говоря, чем ниже значения сопротивления Rds(on), тем холоднее будет МОП-транзистор. При увеличении значения Rds(on) МОП-транзистор будет при работе нагреваться благодаря рассеиванию мощности из-за хоть и небольшой, но всё-таки присутствующей резистивности МОП-транзистора, даже если он находится в состоянии проводимости.

  • Id не менее 3 А (я предлагаю более 20 А) это максимальный ток, который может выдержать МОП-транзистор.

Шаг 3. Проектирование

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

Таинственный терморезистор Hakko

К сожалению, Hakko не приводит практически никаких данных о терморезисторе, установленном внутри нагревательных элементов. Для меня это много лет оставалось загадкой. Ещё в 2017 году я провёл небольшое лабораторное исследование, пытаясь узнать тепловые характеристики таинственного терморезистора. Я прикрепил датчик температуры к наконечнику паяльника, подключил омметр к штырькам терморезистора и подал питание на нагревательный элемент с испытательного стенда. Увеличивая температуру паяльника, я фиксировал соответствующие сопротивления терморезистора. В итоге у меня получился график, который оказался полезным при разработке электрической схемы. Потом я выяснил, что, возможно, этот терморезистор представляет собой терморезистор с положительным температурным коэффициентом сопротивления. Другими словами, по мере повышения температуры вблизи терморезистора сопротивление терморезистора также увеличивается.(При выполнении следующих шагов рекомендую сверяться с третьим рисунком.)

Делитель напряжения для датчика

Используется для получения полезного выхода с датчика температуры терморезистора. Мне пришлось подсоединить его с помощью делителя напряжения. Здесь повторяется та же история технические характеристики этого таинственного датчика отсутствуют, поэтому я установил верхний резистор на делитель напряжения, чтобы ограничить максимальную мощность, рассеиваемую на датчике (я установил максимальное значение 50 мВт). Теперь, когда на делителе напряжения появился верхний резистор, я вычислил максимальное выходное напряжение при максимальной рабочей температуре. Напряжение на выходе делителя напряжения составило приблизительно 1,6 В. Затем я попытался решить проблему совместимости АЦП для 10-разрядного программируемого контроллера Arduino Nano и в итоге обнаружил, что не могу подключить датчик делителя напряжения напрямую, так как значения получаются слишком малыми, и они могут оказаться недостаточными для получения нужного результата. Проще говоря, если я подключу датчик делителя напряжения непосредственно к аналоговому штырьку, то между значениями температуры могут возникать пропуски (например, 325 C, 326 C, 328 C..... пропущено значение 327 C).

Операционный усилитель

Чтобы избавиться от возможной проблемы, связанной с пропуском температурных значений, я использовал операционный усилитель, усиливающий низкое пиковое значение выходного напряжения делителя напряжения (1,6 В). Расчёты, представленные на третьем рисунке, устанавливают требуемое минимальное значение коэффициента усиления и значение коэффициента усиления, выбранное мной для рабочей системы. Я не стал доводить коэффициент усиления до значения, при котором 1,6 В на выходе делителя напряжения превращались бы в 5 В опорного напряжения АЦП в Arduino, так как мне хотелось обеспечить определённый запас, если другие паяльники Hakko, подключаемые к делителю напряжения, будут выдавать напряжения выше 1,6 В (что может привести к нелинейным искажениям). Достаточно большой запас обеспечивается при использовании коэффициента усиления 2,22, при этом система сможет работать с другими моделями паяльников.

Шаг 4. Принципиальная схема

В качестве коммутационного устройства для регулирования напряжения методом широтно-импульсной модуляции в проекте используется простой N-канальный МОП-транзистор логического уровня. Он выступает в качестве цифрового переключателя, подающего питание на нагревательный элемент. Нереверсивный операционный усилитель (LM358) используется для усиления очень малых напряжений, выдаваемых терморезистором делителя напряжения. В качестве регулятора температуры используется потенциометр 10 кОм, а светодиодный индикатор представляет собой обычный индикатор, который я подключил и запрограммировал таким образом, чтобы он отображал состояние активности нагревательного элемента. В данном проекте я использовал ЖК-дисплей 16X2 с драйвером интерфейсной шины I2C, так как новичкам в электронике в нём проще разобраться.

Шаг 5. Печатная плата

Разводку печатной платы я осуществил в программе Proteus. Плата разведена как односторонняя намеренно, чтобы ни у кого не возникали трудности в процессе сборки системы в домашних условиях. Обратите внимание, что, если все элементы устанавливаются на одной стороне печатной платы, потребуется одна перемычка. PDF-файлы можно скачать с диска Google по ссылке ниже.Файлы в формате Gerber, если потребуется, можно скачать с диска Google по ссылке ниже. Дизайн моей платы вы также можете получить непосредственно на сайте PCBway.com, и тогда вам не придётся вручную вводить файлы Gerber. (ссылка на PCBway.com)

Файлы PCB (Proteus, Gerber и Printables):

Шаг 6. Калибровка понижающего преобразователя.

Поскольку большинство клонов программируемого контроллера Arduino Nano способны принимать входное напряжение не более 15 В (более высокое напряжение может вывести из строя пятивольтовый регулятор AMS1117), а нагревательному элементу для оптимальной работы требуется напряжение 24 В, для совместной работы обоих этих компонентов я ввёл в схему понижающий преобразователь. Регулятор AMS1117 5 В, присутствующий в большинстве клонов программируемого контроллера Arduino Nano, имеет напряжение отпускания 1,5 В, другими словами, входное напряжение на VIN-контакте Arduino Nano должно составлять 6,5 В (5 В + 1,5 В).

Шаги:

  1. Установите напряжение на источнике питания 24 В.

  2. Подключите источник питания ко входу понижающего преобразователя.

  3. С помощью мультиметра отслеживайте напряжение на выходе понижающего преобразователя.

  4. Отрегулируйте подстроечный резистор до значения напряжения на выходе 6,5 В.

  5. Для обеспечения более высокой стабильности можно установить значение 7 В.

Шаг 7. Сборка системы

Для сборки системы воспользуйтесь принципиальной схемой или схемой размещения компонентов (см. предыдущие этапы).

Шаг 8. 3D-печать корпуса

Какой корпус выбрать дешёвый пластиковый или мой, разработанный для 3D-печати, решайте сами. Прилагаю для редактирования соответствующий файл Solidworks. Если потребуется осуществить печать заранее, можно воспользоваться файлами STL, которые можно скачать по приведённой ниже ссылке на Google-диск.

Мои настройки 3D-принтера:

  • Печать осуществляется на принтере Creality CR-10.

  • Высота уровня 0,3 мм.

  • Сопло 0,5 мм.

  • Заполнение 30 %.

  • Без суппортов.

Файлы для 3D печати (Solidworks и STL): Шаг 9. Финишная отделка корпуса (покраска и шлифовка).

После завершения печати полученный 3D-корпус корпус можно отшлифовать. Свой корпус, чтобы он выглядел более изящно, я выкрасил в чёрный цвет.Шаг 10. Установка внешних компонентов.

Закрепите на свои места в корпусе ЖК-дисплей, потенциометр 10 кОм, гнездо для подключения внешнего источника постоянного тока и плату. С помощью суперклея прикрепите DIN-разъём и ЖК-дисплей к корпусу.

Шаг 11. Разъём Hakko 907.

У вас, как и у меня, может возникнуть проблема с 5-штырьковым DIN-разъёмом для паяльника Hakko. Штырьковый разъём можно вырезать из паяльника и заменить его на 4-штырьковый разъём (возможно, у вас такой имеется). У меня нашлась пара 5-штырьковых DIN-разъёмов, однако не та, которая используется на Hakko. Третий штырёк это обычный контакт заземления, его можно игнорировать, если не хочется возиться со схемой заземления и защитой от статического электричества.

Шаг 12. Подключение внешних компонентов

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

Шаг 13. Программирование

ШАГИ:

  1. Подключите программируемый контроллер Arduino к компьютеру.

  2. Загрузите шаблон моей программы.

  3. Внесите в шаблон необходимые изменения.

  4. Для паяльников Hakko 907 я использовал стандартные значения.

  5. После калибровки эти значения, возможно, придётся изменить.

  6. Не забудьте установить библиотеки Wire.h и LiquidCrystal_I2C.h.

  7. Tools > Boards > Arduino Nano.

  8. Tools > Port > выбрать порт, к которому подключён контроллер Arduino.

  9. Загрузить шаблон/программу.

Как работает код

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

Контроль PID

В коде не используется техника PID. В первой версии я использовал старый PID-код, и он работает практически так же, как компараторная версия кода (в этом руководстве). Я остановился на более простой версии, так как с ней легче работать (настраивать, модифицировать и пр.). Я могу отправить по электронной почте версию PID, но она мало что изменит. Код Arduino (V1.0)

Шаг 14. Отрегулируйте контрастность ЖК-дисплея и вставьте ручку потенциометра.

Если контроллер Arduino и 16x2 ЖК-дисплей ранее вами не использовались, первым делом нужно настроить подстроечный резистор контрастности ЖК-дисплея. После завершения настройки вставляется пластиковая ручка потенциометра контроля температуры.

Шаг 15. Закройте корпус и включите устройство

Теперь можно закрепить заднюю панель корпуса. Но перед этим необходимо проверить правильность калибровки паяльной станции. В качестве источника питания можно использовать аккумуляторные батареи или любой источник питания с выпрямителем из моего списка рекомендаций по источникам питания. Для получения максимальной производительности паяльной станции рекомендую использовать блок питания 24 В, 3 А. Таким блоком питания паяльной станции может быть импульсный источник питания в металлическом корпусе или, как вариант, зарядное устройство для ноутбука. Если вы не хотите покупать новый источник питания, можно приобрести б/у. Зарядные устройства для ноутбуков, как правило, имеют номинал 18 В, 2,5 A. Они работают нормально, но время разогрева паяльника может достигать 37 с.Шаг 16. Бонус: как повысить теплопередачу.

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

Шаг 17. Станция готова к работе!

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

Узнайте, как прокачаться в других специальностях или освоить их с нуля:

Другие профессии и курсы
Подробнее..

CCTV на базе Raspberry Pi. Часть первая и, возможно, последняя

16.03.2021 16:20:24 | Автор: admin

Привет, коллеги!

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

Итак, наконец у меня дошли руки просверлить/проштробить/собрать/накодить/отладить и запустить видеонаблюдение на базе малинок.

Ничего инновационного в проекте нет, просто в удовольствие и с некоторой экономией.

Задействованы

  • две старушки малины 1B с камерами первого поколения, которые лежали уже лет семь и просились помочь им обрести хоть какой-то смысл существования

  • относительно новая малина 3B и отдельный USB HDD к ней

  • всякая сетевая и питательная инфраструктура

Что особенно интересного было в проекте

Каждая из старушек гонит по TCP с помощью raspivid два потока на свежую малинку.

  • первый поток это H.264 ES, сырой видеопоток.

  • второй поток это, о чудо, motion vectors кодека H.264, которые raspivid может отдельно отдавать.

Свежая малинка работает как сервер (NodeJS), принимающая потоки от старушек (по два с каждой).

  • всё что прилетает в видеопоток дампится в файл на накопитель (с периодическим стартом нового файла). Разумеется, для каждой камеры отдельно.

  • всё что прилетает в поток векторов, используется для детектирования движения (работает весьма неплохо!). Тут мне сильно помогла репка с питониевым кодом для визуализации (https://github.com/janblumenkamp/raspivid_motionvectors), изучив код которой, я и сделал на NodeJS "детектор" движения без всяких этих ваших нейро. Посмотрим, как будет себя вести.

Также открываем на сервере для каждой малины один исходящий TCP-порт, к которому может подключиться, например:

  • mplayer в связке с ffmpeg для отображения на десктопе

  • ffmpeg, который будет оттуда забирать поток и пихать его в rtmp-модуль nginx для веб-стриминга

Волнообразную засветку из-за ККЛ удалось устранить с помощью --flicker, но с параметром auto, а не 50hz.

Длинные шлейфы (100см) дают тёмную картинку, что исправляется с помощью --digitalgain, но удалось обойтись меньшей длиной.

В качестве основы для корпусов я брал прекрасную работу https://www.thingiverse.com/thing:2746186, но пришлось доработать:

  • удлинить корпус камеры, чтобы она всё-таки была больше похоже на камеру, во избежание, так сказать

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

  • заменить шаровую опору на несколько колен с винтовым соединением, потому что:

    • пластик усыхает и шар начинает болтаться

    • несколько удобнее позиционировать

Подробнее..

Перевод Как я сделал кнопку выхода из Zoom

17.03.2021 16:04:48 | Автор: admin

2020 год однозначно можно назвать годом Zoom. Такого количества онлайн-встреч, кажется, не было никогда. И в начале 2021 пока изменений не видно. Но есть способы разнообразить это и заодно немного повеселиться. Эта кнопка аварийного выхода из Zoom позволяет мгновенно выйти из конференции. Она проста в изготовлении и требует очень небольшого опыта работы с электроникой. Я сделал её, потому что я всегда искал кнопку выхода в нижней части экрана и, казалось, всегда был тем человеком, который уходил с каждого собрания последним. Теперь, когда я сделал кнопку аварийного выхода, я могу уйти с любого собрания Zoom как чемпион. Я бы сказал, что качество моей жизни улучшилось на 357 % (плюс-минус).


Запчасти:

(X1) Блок аварийной кнопки.

(X1) Контроллер Adafruit Trinket M0.

(X1) Микро-USB кабель.

(X2) 22AWG M4 Вилочная клемма.

(X2) 6-дюймовые многожильные провода.

(X1) Кнопка мгновенного действия (опционально).

Инструменты:

(X1) Паяльник.

(X1) Инструмент для зачистки проводов.

(X1) Отвёртка.

(X1) Канцелярский нож.

Шаг 1. Установите программное обеспечение

Этот проект предполагает, что у вас есть некоторые практические знания об Arduino. Тем не менее я остановлюсь на процессе установки программного обеспечения.

Прежде всего загрузите Arduino IDE, если вы ещё это не сделали.

Затем вам нужно будет добавить Adafruit Trinket M0 в Arduino IDE. Самый простой способ сделать это следовать инструкциям по установке на странице Adafruit.

Наконец, настройте плату следующим образом

Tools > Board > Adafruit Trinket M0.

Tools > Port > /dev/cu.usbmodem (или похожие).

Шаг 2. Запрограммируйте контроллер

Загрузите в контроллер следующий код:

// ******************************************************// //            Code for quitting Zoom quickly////           Designed for Adafruit Trinket M0//                   by Randy Sarafan////               For more info check out://  https://www.instructables.com/Easy-Zoom-Quit-Button///// ******************************************************// Add the keyboard library#include <Keyboard.h>void setup() {     // Configure Pin 2 as input switch.    // Triggered when connected to ground.     pinMode(2, INPUT_PULLUP);    // Start running the board as a virtual computer keyboard    Keyboard.begin();  }void loop() {      // Check for a button press event    if (digitalRead(2) == LOW) {           // Press command w and wait 1/10 second        Keyboard.press(KEY_LEFT_GUI);        Keyboard.press('w');        delay(100);            // Release all keyboard keys        Keyboard.releaseAll();        // Press the return key and wait 1/10 second        Keyboard.press(KEY_RETURN);        delay(100);            // Release all keyboard keys        Keyboard.releaseAll();        // Wait for the pushbutton to be released before resuming        while (digitalRead(2) == LOW){           delay(1000);        }     }}

Шаг 3. Присоедините разъёмы

Отрежьте два провода диаметром 6 дюймов. Предпочтительно, чтобы один был чёрным (для заземления), а другой любого другого цвета, который вам нужен.

Зачистите один конец каждого провода и обожмите клеммы вилки на концах каждого из них.

Шаг 4. Припаяйте провода.

Припаяйте чёрный провод к земле.

Другой провод припаяйте к контакту 2.

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

Шаг 5. Вставьте USB

Найдите резиновую втулку корпуса.

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

Шаг 6. Подключите USB

Установите резиновую втулку в корпус, а затем подключите кабель USB к контроллеру Trinket M0.

Шаг 7. Замените кнопку (необязательно)

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

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

Для этого я просто разобрал фиксирующую кнопку и вынул её из корпуса. Затем я разобрал и вместо этого установил кнопку мгновенного действия.

Шаг 8. Подключите коммутатор

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

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

Я прикрепил плоские клеммы на печатной плате к этим двум клеммам с помощью крепёжных винтов.

Примечание: не беспокойтесь, если вы ошибётесь. Просто подключите провода к другому набору клемм.

Шаг 9. Закройте корпус

Установите крышку на корпус и закрепите её крепёжными винтами.

Шаг 10. Закройте Zoom!

Чтобы использовать это, просто подключите его к USB-порту.

Когда вы будете готовы выйти с собрания в Zoom, просто нажмите кнопку.

Вот и всё.

Такая кнопка пригодится и на наших вебинарах, которые мы на регулярной основе проводим для наших студентов на всех курсах. На них менторы разбирают со студентами особо сложные темы, попутно отвечая на вопросы. Неважно, какое направление вы выберете Этичный хакинг, Data Science илиMachine Learning на каждом из них вы найдёте современную программу и внимательную службу поддержки.

Узнайте, как прокачаться в других специальностях или освоить их с нуля:

Другие профессии и курсы
Подробнее..

Перевод - recovery mode Как собрать робот, создающий художественные произведения

17.03.2021 20:18:15 | Автор: admin

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


В своём творчестве Энди Уорхол часто вдохновлялся такими понятиями, как коммодитизация (переход продукта из марочной категории в категорию рядовых продуктов) и массовое производство. Это вдохновило его на создание художественных полотен, на которых изображены отдельные предметы или объекты, например бутылки с кока-колой, Мэрилин Монро или банки с супом Кэмпбелл. Кроме того, при создании своих картин он использовал особый метод шелкотрафаретную печать. Это дало ему возможность поставить на поток изготовление картин и художественных работ в собственной студии The Factory.Возможно, я несколько преувеличиваю, но мне кажется, что Энди по достоинству оценил бы искусство моего робота, создающего художественные произведения в его неповторимом стиле. В конце концов, он сам заявил когда-то: "Я хочу стать машиной".

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

Какие компоненты потребуются

Для выполнения данного проекта потребуется множество различных файлов, например файлы для 3D-печати, код микроконтроллера, схема разводки печатной платы и компьютерная программа с графическим интерфейсом. Все необходимые файлы, разработанные и подготовленные мной для данного проекта, я поместил в репозиторий Github, версии этих файлов я постоянно обновляю.

Двигатели и кинематические устройства

  1. Серводвигатель с металлическим приводом. Datan B2122.

  2. 2 шаговых двигателя Nema 17. Модель 17HS4401N.

  3. 2 зубчатых шкива 2GT 20. Просверленное отверстие 5 мм. Для приводного ремня шириной 6 мм.

  4. 2 зубчатых ремня 2GT 20. Ширина 6 мм. Длина 2 м.

  5. 7 шариковых подшипников 623ZZ. 3x10x4 мм.

Рама робота

  1. V-образная направляющая 20x20 мм. Длина 1500 мм.

  2. Как минимум 4 зажима с храповым механизмом или винтовых.

  3. Доступ к 3D-принтеру.

  4. Строительный гипс.

  5. Гайки, болты и шайбы М3 в ассортименте. В принципе, подойдёт размер M3x10 мм (конические).

Печатная плата и электронные элементы

  1. Программируемый контроллер Arduino Nano.

  2. 2 бесшумных шаговых двигателя TMC2130.

  3. 4 цилиндрических алюминиевых конденсатора на 10 мкФ.

  4. 1 конденсатор 1206 на 330 мкФ.

  5. 1 конденсатор 1206 на 100 мкФ.

  6. 1 линейный регулятор напряжения LM7805 TO-252.

  7. 2 диода Шоттки MDD SS14, DO-214.

  8. Нажимная кнопка 6,0x3,5 мм. Сейчас эта кнопка не задействована, я просто добавил её в конструкцию, так как она может понадобиться позже.

  9. 2 четырёхштырьковые гнездовые колодки с JST.

  10. 1 трёхштырьковая гнездовая колодка с JST.

  11. Источник питания: 735 В, мин. ток 1,5 A.

Шаг 1. Как создаётся художественная работа

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

Чтобы использовать робот для рисования, зажимами я закрепил на его раме чистый холст. Затем я подвесил рисующую головку и перебросил ремни через шаговые двигатели, расположенные на углах рамы робота, и отцентрировал рисующую головку (перевел её в домашнее положение). В рисующую головку вставил перманентный маркер. Затем подключил робот по USB-кабелю к компьютеру, на котором запустил управляющее программное обеспечение. В компьютер я загрузил чёрно-белое изображение, созданное в программе Photoshop, а затем разместил рисующую головку в том месте холста, откуда должна начаться прорисовка. Чтобы рисующая головка попала в нужное положение, я отправлял на робот команды перемещения в пределах ограничительной рамки и подгонял расположение изображения до тех пор, пока оно не оказалось именно там, где нужно. Затем я дал команду отправки изображения на робот.

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

Шаг 2. Сборка рамы робота

На этом шаге выполняются все действия по креплению компонентов на раму робота. Главная часть рамы V-образная направляющая 20x20 мм. При проектировании робота я взял за основу направляющую длиной 100 см, так как её было легче разместить на рабочем столе, но по зрелом размышлении я решил увеличить её длину до 150 см. В принципе, длина направляющей может быть любой, желаемую длину можно указать в соответствующей переменной в коде Arduino, мы остановимся на этом чуть позже.Вначале нужно распечатать все 3D-файлы, о которых я говорил на первом шаге. Довольно быстро это делается с разрешением 0,3 мм без заполнения.Взгляните на первый рисунок для данного этапа. Во все 3D-отпечатки, имеющие шестигранное углубление с внутренней стороны, нажатием вставляется гайка M3. С другой стороны в гайку закручивается винт M3 произвольной длины. Нажатие вдавливает винт в металлическую направляющую и создаёт прочное механическое соединение (которое при необходимости может быть ослаблено).

Ключ перевода в домашнее положение

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

Держатель платы

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

Держатели двигателя

Вначале с помощью винтов M3x10 мм прикрутите к держателям двигатель Nema 17 (по шайбе на каждый винт). Затем вставьте держатели двигателей в направляющую робота и снова закрепите их винтами, следя, чтобы двигатели оставались на краях направляющей. Теперь на валы двигателей можно накинуть ремённые шкивы.

Сборка рамы робота

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

Шаг 3. Рисующая головка робота

Левый и правый кронштейны

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

Для крепления двух кронштейнов на рисующей головке мы используем винт М3х20 мм и стопорную гайку М3 с обеих сторон среднего контейнера. Всё это собирается вместе в следующую уровневую конструкцию:

  1. Винт M3x20 мм.

  2. Шайба.

  3. Средний контейнер.

  4. Шайба.

  5. Правый кронштейн с шариковым подшипником.

  6. Шайба.

  7. Левый кронштейн с шариковым подшипником.

  8. Шайба.

  9. Правый кронштейн с шариковым подшипником.

  10. Шайба.

  11. Средний контейнер.

  12. Шайба.

  13. Стопорная гайка M3.

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

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

Манипулятор робота

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

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

Шаг 4. Весовые нагрузки

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

Опытным путём я узнал, что оптимальный вес боковых весовых нагрузок составил около 300 г, а средней около 530 г. Эти значения отлично подошли для размеров создаваемого мною робота. После того как мне стал известен вес, мне нужно было понять, какому объёму гипса он соответствует. Я провел ряд экспериментов с гипсом и рассчитал значение плотности: Rho = 1,435 кг/л.

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

При расчёте объёма, необходимого для печати пластиковых оболочек, я применил расчётное значение плотности, после чего запустил 3D-печать оболочек соответствующего объёма.Теперь ценный совет: для распечатки весовых нагрузок я использовал полилактидный пластик. Это не водонепроницаемый материал, поэтому незатвердевший гипс может просачиваться через трещины в 3D-печати. Чтобы избавиться от этой проблемы, я с помощью кисти нанёс слой воска (для этого пришлось зажечь восковую свечу) на внутреннюю поверхность 3D-отпечатка. Теперь оболочка стала водонепроницаемой, и гипс будет надёжно удерживаться внутри неё вплоть до затвердевания.

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

Шаг 5: Программа управления роботом

Главной программой, управляющей роботом, является программное обеспечение контроллера Arduino Nano. Контроллер обрабатывает входные команды, передаваемые через USB, осуществляет точные расчёты движения, посылает импульсные команды шаговым двигателям, а также перемещает манипулятор робота вверх и вниз либо для рисования линии, либо для простого перемещения по прямой.

На первом этапе можно загрузить файлы GERBER, разработанные мной для "мозга" робота, которые я заказал на сайте JLCPCB.com, любезно предоставившего спонсорскую поддержку этому проекту.На печатную плату нанесена понятная маркировка, для её изготовления используются стандартные компоненты. Процесс пайки предельно прост. Чтобы обеспечить простоту подключения/отключения двигателей, я припаял штыревые головки к шаговому двигателю и сервоприводу. Я припаял соответствующие штыревые головки к проводам сервопривода и двум шаговым двигателям.

  1. Программируемый контроллер Arduino Nano.

  2. 2 бесшумных шаговых двигателя TMC2130.

  3. 4 цилиндрических алюминиевых конденсатора по 10 мкФ.

  4. 1 конденсатор 1206 на 330 мкФ.

  5. 1 конденсатор 1206 на 100 мкФ.

  6. 1 линейный регулятор напряжения LM7805 TO-252.

  7. 2 диода Шоттки MDD SS14, DO-214.

  8. Нажимная кнопка 6,0x3,5 мм. Сейчас эта кнопка не задействована, я просто добавил её в конструкцию, так как она может понадобиться позже.

  9. 2 четырёхштырьковые гнездовые головки JST.

  10. 1 трёхштырьковая гнездовая головка JST.

Для подачи питания на электронные компоненты я использовал зарядное устройство для ноутбука, выдающее напряжение 19,5 В, но вполне можно использовать любой имеющийся блок питания, при условии, что он выдаёт от 7 до 35 В и не менее 1,5 А.

После завершения пайки загрузите в Arduino код (см. первый шаг).

Важное замечание: не забудьте подключить мою библиотеку fork of the stepper, которую можно загрузить из моего хранилища github. Мне пришлось исключить ненужную функцию, вызывавшую ошибку линии рисовались не прямо, а с точкой перелома. Если бы вы знали, сколько времени у меня ушло на поиск этой неисправности и отладку!

Шаг 6. Управление роботом

Рабочая нагрузка разделяется между самим роботом и компьютером. По аналогичной схеме работает большинство 3D-принтеров. Я написал интерпретатор GCODE для Arduino, обрабатывающий входящие команды, вычисляющий направления перемещения и рассчитывающий последовательность подачи импульсов на два шаговых двигателя.

Программное обеспечение соединяется с роботом по USB-кабелю, на компьютер загружается изображение, которое робот должен перенести на холст, затем оно "нарезается" на отдельные линии. Линии на изображении последовательно отправляются на робота. Программное обеспечение ожидает, когда робот закончит движение, и затем отправляет на робота следующую линию.

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

На сегодня управляющая программа обеспечивает отрисовку полных изображений в формате BMP. Все цвета темнее RGB (60, 60, 60) будут отрисовываться роботом как чёрные. Сейчас я также занимаюсь реализацией поддержки векторных изображений для рисования плавных линий и красивых кривых Безье.

Узнайте, как прокачаться в других специальностях или освоить их с нуля:

Другие профессии и курсы
Подробнее..

100500-ая автоматика полива для растений. Часть 2 Сенсоры и электроника

08.04.2021 20:08:42 | Автор: admin

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

Уровень воды

Сначала был дискретный сенсор, сделанный из двух пластин нержавейки.

две пластинки нержавейки ждут касания водыдве пластинки нержавейки ждут касания воды

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

Далее были опробованы различные ультразвуковые датчики: HY-SRF05, HC-SR04, JSN-SR04T, US-025. Наиболее приемлемыми (по измеряемому диапазону) и стабильными (с точки зрения показаний и выносливости) были были выбраны HC-SR04.

HC-SR04 смотрит на воду в бакеHC-SR04 смотрит на воду в баке

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

поплавок с герконом. Такой без проблем тянет 12В, 0.4Апоплавок с герконом. Такой без проблем тянет 12В, 0.4А


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

Слышал про использование лазерного датчика уровня. В комментариях подсказывают ставится в бак трубка с поплавком и на поплавок наводим лазер. С ним я пока не имел дел. Будет датчик попробую.

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

датчик давления крови. Достаточно чувствительный прибордатчик давления крови. Достаточно чувствительный прибор


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

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

Температура

Тут можно измерять температуры воды, воздуха. Изначально опыты проводились на обычных резистивных датчиках, типа, PT100. Далее были освоены датчики DHT11/22. И ещё позже DS18B20. Резистивным датчикам необходим аналоговый вход на контроллере. По входу на каждый датчик. DHT тоже хотят по входу на каждый, но уже можно использовать цифровые входы (коих, обычно, больше). В DHT плюсом идёт измерение влажности. DS18B20 хорош тем, что на один пин контроллера можно подключить несколько датчиков разом. По-итогу, на сегодня, в самом устройстве ставится один DS18B20, измеряющий температуру воды в районе магистрали смешивания удобрений. Это становится излишним, когда в сенсор EC уже встроен резистивный термодатчик, измерения с которого снимаются AD5934, входящим в состав блока для измерения EC.

DS18B20 подключается с резистором 10к между питанием и линией данных.

EC (ака TDS, ака солемер)

Для измерения количества солей были также перепробованы несколько способов:

1. По этой ссылке была найдена следующая схема

Измеритель EC/TDS на TL074. http://www.octiva.net/projects/ppm/Измеритель EC/TDS на TL074. http://www.octiva.net/projects/ppm/

Далее была разведена плата и фоторезистивным методом собственноручно (то было во времена, когда JLCPCB был мне неизвестен, если существовал вообще) изготовлена, с применением хлорного железа и прочими шаманствами. Подозреваю, что руки мои на тот момент росли значительно ниже плеч, что попрепятствовало успеху с данной схемой. На самом деле, один модуль даже работал и весьма неплохо. А вот ещё парочка-другая, почему-то заводиться отказалась.

2. Была ещё одна схема на TL074, но сейчас, к сожалению, не вспомню откуда и какая. Учитывая только память о том, что была пробная сборка на макетке, видимо она не заработала.

3. Самой простой и очевидной оказалась схема измерения влажности на таймере 555.

измеритель влажности на таймере 555. http://www.emesystems.com/OLDSITE/OL2mhos.htmизмеритель влажности на таймере 555. http://www.emesystems.com/OLDSITE/OL2mhos.htm

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

4. AD5934 который водит в состав демонстрационной платы EVAL-0349, от Analog.

демо-плата EVAL-0349 от Analogдемо-плата EVAL-0349 от Analog


Тут уже всё стало более чем серьёзно (на самом деле есть варианты ещё более точные, с более широким диапазоном измерений и более кусачей ценой, но наврядли они пригодятся в растениеводстве). Шутка ли два диапазона измерений (первый: от 25S до 2500S, второй: от 0.2mS до 200mS) с относительной погрешностью измерений 0.5% для первого диапазона и 1% (после программной коррекции. Если без неё, то 3%) для второго. Вообще, AD5934, насколько я сегодня понимаю, был придуман больше для измерения качества проводной сети (типа, проверять затухание сигнала в витой паре). Но CN0349 рассказывает удивительные вещи и про растворы солей. Рекомендую изучить сей circuit note, для общего образования.

схемы EVAL-0349 с сайта analog.comсхемы EVAL-0349 с сайта analog.com


Если вкратце, то работает эта штука следующим образом: есть микросема ADG715, которая делает выбор между одним из двух пределов измерений EC или термодатчиком. Есть сам AD5934, который измеряет сопротивление с сенсора EC или резистивного термодатчика через операционный усилитель AD8606. Всё это дело заведено через изолятор питания ADuM5000 и изолятор данных ADuM1250. Чтобы всё это собрать и запустить на своей плате, пришлось изрядно покурить даташиты по всем этим компонентам. В итоге, когда всё заработало, измерения электропроводности воды стали максимально достоверными за всю историю проекта. Сами сенсоры, после самодельных, были взяты с aliexpress, с сантехнической резьбой пол-дюйма, со встроенным резистивным термодатчиком. Константа сенсора 1.0.

EC сенсор с удлиннителем примеряется в гидросистему аппарата полива растенийEC сенсор с удлиннителем примеряется в гидросистему аппарата полива растений

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

Сенсоры давления воды

Калибровка стального датчика давленияКалибровка стального датчика давления

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

Все эти сенсоры расчитаны на 5В питание. Выдают, соответственно, напряжение, линейно зависящее от давления, в диапазоне от 0.5В до 4.5В. АЦП контроллера STM32 запитан от 3.3В, следовательно в схему подключения привносится самый простой делитель напряжения резистивный.

Измерение кислотности раствора

Измерение кислотности раствора происходит обычным сенсором pH, которые также продают на aliexpress.

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

измеритель pH. http://www.emesystems.com/OLDSITE/OL2ph.htmизмеритель pH. http://www.emesystems.com/OLDSITE/OL2ph.htm

Первая версия, собранная своими руками выглядела как-то так

как ни странно, это заработалокак ни странно, это заработалоэтот вариант стал ещё лучше, уменьшившись в размерах и получив экранэтот вариант стал ещё лучше, уменьшившись в размерах и получив экран

Следующим стал модуль на специализированном решении (LMP91200 от Texas Instruments), заточенном под измерение кислотности стандартными сенсорами pH.

Типичная схема из даташита незамысловата, её и взял.

схема типичного применения LMP91200 из даташита. ti.comсхема типичного применения LMP91200 из даташита. ti.com

там же в даташите нарисовано как надо разводить плату.

Рекомендуемый в даташите на LMP91200 дизайн платыРекомендуемый в даташите на LMP91200 дизайн платы

По схеме из даташита, как видим, выход с LMP91200 подаётся на вход АЦП контроллера, я же направил этот выход на вход отдельного АЦП ADS1110. Этот АЦП уже передаёт данные на STM32 по I2C, через гальваническую развязку в лице ADuM1250 (данные) и дешевого изолятора питания на 1 ватт B0505S-1W (питание).

Изолятор питания B0505S-1WИзолятор питания B0505S-1W


Можно, конечно, как в EVAL-0349 использовать ADuM5000, но этот товарищ имеет одно неприятное свойство достаточно сильные помехи (про это можно почитать в даташите на данный изолятор и сопутствующие аппноты про EMI considerations), требующие разводить плату соответствующим образом.

RTC

Хоть это и не сенсор, но тоже важная периферия, поскольку в системе активно используются различные таймеры. Дело в том, что многочисленные проблемы с RTC, идущим вместе с STM32 прилично утомили. Среди этих проблем были некачественные blue-pill (да, именно на них была разведена основная масса версий плат), криво припаянные кварцы, невидимые сопли на контактах кварца или пинах (PC14, PC15), самого чипа контроллера, куда подключаются кварцы. Однажды я заметил, что часы идут, пока blue-pill не вставлена в разъёмы платы контроллера. Как только вставляешь не идут. Достаёшь опять идут. Отрезал от пилюли пины (PC14, PC15), которые вонзались в разъёмы часы пошли в любом положении. Не любят эти выводы лишних емкостей. Можно было бы как следует чистить платы, разъёмы, отрезать пины, покрывать лаком... да вот один случай совсем расстроил в один из аппаратов забрался таракан и прилёг погреться на чип STM32. Что за дискотеку он там устроил не очень понятно, да вот только напачкал прилично, прям на чипе и вокруг. Встроенный RTC встал. Чистка помогла, но было принято решение дублировать часы при помощи DS3221.

Что было опробовано, но пока не вошло в обиход в силу тех или иных причин

Счётчик воды

Счётчик воды для шлангаСчётчик воды для шланга


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

Счётчик воды с резьбойСчётчик воды с резьбой


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

СО2

Сенсор концентрации углекислого газа MG811Сенсор концентрации углекислого газа MG811


Эксперимента ради был также испробован сенсор концентрации углекислого газа MG811. Сенсор представляет из себя устройство, типа батарейки, с электролитом внутри. Судя по даташиту, ЭДС такой батарейки связан через уравнение Нернста с концентрацией углекислого газа в измеряемой атмосфере. Генерируемые токи такого элемента в районе единиц пикоампер, поэтому часто можно в продаже встретить MG811 в составе шилда, на котором расположен операционный усилитель для поднятия столь мизерных токов. Испольуется такой сенсор не сразу, типа, включил и измеряешь, а в условиях прогретого сенсора. Для этого в MG811 встроен нагревательный элемент, который запитывается по двум (из шести всего) отдельным пинам и потребляет пару сотен миллиампер. И эти миллиамперы, зачастую, несмотря на шилды со встроенными усилителями, требуется подавать с напряжением 6В. Не сказать, чтобы большая проблема поставить дополнительный повышающий преобразователь с 3.3 или 5 вольт, но учитывать этот момент всё же приходится. Вероятно, есть в природе шилды со встроенным повышающим преобразователем напряжения, но мне попадались без него. Времени на разогрев требуется около минуты, отзывчивость тоже не такая резкая, что подышал и увидел броски показаний. За неимением газового обрудования и возможности его применять в полной мере, отложил сей сенсор пока на полку. Кстати, для полноценной работы с ним будет нелишним обзавестись смесями калибровочных газов, что иногда затруднительно и доставляет хлопот поболее, чем с теми же калибровочными жидкостями для pH сенсоров.

Из известных мне, есть ещё инфракрасные сенсоры углекислоты, так называемые NDIR. Их есть несколько моделей. Отличаются скоростью отклика, диапазонами измерений, погрешностью и, разумеется, ценой. В качестве примера, на который в своё время посматривал, могу назвать MH-Z14A. Рекомендовать или отговаривать не могу, ибо не имею в наличии и не проверял. На Хабре есть те, кто держал подобные в руках (раз и два).

Датчик освещённости

Хороший пример описан тут

Системы, способы контроля и предотвращения нештатных ситуаций. Электроника

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

Watchdog

В контроллерах STM32 имеется встроенный независимый вочдог таймер именуемый IWDG (Independent WatchDoG). Он хорошо справляется с подавляющим числом зависаний контроллера, на большинстве контроллеров позволяет даже просыпаться из глубокого сна. Однако, как показала практика (особенно на сырых версиях электроники, да простят меня олдовые), в реальных условиях, даже он не всегда справляется. Поэтому был установлен дополнительный, аппаратный сторожевой таймер. С усовершенствованием схемотехники и прошивок, толку от него становится меньше. Тем не менее, для страховки он остался по сей день. Я использовал MAX6369. Для тех кто не в курсе, поясню вкратце у аппаратного сторожевого таймера выход WDO подключается на вход RESET контроллера, а вход WDI заводится на одну из ног контроллера. Когда всё работает, прошивка периодически генерирует импульс на WDI, чтобы дать понять сторожевому таймеру, что всё впорядке. Если в течение продолжительного времени на WDI такого импульса не приходит, сторожевой таймер даёт импульс на WDO, что приводит к аппаратному (как от кнопки) перезапуску контроллера. Можно такой сторожевик собрать и на таймере 555 (чем я тоже баловался в качестве эксперимента), но он занимает прилично места, по сравнению со специализированными решениями.

Неопредённые состояния во время старта

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

разные варианты драйвера нагрузок, до и после испытанийразные варианты драйвера нагрузок, до и после испытаний

Поскольку у меня исполнительными устройствами усправляет отдельный драйвер, где управляющие сигналы создаёт экспандер MCP23017, то подтянуть все 16 линий, вероятно (следует заглянуть в даташит на L6205 и/или протестировать в железе, чтобы уточнить однозначно), можно на нём. Однако, чтобы получить результат наверняка и с меньшим числом точек запайки я выбрал установку достаточно мощного полевого P-канального транзистора на питание всех L6205. В результате, этим полевиком управляет основной контроллер STM32 через оптопару. Логика прошивки сначала инициализирует все входы/выходы на выход, пишет в регистры выходов нули (всё выключено), зачитвает обратно содержимое этих регистров, сверяет с тем, что только что было записано и, если все биты совпадают, то старт считается успешным. Если старт определился как неуспешный, поднимается соответствующий флаг ошибки и работа всей силовой части блокируется (основной контроллер не станет открывать полевик до устранения проблемы). Если же старт засчитан успешным, то полевик всё ещё будет закрыт. До тех пор, пока не будет выдана команда на запуск одной из нагрузок, которая (команда) отправит на экспандер драйвера последовательность бит (где как минимум один из битов будет отличаться от нуля) и не прочитает обратно такую же последовательность. Когда все эти условия выполнятся, основной контроллер открывает MOSFET и только тогда драйвер начинает питать нагрузку. По завершении работы нагрузки/нагрузок, основной контроллер вновь отключает питание силовой части драйвера, закрывая полевик до следующих мероприятий. Если происходит физический обрыв проводов (скажем, отгрызла внезапная мышь), то линия управления полевым транзистором ложится в ноль (для P-канального, на самом деле, в 1) и нагрузки не сдвинутся с места (как минимум, до тех пор, пока не будет отгрызен подтягивающий резистор).

Кстати, о силовом драйвере. Однажды, пришёл ко мне один молодой человек и попросил дать ему попрактиковаться в сборке. Было ему выделено место, даны компоненты, паяльник, платы, схемы, тестовый аппарат. Собрал он пару таких драйверов и стал их тестировать. Не получается. Звонит мне, рассказывает невероятные вещи. Приехать на место и проверить лично в чём там дело непросто - я в другой стране. В драйвере этом, в роли экспандера, использовалась 74HC595. Он тычет в неё и говорит, мол, то ли микросема отстой, то ли прошивка твоя не важнецкая. Дело дрянь, вобщем. Я проверяю прошивку на своём девайсе, перепроверяю все подключения у себя, шлю ему видео. И у него всё-равно не работает. Ну, думаю, что с микросхемами-то может быть. Я же не DI HALT, который всё-всё видывал в силу огроменного опыта и может писать про подделки, в которых нет кристаллов или ещё что похуже. Мне чисто по теории вероятности левак достанется крайне наврядли - думал я. А вариант с прошивкой не подтверждался в моих тестах.
Микрухи, действительно, оказались леваком. Об этом я узнал, когда прибыл на место событий. Чувак к тому моменту пропал за горизонтом. Так что, если ты вдруг это читаешь, дядька, знай - ты был прав, микрухи оказались шляпой. А я ошибся.

Малина

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

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

Питание

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

Кстати, о клеммах

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

клемма поплылаклемма поплыла

Они были использованы в первых версиях аппаратов на проводах основного насоса. Сначала ставились рядом с мотором, чтобы удобно было поставить обратный диод. Когда принесли аппарат с погоревшими клеммами, диод я стал запаивать, а клеммы вынес подальше, сантиметров на 10-15. Это не изменило ровным счётом ничего. Больше я их там не использую вообще, только запайка. А вот разём GX16 справляется и не чернеет даже (хотя, лет через 10, кто его знает).

Пара историй про химические фэйлы

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

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

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

светлые трубочки идущие в канистры - расходный материалсветлые трубочки идущие в канистры - расходный материал
Подробнее..

Telegram для бабушки испанец создал механическую DIY-машину для чтения и печати сообщений

27.04.2021 14:21:47 | Автор: admin

Общение в мессенджерах давно стало нормой для большинства жителей планеты. Но далеко не все пожилые люди овладели современными технологиями. Чтобы облегчить коммуникацию со своей 96-летний бабушкой, испанец Мануэль Лусио Далло создал механическую машину. Ее общение с внуками было сильно ограничено во время пандемии, что и вдохновило испанца на разработку устройства. Аппарат умеет принимать текстовые и отправлять голосовые сообщения. Технологическая схема процесса напоминает использование старого телефонного коммутатора.

Yayagram для бабушки


Источник
Испанец назвал устройство Yayagram. На кастильском диалекте yaya это вариант теплого обращения к бабушке.


Две основные функции Yayagram:

  1. Отправка голосовых сообщений.
  2. Прием сообщений с печатью на термобумаге.


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

Создание DIY-устройства


Источник
Далло работает в компании, разрабатывающей ПО Plastic SCM. Для создания аппарата для бабушки он использовал Raspberry Pi 4 и несколько сторонних программных библиотек. Код написал на Python. Микрофон самый обычный. Встроенный принтер похож на те, что используют в кассовых аппаратах. Помимо этого, в устройстве задействованы несколько светодиодов, разъемов, кабели и кнопки. По словам Далло, синхронизировать аппарат с Telegram он решил из-за большей открытости сервиса по сравнению с другими мессенджерами. А еще он не любит Facebook.

Источник
Бабушка Далло живет в испанском городе Бургос (Burgos), вдалеке от большинства своих внуков. Во время пандемии они не могли ее навещать. Еще его бабушка плохо слышит, поэтому разговаривать с ней по телефону или с помощью видеозвонков порой проблематично. Теперь же с помощью Yayagram она может самостоятельно отправлять и получать сообщения.

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

Подробнее..

Торцовочная пила своими руками

20.06.2021 18:15:44 | Автор: admin

Самоделка, самоделка, самоделочка! Что есть самоделка на самом деле, попробуем разобраться в этом на примере собранной мной торцовочной пилы.

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


Концепция этого станка

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

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

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

Сразу признаюсь, что идея не нова, и я ее подсмотрел в Интернете, но исполнение немного отличается.

Конструкция

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

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

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

Все элементы конструкции связаны металлическим листом толщиной 10 мм торцы основания и 6 мм подвижная каретка.

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

Начал с покупки комплектации, в местном магазине прикупил четыре каретки, опор для направляющих, два метра самой цилиндрической направляющей диаметром 25мм.

Всего необходимо изготовить 3 детали плюс торцануть в один размер направляющие и сделать в них отверстия с резьбой.

Три детали из листовой стали заказал на лазерной резке, для этого отправил технологам файл в векторном формате для раскроя на станке.

Направляющие с припуском на обработку распилил и отдал токарю.

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

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

Через день забрал детали с покраски и собрал станок как конструктор, довольно приятное занятие.

В качестве чернового стола приобрел лист фанеры толщиной 15 мм.

Цена вопроса

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

Размышления на тему самодельности

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

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

На покупнине конечно тоже можно сэкономить, постараясь найти что-то подходящее для этого в металлоприемке. Но сколько на это может уйти времени, и найдете ли?

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

Каждый выбирает тот вариант, который ему ближе.

Отчасти я сделал все сам: спроектировал, собрал. Другую часть работы за меня сделали люди. Получается, что я и не сам все делал значит у меня не самоделка?

Что характеризует самоделку? Самостоятельность изготовления и/или применение только ручного инструмента в изготовлении? А может быть что-то еще?

А что думаете Вы на эту тему?

Подробнее..

Категории

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

  • Имя: Макс
    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