Преобразователь UART в Ethernet на Arduino
1Существующие аналоги преобразователя UART в Ethernet
Аналогичные устройства создаются различными фирмами. Так, например, серверы последовательных портов выпускает фирма MOXA. Выглядят такие устройства так:
Или вот так:
У данного производителя имеются и другие вариации, которые отличаются количеством COM-портов, поддерживаемыми интерфейсами (RS-232, RS-485, RS-422 и другие), способом подключения (Ethernet, USB и другие) и так далее. Также эти устройства имеют удобный веб-интерфейс для настройки, поддерживают удалённое управление с использованием стандартного языка SCPI и другие «навороты». Как правило, такие устройства применяются в промышленности, а значит, их стоимость для обычного пользователя заоблачная.
Нам же для создания аналогичного устройства (хоть и не столь навороченного), понадобится:
- Arduino UNO или иная совместимая плата;
- Ethernet-шилд;
- преобразователь с 12В в 5В UART с разъёмом DB9;
- соединительные провода;
- персональный компьютер со средой разработки Arduino IDE.
2Схема соединений и скетч преобразователя UART в Ethernet
Если мы воспользуемся готовым Ethernet шилдом, то подключений будет минимум. Прежде всего необходимо установить Ethernet шилд. Он устанавливается сверху на плату Arduino как «мезонинная» плата.
Шилд – в мире Arduino-разработки это печатная плата с разъёмами и микросхемами, обладающая какой-либо готовой функциональностью. Например, Ethernet-шилд позволяет подключать Arduino к локальной сети посредством кабеля c коннектором RJ-45; SD-шилд позволяет подключать к Arduino SD или mini/micro SD карты, и т.д. Шилды очень просто подключаются к Arduino, а также обеспечивают лёгкое подключение к ним самим (при необходимости).
К Arduino можно подключать устройства с UART, которые работают на напряжении 5 В, т.к. цифровые выводы Arduino работают именно с таким напряжением (максимум допустимо подавать 5.5 В). Стандартный COM-порт компьютера и другие устройства с UART работают на напряжении 12 В, и подключать их к нашему устройству напрямую нельзя. Необходимо использовать преобразователь 12-вольтового UART в 5-вольтовый на микросхеме MAX3232. Предлагаемый модуль выполнен на небольшой платке, имеет стандартный разъём DB9 и удобные отверстия для крепления, которые соосны с отверстиями в плате Arduino UNO и Ethernet шилда.
Для фиксации преобразователя можно воспользоваться винтами с гайками, как на фотографии. Линию RX модуля преобразователя достаточно подключить к линии TX Arduino, TX – к RX, питание модуля к 5 В Arduino, землю модуля – к земле Arduino.
Если предполагается работа с устройствами, которые используют 5-вольтовый UART, то модуль преобразования напряжения не нужен. Если нужно подключаться к компьютеру, который не имеет COM-порта, можно использовать 5-вольтовый преобразователь USB в UART.
Так как в Arduino имеется только один аппаратный COM-порт, а хотелось бы выводить также диагностические сообщения, то будем использовать для вывода сообщений аппаратный COM-порт на цифровых выводах 0 и 1, а для работы с преобразователем используем программный последовательный порт на аналоговых выводах A8 и A9. В «боевой» прошивке, когда убедимся, что всё работает как надо, я бы отключил диагностический вывод и переключил работу с модулем преобразователя с программного на аппаратный UART Arduino.
Теперь напишем такой скетч для нашего устройства.
Скетч преобразователя UART в Ethernet (разворачивается)
#include <SPI.h> // это нужно для работы Ethernet-шилда #include <Ethernet.h> #include <SoftwareSerial.h> byte mac[] = { 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF }; // укажите желаемый MAC IPAddress ip(192, 168, 0, 155); // укажите желаемый IP const int port = 7777; // укажите желаемый порт EthernetServer server(port); SoftwareSerial uart(8, 9); // сюда подключаем внешний UART (8 - RX, 9 - TX) String tcpData; //строки для временного хранения сообщений String uartData; void setup() { Serial.begin(9600); uart.begin(9600); Serial.println("UART started"); Ethernet.begin(mac, ip); server.begin(); Serial.print("Server started at "); IPAddress lip = Ethernet.localIP(); for (byte thisByte = 0; thisByte < 4; thisByte++) { Serial.print(lip[thisByte], DEC); Serial.print("."); } Serial.println(":" + (String)port); } void loop() { EthernetClient client = server.available(); // ожидаем подключения if (client) { // принимаем запрос на подключение TCP клиента while (client.connected()) { // пока клиент подключён // ЕСЛИ ПРИШЛИ ДАННЫЕ ПО UART: if (uart.available() > 0) { char c = uart.read(); if (c != '\n') { uartData.concat(c); // добавляем прочитанный символ к временной строке } else { Serial.println("UART data received: " + uartData); client.println(uartData); // отправляем принятую строку TCP клиенту uartData = ""; // обнуляем временную строку } } // ЕСЛИ ПРИШЛИ ДАННЫЕ ПО TCP: if (client.available()) { char c = client.read(); if (c != '\n') { tcpData.concat(c); } else { Serial.println("TCP data received: " + tcpData); uart.println(tcpData); // отправляем принятые данные в UART tcpData = ""; } } } client.stop(); // закрываем соединение } }
Загрузим этот скетч в Arduino. Соединим сетевым кабелем разъём Ethernet-шилда и маршрутизатор (роутер) или коммутатор (свитч). Коннектор DB9 преобразователя соединим с COM-портом компьютера. Подключимся монитором среды Arduino IDE к последовательному порту Arduino. Если всё хорошо, то появится сообщение, что сервер запущен.
Подключимся какой-либо терминалкой к нашему серверу на Arduino, а другой терминалкой – к COM-порту компьютера, к которому подключён преобразователь. Отправим через терминалку команду по сети. Она должна появиться в мониторе последовательного порта Arduino. Если отправим команду из монитора – она появится в терминалке COM-порта. Преобразователь работает!
Поблагодарить автора:
Поделиться
Related items
2 comments
-
sotion Среда, 08 Январь 2020 21:51 Ссылка на комментарий
Здравствуйте спасибо! все работает!
но когда я из сети посылаю команды! они появляются на 8-9
а как сделать что бы работало в 2 стороны ?
сейчас у меня только отсылаются данные по сети
а когда я на выводы 8-9 подаю информацию
то сетевой терминал молчит(( -
aave1 Пятница, 10 Январь 2020 16:46 Ссылка на комментарий
sotion, спасибо за отзыв!
Специфика данного скетча такая, что необходимо после посылки каждой команды переподключаться к серверу Ethernet (роль которого выполняет Arduino). Возможно, в этом дело. Приветствую, если вы улучшите данный скетч и пришлёте сюда или мне на почту, я добавлю в статью.