|
|
Auslesen Beschleunigungssensor via Raspberry Pi + Simulink |
|
student88 |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 24.04.2016, 11:31
Titel: Auslesen Beschleunigungssensor via Raspberry Pi + Simulink
|
|
|
|
|
Guten Morgen
Ich bin gerade dabei, den Beschleunigungssensor Bosch BMA280 in Simulink einzubinden, um die Werte weiter verarbeiten zu können. Als Schnittstelle zwischen Sensor und Simulink nutze ich einen Raspberry Pi, wofür es ja auch ein Support Package gibt (aber leider keine fertigen Simulink Blöcke für zB SPI Bus Anbindung...).
Da der Sensor via SPI Bus ausgelesen wird, habe ich ein C-Programm, unter Verwendung der BCM2835-Bibliothek, geschrieben. Funktioniert soweit einwandfrei und gibt die entsprechenden Beschleunigungswerte in der Raspberry Pi Konsole aus.
Um das ganze in Simulink zu verwerten, gibt es ja verschiedene Ansätze:
- S Function Builder
- Matlab Function Block
- Legacy Code Tool
usw...
Ich habe mich für den Matlab Function Block entschieden, da man hier zusätzlich die Sample Time in den Block Parametern einfach ändern kann (was für mich wichtig ist).
Auf Grundlage eines Tutorials:
http://www.mathworks.com/matlabcent.....ange/39354-device-drivers
habe ich mir auch einen dementsprechenden Matlab Function Block zusammen gebastelt (siehe Anhang). Für ein einfaches LED an / aus funktioniert das ganze (inklusive Einbindung der Bibliothek über den Compiler). Auch das Auslesen des SPI Bus für ein einfaches Beispiel klappt reibungslos.
Leider klappt die Einbindung meines C-codes noch nicht so ganz wie gewünscht.
Mein C-Code gibt die X, Y & Z-Beschleunigungswerte als Referenz zurück, sprich, im Matlab Function Block habe ich mir drei Variablen deklariert und übergebe diese an das C-Programm als Referenz (via coder.ceval und coder.ref). Leider bekomme ich nicht die richtigen Werte zurück. Das C-Programm läuft jedoch einwandfrei (ich habe einfach mal die Beschleunigungswerte aus dem C-Programm in der Matlab Konsole ausgeben lassen während dem Simulieren in Simulink -> funktioniert korrekt).
Ich vermute, dass es Probleme mit den Variablentypen von C und Simulink gibt. Zuerst habe ich im C-Programm mit Float-Variablen gearbeitet, welches ja dem Single-Typ in Matlab entspricht. Aber auch die Anpassung auf Double in matlab und C hat keine Besserung gebracht.
Habt ihr einen Ansatz für mich? Den Matlab Code habe ich mal im Anhang beigefügt. Die C-Funktion, welche im Matlab Programm aufgerufen wird, ist auch angehangen.
Dann hätte ich noch zwei kleine, eher nebensächliche, Fragen. Wie kann man am besten printf Anweisungen im c-Code ins Matlab Konsolenfenster portieren? (mit Konsolenfenster meine ich nicht das Eingabefenster für Befehle in matlab. Es öffnet sich beim Ausführen des Simulink Programms ein Konsolenfenster, welches Informationen über den Zustand des Programms auf dem Pi ausgibt und auch Fehlermeldungen ausgeben soll). Die im c-Code hinterlegten printf-Ausgaben werden nur im Konsolenfenster ausgegeben, sobald ich im Matlab Code selbst eine Ausgabe veranlasse (ebenfalls via printf).
Ich habe von ssprintf gelesen, welche zwischen Simulation und Ausführen auf dem Raspberry Pi unterscheiden soll. Hierfür sollte man aber simstruc.h im c-Code inkludieren und das führte bei mir zu Fehlermeldungen... Habt ihr hierfür Vorschläge?
Als letzten Punkt, der mich brennend interessieren würde, wie kann ich einen solchen Matlab Function Block debuggen? Man kann zwar im Matlab Code Haltepunkte setzen, diese werden aber schlicht von Simulink (während dem der Code auf dem Raspi ausgeführt wird) nicht beachtet... Und eine lokale Simulation auf dem PC bringt mir nichts, da ich ja an die Sensordaten gebunden bin und wissen möchte, ob Simulink die Daten richtig verarbeitet. Ich habe bis jetzt keine passende Lösung hierfür gefunden, außer c-Code extern zu debuggen (ist soweit fehlerfrei) und dann darauf zu hoffen, dass der Matlab Function Block das richtige draus macht...
Allgemein Frage ich mich, ob es vlt. bessere Ansätze gibt, als den, den ich gerade verfolge. Ich habe leider zu spät gemerkt, dass die Unterstützung für den Raspi in Simulink doch sehr eingeschränkt ist und man demzufolge auf eigene Lösungen angewiesen ist. Leider finde ich es nicht gerade Leicht, den c-Code zu implementieren und somit die Sensordaten auszulesen.
Könnte man vlt. die Daten anders nach Matlab importieren, aber trotzdem das ganze live auswerten? Spontan würde mir nur die Verwendung des UDP-Receiver Blocks einfallen. Es gibt bestimmt die Möglichkeit c-Seitig Daten via UDP zu senden und diese dann in Simulink auszuwerten. Aber das wird sicherlich aufwendiger, als den Matlab Function Block zum Laufen zu bekommen.
Danke schon mal für eure Antworten
Einen angenehmen Sonntag gewünscht
-----
Ich habe zusätzlich mal ein Beispielhaftes Simulink modell angehangen, in dem ich einfach nur eine double Variable aus dem C-Code übergeben möchte. Matlab zeigt mir aber nicht den passenden wert an. Ich habe schon probiert, die Datentypen in dem c-Programm auf die Datentypen aus der rtwtypes.h anzupassen (real_T = double), jedoch ohne Erfolg.
Beschreibung: |
Simulink Modell inklusive c-Code |
|
Download |
Dateiname: |
Uebergabe_Value Modell.zip |
Dateigröße: |
27.56 KB |
Heruntergeladen: |
518 mal |
Beschreibung: |
Programmcode C (hier noch mit Variablentyp Float -> Double hat aber auch keine besserung gebracht) |
|
Download |
Dateiname: |
snip_20160424121337.png |
Dateigröße: |
20.17 KB |
Heruntergeladen: |
520 mal |
Beschreibung: |
Code Matlab Function Block |
|
Download |
Dateiname: |
snip_20160424121207.png |
Dateigröße: |
23.89 KB |
Heruntergeladen: |
563 mal |
Beschreibung: |
Simulink Aufbau inklusive Matlab Function Block |
|
Download |
Dateiname: |
snip_20160424120116.png |
Dateigröße: |
7.65 KB |
Heruntergeladen: |
536 mal |
|
|
|
|
|
H4ti |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 13.06.2016, 17:13
Titel:
|
|
Hallo du student,
ich arbeite derzeit an einem ganz ähnlichen Problem. ich lese auch Sensordaten über SPI aus, stehe da aber noch ziemlich am Anfang und mehr wie der Ochs vorm Berg.
Ich wollte mal ganz lieb anfragen, ob du dein Code schon in Griff bekommen hast und ob du mir den netter Weise nochmal zukommen lassen könntest?
viele Grüße
H4ti
|
|
|
student88 |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 16.06.2016, 07:04
Titel:
|
|
hey ho
Den Programmcode kann ich dir leider nicht geben, aber ich kann dir sagen, woran es bei mir gescheitert ist
Das Problem lag, wie oben schon angedeutet, an den Variablentypen. Dabei konnte ich keine Variablen vom Typ Double an Matlab/Simulink übergeben, da dann nur Mist als Ergebnis herauskam. Also lese ich über das C programm die rohdaten des Sensors ein und übergebe diese an Matlab (Datentyp: signed short int im C-Programm). Diese wandle ich dann in Matlab in den entsprechenden Sensorwert um (das habe ich vorher quasi im C-Programm gemacht, dabei ist die Übergabe an Matlab/Simulink gescheitert).
Das ist die Variable, die die rohdaten in Simulink erhält.
So sieht dann die Umwandlung zum Sensorwert bei mir aus
Viele Grüße
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2024
goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
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.
|
|