ich habe eine kleine Frage zur Kommunikation von Matlab und Arduino. Und zwar habe ich ein Programm geschrieben in der Arduino IDE mit der ich Schrittmotoren steuern kann. Jetzt möchte ich dieses Programm erweitern und benötige dafür Matlab. Im aller ersten Schritt möchte ich erstmal einfach über Matlab eine Schrittanzahl über die Serielle Schnittstelle an den Arduino senden und mein Arduino Programm soll diese Zahl dann erhalten. Ich sitze nun schon seit ein paar Tagen dran und komme da einfach nicht weiter. Ich habe also erstmal zum testen ein Arduino Programm geschrieben dass den Schrittmotor drehen soll. In einer For Schleife soll dann die von Matlab gesendete Zahl als Maximale Schrittanzahl des Motors fungieren. Aber wie es scheint kommt immer am Arduino eine 0 von Matlab an. Die Variable empfange ich ganz normal über Serial.parseint() bzw. Serial.read(). Und in Matlab sende ich die Zahl mit write(arduino,100,"int8");
Sollte doch eigentlich richtig sein oder? Hat jemand vielleicht ein ganz einfaches Programm wo er eine Zahl von Matlab an Arduino per Serieller Schnittstelle sendet? Das würde mir schon sehr weiterhelfen.
Vielen dank schonmal
Ohne Deinen Code wird das wohl nichts mit Hilfe werden können.
Wie liest Du die Zahl denn ein? Sendet MatLab ein Ende-Zeichen oder wie erkennst Du, dass die Zahl fertig ist?
Mache doch erst mal das Ganze nur auf dem Arduino und nutze als Eingabe (und Ausgabe) den Seriellen Monitor und nimm erst danach den Stepper und MatLab dazu..
Beim Microcontroller programmieren gibt es absolut kein normal!.
Schon gar nicht bei so etwas komplexem wie seriellem Datenempfang.
Manche Einstellungen werden häufiger als andere verwendet.
Was da jetzt alles nicht zusammenpassen könnte:
baudrate
Anzahl Startbits
Anzahl Stopbits
Anzahl Datenbits
ganz ohne Endekennung
mit Endekennung NL
mit Endekennung CR
mit Endekennung NL-CR
Und in Matlab sende ich die Zahl mit write(arduino,100,"int8");
Was genau wird für eine Zeichenfolge wird gesendet wenn du in Matlab
den Befehl write(arduino,100,"int8"); benutzt?
Der Befehl sieht sehr nach C++ aus. Benutzt Matlab C++?
Das alles kann man erst so richtig beurteilen wenn du mal deinen kompletten Sketch postest.
Um der Sache auf den Grund zu gehen solltest du zunächst auf dem Arduino ein Testprorämmchen laufen lassen das einfach 1 zu 1 die Zeichen die Empfangen wurden auf dem seriellen Monitor ausgibt.
Also ich würde das Ganze mit einer zweiten Seriallen Schnittstelle lösen.
So nu wirst Du vermutlich keinen Seriellen Adapter haben.
Hast Du einen zweiten Controller, den Du mit dem arduino verbinden kannst? Das würde ungemein helfen.
Und dann kommt es darauf an, wie Du die serielle Schnittstelle für MathLab vorbereitet hast.
Vor allem der Terminator...
Im Ausgangszustand sendet Mathlab ein LF nach dem Wert.
Ob die gleichzeitige Nutzung des Seriellen Monitor und Mathlab möglich und zielführend ist, vermag ich nicht zu beurteilen....
Ich würde zumindest erstmal versuchen, ob überhaupt ein Steuerzeichen erkannt wird. Ganz ohne Seriellen Monitor.
Mit dem folgendem Sketch führt jedes Steuerzeichen zum Wechsel der onBoard LED von aus nach an oder umgekehrt.
Als erstes probierst Du das mit dem Seriellen Monitor aus.
Dazu stellst Du den SerMon wie folgt ein:
gibst Du jetzt Deine 100 ein und drückst Enter - oder auf senden.
Dann muss die OnBoardLED beim ersten Mal von aus auf an umschalten.
Bei jeder neuen (auch leeren) Eingabe ändert sich der Zustand Deiner LED.
Jetzt den SerMon zumachen und Mathlab die 100 senden lassen.
Es muss das gleiche passieren, wenn Mathlab mit 9600 eingerichtet ist und auf die Frage
Da bin ich mir eben nicht sicher.
Belegt der SerMon TX auch ohne was zu senden? Dann würde nur Murx rauskommen...
Und wenn Mathlab RX (bzw. den Status) nicht vor TX abfragt, sondern wild drauf los kickt, dann könnte das was werden.
Aber dafür hab ich das ja mit der LED gemacht
Serielle SST sind kein Bus. Die werden immer in beide Richtungen bei Eröffnung belegt, egal was genutzt wird.
Kannst Du ganz einfach austesten. Öffne die Serielle auf dem PC zum Arduino mit einem Terminalprogramm, dann öffne den seriellen Monitor.
Auch wenn alle Beteiligten nichts senden bekommt der busy.
Ja kann ich machen. Aber es wäre meiner Meinung nach Aufgabe des TO die entsprechende Info zur Verfügung zu stellen.
So Paul,
ich habe gegoogelt und das hier gefunden.
Transmit Serial Data
To transmit data through a serial port or USB port on the Arduino hardware:
Add the Serial Transmit block to your model.
Connect a data source to the block input on the Serial Transmit block.
If the data type is not uint8, use a Data Type Conversion block to convert it to uint8.
In the Arduino Serial Transmit block, select a Port number.
Click the Tools menu in the model, and select Run on Target Hardware Options.
In the Configuration Parameters dialog that opens, on the Hardware Implementation > Serial port properties, set the baud rate for the serial port you selected in the Arduino Serial Transmit block.
Connect the appropriate digital transmit pin to the hardware that receives the data.
Run the model, as described in Run Model on Arduino Hardware.
If your model uses the Arduino USB port (Serial port 0) to transmit data to a device that is not your host computer, reconnect the USB cable to that device and press the RESET button.
Ich habe jetzt weder Lust selbst weiter nach evtl. besser geeigneten Links zu suchen noch mich da einzuarbeiten.
Genau deswegen sage ich ja: der TO müsste den Link oder eine Zusammenfassung wie es geht anliefern.
vgs