Чтение данных из Arduino с использованием коммуникации TCP/IP

В этом примере показано, как разрешить коллбэкам считать данные синусоиды от Arduino ® Uno с помощью tcpserver интерфейс. Arduino сконфигурирован как клиент TCP/IP и соединяется с сервером TCP/IP, созданным в MATLAB ®, используя tcpserver.

Подключите Ethernet Shield к Arduino Uno

Подключите Arduino Uno к компьютеру. Выполните следующие действия, чтобы подключить сетевой щит W5100 Ethernet к Arduino Uno и к сетевому маршрутизатору или сетевому адаптеру на компьютере.

Надежно разместите Ethernet Shield на Arduino Uno.

Используйте RJ45 кабель для подключения Arduino Ethernet Shield к одному из следующих:

  • Сетевой маршрутизатор, обеспечивающий доступ к Интернету на вашем компьютере.

  • Сетевой адаптер на вашем компьютере.

Идентифицируйте IP-адрес маршрутизатора или сетевого адаптера, к которому подключен Arduino Ethernet Shield. Укажите этот IP-адрес в программе Arduino в разделе Load Program на Arduino Uno. Вы также используете этот IP-адрес в качестве входного параметра для tcpserver в разделе «Создание сервера».

Загрузка программы на Arduino Uno

Загрузите следующую программу на Arduino Uno с помощью Arduino IDE. Эта программа записывает 250 значений с плавающей точкой синусоиды.

/*
 TCPIPClient
 Write sine wave data values to the tcpserver object created in MATLAB.
 */

#include <SPI.h>
#include <Ethernet.h>

// Specify the MAC address printed on the Ethernet shield.
// If no MAC address is printed, then use the address shown below.
byte mac[] = {0xDE,0xAD,0xBE,0xEF,0xFE,0xED};

// Specify the server IP address that is used to create the tcpserver object in MATLAB.
// This is the IP address of the router or network adapter that the Arduino Ethernet Shield is connected to.
// In this example, 192.168.1.81 is the IP address for the server.
IPAddress server(192,168,1,81);

// Set the static IP address for the Arduino Ethernet Shield to act as a TCP/IP client.
// Choose an IP address that is in the same subnet or private network as the server IP address.
// In this example, 192.168.1.177 is the IP address for the Arduino Ethernet Shield. It is in the same subnet as the server IP address.
IPAddress ip(192,168,1,177);
IPAddress myDns(192,168,1,1);

// Ethernet client library.
EthernetClient client;

// Command sent by the server.
byte command;

// Sine wave data buffer.
float sineWaveBuffer[250];

// The setup routine runs once when you press reset.
void setup()
{
  // Initialize serial communication.
  Serial.begin(9600);
  while (!Serial) 
  {
    ; // Wait for serial port to connect.
  }
  
  Ethernet.begin(mac,ip,myDns);
  Serial.print("Manually assigned the following IP address to the Arduino:");
  Serial.println();
  Serial.println(Ethernet.localIP());

  // Check for Ethernet hardware.
  if (Ethernet.hardwareStatus() == EthernetNoHardware)
  {
    Serial.println("Ethernet shield was not found.");
  }

  // Check for Ethernet cable connection.
  if (Ethernet.linkStatus() == LinkOFF) 
  {
    Serial.println("Ethernet cable is not connected.");
  }

  Serial.print("Attempting connection to ");
  Serial.print(server);
  Serial.println("...");

  // Attempt to connect to the server running at IP address 192.168.1.81 and port 5000.
  if (client.connect(server,5000))
  {
    Serial.print("Connected to server running at ");
    Serial.println(client.remoteIP());
  }
  else 
  {
    Serial.println("Connection to server failed.");
  }

  // Store sine wave data as 250 float values.
  for (int j = 0;j < 250;j++) 
  {
    sineWaveBuffer[j] = sin(j*50.0/360.0);
  }
}

// Main processing loop
void loop() 
{
  // Block until data is sent by server.
  if (client.available() > 0)
  {
    // Read the command sent by the server.
    command = client.read();

    // Print the command sent by the server.
    Serial.println("The server sent the following command:");
    Serial.println(command);

    if (client.connected() && command == 1)
    {
        // Write sine wave data to the server.
        client.write((const uint8_t *) & sineWaveBuffer, sizeof(sineWaveBuffer));
    }
  }
}

Создайте сервер

Создайте tcpserver образец с использованием IP-адреса маршрутизатора или сетевого адаптера.

В этом примере IP-адрес 192.168.1.81 и номер порта 5000. Этот IP-адрес должен быть таким же, как и в программе Arduino.

server = tcpserver("192.168.1.81",5000)
server = 
  TCPServer with properties:

        ServerAddress: "192.168.1.81"
           ServerPort: 5000
            Connected: 0
        ClientAddress: ""
           ClientPort: []
    NumBytesAvailable: 0

  Show all properties, functions

Подготовим tcpserver Объект для приема данных

Установите ConnectionChangedFcn свойство к @requestDataCommand. Функция обратного вызова requestDataCommand срабатывает, когда Arduino соединяется с tcpserver объект.

server.ConnectionChangedFcn = @requestDataCommand;

Создайте функцию обратного вызова requestDataCommand который отправляет значение uint8 1 как команду, чтобы запросить Arduino отправить данные.

function requestDataCommand(src,~)
if src.Connected
    % Display the server object to see that Arduino client has connected to it.
    disp("The Connected and ClientAddress properties of the tcpserver object show that the Arduino is connected.")
    disp(src)
    
    % Request the Arduino to send data.
    disp("Send the command: 1")
    write(src,1,"uint8");
end
end

Установите BytesAvailableFcnMode свойство для "byte", the BytesAvailableFcn свойство к @readArduinoData, и BytesAvailableFcnCount свойство до 1000.

configureCallback(server,"byte",1000,@readArduinoData);

Функция обратного вызова readArduinoData запускается, когда 250 синусоиды точек данных с плавающей точкой (1000 байт) доступны для чтения с Arduino.

Чтение функции обратного вызова

Создайте функцию обратного вызова readArduinoData который считывает 250 точек данных синусоиды и строит график результата.

function readArduinoData(src,~)
% Read the sine wave data sent to the tcpserver object.
src.UserData = read(src,src.BytesAvailableFcnCount/4,'single');

% Plot the data.
plot(src.UserData)
    
% Clear any other remaining data sent by the Arduino.
flush(src);
end