Считайте Данные из Arduino Используя Коммуникацию TCP/IP

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

Соедините щит Ethernet с Uno Arduino

Включите Uno Arduino к своему компьютеру. Выполните эти шаги, чтобы соединить Щит Сети W5100 Ethernet с Uno Arduino и с вашим сетевым маршрутизатором или сетевым адаптером на компьютере.

Поместите Щит Ethernet твердо в Uno Arduino.

Используйте кабель RJ45, чтобы соединить Щит Ethernet Arduino с одним из следующего:

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

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

Идентифицируйте IP-адрес маршрутизатора или сетевого адаптера, с которым соединяется Щит Ethernet Arduino. Задайте этот IP-адрес в программе Arduino в Программе Загрузки на разделе Arduino Uno. Вы также используете этот IP-адрес в качестве входного параметра для tcpserver в разделе Create the Server.

Загрузите программу на Uno Arduino

Загрузите следующую программу на Uno Arduino с помощью IDE Arduino. Эта программа выписывает 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", BytesAvailableFcn свойство к @readArduinoData, и BytesAvailableFcnCount свойство к 1 000.

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

Функция обратного вызова readArduinoData инициирован, когда 250 плавающих точек данных синусоиды (1 000 байтов) доступны, чтобы быть считанными из 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