Как реализовать Arduino NANO в качестве адаптера RS-232 к USB (или нужен Arduino Mega?) Для связи с 3D принтером
У меня есть наверху компьютер, на котором работает программа slicer для 3D-печати (Simplify 3D). В подвале у меня есть несколько 3D-принтеров с поддержкой USB. Мой компьютер наверху имеет последовательный адаптер USB-RS-232. Последовательная сторона этого адаптера USB-to-Serial подключается к последовательному порту адаптера протокола Moxa Nport 6150 RS232-to-Ethernet. Я получаю эти мокса-аппараты бесплатно, когда они ломаются на работе, а потом чиню их за пару долларов.
Другая сторона Moxa подключается к маршрутизатору моей домашней компьютерной сети. В подвале я могу подключить еще один Moxa к кабелю ethernet в моей домашней сети, а последовательный выход RS232 мне нужно подключить к разъему Micro-USB 3D-принтера. Как я могу использовать Arduino Nano (или Uno или Mega, если требуется) для преобразования данных RS232 на USB-вход моего 3D-принтера?
Так что у меня есть PC->(RS-232)->[MOXA(RS-232)->Moxa(Ethernet)]->Router->[Moxa(Ethernet)->Moxa(RS-232)]->[Arduino(RS-232)->Arduino(USB)]->3D-принтер(через USB)... Как я могу заставить Arduino выполнять эту функцию? Элементы в скобках [ и ] - это отдельные устройства, выполняющие преобразование протокола.
Я знаю, что люди используют Raspberry Pi и программу под названием OctoPrint для удаленного управления своими 3D-принтерами, но я получаю Моксы бесплатно, а Uno или Nano стоят очень дешево. RPI стоят дороже, и для нескольких 3D-принтеров они могут начать складываться. Есть идеи?
@ABNormal, 👍2
Обсуждение4 ответа
Nano, как и Uno, имеет встроенный последовательный USB-конвертер. Если вы можете получить последовательный логический уровень от Moxa, то вы можете использовать Nano для преобразования его в USB:
- Загрузите скетч "ничего не делать" в Nano
- Подключите Moxa TX к Nano Tx через резистор 1 Ком, и Moxa RX к Nano RX.
Да, второй шаг оглядывается назад. Причина в том, что метки RX и TX относятся к ATmega328P, который запускает ваши скетчи на Nano. Внутренне, контакт обозначенный RX соединен (через резистор) к TX pin последовательного USB-преобразователя, и это, таким образом, pin, который вы хотите подключить к RX Moxa. И аналогично для метки pin TX (это RX бортового преобразователя).
Шаг 1 важен, потому что вы не хотите, чтобы 328P открывал свой последовательный порт. Резистор необходим в течение короткого времени, когда 328P запускает загрузчик и имеет открытый последовательный порт.
+1 Переход от "СБРОСА к" GND
-это обычно то, что я делаю, хотя размещение скетча "ничего не делать" также является хорошей идеей. Если он удерживается в режиме сброса, загрузчик также не получает возможности играть с последовательными линиями., @timemage
Это здорово! Итак, у меня уже есть некоторые из этих плат преобразователя RS232 в TTL, которые я купил у Amazon: https://smile.amazon.com/gp/product/B07PFB4MHR/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1 Затем я могу перенести TX с этой платы преобразователя на TX Nano (запустив что-то вроде скетча мигания), а RX с платы преобразователя на RX Nano, а затем подключить мини-USB NANO к микро-USB моего 3D-принтера., @ABNormal
@Аномальный подключите мини-USB NANO к микро-USB моего 3D-принтера.
Нет, это никогда не сработает. USB-это протокол, управляемый хостом. Вы не можете просто соединить два устройства вместе в бизнес-центре без хоста., @J...
Это не так просто, как вы думаете. Arduino будет недостаточно для подключения USB 3D-принтера. Протокол USB строго разделен на рабов и хозяев. USB(us) имеет ровно одного ведущего, который полностью контролирует то, что может делать ведомый. Сам раб мало что может сделать сам.
Ваш 3D-принтер является USB-ведомым устройством. Это позволяет USB-мастеру (например, компьютеру) управлять им. Arduino также является подчиненным устройством USB. Если вы подключаете и то, и другое, то у вас есть USB-соединение без мастера. Ничего не случится. Таким образом, вам нужно реализовать USB-мастер на Arduino, который может обрабатывать связь UART; все в программном обеспечении. В целом это возможно, но я бы не советовал. Кроме того, вам определенно нужно дополнительное оборудование, потому что D+ и D - on USB также электрически полностью отличаются от линий TTL RX и TX (а также от линий RS232). Они работают дифференцированно. Так что для этого вам нужно дополнительное оборудование.
Самый простой способ с Arduino-купить USB-хост-щит. С помощью этого вы можете построить то, что вы хотите.
Но я бы поспорил, если это действительно имеет смысл. Самый дешевый USB-хост-щит для Arduino, который я смог найти на amazon, стоит около 10 евро, плюс цена за Arduino и хлопоты по его работе. RaspberryPi Zero W стоит всего 10 евро. Если вы не хотите использовать Wi-Fi, вы можете добавить адаптер USB к Ethernet. И в зависимости от используемого программного обеспечения и его установки вы даже можете обрабатывать несколько принтеров только с одним Pi (я использую сервер Repertier, который, как мне кажется, имеет возможность управлять несколькими принтерами). (Хотя в зависимости от количества принтеров и результирующей нагрузки вы можете увеличить игру до полного Pi4)
Может быть дополнительный способ, в зависимости от ваших принтеров. Плата микроконтроллера принтеров может сломать контакты TX и RX для вас. Тогда вы могли бы подключить к ним Arduino, в этом случае нет необходимости в USB. Но это может быть не вариант. Если используемый микроконтроллер имеет прямой USB-интерфейс, нет никаких контактов RX и TX, чтобы вырваться.
На данный момент информации недостаточно, чтобы дать общее решение. Как справедливо говорит крисл, 3D - принтеры ожидают подключения от хоста. Это соединение хоста зависит от того, поддерживается ли последовательный интерфейс USB внутри принтера. Обычно это чипы FTDI или WCH (QinHeng), и для каждого типа требуется соответствующий системный драйвер. Это было бы трудно реализовать на USB-хост-щите для Arduino.
Большинство 3d-принтеров, по сути, представляют собой Arduino внутри. Типичный 8-битный контроллер на подавляющем большинстве 3d-принтеров использует очень похожий микроконтроллер ATmega. Некоторые новые машины используют 32-битные микроконтроллеры ARM, которые обычно имеют логику 3,3 В по сравнению с Arduino (типичной) 5 В. Чтобы добавить стандартный порт RS-232, вам нужно найти точки RX, TX, GND и Vcc на каждой плате контроллера принтера и подключить к этим точкам правильные контакты ваших плат преобразователя RS-232 в TTL. Это полностью обошло бы USB-порты на принтерах.
У вас могут возникнуть проблемы с управлением потоком и буферизацией при отправке нескольких портов с одного ПК и задержке последовательной сети. Принтеры Gcode в стиле Marlin (= большинство нитевидных принтеров, которые не являются Makerbot или Flashforge, приблизительно) не используют управление потоком: принтер отправляет обратно ok
, когда он готов к следующей команде. 3D-принтерам не нужны действительно быстрые последовательные соединения (менее 20 кбит/с на принтер, если они используют Gcode), но они нуждаются в данных, когда будут готовы к печати.
OctoPrint может быть довольно дорогим вариантом. Минимальная поддерживаемая платформа-это Raspberry Pi 3b+ (+ блок питания, SD-карта, USB-кабель, чехол,...), предназначенный для каждого принтера. В то время как вы можете запустить очень урезанную осьминожку на Raspberry Pi Zero, автор не рекомендует ее использовать, и вам придется щелкнуть по неподдерживаемой конфигурации: Используйте диалог на свой страх и риск.
Если мы возьмем ПК следующей конфигурации (только псевдопоследовательный, как на старых ноутбуках без USB) -> Ардуино -> USB-принтер, главное — это псевдокод Arduino «xxx.ino» ;):
//делаем все необходимые настройки
initialize
(((( loop
//ПК-->arduino
oh, some bytes on serial //Nano обнаруживает некоторую активность на последовательном порту
I'm dividing that in commands,status and cargo. //Нано разбираем этот поток и определяем, что с чем делать.
huh, now repack that in USB protocol and send out // скорее всего, это данные и команды для отправки на принтер через USB с соответствующим протоколом
//Arduino-->принтер
hey printer, here is some feed for you // Nano объявляет о предстоящем событии с данными
//принтер --> Ардуино
thanks, want more input // принтер обязательно отреагирует подтверждением (успех или ошибка) и запросит или нет следующие данные
//Ардуино --> ПК
let's send some more, he like it //Nano запрашивает следующий пакет данных с ПК отправителя
))) //завершаем цикл и повторяем, пока все не будет выполнено
Но как-то поподробнее.
Надеюсь, вы понимаете, что этот идентификатор ;) "юмор/шутка/ерунда" псевдокод, который показывает только организацию потока данных, как создавать некоторые функции/процедуры. Конкретный полезный код зависит от вас. Еще раз это показывает только то, что это можно сделать с помощью Arduino. Чтобы написать комментарий, конечно, нужно больше 5 минут.
Я не уверен, что CR/LF работает правильно, но любой, кто умеет писать код на C, сможет правильно отформатировать этот текст и, возможно, начнет заполнять разделы реальным кодом
В настоящее время ваш ответ неясен. Пожалуйста, [измените], чтобы добавить дополнительную информацию, которая поможет другим понять, как это относится к заданному вопросу. Дополнительную информацию о том, как писать хорошие ответы, вы можете найти [в справочном центре](/help/how-to-ответ)., @VE7JRO
Добро пожаловать в Stack Exchange! Вероятно, будет полезнее и вы получите больше репутации, если ответите на более свежие вопросы. Я полагаю, что этот вопрос с апреля 2021 года уже не имеет особого отношения к ФП., @Nick Gammon
- Arduino Uno: avrdude: stk500_recv(): программатор не отвечает
- В чем разница между delay() и delaymicroseconds()
- Программирование Arduino на Паскале?
- Выход 3,3 В при установке вывода на высокий уровень
- Может ли Arduino UNO постоянно хранить код?
- Использование библиотеки Arduino fix_fft или arduinoFFT для фильтрации определенного звука?
- Как сгенерировать файлы .a и .so для добавления в проект arduino
- Частота дискретизации нескольких аналоговых контактов на Arduino
Nano не может использовать RS-232: для этого требуется последовательный интерфейс логического уровня. Вам понадобится какой-то переключатель уровней, например, микросхемы MAX232., @Edgar Bonet
Хм ... что-то вроде чипа MAX232-это та часть, которую я заменяю в MOXA, чтобы починить их. Если я взял последовательный вывод Moxa через чип MAX232, затем последовательный TTL для RX и TX Arduino... вот где я теряюсь., @ABNormal
Или я могу просто подключить данные TTL RX и TX от MAX232 и подключить их непосредственно к разъему Micro-USB? Я нашел диаграмму распиновки microUSB, но на ней данные отображаются как "D+" и "D-". Не уверен, как это соотносится с TX и RX. Кроме того, где-то мне придется установить скорость передачи данных для всего, что делает преобразование со скоростью 115200 на моем 3D-принтере. Вот также, почему я думаю, что мне нужен микроконтроллер? Но я могу установить скорость последовательной передачи данных на стороне принтера Moxa на 115200, затем отправить этот RS232 на MAX232, но теперь мне нужен чип UART для преобразования RX и Tx в D+ и D -? Это правда?, @ABNormal
RX и TX напрямую в D+ и D - не идут. Другой протокол, разные уровни напряжения и разные функции контактов., @chrisl
Это полностью зависит от *какого протокола ожидает ваш 3D-принтер через свой USB-порт*. Когда вы подключаете свой 3D-принтер, как он выглядит? Собственное USB - устройство с собственным драйвером устройства? В качестве UART USB/RS-232, представляющего виртуальный COM-порт? Если 3D-принтер не управляется RS-232, то это безнадежно, и в любом случае это безнадежно, потому что его UART уже скрыт за USB-конвертером, поэтому вам нужно будет отправлять кадры USB, а не необработанные данные RS-232. Нужна дополнительная информация., @J...
Если принтер работает по протоколу RS-232 со встроенным USB-преобразователем, то одним из решений было бы открыть 3D-принтер, отключить сигнал RS-232 от UART и подключить moxa непосредственно к внутренним линиям RS-232 принтера. Конвертер arduino RS-232/USB работает только в одном направлении - USB является стороной хоста, а не стороной устройства., @J...