Wie kann ich von Arduino zu MATLAB kommunizieren?


7

Ich möchte Sensoren auf einem Arduino verwenden, um Werte in einem MATLAB- Programm zu steuern . Welche Kommunikationsmöglichkeiten habe ich?

Ich habe die Verarbeitung verwendet , um Daten zu empfangen, die über das serielle Kabel gesendet wurden, und diese Strategie hat ziemlich gut funktioniert. Kann ich mit MATLAB etwas Ähnliches tun? Ich bin etwas neu in MATLAB, daher wäre eine sanfte Anleitung großartig.

Ich bin nicht wirklich auf der Suche nach so etwas wie dem ArduinoIO- Paket - ich möchte eine separate Berechnung auf dem Arduino ausführen und gelegentlich mein MATLAB-Programm informieren (das gelegentlich die serielle Leitung abfragt , nehme ich an).


6
Benötigen Sie Hilfe beim Schreiben des Codes für das Arduino oder beim Schreiben des MATLAB-Codes zum Lesen der vom seriellen Stream eingegebenen Daten?
Apnorton

1
Diese Frage scheint nicht zum Thema zu gehören, da es um die Programmierung in Matlab geht.
Der Kerl mit dem Hut

Die serielle Schnittstelle ist die beste Wahl. Ich würde ein einfaches Nachrichtenformat definieren, das auf Ihren Bedürfnissen basiert. Wenn Sie nur einfache Dinge wie das Ein- und Ausschalten des Ventils tun: Ich würde ein Startbyte gefolgt von einer festen Anzahl von Datenbytes definieren. Wenn Sie komplizierter werden möchten, senden Sie zuerst ein Längenbyte, gefolgt von so vielen Datenbytes. Bitte denken Sie daran: Senden Sie keine seriellen Bytes ohne Unterbrechung, sondern machen Sie immer ein paar Pausen (Schlafzyklen) in den Daten, damit sich die seriellen Chips im Takt erholen können.
Portforwardpodcast

Antworten:


5

Mit dem MATLAB Support Package für Arduino (auch bekannt als ArduinoIO Package) können Sie dies ziemlich einfach tun.

Beispielnutzung:

% - Verbindung zur Karte herstellen

a = arduino('COM9')

% - Pin-Modus angeben

a.pinMode(4,'input');

a.pinMode(13,'output');

% - digitale E / A.

a.digitalRead(4) % read pin 4

a.digitalWrite(13,0) % write 0 to pin 13

% - analoge E / A.

a.analogRead(5) % read analog pin 5

a.analogWrite(9, 155) % write 155 to analog pin 9


Wenn ich ArduinoIO richtig verstehe, wird die gesamte Berechnung auf der Matlab-Seite initiiert und das Arduino wird nur zu einer Sensorerweiterung. Das will ich nicht. Ich möchte ein Programm auf dem Arduino haben (das seine eigene Berechnung durchführt), das gelegentlich mit Matlab kommuniziert.
Bill Nace

1
Die MATLAB-Seite bietet Ihnen einfach die Funktionen zur Kommunikation mit dem Arduino. Es liegt an Ihnen, wie / wann Sie möchten, dass die beiden kommunizieren. Der Arduino kann auf die serielle Schnittstelle schreiben und so können Sie daraus lesen.
Sachleen

3

Ich weiß nicht viel über MATLAB, aber ich habe einige Tutorials zum Lesen und Schreiben über die serielle Schnittstelle gefunden:

s = serial('COM1');
fopen(s)
fprintf(s, 'Your serial data goes here')
out = fscanf(s)

out ist jetzt Ihre empfangenen Daten, und Sie können damit machen, was Sie wollen.

Schließen:

fclose(s)
delete(s)
clear s

Es stammt aus dem Schreiben und Lesen von Daten ( MATLAB / Daten- und Dateiverwaltung / Geräte mit serieller Schnittstelle ).

Aus Ihrer Frage gehe ich davon aus, dass Sie die Arduino-Seite der Dinge kennen (mit Serial).


0

Ich habe eine Verbindung hergestellt und Nummern gesendet. Durch einfaches Ändern von Serial.write in Serial.print und von fread in fscanf können Sie klaren ASCII-Text anstelle von Binärdaten senden / empfangen.

Bei dieser Frage finden Sie sowohl Matlab- als auch Arduino-Code:

/programming/24368670/matlab-plot-serial-data-continously


-1

clc löscht alle globalen Werte globaler Wert1 globaler Wert5 globaler Wert6 globaler Wert7 globaler Wert8 globaler Wert8 globaler Wert9 a = arduino ('COM4'); Wert = Nullen (); Wert1 = Nullen (); val5 = Nullen (); val6 = Nullen (); val7 = Nullen (); val8 = Nullen (); val9 = Nullen (); für i = 1: 1000

val1 (i) = analogRead (a, 0) / 2; % eingehend

val2 (i) = analogRead (a, 1) / 2; %Heizung

val3 (i) = analogRead (a, 2) / 2; %Kühlkörper

val4 (i) = analogRead (a, 5) / 2; % atmsphr

val8 (i) = analogRead (a, 6) / 2; %Druck

val9 (i) = analogRead (a, 7) / 2; %Druck

val (i) = analogRead (a, 0) / 2;

Wert (i) = (val1 (i) + val4 (i) + val3 (i)) / 3;

Wert1 (i) = (Wert8 (i) - Wert9 (i)); %Druck

val5 (i) = analogRead (a, 0) / 2% eingehend

val6 (i) = analogRead (a, 4) / 2% ausgehend

val7 (i) = Wert (i) -val6 (i) Diagramm (Wert, 'r'); Titel ('Kühlkörpertemperatur');

hold on

plot(val5, 'k');

title('incoming air temprature');
plot(val6, 'g');

title('outgoing air temprature');

 plot(val4, 'k');
 title('atmospheric temperature');

plot(val7,  'c');
title('change in temprature');

pause(6)

figure
plot(value1,  'r');
title('change in pressure'); 

pause(6)

Ende


1
Wenn Sie eine Code-Antwort ohne Erklärung zu deren Funktionsweise bereitstellen, ist dies hier auf StackExchange keine gültige Antwort. Können Sie Ihren Beitrag mit einigen Informationen bearbeiten?
LoganBlades
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.