Небольшой проект на Arduino, который печатает приходящие вам на телефон уведомления: сообщения из разнообразных мессенджеров, новости из Твиттера и всё остальное. Такой «телеграфный аппарат» задумывался как интересная игрушка без серьёзного применения, но, как оказалось, получать сообщения в виде бумажных телеграмм крайне приятно. Под катом — описание работы аппарата и подробный туториал.
Коротко о том, как это все работает
Собственно говоря, весь процесс печати сводится к трем простым операциям: Движение по оси X (протягивание ленты), движение по оси Y (движение ручки), и процесс оставления следа на бумаге.
Смотреть видео
Движение по оси Y производится с помощью лямбда-механизма П. Л. Чебышёва, преобразующего вращательное движение в приближённо прямолинейное.
Протягивание ленты осуществляется с помощью силиконового вкладыша от наушников, вращаемого шаговым двигателем. В идеале ленту нужно протягивать через два прижимающихся друг к другу ролика, но такое решениие существенно усложнило бы конструкцию, поэтому выбор пал на наиболее простой из рабочих вариантов.
В похожих проектах(самодельных плоттерах, принтерах и т. д...) процесс рисования осуществляется посредством поступательного(или близкого к поступательному) движения ручки вверх-вниз. Такая система слишком громоздкая для размещения на лямбда-механизме, поэтому я пошел несколько другим путём. В корпусе установлен соленоид, к которому прикреплена небольшая площадка, приподнимающая бумажную ленту. Такое решение малоприменимо в других проектах, но сюда оно вписалось как нельзя лучше. Все элементы расположены в фанерном корпусе размером 64×64 мм.
Сам аппарат печатает буквально всё, что ему приходит на последовательный порт. В скетч зашит шрифт на 128 символов:
Для этого была написана программка на Java, которая преобразует картинку в описание массива байтов на языке С, при желании, шрифт можно переделать под себя.
Также я разработал небольшое android-приложение, задача которого — ловить все отображаемые на телефоне push-уведомления, а затем отправлять их в фоновом режиме на arduino через bluetooth.
Скрин приложения
Что нам понадобится
- Arduino Mini. Это миниатюрная модификация Arduino Uno с весьма компактными габаритами. Не обязательно использовать именно её. Если у Вас нет желания запихивать всю управляющую электронику в корпус устройства, тогда подойдёт любая другая плата, например, Arduino Uno или Leonardo. Ещё можно посмотреть в сторону Iskra Mini — полного аналога Arduino Mini.
- Сервопривод SG-90. Самые маленькие и дешёвые сервоприводы из ныне существующих.
- Шаговый двигатель 28BYJ-48. Очень дешёвый шаговый двигатель, имеющий высокую точность позиционирования — 4096 шагов на оборот. Обычно, продается уже вместе с драйвером ULN2003.
- Соленоид 5В. Данные девайсы не так часто применяются в самоделках, как, например, сервоприводы. Их суть заключается в следующем: это небольшие электромагниты, которые при подаче на них тока проталкивают находящийся в них шток. Они могут осуществлять весьма быстрые поступательные движения, которыми можно управлять.
- Bluetooth-модуль HC-06. Нужен для общения с внешним миром. Также можно подумать о подключении к wifi через esp8266 вместо использования bluetooth-модуля
- Резиновые амбушюры(вставки) для наушников. Нужно для изготовления механизма, протягивающего бумагу. Чем больше размер амбушюра, тем лучше.
- Оси 3мм. Выбор материала широк: можно использовать деревянные шпажки диаметром 3мм или винты с отпиленными шляпками.
- Клей. Для большей аккуратности лучше использовать 3 вида клея: ПВА для склеивания деревянных деталей, термический клей и супер-клей для крепления остальных элементов.
- Наждачная бумага. Даже при очень точном изготовлении деталей им потребуется подгонка, поэтому без шлифовки — никуда.
- Фанера 4 мм. Можно найти в строительном или хобби-магазине. Возможно, подойдут и другие варианты, например, оргстекло.
- Чертежи. Их можно взять здесь.
А в формате DXF — здесь - Много мелочи...
- Капиллярная ручка или фломастер. Шариковые и гелевые ручки, а также карандаши подходят значительно хуже, так как след, оставляемый ими на бумаге, значительно менее отчетлив.
- Маленькие шурупы. Диаметром не более 2 мм. Часто такие применяются в разного рода китайских игрушках.
- Термоусадочная трубка. Нужна, чтобы удлинить вал шагового двигателя. Внутренний диаметр до нагрева — в районе 6 мм.
- Выключатель. Любой, который вам понравится. Можно посмотреть в сторону небольших кнопок с фиксацией.
- Разъём питания. 2.1 mm Barrel Jack.
- Диод. Номинал и характеристики большой роли играть не будут, можно выпаять из какого-нибудь старого радиоприемника.
- Транзисторный ключ или реле. Про них подробнее будет написано ниже.
Изготовление деталей
Этот этап зависит от Вашего желания и от ваших возможностей. Можете вырезать на станке или выпиливать все детали вручную. Кстати, вовсе не обязательно повторять проект точь-в-точь. Например, можно не пытаться запихнуть всю управляющую электронику в корпус аппарата. Или, поняв принцип работы, сделать что-то похожее буквально «на коленке», и всё равно всё будет работать.
Для тех, кто планирует всё делать вручную
Для того чтобы изготовить все детали, понадобится: лобзик (лобзиковый станок), дрель (сверлильный станок), принтер, наждачная бумага и, при необходимости, надфили.
Алгоритм здесь такой. Распечатываете чертежи, наклеиваете их на фанеру. Затем сверлите все необходимые отверстия в местах внутренних контуров. Контуры пазов следует выпиливать, отступая немного места (~0.2-0.5 мм) внутрь, чтобы потом шипы (после небольшой обработка надфилем) вошли в них внатяг. После этого выпиливаем внутренние контуры, отрываем/сошкуриваем бумагу, которую наклеили, и шлифуем. Ничего сложного в этом нет, главное — работать аккуратно и не торопиться.
Алгоритм здесь такой. Распечатываете чертежи, наклеиваете их на фанеру. Затем сверлите все необходимые отверстия в местах внутренних контуров. Контуры пазов следует выпиливать, отступая немного места (~0.2-0.5 мм) внутрь, чтобы потом шипы (после небольшой обработка надфилем) вошли в них внатяг. После этого выпиливаем внутренние контуры, отрываем/сошкуриваем бумагу, которую наклеили, и шлифуем. Ничего сложного в этом нет, главное — работать аккуратно и не торопиться.
Собираем корпус
Пока нет ничего сложного: просто берете детали и склеиваете их. Следите за тем, чтобы на деталях не оставалось лишнего клея.
Устанавливаем держатель катушки
При склеивании этого элемента рекомендую использовать сверло, чтобы соблюсти соосность. Сначала к корпусу приклеиваются боковые стенки, а затем на них устанавливается крышка. Следите за перпендикулярностью — от положения отверстия на крышке этого держателя зависит работа лямбда-механизма.
Собираем лямбда-механизм
Вот мы и добрались до первого ответственного этапа — сборки лямбда-механизма. Для начала нужно изготовить плечо для сервопривода. В комплекте с каждым серво идет несколько пластиковых качелек. Надо взять одну из них и обрезать-обточить так, как показано на рисунке ниже. А затем вклеить её в заготовку для плеча.
Далее изготавливаем плечо с «ручкодержателем». Отверстие под пишущий инструмент лучше выверить заранее. Скорее всего, оно будет в районе 8-9 мм. Приклеиваем сверху и снизу два кольца. Чтобы они не съехали, в отверстие можно вставить ручку или сверло подходящего диаметра. После высыхания клея шлифуем внутреннюю и наружную поверхности кольца, пока ее поверхность не станет достаточно ровной. Сбоку сверлим отверстие под поджимной винт.
Теперь можно переходить к сборке лямбда-механизма. Для начала нужно приклеить на термоклей сервопривод так, чтобы расстояние от его оси до отверстия на держателе катушки было ровно 20 мм. Далее поворачиваем сервопривод против часовой стрелки до упора, после чего собираем всю конструкцию согласно фото:
Проверить работоспособность этого механизма можно, если подключить сервопривод к Arduino и загрузить скетч из образцов: Servo → Sweep(По умолчанию серво подключается к 9 пину). Код скетча я, на всякий случай, привожу ниже.
Servo sweep
#include <Servo.h>
#define MIN_ANGLE 150
#define MAX_ANGLE 180
Servo servo;
void setup() {
servo.attach(9);
}
void loop() {
for(int i=MIN_ANGLE; i<=MAX_ANGLE; ++i) {
servo.write(i);
delay(15);
}
for(int i=MAX_ANGLE; i>=MIN_ANGLE; --i) {
servo.write(i);
delay(15);
}
}
На этом этапе можно подобрать рабочий диапазон углов для сервопривода, выставляя значения MIN_ANGLE и MAX_ANGLE (диапазон этот примерно 150°...180°), это понадобится в дальнейшем. Если механизм работает не гладко, попробуйте ослабить винты или проложить шайбочки.
Устанавливаем салазки для бумаги
Сейчас нам предстоит почти ювелирная работа: сделать салазки, вдоль которых будет двигаться бумажная лента, а также площадку, которая будет крепиться на соленоид. Длинные реечки нужно приклеить к основанию так, чтобы их торцы упирались в стойку для катушки, а расстояния между ними должно быть 13 мм.
Далее на эти реечки приклеивается верхняя короткая палочка. Сборку этого узла проще производить на супер-клей. Старайтесь не оставлять лишнего клея, это может очень сильно помешать протягиванию бумаги.
Площадочку необходимо сошкурить до минимально возможной толщины (≤1.5мм), а один край сделать клинообразным, чтобы по нему легче заезжала бумага. Можно сразу взять и сделать эту площадку из относительно тонкой деревянной линейки или ненужной пластиковой карты. Далее к ней по центру приклеивается круглая стойка. Далее внутрь корпуса вклеивается соленоид таким образом, чтобы чтобы его стержень расположился по центру отверстия. После этого на супер-клей аккуратно приклейте площадочку к штоку соленоида. Должно получиться примерно так:
В начале проверки попробуйте просто подать напряжение 5В на соленоид. Если площадочка поднялась — значит все хорошо. Если этого не произошло, то попробуйте поменять полярность. Если и это не помогло, то попробуйте собственноручно потыкать шток соленоида. В случае, если он двигается или двигается при большом усилии — значит, туда попал лишний клей.
Подключение соленоида к управляющей плате осуществляется не напрямую: для этого нужно использовать электромагнитное реле или транзисторный ключ. Можно посмотреть в сторону готовых решений, например, сюда. Также будет полезно почитать эту статью. Я использовал советские реле РЭС49. Ниже приведена схема подключения соленоида через транзистор TIP120.
Использование диода в схеме обязательно. Он здесь выполняет запирающую функцию, без него плата Arduino будет постоянно перезагружаться. Характеристики диода большой роли не играют, его можно найти и выпаять из любой старой платы.
Протягивающий механизм
Для того чтобы протяжный механизм работал, нужно обеспечить минимальное трение бумажной ленты о поверхность корпуса. Снизить трение можно, если обильно натереть дорожку парафином или, на худой конец, наклеить на неё полоску прозрачного скотча.
Переходим к процедуре изготовления. Отрезаем вал нужной длины (28 мм), после чего намечаем то место, где будет располагаться амбушюр от наушников, наматываем на вал несколько витков изоленты — так, чтобы на нее плотно входил наш «ролик».
Далее, предварительно откусив от шагового двигателя «уши» для крепления на резьбу, просовываем его в нишу. Затем с помощью термоусадочной трубки крепим ось к валу мотора. Если всё получилось, закрепляем мотор при помощи термоклея. Старайтесь сделать так, чтобы вал располагался перпендикулярно дорожке и параллельно горизонтальной плоскости. Амбушюр и вал мотора лучше сразу аккуратно приклеить к оси супер-клеем.
Для проверки подключаем шаговый двигатель через драйвер к управляющей плате и загружаем в нее скетч из образцов: Stepper → stepper_oneStepAtATime. Только нужно поменять значение переменной stepsPerRevolution с 200 на 4096 и убрать delay(500).
Код с исправлениями я, на всякий случай, привожу ниже.
stepper_oneStepAtATime
#include <Stepper.h>
const int stepsPerRevolution = 4096;
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
void setup() {
}
void loop() {
myStepper.step(1);
delay(5);
}
После загрузки скетча шаговый двигатель должен начать плавное и медленное вращение. Можете попробовать подсунуть под ролик кусочек бумажной ленты. Она так же должна начать плавное и медленное движение. Если этого не произошло, то дело, возможно, в высокой шероховатости поверхности, что исправляется наждачной бумагой с мелким зерном.
Ось для катушки
Это, пожалуй самый простой этап среди прочих. Берем ось длиной ~25мм, одну оставшуюся неиспользованной деталь и склеиваем их вместе. Возможно, придется проложить шайбочку между стойкой для катушки и той деталью, для которой я не придумал название.
Теперь пару слов о бумажной ленте. Её оптимальная ширина — 11мм. Можно придумать несколько технологий её изготовления. Например, взять рулон чековой ленты(рулон кальки, миллиметровой бумаги и т. д...) и просто нарезать его. Мне больше понравился вариант нарезания листа A4 на полоски, которые потом аккуратно склеиваются в ленту нужной длины.
Собираем все воедино
Если все механизмы уже работают, то теперь пора приступать к самому сложному этапу — заставить их работать вместе. Для начала нужно собрать/спаять схему, приведенную ниже.
Я разместил всю электронику в корпусе устройства следующим образом (когда-нибудь я научусь нормально паять, но уже не в этот раз):
Также устанавливаем выключатель и разъём питания. В качестве выключателя я использовал советский МТ-1. Я рекомендую взять что-нибудь поменьше, потому что использовать столь большой тумблер в таком маленьком корпусе — непозволительная роскошь, это место лучше занять чем-то более полезным.
Несколько фотографий готового аппарата
Переходим к отладке программы. Для этого берем скетч ЗДЕСЬ и загружаем в плату.
Я постарался максимально подробно его закомментировать, поэтому, надеюсь, он будет максимально понятным. При запуске программы аппарат печатает слово «HELLO», а затем печатает буквально всё, что приходит на Bluetooth-модуль. Ваша задача на этапе отладки — подобрать значения DOT_UP_DELAY, DOT_DOWN_DELAY, SERVO_MAX, SERVO_STEPS, SERVO_DELAY и LINE_TAB в скетче такими, чтобы надпись «HELLO» при старте программы выходила максимально красивой.
После того как желаемое качество печати достигнуто, можно попробовать отправить какое-нибудь сообщение через bluetooth. Для этого можно скачать себе на телефон любое приложение, в названии которого фигурирует словосочетание «Bluetooth terminal», подключиться к аппарату(скорее всего, он будет отображаться под именем hc-06) и начать отправлять на него сообщения. Следует учитывать, что размер буфера последовательного порта на Arduino — 64 байта. Это значит, что при отправке слишком длинного сообщения, будет напечатано не совсем то, что вы хотите.
Также я написал небольшое android-приложение, которое ловит push-уведомления, отображаемые у Вас в телефоне, и отправляет их на печать. Его также можно использовать как простой bluetooth-терминал. Поддерживаются версии android от 4.3.0. Нужно не забыть разрешить приложению доступ к уведомлениям системы, иначе ничего не будет работать.
Как разрешить приложению доступ к уведомлениям
Это бета-версия приложения, при необходимости буду его дорабатывать и расширять функционал.
Декоративная часть
Этот этап совсем не обязательный, а в некоторых случаях он, скорее, навредит. Здесь всё на ваш вкус. В моём случае, например, я состарил все деревянные детали патиной и покрыл тонким слоем лака, а также сделал небольшие таблички «Mini Telegraph», «ON/OFF» и табличку с подписью.
Подводя итоги
На этом всё. Надеюсь, вам понравился этот небольшой проект. Возможно, Вам показались интересными какие-то идеи или решения. С большой долей вероятности буду дорабатывать
этот проект. Буду рад любым вопросам, советам и пожеланиям в комментариях. Если у Вас получиться сделать что-нибудь похожее, мне будет очень интересно на это посмотреть, если у вас будут возникать какие-либо вопросы, можете писать сюда.
Список статей, которые могут пригодиться
Список
Глубокое понимание того, с чем работаешь, поможет избежать множества неприятных ошибок.
(Некоторые статьи на английском, но зато с красивыми цветными картинками)
(Некоторые статьи на английском, но зато с красивыми цветными картинками)
- Про сервоприводы
- Про шаговый двигатель 28BYJ-48
- Про подключение соленоидов
- О том, как прошить Arduino mini
- Про Bluetooth-модуль