Мобільний друк



У наш час нікого вже не здивуєш печаткою картиночек на аркуші паперу. Існує величезний вибір принтерів (в тому числі і кишенькових). Багато хто з моїх знайомих купують або збирають 3D-принтери. Я ж хочу розповісти, як я знову винаходив велосипед. Отже, знову крок назад — це історія про 2D друк. Розповідь про те, як я робив мобільний принтер для телефону на основі термального принтер (принтер, який друкує на термопапері — не потрібні чорнило, тільки спеціальна папір і електрика), модуля bluetooth і ще кількох дрібниць.
Хочу відразу попередити, що в електроніці і електротехніці я нічого не розумію, що я принципово не використовував готових рішень і бібліотек. Тому це розповідь про рукожопство і велосипеди, про проблеми з якими я зіткнувся. Продовжуйте читання на свій страх і ризик.

Супертехнологическое пристрій

Я думаю, що мені не треба нагадувати, що ми живемо в століття мобільних технологій. Я пам'ятаю, як років 20 тому я думав, що ось ще трохи, і світ буде сповнений роботів, літаючих автомобілів і ще багато-багато чого дивного. З урахуванням того, що я вважав, що ще трохи і у всіх будуть свої роботи, символічно і те, що роботів у нас толком немає (захисників робопылесосов прошу пробачити мені минулої фразу), але є дещо інше… Я б швидше за все не повірив, якби мені тоді сказали, що у майже у кожної людини на землі в кишені буде супертехнологическое пристрій, з допомогою якого люди будуть, сидячи в туалеті, запускати симуляцію фізичних взаємодій процесу вкидання птахів у свиней. А якщо б мені сказали, що це пристрій будуть називати телефоном, я б і зовсім розсміявся в обличчя оповідачеві.

Трохи історії

На носі був 95-ий рік (може і раніше, але я вже в минулому абзаці написав про «20 років тому», а «20» це красиве і кругле число, тому я залишуся при ньому) і в одного із знайомих з двору був Gameboy (DMG-001). Не думаю, що варто розповідати, наскільки він був крутий за мірками того часу і яка вибудовувалася черга, щоб побачити і потримати в руках це диво техніки. На початку 2000-их цей пристрій знову нагадало про себе, т. к. до нього з'явилася додаткова периферія, а саме камера і принтер. Реальної необхідності в такій камері або принтері (тим більше такої якості) не було, але сама ідея мобільного пристрою, з якого можна було роздрукувати невелику картиночку здавалося кроком у майбутнє.



Назад до теми

Отже, пройшло 20 років і я подумав, що можна було б зробити пристрій схоже, тільки для супертехнологического пристрою — телефону.

Ідея була досить проста і ґрунтувалася на таких речах:
  1. Термальний принтер (A2 Micro Panel Thermal Printer).
  2. Модуль bluetooth (JY-MCU BT_BOARD V1.06).
  3. Контролер (Stellaris Launchpad LM4F120XL. Щоб уникнути питань «а чому?», відразу відповім, що просто у мене була під рукою саме ця плата).
  4. Екран (LCD 84x48 Nokia 5110) та кілька led діодів для індикації стану.
  5. Акумулятор і регулятор (Turnigy UBEC 5A).
  6. Додаток під Android для управління принтером (читати, як «друку»).
  7. Розряд по рукожопству і слабкі знання основ електротехніки.
Саме через 7-ого пункту я повинен попросити вибачення у всіх, кого засмутить моя реалізація. Вибачте, але виготовлення друкованих плат, налагодження пристрою з використанням осцилографа та інших плюшок адекватної розробки пристроїв в цьому оповіданні ви не знайдете. Необхідних інструментів у мене теж немає, оскільки в повсякденному житті я не працюю в цій сфері, так і розряд з рукожопству втрачати не хочеться. Я постарався трохи поліпшити свої знання предметної області, але так чи інакше, розумію, що можу помилитися і в термінології. Мені самому буває боляче дивитися на код людей далеких від програмування, тому, щоб не забирати більше часу у любителів прекрасного в області електротехніки, викладаю фото того, як все було зібрано:



Щож, для всіх, хто продовжив читання після минулого фотографії, доступна ачивка «Пережив пекло перфекціоніста електротехніка»…



Отже, як я вже говорив, ідея була проста: є картинка на телефоні (тут вже не важливо, що є джерелом картинки, просто приймемо, що картинка є), необхідно зменшити її, зробити маніпуляції з яскравістю і контрастом (якщо є необхідність), потім дітерінг (dither), щоб отримати чорно-біле зображення, потім відправка по bluetooth на принтер і безпосередньо друк.

Оскільки я займаюся розробкою програмного забезпечення, то з програмною частиною не було проблем або проблем. Був реалізований простенький протокол обміну даними між принтером і керуючим пристроєм (оскільки принтер приймає команди по bluetooth, то немає сенсу обмежуватися тільки телефоном):
  1. Використовується бінарний протокол для обміну даними.
  2. Дані передаються у вигляді пакетів, кожний з який починається із заголовка (що за пакет, скільки даних).
  3. На кожен пакет-запит є дві відповіді («запит отримано» і «виконання запиту завершено»). Можна було б обійтися і однією відповіддю, але в такому режимі можна було краще контролювати стан принтера — немає необхідності реалізовувати чергу команд на стороні контролера, т. к. контролер сам повідомляє, що готовий до виконання нового запиту.
Крім службових команд типу «а живий чи принтер?», було реалізовано лише кілька команд, які безпосередньо пов'язані з друком (друк зображення і подача паперу — feed).

Оскільки принтер здатний друкувати лише монохромні зображення, то в якості формату зображення було обрано спрощений аналог Bitmap з 1bpp (1 біт на піксель). Принтер здатний друкувати 384 точок на лінію, що означає, що для друку однієї повної лінії необхідно 48 байт (не рахуючи заголовка).

Проблеми зі зв'язком

Не буду загострювати увагу на тому, що контролер відмовився отримувати дані від модуля bluetooth з-за дуже низької напруги на нозі TX модуля, т. к. надто багато часу я витратив на налагодження цієї деталі. На це я вбив приблизно два дні, т. к. спочатку перевірив все що тільки міг і тільки потім пішов читати інтернет, звідки і дізнався, що це особливість обраного модуля і що рівень доведеться підтягнути до необхідних 3.3 V самому або ж доведеться ґвалтувати модуль і випоювати з нього діод (що я вирішив не робити).



Після того, як я зміг отримувати пакети на стороні контролера з'явилася інша проблема: дані приходили частково. Досі не можу точно сказати, в чому саме була проблема, але тут толі ліміт буфера модуля bluetooth, толі його швидкість передачі / обробки даних. Проблема була така: шолом пакет (наприклад, кілобайт даних), на стороні контролера отримуємо 990-1023 байта з втратами у випадковому діапазоні (випадкова область даних, випадкове кількість). Втрати даних траплялися приблизно в 50% випадків і становили завжди невеликий відсоток від вихідних даних (не більше 50 байт, навіть при пересилання декількох кілобайт). Проблема повторювалася на всіх швидкостях обміну даними (не те, щоб я перевіряв все, але перевірив як середнє значення, так і межі — 1200 і 115200 бод), але зникала при додаванні затримки між відправкою даних. Щоб не вбудовувати синтетичних затримок, я вирішив, що просто доповню протокол обміну даними:
  1. додано контрольна сума пакета.
  2. Дані в рамках пакету передавалися фрагментами, після передачі фрагмента даних, очікувався відповідь від контролера, який пересилав порядковий номер отриманого фрагмента.
  3. додано службовий пакет для установки розміру фрагмента (зазвичай використовується розмір 128 байт, але можливість змінювати розмір фрагмента я залишив).
Отже, перше, що було необхідно, щоб визначити початок пакету — це підпис (певна послідовність байтів):


Ідея з підписом не нова. У випадку, якщо одна із сторін, з якихось причин перервала прийом пакету на середині передачі, то інші дані пакета не повинні бути інтерпретовані, як наступний пакет. Таким чином, прийом починається з того, що з буфера видаляються (ігнорує) всі байти, до підпису — початку заголовка пакета. Таким чином, забезпечується те, що випадкове сміття в буфері (залишки минулого пакета) не будуть вважатися заголовком нового пакета.

Код одержання даних фрагментами область даних, після отримання та перевірки заголовка):


Оскільки існує ймовірність того, що при передачі даних будуть втрати, необхідно перевіряти і порядковий номер пакета. Наприклад, запит на друк відправлений, а відповідь не отримано. У такому разі запит буде відправлено повторно, але виконувати його не потрібно, оскільки досить просто відповісти статусом попереднього виконання запиту. Кожна зі сторін вважає пакети і якщо порядковий номер пакета невірний, значить слід розпочати комунікацію «з чистого аркуша» (скинути лічильники).

Крім самого принтера

Крім самого принтера, контролера і модуля зв'язку (bluetooth), було додано декілька елементів для індикації стану. Були додані 3 світлодіода:
  1. Індикатор включення.
  2. Індикатор наявності зв'язку з телефоном (горить, якщо протягом останніх 5 секунд була передача даних).
  3. Індикатор друку (горить, коли відбувається друк).


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

Загальна схема виглядає так:


Зовнішній вигляд

Для корпусу я вирішив використовувати 4мм фанеру, різання фанери я довірив верстата з лазером. Від мене потрібні тільки векторний креслення і гроші за роботу. Креслення вийшов ось такий:


Червоним позначені області, які було необхідно випалювати, а не різати. Результатом задоволений. З мінусів даної коробки можу назвати лише те, що вона склеєна і розгляду не підлягає. Благо порт для нових прошивок контролера і порт для зарядки акумулятора я вивів, тому необхідності розбирати коробку немає:


Слід уточнити, що коробка вийшла з третього разу. Спочатку коробка просто не зійшлася — я поквапився, не перевірив розміри і одна грань не підійшла. Потім я переробив креслення, але зробив досить дурний вибір у тому, як кріпити скло, що захищає екран:


В результаті, скло було заховано в корпус і не стирчало зовні (не стану тут знову вставляти картинку з початку статті).

Додаток

На стороні телефону я зробив досить примітивний інтерфейс:
Вибір картинки для друку (з камери або з файлової системи):


Налаштування зображення — яскравість і контраст:


Кілька елементів управління (підключення до принтера, друк, подача паперу, поворот зображення):


Результати

Якість друку досить пристойна (для термального принтера):


Як і багато принтерів, цей не виняток і трохи «полосатит»:


Загалом, те, що я хотів би сказати цією історією — це те, що не варто боятися робити речі своїми руками, не варто боятися і велосипедів. В наш час, розробка своїх пристроїв стало набагато простіше. Контролери не так обмежені в ресурсах, невибагливі в роботі і прощають деякі помилки (які б не допустив людина, що розуміє в електротехніці). Робіть речі своїми руками, винаходьте свої велосипеди. Спасибі всім, хто дочитав до кінця.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.