Однажды мне рассказали о самодельном устройстве под названием Яяграм (почему-то описанном создателем в Твиттер , и здесь здесь по-русски ).
Я посмотрел на это и решил сделать свой, с предпочтениями и аркадными кнопками поэтессы и старым термопринтером.
Так родился BabaGram, черный ящик, открывающий общение в Telegram для моей бабушки.
Что такое Бабаграм
Мне хотелось сделать что-то похожее на Яяграмму — устройство, которое распечатывало бы входящие сообщения на встроенном принтере, а бабушка позволяла бы отправлять сообщения мне и другим контактам.
При этом бабушка не умеет печатать на клавиатуре телефона и очень неуверенно читает с экрана.
Яяграм использовал провода и разъемы, чтобы выбрать, кому будет отправлено сообщение.
Я решил использовать аркадные кнопки — мне кажется, это более естественный выбор.
Они удобны и предназначены для игровых автоматов, в которые играют достаточно агрессивно, а значит, выдерживают большие нагрузки.
Итого нам нужно устройство с принтером, микрофоном, кнопками, доступом в Интернет и логикой, которая всем этим управляет.
Оглавление
Начнем с «железной» части — термопринтер И периферия , контролеры , питание .Далее немного о производство корпусов .
И, наконец, о код .
Термопринтер
Однажды мне подарили старый кассовый аппарат. Думаю, это была Ока 102к, но это не так важно.Выпаяв из него все, что могло пригодиться, я стал обладателем старинного термопринтера.
Как этот.
Документации на этот термопринтер я не нашел, но нашел обозначение самой термопечатающей головки (T1001B) и после долгосрочный Погуглил, даташит на него.
Я считаю себя квалифицированный интернет-детектив после этого выложу даташит на Google Диске .
Я не помню, где я это нашел.
Далее нам предстояло разобраться с платой, управляющей этим термопринтером.
Не утомляя вас подробностями, скажу лишь, что логика там примитивная: головка представляет собой 128-битный сдвиговый регистр, где каждый бит — это один резистор в термоголовке.
Вам необходимо последовательно отправить 128 бит, а затем кратковременно подать сигнал «пожар», который включает нагрев выбранных резисторов.
Важно не перегреть, иначе они сгорят. И вы не можете включать более 32 строк одновременно, поэтому более полные строки будут печататься медленнее.
Выжечь строчку на бумаге – это только полдела.
Вы должны иметь возможность перемещать ленту.
Для этого в принтере имеется шаговый двигатель.
От него идут 6 проводов, 2 из которых одного цвета и после долгого тыкания мультиметром, определяется как один провод в двух плоскостях (для увеличения поперечного сечения) .
Существует стандартный шаговый двигатель с 5 проводами и таким расположением контактов:
Управлять таким мотором довольно просто – знайте, дергайте фазы по очереди (а красная всегда либо GND, либо VCC).
Экспериментально определив последовательность фаз, приводящую к движению ленты вверх, я двинулся дальше.
Начался долгий процесс обнюхивания термоголовкой.
Выбрал тайминги тактового сигнала, время включения огненного нагрева резисторов и порядок битов в регистре.
Из-за существования прямого и обратного порядка байтов я рассмотрел все возможные комбинации перевернутых отпечатков пальцев, включая зеркальные и четверные внутри зеркальных (где каждый байт находится в неправильном порядке).
Мне даже удалось добиться оттенков серого.
В некоторой степени.
Вот так печатаются фотороботы! Или фотографии фоторобота? Но вот проблема: то, что было напечатано, было существенно сжато по вертикали.
Что это? Прямоугольные пиксели? Или я делаю слишком мало шагов двигателя? Стоит ли смотреть двигатель? Знаешь, что я видел? Два двигатель на одном валу.
У каждого по 3 провода, один из которых видимо центральный между фазами.
Эти центральные провода были соединены в один на плате.
Поэтому тыканье мультиметром показало, что они замкнуты, а на самом деле в моторе (моторах!) они не замкнуты.
Один мотор вращает ремень вперед, другой назад. Так вот, когда я делал 4 шага по фазе, моторы включались попеременно, причем мотор «вперед» честно двигал ленту (и даже чуть дальше), а мотор «назад» мешал.
Выкинув 2 фазы из 4, я все исправил.
Никогда не слышал об однонаправленных шаговых двигателях, но оказывается они существуют?
Периферия
Помимо термопринтера, который у меня уже был, мне понадобились кнопки и микрофон.Я купил их на Amazon. Про микрофон сказать особо нечего - самый дешевый USB-микрофон, по совпадению, точно такой же, как и в Яяграме.
Когда бабушка распаковала бабаграмму, ее вырвали из футляра и сломали провод внутри, потому что бабушка подумала, что это ручка.
Пришлось быстро исправлять - первый раз в жизни паял под Новый год. Еще добавил твитер из комплекта Ардуино, но это мелочи.
И здесь кнопки интереснее.
Ну, совсем немного.
У них светодиоды со встроенными резисторами, и при напряжении 3,3в они тускло светятся.
Светодиоды сменные, в одной кнопке я заменил штатный белый светодиод на красный.
Нет, не в кнопку записи, а в кнопку SOS. Кнопки отлично крепятся на корпусе – имеют «юбочку».
И очень легко понять.
Контакты для клемм есть, но обжимать 24 клеммы мне было лень, поэтому я просто припаял провода.
В комментариях справедливо отмечено, что это не очень хорошая идея из-за возможного перегрева пластика.
Я внимательно следил за деформациями, но все же не могу рекомендовать такой подход.
В следующий раз сделаю это аккуратно Мне нужна была одна маленькая кнопка, поэтому я нарисовал и распечатал корпус микропереключателя.
Модели публиковать не буду - получилось не очень.
На самом деле он одноразовый и немного прилипает.
Контроллеры
Проблема возникла, когда мы этого не ожидали.Я хотел собрать устройство на Raspberry Pi, а оно 3,3 вольта.
Но вся логика управления термопринтером 5-вольтовая, а кнопки на 3,3в плохо светятся.
В общем, я решил, что устройство, которое я собираю, сложное, и поэтому я могу использовать два устройства управления, одно для логики 5в, другое для Интернета и вообще для более сложных операций.
Я использовал Raspberry Pi Model 3B, но любой Pi (или аналогичный) должен работать, если у него есть Wi-Fi. Ну или можно сделать Babagram-over-Ethernet.
Для логики 5в я выбрал (из-за наличия дома) Attiny88. А вообще я очень люблю Атмелы из этой серии.
Их сложно убить и очень легко запрограммировать, если у вас дома есть какой-нибудь Arduino. А возможностей за копейки много.
Единственный минус - у них очень мало памяти, как и у ОЗУ (512 байт ) и флэш (8Кб для 8х моделей).
Но здесь подросток будет очень прямолинейным исполнителем.
Максимум, что ему придется хранить, — это одна строка печати, 128 бит, 16 байт. Справлюсь.
Для связи между Тайни и Пи я использовал шину I. 2 C: Требуется несколько проводов — SDA, SCL и земля.
Кроме того, контакты Pi не допускают напряжения 5 В, поэтому для любого протокола, использующего высокий уровень от ведомого устройства, потребуется делитель напряжения.
Лень подсказала мне, что я 2 С — мой выбор.
Однако мне пришлось исправить код, который я 2 Из клиента в аттини - в штатном есть подтягивающий резистор, который будет выдавать 5в, но мне он не нужен.
Высокий уровень будет установлен мастером, которым является наш Пи.
Все знакомые мне Atmel понимают 3,3 В как логическую единицу.
Attiny88 гарантирует это при питании от 5В (для него В ИХ > = 0,6 В, то есть 3 В).
Я неожиданно узнал, что у гребенки Raspberry Pi количество контактов и шаг между ними точно такое же, как и у IDE-кабеля.
Приятное открытие, позволившее мне впервые в жизни сделать более-менее разборное устройство с помощью тросов.
Я уже давно удалил разъемы IDE из нескольких старых материнских плат, поэтому просто вырезал очень простую плату для разводки этого разъема.
И еще один для атмела для подключения к плате термопринтера (тоже кабель).
А вот так на стенке корпуса выглядит блок питания, Pi и плата термопринтера:
Pi с кабелем, блоком питания и платой термопринтера
Питание
Термопринтеру требовалось 12 Вольт, а у меня был блок питания 220 -> 12 В (на фото выше слева вверху).Для 5в я сначала использовал дешевый асинхронный DC-DC преобразователь с алиэкспресса, но потом столкнулся с эпическими глюками из-за шумного блока питания (несмотря на развязывающие конденсаторы), и выбросил этот преобразователь.
Вместо этого я использовал блок питания USB-C, который валялся где-то поблизости.
Для меня, привыкшего к старому USB-A, стало открытием, что адаптеры USB-C требуют нетривиальной настройки, чтобы выдавать даже стандартные 5 вольт. Нет, я понимаю, что сразу 12в ставить в линию не стоит. А вот 5 вольт могло бы быть.
Ладно, надо просто добавить резистор между линиями CC и GND. На 5,1 кОм, который доступен только в серии E24 и выше, но ближайший «обычный» номинал 4,7 кОм меня вполне устраивает. В итоге получается вот такая колбаска:
Где бы мы были без горячего клея?
Рамка
С электроникой все понятно, осталось только придумать, как сделать коробку.Яяграм видимо использовал заводской, но это не наш метод. Я купил фанеру толщиной 4 мм и вырезал корпус на лазерном станке с ЧПУ (диодном!).
Оказывается, если разрезать фанеру, не предназначенную для этого, появляются забавные артефакты — некоторые волокна фанеры плохо распиливаются, и остается много неразрезанных точек.
А в некоторых местах горит внутри.
Мой лазер на 40 китайских ватт. При питании от 12В он потребляет ~1,7А - такая китайская арифметика, но я отвлекся.
По крайней мере, он режет фанеру.
Он абсолютно идеально режет специальную «лазерную» фанеру.
ЧПУ с лазером Внезапно стало ясно, что машина не совсем картезианская.
То есть его оси не перпендикулярны.
Раньше я вырезал только доски, где перпендикулярность была не так важна.
И вот я вырезал два прямоугольника на пределе размера стола и сложил их, перевернув.
И я увидел расхождение ~1,5 мм.
Пришлось корректировать станок молотком, чтобы сделать его более перпендикулярным.
Для сборки корпуса я распечатал на принтере уголки, некоторые из них были обычные мебельные, а некоторые «трехсторонние» — см.
ниже.
Здесь .
Очень удобно собирать на месте – два часа отверткой, и корпус грубо собран.
Правда некоторые отверстия оказались ненужными, пришлось их залить эпоксидкой, и после покраски они стали глянцевыми.
После покраски встал вопрос как нанести текст на тело.
От рельефных пластиковых полосок, как в Яяграме, я сразу отказался — хотелось честных изображений на поверхности.
Я пробовал гравировать резцом по краске, предполагая, что срежу краску и оставлю более-менее светлую фанеру, но это оказалась фигня.
Бред сивой кобылы
Фотография красивее, чем в реальности благодаря вспышке.
В реальной жизни контраст еще меньше.
Поэтому я перешел на более тяжелую артиллерию.
Одну эмблему (для кнопки подачи бумаги) я нарисовал более простым способом: вырезал лазером трафарет на клейкой этикетке, приклеил к дереву и закрасил акрилом из аэрографа.
Это возможно, поскольку на эмблеме нет изолированных участков черного цвета.
Другими словами, черная область связана.
Фото трафаретной росписи
Этот режим не подходит для обычного текста.
Либо вам придется использовать трафаретный (трафаретный?) шрифт, который правильно соединяет все буквы, либо придумать другой метод. Я не хотел ограничиваться тем, что могу нарисовать, поэтому выбрал второй вариант. Чтобы нарисовать случайное (одноцветное) изображение, я покрыл всю поверхность малярным скотчем, затем лазером выгравировал участки, где должна быть краска (в итоге белая).
При этом малярная лента и немного дерева испарились, и я нанес их на маску аэрографом.
Фото более сложного процесса
Шрифт как на усилителях ВЭФ.
На самом деле сделать это было не так уж и сложно.
И качество на удивление хорошее.
Плохо только то, что контраст ниже, потому что краска после лазера плохо держится на шероховатой поверхности.
Хотя казалось бы.
Фото собранной и покрашенной бабаграмы:
Это изображение было на превью, это верно.
Код
Я написал код для Attini как для Arduino и загрузил его через интернет-провайдера, которым был Arduino Uno. Код для малины основан на python-telegram-бот и работает как Telegram-бот. Там много чего сделано криво, в частности плохо реализована многопоточность.Возможно, я обновлю этот код на что-нибудь более красивое.
.
Вы не можете запустить код как системную службу — это должна быть пользовательская служба, иначе pyaudio не сможет использовать микрофон.
Не знаю почему, возможно из-за какой-то аутентификации в PulseAudio. Я не основывал его на коде Яяграммы, потому что в некоторых местах он даже хуже.
В частности, запись звука там осуществляется путем запуска бинарного файла arecord с последующим его уничтожением при отпускании кнопки записи.
Чтобы распечатать текст на термопринтере, вам понадобится шрифт. Его нужно было выбрать, и это было сложно.
Я пробовал векторные шрифты (потому что растровые были нечитабельны), и они выглядели в разной степени криво.
Как я понял позже, растровые не работали из-за описанного выше неправильного управления шаговым двигателем.
Но прежде чем я это осознал, я перепробовал десятки шрифтов и потратил впустую много бумаги.
Наконец, после исправления управления мотором, я смог распечатать один в один и заменил шрифты на растровые.
Какое это было счастье! Когда уже все заработало, я понял, что мне не всегда удобно слушать аудиосообщения, а хочется читать текст. Для этого есть много разных сервисов, но я выбрал Google .
Покопавшись в дебрях версий компилятора Rust и glibc, я наконец установил google-cloud-speech, и всё заработало.
Если хотите моего совета, устанавливайте нестабильную версию raspbian — там более подходящие пакетные версии.
Я больше не могу обновлять свой Pi, потому что.
оказывается, Wi-Fi пропадает во время обновления .
Весь код здесь: https://github.com/gurux13/babagram
Заключение
Бабушке очень нравился Бабаграм.
Она им пользуется, и это очень удобно - мы отправляем сообщение, оно распечатывается на кассовой ленте, и когда она видит выходящий чек, она отвечает нам аудиосообщением, которое сразу распознается как текст.
Спасибо, что дочитали до конца.
Ну или долистнули :) Надеюсь было интересно.
Теги: #Программирование микроконтроллеров #Сделай сам или Сделай сам #поделки #Разработка на Raspberry Pi #Telegram #Raspberry Pi #Atmel #бабушкин телефон #лазерная резка
-
Разработка В Монорепозитории. Отчет Яндекса
19 Oct, 24 -
Машинный Анализатор. Часть 4. Классификатор
19 Oct, 24 -
Есть Ли В Вашей Компании «Черная» Зарплата?
19 Oct, 24 -
Миниатюрный Внешний Диск От Freecom
19 Oct, 24