folgendes habe ich vor:
In mein Simulink Modell möchte ich einen realen Ultraschallsensor einbinden. Dafür möchte ich mein Ardunio nutzen. Ich habe mir einen SRF08 Ultraschallsensor gekauft, den ich mit einer Arduino Library auslesen kann (http://arduino.cc/playground/Main/SonarSrf08).
Jetzt komme ich aber nicht weiter. Folgende Fragen habe ich:
1. Wie kommen die Daten von der Ardunio Software zu Matlab/Simulink?
2. Ich habe Simulink Coder noch nicht benutzt, wie kann ich nun ein Echtzeitfähiges Modell erstellen?
Ziel soll es sein, via Scope die Entfernungen aus dem Ultraschallsensor in Echtzeit anzeigen zu lassen.
All deine genanten Webseiten kenne ich. Leider ist die Matlab Library dazu da, um direkt die PINs vom Arduino auzulesen. Ich habe aber mein Arduino Code schon, denke nicht, dass ich dazu in der Lage bin, das in Simulink zu erstellen.
Die Seite von arduni, da geht es um Matlab, ich will Simulink.
Ich habe bereits angefangen mir die Hilfe vom Simulink Coder durchzulesen, aber ist halt noch vieles Spanisch für mich, hatte naiverweise auf knappe Hilfe gehofft, aber das Thema ist wohl nix für knappe Sachen
Aber bei der Seite über die Simulink Anbindung hast du doch unter "Support Package" Links um die Simulink Librarys für die Uno oder Mega Variante zu installieren.
Damit müsste das doch gehen? Da sind doch direkt Simulink Blöcke abgebildet?!
Oder ich verstehe dein Problem leider nicht.
Das mit der Hilfe ist so eine Sache, ich könnte dich genauso fragen was du erwartet hast? Auf so allgemeine Fragen, kann man nur allgemein antworten.
Man könnte zwar hier lange diskutieren und denjenigen an die Hand nehmen, aber soviel zeit und Lust hat keiner. Ausserdem würde man nichts weiter vermitteln und vermitteln können was nicht im Getting started steht.
Leichter ist es, wenn du mit einem konkreten Problem um Hilfe bittest. Dabei solltest du beachten alle wichtigen Infos zu liefern. Dazu gehören unter anderem:
- Relevanter Codeabschnitt
- Fehlermeldungen falls vorhanden komplett posten
- Soll und Ist Verhalten klar stellen
- ggf. ein Beispiel.
- was dir noch so einfällt was helfen könnte dein Problem zu lösen.
_________________
Das Problem mit der Kopplung Arduino - Simulink gehe ich später an.
Erstmal möchte ich es hinbekommen, dass ich eine Echtzeitsimulation durchführe an einem völlig simplem Beispiel:
Ich will eine Konstante zu einem Scope schicken. Diese möchte ich, während die Simulation läuft, ändern, so dass ich auf dem Scope dann auch die Änderung sehe.
Dazu habe ich das einfach Modell gebaut.
Dann gehe ich auf Tools - Code Generation - Options.
Erst setze ich beim Solver folgende Einstellungen:
- Fixed Step
- Ode5
- Stopzeit 1000.0
Dann die bei Code Generation: Siehe Bild Anhang 1
Dann "Build".
Wenn ich jetzt die Simulation starte, dann rechnet er kurz durch.
Matlab zeigt mir auch folgende Warning:
Code:
"Warning: Unable to determine a fixed stepsize based on the sample
times in the model 'fff', because the model does not have any discrete
sample times. Picking a fixed stepsize of (20.0) based on simulation
start and stop times. You can disable this diagnostic by explicitly
specifying a fixed stepsize in the Solver pane of the Configuration
Parameters dialogbox, or setting the 'Automatic solver parameter
selection' diagnostic to 'none' in the Solver group on the Diagnostics
pane of the Configuration Parameters dialogbox. "
Ich habe einfach mal die Simulationszeit hochgeschraubt und kann nun die Konstante beliebig ändern. Man bin ich doof, dazu brauch ich gar kein RTW (bzw. neu Simulink Coder).
hm jetzt muss ich nur noch hinbekommen die Daten vom Arduino ins Modell zu bekommen.
Zu deiner Frage warum es mit dem Plugin nicht geht:
Ich habe bereits einen kompletten Code für den Ultraschallsensor. Dieser wurde mir fürs Arduino bereitgestellt (inkl. Bibliothek).
Simulink bietet mir die Möglichkeit die PINs auszulesen und damit zu arbeiten, genauso wie in der Arduino Programmieroberfläche. ABER: ich müsste mir das auslesen des Sensors dort komplett neu erstellen, dafür fehlt mir die Expertise. Klar wäre es mir lieber in Simulink alles zu haben, aber ich glaube einfacher ist es, wenn ich die Daten einfach an Simulink sende.
Bevor ich deine Möglichkeiten validiere, habe ich glaube ich eine einfachere Variante, die ich testen möchte. ich lese die Daten des Ultraschallsensors aus und gebe sie an einen COM Port weiter. Kann ich diesen in Simulink auslesen? Wenn ja wie? Ich habe in der Library nach einem COM Baustein gesucht, aber leider nix gefunden, ebenso in den Einstellungen.
Ich glaube dieser Weg ist einfacher, wenn ich nur wüsste wie
hmm... das habe ich noch nicht probiert... aber in der "Instrument Control Toolbox" sind Blöcke dafür drin. Falls du diese Toolbox nicht hast, wirst du um eine S-Function nicht rum kommen denke ich.
vielen Dank! Das hat mir sehr geholfen. Dort habe ich tatsächlich eine Serial Input Box. Allerdings bekomme ich keine Werte ausgelesen. In Arduino habe ich folgenden Code:
Code:
/*
* SRF08.ino - example interfacing with sonar sensor SRF08
* library uses Wire.h
* SDA - Analog Pin 4
* SCL - Analog Pin 5
*
* Authors:
* - Zach Foresta - Foureza87@yahoo.com(April 2009)
* - Leo Colomb - @LeoColomb (May 2012)
*
* For component setup - http://www.arduino.cc/playground/Main/SonarSrf08
*/
#include <Wire.h>
#include <SonarSRF08.h>
SonarSRF08 MySonar;
#define CommandRegister 0x00
int New_Address = 248; // 0xF8
#define ResultRegister 0x02
#define GainRegister 0x00 // Setup Analogue Gain -- http://www.robot-electronics.co.uk/htm/srf08tech.html section "Analogue Gain"
#define RangeLocation 0xFF // Setup Range Location -- http://www.robot-electronics.co.uk/htm/srf08tech.html section "Changing the Range"
int DEBUG = 1;
char unit = 'c'; // 'i' for inches, 'c' for centimeters, 'm' for micro-seconds
float sensorReading = 0;
int time = 70;
void setup() {
MySonar.connect();
MySonar.changeAddress(CommandRegister, New_Address, GainRegister, RangeLocation);
if(DEBUG){
Serial.begin(9600);
}
New_Address += 4;
// offset address not sure why this is but it works for this address
}
void loop() {
// set units, gain, and range location for reading out distance
MySonar.setUnit(CommandRegister, New_Address, unit, GainRegister, RangeLocation);
// pause
delay(time);
// set register for reading
MySonar.setRegister(New_Address, ResultRegister);
// read data from result register
sensorReading = MySonar.readData(New_Address, 2);
// print out distance
// Serial.print("Abstand: ");
Serial.print(sensorReading);
// Serial.print(" cm");
Serial.println();
// pause
delay(time);
}
Anbei noch mein Simulink Modell und die Einstellungen der Boxen. Leider ergibt das Scope immer nur 0. Wenn ich in Arduino auslese bekomme ich die Werte im Serial Monitor angezeigt (xxx.xx). Wenn meine Simulink Simulation läuft, kann ich auch im Arduino nicht den COM Port auslesen, da er besetzt ist, was ja ein gutes Zeichen ist. Ich vermute, dass nur meine Einstellungen in Simulink falsch sind.
Ich bekomme nun Werte ausgelesen. Allerdings scheinbar Zahl für Zahl hintereinander. im Angehängten Screenshot sieht man die Werte.
Jeder "Hügel" sind die Daten, bestehend aus 6 Werten. Also innerhalb von 5 Sekunden wurde 6 mal die Zahl 178.00 übertragen.
Wie kann ich aus diesen Daten nun die Zahl 178,00 generieren?
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.