Contenido principal

Leer datos de transmisión desde Arduino usando la comunicación de puertos serie

Este ejemplo muestra cómo habilitar callbacks para leer datos de transmisión terminados en ASCII desde una placa Arduino® usando la interfaz serialport.

Este ejemplo utiliza un Arduino Due; sin embargo, la mayoría de placas Arduino debería funcionar.

Cargar un programa al Arduino

Conecte una placa Arduino al equipo.

Cargue el siguiente programa en la placa Arduino® usando el Arduino IDE. Este programa escribe puntos continuos de una onda sinusoidal, seguidos de los terminadores "Retorno de carro" y "Salto de línea".

/*
 SineWavePoints
 
 Write sine wave points to the serial port, followed by the Carriage Return and LineFeed terminator.
 */

int i = 0;

// The setup routine runs once when you press reset:
void setup() {
  // Initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
}

// The routine loops forever:
void loop() {
  // Write the sinewave points, followed by the terminator "Carriage Return" and "Linefeed".
  Serial.print(sin(i*50.0/360.0));
  Serial.write(13);
  Serial.write(10);
  i += 1;
}

Establecer una conexión con el Arduino

En MATLAB, cierre todas las conexiones serialport existentes.

delete(serialportfind);

Encuentre el puerto serie al que está conectado el Arduino. Puede identificar el puerto desde el Arduino IDE. Para este ejemplo, supongamos que el Arduino IDE indica que la conexión está en el puerto COM4. Confirme que este puerto existe en el equipo enumerando todos los puertos disponibles.

serialportlist("available")
ans = 1×2 string
    "COM3"    "COM4"

Conéctese al Arduino Due creando un objeto serialport. Utilice el puerto y la transmisión especificados en el código de Arduino.

serialObj = serialport("COM4",9600)
serialObj = 
  Serialport with properties:

                 Port: "COM4"
             BaudRate: 9600
                  Tag: ""
    NumBytesAvailable: 15

  Show all properties, functions

Prepare el objeto serialport para empezar a transmitir datos.

Configure el objeto serialport configurando sus propiedades y borrando datos antiguos.

Defina la propiedad Terminator para que coincida con el terminador que especificó en el código de Arduino.

configureTerminator(serialObj,"CR/LF");

Vacíe el objeto serialport para eliminar cualquier dato antiguo.

flush(serialObj);

Prepare la propiedad UserData para almacenar los datos de Arduino. En este caso, defina UserData para que sea una estructura en la que el campo Data contiene valores de onda sinusoidal y Count registra el número de puntos de datos recogidos. Esta estructura permite el acceso organizado y eficiente, así como la actualización de estos datos relacionados.

serialObj.UserData = struct("Data",[],"Count",1)
serialObj = 
  Serialport with properties:

                 Port: "COM4"
             BaudRate: 9600
                  Tag: ""
    NumBytesAvailable: 0

  Show all properties, functions

En un archivo de MATLAB nuevo, cree una función de callback readSineWaveData que lea los primeros 1000 puntos de datos terminados ASCII de la onda sinusoidal y represente el resultado. Esta función toma un argumento maxDataPoints que determina cuándo representar los datos.

function readSineWaveData(src, ~, maxDataPoints)

% Read the ASCII data from the serialport object.
data = readline(src);

% Convert the string data to numeric type and save it in the UserData
% property of the serialport object.
src.UserData.Data(end+1) = str2double(data);

% Update the Count value of the serialport object.
src.UserData.Count = src.UserData.Count + 1;

% If over maxDataPoints points have been collected from the Arduino, switch off the
% callbacks and plot the data, starting from the second point. 
if src.UserData.Count > maxDataPoints
    configureCallback(src, "off");
    plot(src.UserData.Data(2:end));
end
end

Configure el objeto de puerto de serie para ejecutar la función readSineWaveData cuando haya nuevos datos, indicados por el terminador, disponibles para leer desde el Arduino. El siguiente comando configureCallback establece BytesAvailableFcnMode en "terminator" y la propiedad BytesAvailableFcn en un indicador para la función readSineWaveData.

maxDataPoints = 1002; 
configureCallback(serialObj, "terminator", @(src,event) readSineWaveData(src,event,maxDataPoints))

La función de callback abre la figura de MATLAB con una gráfica de los primeros 1000 puntos de datos.

figure.png