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.