Знакомьтесь, это - Вася. Он перелетел с компьютера в 3D-принтер по воздуху, через WiFi. Так что да, крокодилы летают, а 3D принтеры развиваются и становятся удобнее...

Продолжаем разговор начатый в статье: 3D ПРИНТЕР И WIFI. ДОБАВЛЯЕМ БЕСПРОВОДНОЙ ИНТЕРФЕЙС УПРАВЛЕНИЯ 3D ПРИНТЕРОМ

yes3d-croco-1__3_.jpg

Кто-то усмехнётся и скажет: "Эка невидаль! Рынок завален моделями с WiFi". Так-то оно так, но мой 3D принтер MZ3D-256 к таковым не относится. Вернее, не относился.

В прошлой статье, я показал, что меня занимала идея сделать модуль Wifi, который бы подключался к произвольному принтеру на базе прошивки Marlin без какой-либо её переделки. Просто включаемся вместо переходника USB-COM (да хоть тумблером двухконтактным) и начинам работать. Правда, я там забыл упомянуть, почему запал именно на модуль ESP12F. Исправляюсь - просто этот модуль стоит 160 рублей с доставкой в РФ, входящей в стоимость. Если брать непосредственно в Китае, на TaoBao, то там он стоит 110 рублей (но по Китаю доставка оплачивается отдельно, там так принято).  Было интересно, выйдет ли из такого дешёвого модуля толк (WiFi модуль от ST Microelectronics, для сравнения, стоит около 2000 рублей). Вроде, вышел.

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

Виртуальный COM порт

Из идеи автономности, вытекает, что никакое ПО для ПК не должно подвергаться модификации. Первое, что приходит в голову - эмуляция COM порта. Тогда ПО будет думать, что печатает на USB принтер (там же тоже эмулируется COM порт), а фактически данные будут уходить в эфир.

В целом, в комплекте поставки среды разработки (которую я упоминал в прошлой статье), имеется замечательный пример WiFiTelnetToSerial. Я проверял его в рамках одного забавного проекта, он прекрасно работает. Со стороны WiFi он предоставляет порт Telnet, с другой - внешнее устройство может быть подключено к ножкам Tx и Rx, имеющимся на модуле. Со стороны ПК эмуляцию COM порта можно обеспечить, чуть-чуть поправив пример "Virtual serial driver sample" из пакета Microsoft WDK. Причём не надо пугаться слов "Драйвер" и WDK. Уже достаточно много лет назад, умные дядьки из Microsoft заменили сложную модуль WDM на вполне себе симпатичную WDF. Но вся соль в том, что в рамках модели WDF есть возможность писать User-Mode драйвера! Да-да! Никаких заморочек с ядром, доступны абсолютно все функции, которые программист привык использовать в повседневной работе, да и при компиляции получается обыкновенная DLLка! В общем, уже много-много лет это всё доступно, а упомянутый пример сделан как раз в виде UMDF драйвера (UM - User Mode). В общем, ничего страшного, только чуть-чуть возни.

Кто не любит программировать, но любит возиться с Open Source решениями (лично я к таким не отношусь), может пойти другим путём. Гугль показывает массу решений, как на базе микросхемы ESP8266 сделать виртуальный COM порт. Приведу пару ссылок, но повторю, что я это решение не проверял. Вот тут, как говорят, живёт бесплатный готовый драйвер виртуального COM порта

http://www.hw-group.com/products/hw_vsp/index_en.html

Кажется, прямая ссылка на файл драйвера выглядит так (напомню, я сам решение не проверял)

http://new.hwg.cz/files/download/sw/version/hw-vsp3-single_3-1-2.exe

А проект, который следует заливать в модуль, живёт здесь

https://github.com/beckdac/ESP8266-transparent-bridge

Вариант с хранением в принтере

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

Для реализации такого варианта лучше всего подходит пример SdWebServer из комплекта поставки среды разработки. Этот пример позволяет

  • Отображать Web страницы, хранящиеся на SD карте, припаянной к контактам модуля ESP12F
  • Заливать файлы в произвольные каталоги SD карты
  • Отображать список файлов
  • Считывать и производить произвольные действия с файлами

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

Правда, HTML/JavaScript код этого примера просто ужасен. Я много раз порывался доработать его, и всегда бросал (правда, я никогда не сталкивался с JavaScript и слабо знаком с HTML). Так что интересен только код "сервера" на С++, который заливается в модуль. А вдохновение по клиентской части лучше всего черпать из примера, который прилагается вот к этому учебному фильму.

http://esp8266-arduinoide.ru/ajax/

Я лично черпал оттуда вдохновение при написании WEB-морды к одной своей программе для PC. Там есть всё, что нужно, так что рекомендую. Правда, когда я начал пытаться разложить штатную диаграмму меню Marlin на 4 странички (а опыта работы с меню принтера у меня мало), то запутался. Обратился к сыну, он окинул мою идеологию взглядом и сказал, что в Париже такое уже не носят так писали в конце прошлого тысячелетия. И сделал какую-то супер мега страницу с трёхуровневым меню на каких-то жутких JavaScript-ах. Но вдохновение для связи с принтером, он всё равно черпал (по моему указанию) на тех страничках, на какие я отправляю Вас, дорогой читатель.

Ну, а когда файл залит, "прошивка" модуля его потихоньку считывает и отправляет в COM порт. Причём у модуля есть огромная аппаратная очередь в блоке UART. 128 байт, кажется. Так что отправить строку - это быстро. Вжик, а дальше она сама уходит. И в это время можно спокойно читать данные с SD карты (это чтобы оптимизировать процессы, дабы система была равномерно загружена).

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

Чтобы разбавить сухой текст, покажу, как выглядит модуль WiFi на принтере. Вот та чёрненькая крышечка около катушки - под ней спрятан и модуль WiFi, и MicroSD. Просто сам принтер из металла, поэтому пришлось вынести радиомодуль наружу, прикрыв пластиком, который более радиопрозрачен. В большом чёрном ящике живёт макетная плата на базе ARM.

yes3d-croco-3__3_.jpg

А вот этот модуль на переходнике MicroSD-SD до того, как был упакован под крышку

yes3d-croco-4__1_.jpg

Заключение

Работа WiFi-модуля ESP12F успешно проверена на практике. В статье показаны два варианта передачи данных на принтер, "прозрачных" для слайсеров. Первый вариант - более прост в реализации, но сама суть радиоканала не стыкуется с требованиями к чёткой и быстрой многочасовой печати. Второй вариант - чуть более сложен в разработке (требует написания кода на С++ для самого модуля, а также HTML/CSS/JavaScript для клиентской части), но зато непосредственно печать идёт уже локально, так что помехи в эфире и сбои стороннего оборудования не повлияют на процесс печати.

 

С уважением В.Ш.