Как я напечатал и автоматизировал умывальник





То, что должно получиться в итоге
Смеркалось. Рядом со мной стоял откалиброванный 3Д принтер, две катушки свежего PLA-пластика, пять еще не распакованных датчиков с маркетплейса, мультиметр, надфили, кусачки, пол-литра изопропилового спирта и целый комплект Arduino Uno с набором проводов — не считая той мелочи, что оставалась из старых запасов. Всё это было щедро приправлено некоторыми знаниями и относительно прямыми руками. Не хватало идеи.
Помогло отключение воды. Поливая руки из пластиковой бутылки, зажатой подмышками, кряхтя и промахиваясь, я вспомнил летний отдых в доме у бабушки, где не было водопровода по определению. Был умывальник. И это было удобно, за неимением альтернативы.
Решено! Сделаю умывальник. Идею взять цветочный горшок, гвоздь "сотку", кусок пластилина и сделать все быстро была отметена в зародыше. 21 век, все таки! Напечатаю на 3Д принтере.
Если интересно, как, зачем, почему и какие проблемы решил в процессе, то добро пожаловать.
Всю эпопею можно разделить на три четких этапа. Первый - неудачный. Второй - удачный и точка, где, по хорошему надо было бы остановиться. Третий - чистое баловство и развлечение. Зато он самый интересный.
Вариант 1. Эпичный провал.
Буквально в день появления идеи, на коленке, был сделан набросок и пущен на печать. За основу идеи я взял те умывальники, что висели в огороде в моем детстве. Круглая емкость, больше всего похожая на цветочный горшок, сужающаяся к низу. К сожалению чертежей первой версии не сохранилось. Есть только фото готового результата.



Умывальник версии 1 типа "ведро"
Наиболее полезной и работоспособной частью стал "язык" умывальника и выемка под резиновое уплотнительное кольцо для него. Это, без особых изменений пошло в дальнейшие модификации.
В целом испытания показали - работает. Подтекает немного, но нажимаешь - льется, отпускаешь - не льется. Осталось как - то его прикрепить. Вот тут - то и выявились критические недостатки конструкции. На фото не очень хорошо видно габариты, но в верхней части диаметр сантиметров 16-18. Как это крепить я сразу и не подумал. А надо было!
Наращивать какие - то ушки на верхнем бортике? Слишком узко. Не выдержит веса набранной воды. Да и перепечатывать не хочется. Попытка сделать обруч, который повторяет сужение и по бокам имеет крепежные элементы уперлась в ограничение принтера. Хоть оно и вполне приличное, но имеет пределы. Саму емкость надо держать в верхней части, чтобы центр масс был ниже, иначе перевернется. И так далее. Выходило громоздко, некрасиво и не печаталось одним элементом.
Я конечно попытался что - то изобразить. К сожалению не нашел фотографии. Оно и к лучшему. Мне было бы стыдно это показывать.
Пришлось подумать и пересмотреть концепцию. Во мне проснулся инженер. [А он и не засыпал!]
Вариант 2. То, что надо!
К делу подошел более вдумчиво. Если круглая емкость не подошла - пусть будет емкость квадратная. Ее крепить однозначно будет проще. Сразу решил, что крепить буду к шкафчику над раковиной. Ширина доски 16 мм. Вот на нижнюю часть шкафчика и повешу умывальник. Удобно одевать и снимать. Получится достаточно высоко, чтобы можно было без проблем поднести руки и/или посуду.




Умывальник версии 2. Переработанный.
На рисунках выше видно, что получилось. Из неизменного взято отверстие и язык. Емкость квадратная. Внутри сделаны плавные скаты, чтобы не оставалось лишней воды.
Особое внимание стоит уделить держателям, а именно их способу крепления к емкости. Хотелось проверить - получится ли на PLA пластике, несмотря на его хрупкость, сделать эффект пружинной защелки? В нижней части емкости сделаны пазы в которую предполагается защелкнуть крепление. В верхней части емкости сделано углубление - потай. Крепление как бы одевается сверху, а потом защелкивается.
Опыт показал, что это отличное решение. Одевается с характерным щелчком. Чтобы снять необходимо чем - то острым типа отвертки поддеть снизу. Снимается и не ломается.
В связи с тем, что задача стала уже больше экспериментом, чем решением актуальной проблемы - появилось желание проверить возможность печати различных деталей и общей модульности конструкции. Например, сама емкость печаталась 11 часов, и не хотелось печатать ее снова. Хотелось, переделывать отдельные элементы. Будь - то крышка, держатели, или что - то еще.
Итог - все работает так, как должно. Почти. Крепится, льется. Выявил три проблемы:
Крепление слишком короткое и хрупкое в том месте, которое одевается на стенку шкафчика. Печатал не думая о прочности. Внутри пористая структура. Итог закономерен. Набрав полную емкость воды (а это литра 2,5 - 3) крепления не выдержали и сломались. Это поправимо сделаем длиннее, толще и уменьшим внутренний воздух.
Нет полной герметичности. После наливания воды постоянно капает. Причиной этому стала ошибка в глубине выемки под уплотнительную резинку. Буквально на 1 миллиметр глубже, чем следовало. Но перепечатывать емкость и тратить снова 11 часов на это очень не хотелось. Ниже будет описано, как постарался исправить ситуацию.
Чего - то не хватает. Нет полного удовольствия от процесса. Сам по себе этот умывальник больше игрушка. Так - что доведем игрушку до логического конца. Сделаем его автоматизированным устройством, чтобы он автоматически открывался, когда подносишь руки и закрывался, когда убираешь.
Вариант 3. Лучшее враг хорошего!
Мне кажется это самая интересная часть повествования. Для автоматизации надо было найти ответы на следующие вопросы:
Как преобразовать вращательное движение (двигатель) в поступательное?
Какой двигатель выбрать?
Какой подобрать датчик, чтобы он удовлетворял требованиям по точности и скорости срабатывания.
Как скомпоновать и закрепить все на устройстве?
Изначально хотел сделать какой - то вариант кривошипно - шатунного, или кривошипно - ползунного механизма. Можно, но зачем? Остановился на варианте звезда - рейка. Дешево и сердито. Чтобы открыть/закрыть требуется минимум оборотов. Об износе и речи не идет. Если все сделать точно - будет работать как надо.


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


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



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


Крепление контроллера и батарейки нет смысла обсуждать отдельно. Ничего интересного.
Гораздо интереснее оказалось с выбором датчика. Изначально задумывалось использовать инфракрасный датчик HC-SR505. Он срабатывает именно на человека. Должен работать хорошо.
На практике оказалось все иначе. Для моего случая у датчика был запредельный диапазон срабатывания, а что самое важное, крайне медленное время реагирования. По факту, даже накрыв датчик плотной тканью он узнавал об этом спустя 30 - 40 секунд. Датчик отлично подойдет для систем освещения типа лампочек в подъездах (для этого он и сделан), но в моем случае не годится. Думал применить его старших братьев с регулировкой скорости и расстояния, но остановился на ультразвуковом датчике hc-sr04. Расстояние срабатывания от 2 см до 4 м и скорость отклика до 38 мс.
Скорость отклика записывают в его недостатки, но для меня это фактически сверхсветовая. С гарантией. В программе мы опрашиваем его раз в пол секунды.
Надо бы его закрепить так. чтобы руки точно попадали под его излучение. Тут все просто - смотри картинку. Важно сделать желобок, чтобы не мешали провода и прижать все так, чтобы не попала вода.
Детали напечатаны, собраны. Дело за программным обеспечением. Не стал жестить и вспоминать ассемблер под контроллеры ATMega. Решил пусть будет C++. Программа простая. Ресурсов хватит точно. Поставил Arduino IDE, надергал скетчей из интернета по работе с двигателем и датчиком и собрал все в удобное для себя решение. Где брал основу для своего класса по работе с двигателем уже не вспомню. А вот по датчику помню.
Основной код программы:
#include "u_driver.h"
#define echoPin 6
#define trigPin 7
#define in1 8
#define in2 9
#define in3 10
#define in4 11
U_Driver *drvr;
int isOpen; //-1 подготовка, 0 закрыто, 1 открыто
const int thresold = 11; //Пороговое значение срабатывания (открытия/закрытия) в см
void setup() {
//Пины привода
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
//Пины датчика
pinMode(trigPin, OUTPUT); // назначаем trigPin, как выход
pinMode(echoPin, INPUT); // назначаем echoPin, как вход
Serial.begin(9600);
drvr = new U_Driver(10,90);
isOpen = -1;
Serial.println("START PROGRAM");
}
void loop() {
if (isOpen == -1){
delay(1000);
//Убираем первое ложное срабатывание
isOpen = 0;
}
else {
Serial.println("MAIN LOOP START");
int duration, cm; // назначаем переменную "cm" и "duration" для показаний датчика
digitalWrite(trigPin, LOW); // изначально датчик не посылает сигнал
delayMicroseconds(2); // ставим задержку в 2 ммикросекунд
digitalWrite(trigPin, HIGH); // посылаем сигнал
delayMicroseconds(10); // ставим задержку в 10 микросекунд
digitalWrite(trigPin, LOW); // выключаем сигнал
duration = pulseIn(echoPin, HIGH); // включаем прием сигнала
cm = duration / 58; // вычисляем расстояние в сантиметрах
Serial.print(cm); // выводим расстояние в сантиметрах
Serial.println(" cm");
Serial.print("IsOpen:");
Serial.println(isOpen);
if (cm <= thresold && isOpen == 0)
{
Serial.print("NEED OPEN");
//Если поднесли руки в зону срабатывания датчика и закрыто
drvr->Open();
isOpen = 1;
}
if (cm > thresold && isOpen == 1){
Serial.print("NEED CLOSE");
//Было открыто, но убрали руки.
drvr->Close();
isOpen=0;
}
}
delay(500); // ставим паузу в 0,5 секунд
}
По коду и комментировать - то нечего. Кроме того, что я немножко получил удовольствие вспомнив С++. Убедился, что современные языки стали гораздо удобнее тот - же С#. Не удержался от соблазна немного поиграть в ООП и спрятал логику работы с двигателем в отдельный класс. Думаю, что не стоит тут это расписывать. В конце статьи будет ссылка на материалы в т.ч. и на код. Кому интересно посмотрит самостоятельно.
Изначально я планировал закрывать язык в самом начале работы программы. Чтобы избежать состояния, когда язык поднят, а питание убрано. Это было лишнее. Точнее как. Это было бы правильно сделать, по науке, но для этого надо было усложнить схему. Как - то определять вращается ли двигатель. Просто вращать - оказалось плохой идеей. Мощности двигателя хватало, чтобы приподнять крышку.
Но, к моему удивлению, убрав блок инициализации, я столкнулся с тем, что при включении устройства в сеть (не ресет, а именно подача питания) было ложное срабатывание датчика на открытие. Склоняюсь к тому, что идет процесс инициализации самой микросхемы. Копать глубже не стал. Поступил, как настоящий ИТшник. Сделал костыль. Вернул этап подготовки, но при этом не стал вращать двигатель, а подождал одну секунду. Это убрало ложные срабатывания. Может кому - то будет полезно.
Костыль, конечно, но, надо держать марку. Как - же без костылей - то?
Итог
Рендеринг, это хорошо, но, уверен, что хочется посмотреть, как получилось в итоге.



Не уверен, что кому - то надо, но STL файлы и код для ардуино можно скачать по этой ссылке
Выводы
Лично я получил большое удовольствие от процесса. Времени потрачено очень много. Пластика, с учетом брака и экспериментов - три катушки по 1 кг каждая.
Значительно повысил навык работы в CAD программе.
Методом проб и ошибок понял пределы допустимого в использовании 3Д принтера для своих целей. Что работает, что нет. Захотелось попробовать иные пластики, более сложные конструкции и так далее.
В планах сделать какой ни будь мини проект, чтобы:
- Интегрировать ПК (ноут, или рапсбери) с ардуино, а может какой другой линейкой контроллеров. Ардуино самый доступный. Без интеграции с ПК дальше мелких поделок продвинуться не удастся. То, что это у меня получится гарантия 100% тут нет сомнений, но сам путь все равно надо пройти и набить руку.
- Поиграться с тем, чтобы один контроллер мог управлять другими контроллерами. Теми же приводами могут управлять и более простые контроллеры, а некую логику реализовывать более мощные, а им управлять программы на ПК и т.д.
У меня есть пару идей, куда бы применить свое внезапно появившееся хобби, но может быть в комментариях кто - то еще подскажет дельные советы? Буду благодарен. Жду отзывов. Панамку приготовил.
Кто осилил текст - тем большое спасибо за внимание!





