Рейтинг@Mail.ru

Преобразователь UART в Ethernet на Arduino

автор:
2 comments Arduino
Print Friendly, PDF & Email
Весьма полезная вещь – преобразователь UART в Ethernet. С его помощью можно было бы управлять устройствами, которые оснащены универсальным последовательным асинхронным интерфейсом UART, по локальной сети. Давайте как раз и займёмся созданием такого устройства.

1Существующие аналоги преобразователя UART в Ethernet

Аналогичные устройства создаются различными фирмами. Так, например, серверы последовательных портов выпускает фирма MOXA. Выглядят такие устройства так:

Преобразователь интерфейсов MOXA NPort 5250A
Преобразователь интерфейсов MOXA NPort 5250A

Или вот так:

Преобразователь интерфейсов MOXA NPort 5650I-8-DT
Преобразователь интерфейсов MOXA NPort 5650I-8-DT

У данного производителя имеются и другие вариации, которые отличаются количеством COM-портов, поддерживаемыми интерфейсами (RS-232, RS-485, RS-422 и другие), способом подключения (Ethernet, USB и другие) и так далее. Также эти устройства имеют удобный веб-интерфейс для настройки, поддерживают удалённое управление с использованием стандартного языка SCPI и другие «навороты». Как правило, такие устройства применяются в промышленности, а значит, их стоимость для обычного пользователя заоблачная.

Нам же для создания аналогичного устройства (хоть и не столь навороченного), понадобится:

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 шилда.

Преобразователь Ethernet в UART на Arduino UNO
Преобразователь Ethernet в UART на Arduino UNO

Для фиксации преобразователя можно воспользоваться винтами с гайками, как на фотографии. Линию RX модуля преобразователя достаточно подключить к линии TX Arduino, TX – к RX, питание модуля к 5 В Arduino, землю модуля – к земле Arduino.

Преобразователь Ethernet в UART на Arduino UNO
Преобразователь Ethernet в UART на Arduino UNO

Если предполагается работа с устройствами, которые используют 5-вольтовый UART, то модуль преобразования напряжения не нужен. Если нужно подключаться к компьютеру, который не имеет COM-порта, можно использовать 5-вольтовый преобразователь USB в UART.

Преобразователь Ethernet в UART подключён к ПК через USB-UART преобразователь
Преобразователь Ethernet в UART подключён к ПК через 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. Если всё хорошо, то появится сообщение, что сервер запущен.

Преобразователь Ethernet-UART на Arduino подключён к COM-порту компьютера и локальной сети
Преобразователь Ethernet-UART на Arduino подключён к COM-порту компьютера и локальной сети

Подключимся какой-либо терминалкой к нашему серверу на Arduino, а другой терминалкой – к COM-порту компьютера, к которому подключён преобразователь. Отправим через терминалку команду по сети. Она должна появиться в мониторе последовательного порта Arduino. Если отправим команду из монитора – она появится в терминалке COM-порта. Преобразователь работает!

Last modified onВторник, 09 Январь 2024 20:07 Read 10618 times
Ключевые слова: :

Поблагодарить автора:

Поделиться

Print Friendly, PDF & Email

2 comments

  • sotion
    sotion Среда, 08 Январь 2020 21:51 Ссылка на комментарий

    Здравствуйте спасибо! все работает!
    но когда я из сети посылаю команды! они появляются на 8-9
    а как сделать что бы работало в 2 стороны ?
    сейчас у меня только отсылаются данные по сети
    а когда я на выводы 8-9 подаю информацию
    то сетевой терминал молчит((

  • aave1
    aave1 Пятница, 10 Январь 2020 16:46 Ссылка на комментарий

    sotion, спасибо за отзыв!
    Специфика данного скетча такая, что необходимо после посылки каждой команды переподключаться к серверу Ethernet (роль которого выполняет Arduino). Возможно, в этом дело. Приветствую, если вы улучшите данный скетч и пришлёте сюда или мне на почту, я добавлю в статью.

Leave a comment