SendAccelerometerDataOverBle
Answer
10/11/17 7:09 AM

Guten Tag zusammen,

ich habe mich bereits in das Datenblatt des BMA280 eingelesen und versucht die Rohdaten mit Hilfe von Seite 31, 110 auszulesen. Hierbei kommen eher schlechtere Ergebnisse raus da diese durch die Bewegung des Sensors stark eingeschränkt sind (cos) oder mach ich was falsch. Meine Frage:

 

Wie bekomme ich die Lage und die jeweiligen Beschleunigungen der Achsen raus? Ich habe bereits die Words aufgesplittet und vermute das das erste Byte die Lage des Sensors und das zweite Byte die Beschleunigung ist. Ist dies korrekt? (Der XDK ist über einen DATAEAGLE mit einer SPS verbunden).

 

Vielen Dank für eure Hilfe

 

Maximilian Michl

0 (0 Votes)
RE: SendAccelerometerDataOverBle
Answer
10/17/17 3:23 PM as a reply to Maximilian Michl.

Hallo Maximilian,

ich würde dich bitten, etwas näher ins Detail zu gehen, auf welche Rohdaten du dich beziehst. Der Sensor BMA280 steht nur intern zur Verfügung und die Daten der Sensoren (Accelerometer / Temperatur) können daher nur software-seitig ausgelesen werden.

Generell kannst du die jeweiligen Beschleunigungsachsen direkt über die eine high-level Sensor API auslesen. (siehe Sensor Guide S.13 )

Nachdem die Daten software-seitig ausgelesen wurden, können diese über das Extension-Board über SPI/UART/I2C/BLE/WiFi übertragen werden.

Deshalb würde ich dich bitten, folgende Fragen zu beantworten:

  • Auf welches Datenblatt beziehst du dich? Könntest du mir einen Link zu dem Datenblatt geben?
  • Was genau meinst du mit “Lage der Achsen”? Meinst du damit die Ausrichtung des XDK?
  • Wie ist der DATAEAGLE Bus mit dem XDK verbunden?
Mit freundlichen Grüßen,
Franjo

 

--------------------------- ENGLISH ---------------------------

Dear XDK Commmunity,

Maximilian wrote that he attemps to read raw accelerometer data, using a BMA280 datasheet. Specifically, he asks how to get the respective positions and accelerations of each axis. His XDK is connected to a PLC via a DATAEAGLE Since raw data from sensor cannot be read, other than what the software of the XDK offers (via the Accelerometer API), I advised him to take a look at the Sensor Guide at the learning section. Additionally, I have asked him the following questions:

  • Which datasheet he uses, and if he can provide a link
  • What exactly he means by “position of axes”
  • In what way the DATAEAGLE is connected to the XDK
Kind regards,
Franjo

 

0 (0 Votes)
RE: SendAccelerometerDataOverBle
Answer
10/13/17 5:38 AM as a reply to Franjo Stjepandic.

Hallo Franjo,

 

ich beziehe mich auf das Datenblatt vom Sensor BMA280 (Link: http://www.mouser.com/ds/2/783/BST-BMA280-DS000-11_published-786496.pdf).

 

Genau. Ich versuche die Lage des Sensor im Raum und die jeweilige Beschleunigung der einzelnen Achsen auszulesen. Die Rohdaten müssen ja konvertiert werden (damit man sich was darunter vorstellen kann). Sehe ich das richtig?

 

Der DATAEAGLE ist über Profinet mit der SPS verbunden und kommuniziert über Bluetooth mit dem Sensor. Wenn man das Programm (SendAccelerometerDataOverBle) starte werden die jeweiligen Achsrohdaten auf der Console ausgegeben. Die selben Daten bekomme ich auch in der SPS angezeigt nur in 2 Byte (Word) aufgesplittet. Fügt man diese zwei Byte wieder zusammen kommt das selbe Ergebniss wie auf der Console raus --> somit korrekt übertragen.

 

Vielen Dank für deine Hilfe

 

Max

0 (0 Votes)
RE: SendAccelerometerDataOverBle
Answer
10/17/17 3:24 PM as a reply to Maximilian Michl.

Hallo Maximilian,

Vielen Dank für deine Antwort. Jetzt verstehe ich den Kontext. Tatsächlich werden im SendAccelerometerDataOverBle Beispiel die Rohdaten verschickt. Ich hatte missverstanden, dass du die Daten des Sensors auf Register-Ebene auslesen wolltest.

Es ist möglich, statt der Rohdaten, bereits konvertierte Daten über die Accelerometer-API auszulesen. Dafür müssten Sie in der source-file SendAccelerometerDataOverBle.c in der Funktion BleAccelDataTransmit() den Funktionsaufruf

advancedApiRetValue = Accelerometer_readXyzLsbValue(xdkAccelerometers_BMA280_Handle, &getaccelData);

durch

advancedApiRetValue = Accelerometer_readXyzGValue(xdkAccelerometers_BMA280_Handle, &getaccelData);

ersetzen. Im unveränderten Projekt ist dies Zeile 329. Die Sensor-Daten werden dann in mG angezeigt. Das bedeutet: Liegt das XDK auf dem Tisch, wobei die Unterseite Richtung Erde zeigt, dann sollte die Z-Achse den Wert 1000 mG anzeigen (1g).

Falls es nötig ist, explizit die Rohdaten zu versenden, habe ich hier die Konvertierungs-Formel, die in Accelerometer_readXyzGValue() verwendet wird, für Sie:

bmaConvertionData = (int32_t) (bmaAccelData.x * ACCEL_CONV_G_MG * bmaRangeValue);
            readDataAccel.x = (bmaConvertionData / BMA2X2_ONEBITRESOLUTION);

bmaAccelData.x sind die Rohdaten, beispielsweise für x. ACCEL_CONV_G_MG hat den Wert 1000 (um G in mG zu konvertieren) und bmaRangeValue enthält den Wert der Range. Standardmäßig, falls nicht anders über Accelerometer_setRange() eingestellt, hat die Range den Wert 2. BMA2X2_ONEBITRESOLUTION hat den Wert 8192.

Was die Lage angeht, hat der Beschleunigungssensor des BMA280 in dem Sinne keine Daten für die Lage des XDK. Man kann lediglich inferieren, welche Achse gerade direkt zur Erde zeigt (bzw. direkt von der Erde weg), wenn eine Achse den Wert +-1000 hat.

Um die Orientierung des XDK auszulesen, könnte Ihnen das Orientation Sensor Feature behilflich sein. Eine Beschreibung dazu finden Sie im Sensor Guide, der hier zur Verfügung steht und zusätzlich in der API-Übersicht hier.

Ich hoffe das hilft dir weiter, falls du noch weitere Fragen hast, zögere nicht diese zu stellen.

Mit freundlichen Grüßen,
Franjo

 

----------English----------

 

Dear XDK Community

Maximilian clarified which data sheet he used, which is this one here .

He uses the SendAccelerometerDataOverBle example, and sends them succesfully to his PLC via the DATAEAGLE. The DATAEAGLE, of course, communicates via BLE with the XDK. Now he wants to know how to convert the raw data to readable values.

First, I recommended him to change the reading function call from
advancedApiRetValue = Accelerometer_readXyzLsbValue(xdkAccelerometers_BMA280_Handle, &getaccelData);

to

advancedApiRetValue = Accelerometer_readXyzGValue(xdkAccelerometers_BMA280_Handle, &getaccelData);

This is line 329 in the unchanged example project. This function call will read converted data, instead of raw data.

Just in case he actually requires the raw data, I have explained the conversion formula to him, which is also used in Accelerometer_readXyzGValue()

bmaConvertionData = (int32_t) (bmaAccelData.x * ACCEL_CONV_G_MG * bmaRangeValue);
            readDataAccel.x = (bmaConvertionData / BMA2X2_ONEBITRESOLUTION);

bmaAccelData.x is the raw data, ACCEL_CONV_G_MG contains the value 1000 (to convert G to mG) and bmaRangeValue contains the value that is set for range. By default, if not changed by using the function Accelerometer_setRange() the range will be 2. BMA2X2_ONEBITRESOLUTION has the value 8192.

Since he also wants the orientation of the three axes, I clarified that the BMA280 does not have data for orientation. It is only possible to infer the orientation if one of the axes is pointing directly to or from the earth. This axis will have a value of +- 1000 accordingly, which is one G.

For getting the orientation data, I recommended the Orientation Sensor feature to him. Information on that is available in the guide section and here.

Kind regards,
Franjo

0 (0 Votes)
RE: SendAccelerometerDataOverBle
Answer
10/17/17 1:20 PM as a reply to Franjo Stjepandic.

Hallo Franjo,

 

vielen Dank für schnelle und ausführliche Hilfe. Es hat alles wunderbar funktioniert.

 

Ich hätte noch eine weitere Frage zu diesem Programm.

 

Ich würde gerne die Latenzzeit zwischen dem Sensor und einer SPS auslesen. Dazu bräuchte ich ein Signal, dass gesendet wird sobald die Daten über BLE verschickt wurden. Meine Vorstellung wäre einen Pin des 26-poligen oder des JTAG-Steckers zu schalten und diesen dann mit einem Eingang (Analog) der SPS zu verdrahten. Somit kann ich die zwei Signale vergleichen und die Latenzeit berechnen. Die BLE Daten werden über einen DATAEAGLE 2730 empfangen und mit Profinet in die SPS geladen.

 

Meine Frage nun:

 

Besteht diese Möglichkeit? Oder gibt es eine einfachere Lösung für das Problem?

 

Mit freundlichen Grüßen

 

Max 

0 (0 Votes)
RE: SendAccelerometerDataOverBle
Answer
11/23/17 11:59 AM as a reply to Maximilian Michl.

Hallo Maximilian,

das manuelle Verdrahten ist über den Extensionbus möglich.

Dazu kannst du jeweils einen der beiden GPIO Pins (PA1 oder PE2)  mit der SPS verbinden und so konfigurieren, dass dieser nach jeder Bluetooth Übertragung zwischen High und Low Pegel wechselt. Bedenke hierbei, dass das XDK nur einen Spannungspegel von maximal  2.5V liefern kann. Sofern dieser Spannungspegel zu klein für die SPS ist, muss ggf. eine Verstärkerschaltung zwischen XDK und SPS geschaltet werden.

Ein Codebeispiel für die Programmierung des Pins findest du im General Information Guide auf Seite 47. Im Beispiel wird eine LED mit dem GPIO Pin PA1 getaktet. Alternativ kann das Beispiel aber auch so modifiziert werden, dass der GPIO Pin PE2 verwendet wird.

Ich hoffe das hilft dir weiter, falls du noch weitere Fragen hast, zögere nicht diese zu stellen.

Mit freundlichen Grüßen,
Franjo
 

----------English----------


Dear XDK community,

Maximillian was able to convert the raw acceleration data to readable values. Now he would like to measure the delay time between the PLC and the XDK. To do that he wants to wire an input analog channel of the PLC with a pin of the XDK to read an input signal from the XDK, every time a Bluetooth message is sent from the XDK to the PLC containing the acceleration data.

As such, he asked, if this option would be available.

I told him, that this can be achieved by wiring one of the GPIO pins (PA1 and PE2) to the PLC.
Additionally, I noticed that he should keep in mind that the GPIO pins can only provide 2.5V as output voltage and that he would need to insert an additional amplifier within the XDK and the PLC if the PLC need higher input voltages then 2.5V.

Furthermore, I recommended the extension bus example on page 47 of the general information guide as starting point, which uses the GPIO pin PA1 to toggle an external LED on the extension bus.
I told him that the example could be modified, to use the GPIO pin PE2 instead of the GPIO pin PA1.

Kind regards,
Franjo

0 (0 Votes)
RE: SendAccelerometerDataOverBle
Answer
11/21/17 9:53 AM as a reply to Franjo Stjepandic.

Hallo Franjo,

 

danke für die Info. Ich hätte ein paar Fragen bezüglich des Codes und zur Programmierung.

 

1) void appInitSystem()

Muss ich die Funktion im Programm (SendAccelerometerDataOverBle.c) wie im Codebeispiel anpassen und wenn ja warum?

2) void extensionLedTask()

Wie binde ich am besten die Funktion ein, damit ich einen genauen Wechsel am Pin bei jeder Bluetooth Übertragung bekomme. Sozusagen eine Art Startsignal. Ich vermute dass ich die Funktion in static void bleAccelDataTransmit(void *pvParameters) einbinden muss.

Sobald die Übertragung stattfindet muss ein Wechsel zwischen High und Low am Analogausgang stattfinden damit ich die Latenzzeit der Übertragung herrausrechnen kann.

 

Vielen Dank für deine Bemühungen

Max

 

0 (0 Votes)
RE: SendAccelerometerDataOverBle
Answer
11/23/17 11:58 AM as a reply to Maximilian Michl.

Hello Maximillian,

Generell muss die Funktion appInitSystem() um die Initialisierung des GPIO pins erweitert werden. Dazu müsste in deinem Fall die Funktion um den folgenden Codeausschnitt erweitert werden.

GPIOA.Port = gpioPortA;
GPIOA.Pin = 1;
GPIOA.Mode = gpioModePushPull;
GPIOA.InitialState = MCU_GPIO_PIN_STATE_HIGH;


Wobei hier der Initialwert für den Pin variieren kann zwischen High-Pegel (MCU_GPIO_PIN_STATE_HIGH) und Low-Pegel (MCU_GPIO_PIN_STATE_LOW).

Der Wechsel des Signalpegels, sollte wie du schon angemerkt hast in der Funktion bleAccelDataTransmit() stattfinden. Hierbei müsste nur der Aufruf MCU_GPIO_WritePin(&GPIOA, MCU_GPIO_PIN_STATE_HIGH); eingebunden werden, welcher den Signalpegel auf High setzt. Gleichzeitg sollte in der Funktion BleAccelDataSentCallback() der Signalpegel durch den Funktionsaufruf MCU_GPIO_WritePin(&GPIOA, MCU_GPIO_PIN_STATE_LOW); wieder auf Low-Pegel umgeschaltet wird.

Bitte bedenke, dass die Variable MCU_GPIO_Handle_T GPIOA; als globale Variable angelegt werden muss um in den drei genannten Funktionen verwendet werden zu können.

Ich hoffe das hilft dir weiter, falls du noch weitere Fragen hast, zögere nicht diese zu stellen.

Mit freundlichen Grüßen,
Franjo

----------English----------

Dear XDK community,

Maximillian asked further questions about extending the SendAccelerometerDataOverBle with a serial signal GPIO pin to measure the delay time between the PLC and the XDK. In detail, he wanted to know how to extend the example to change the signal on the GPIO pin.

I told him, that he would need to add the following code into appInitSystem():

GPIOA.Port = gpioPortA;
GPIOA.Pin = 1;
GPIOA.Mode = gpioModePushPull;
GPIOA.InitialState = MCU_GPIO_PIN_STATE_HIGH;


Additionally, I told him that it depends that the voltage state of the pin can be either high or low, depending on the configuration of GPIOA.InitialState.

Thus, I told him that he would need to add the function call MCU_GPIO_WritePin(&GPIOA, MCU_GPIO_PIN_STATE_HIGH); into the function MCU_GPIO_WritePin(&GPIOA, MCU_GPIO_PIN_STATE_HIGH); to change the state of the GPIO pin to high, when a BLE message is sent.

On the opposite, he would have to add the call of MCU_GPIO_WritePin(&GPIOA, MCU_GPIO_PIN_STATE_LOW); into BleAccelDataSentCallback() to reset the state of the GPIO pin.

Finally, I told him to set the line MCU_GPIO_Handle_T GPIOA; as a global variable to make it usable in the three mentioned functions.

Kind regards,
Franjo

0 (0 Votes)
RE: SendAccelerometerDataOverBle
Answer
11/23/17 10:35 AM as a reply to Franjo Stjepandic.

Hallo Franjo,

danke für deine schnelle und hilfreiche Antwort. Ich hätte noch eine Frage bezüglich der Einbindung der zwei Header-Files

#include "BCDS_MCU_GPIO.h"

#include "BCDS_MCU_GPIO_Handle.h"

und der Globalen Variable

MCU_GPIO_Handle_T GPIOA

Die Variable kann ich warscheinlich nur erstellen wenn die zwei Header eingebunden sind. Somit stellt sich mir die Frage wo bekomme ich die zwei Header her, da beim build ein Fehler (unresolved inclusion) auftritt? Ich hab auch schon mal in der API nachgesehen aber leider nichts gefunden. Gibt es da Programm intern eine Bibliothek wo man libraries manuell in das Projekt hinzufügen kann?

Mit freundlichen Grüßen

Max

0 (0 Votes)
RE: SendAccelerometerDataOverBle
Answer
11/23/17 6:40 PM as a reply to Maximilian Michl.

Hallo Maximilian,

falls du NICHT die XDK-Workbench Version 3.0 oder 3.1 verwendest, kann die Header-File nicht eingebunden werden, da sie vor 3.0 nicht in dieser Form im SDK verfügbar ist.

Falls du 3.0 verwendest, dann sollte es normalerweise genügen die zwei Headerfiles einzubinden, sofern dein Build endet ohne einen Fehler in der Konsole der XDK-Workbench zu werfen. Der Fehler mit den unresolved Variablen und Interfaces tritt dann auf, wenn das Indexing System der XDK-Workbench nicht in der Lage ist diese zu finden. Dies ist nicht direkt zusammengehörig mit dem Compiler, da dieser, wie ich vermute, keine Fehler wirft.

Daher solltest du das so belassen wie es ist, sofern der Build ohne Fehler in der Konsole durchläuft.

Um das Problem generell zu beheben, rechtsklicke das Projekt und scroll runter bis zu index und drücke re-build.
Das erlaubt dem Indexing System der XDK-Workbench nochmal zu indexieren und die Variablen und Interfaces, welche mit unresolved markiert wurden zu finden.

Ich hoffe das hilft dir weiter, falls du noch weitere Fragen hast, zögere nicht diese zu stellen.

Mit freundlichen Grüßen,
Franjo

 

-------------- English ----------------

 

Dear XDK community,

Maximilian faces the issue that the interfaces "BCDS_MCU_GPIO.h" and "BCDS_MCU_GPIO_Handle.h" are marked as unresolved. Now he is asking were he can get the headers to insert the global variable MCU_GPIO_Handle_T GPIOA;.

First I informed him that these header-files are not available in Workbench versions below 3.0.

If he does indeed develop his project in the latest Workbench version, I explained to him that this is an issue with the indexing system of the XDK-Workbench and that the application should be able to successfully run when the build finishes without throwing any errors in the XDK-Workbench's console. Furthermore, I recommended right-clicking the project, browse down to index and select rebuild to get rid of the unresolved errors.

Kind regards,
Franjo

0 (0 Votes)
RE: SendAccelerometerDataOverBle
Answer
11/24/17 8:00 AM as a reply to Franjo Stjepandic.

Hallo Franjo,

danke für die Antwort.

BleAccelDataSentCallback() kann ich leider nicht finden?! Die Funktion wird in "SendAccelDataOverUdpAndBle" gefunden. Kann es sein dass die Funktion callbackIsr gemeint ist?

 

Nach dem Build kommen aktuell folgende Fehlermeldungen: siehe Anhang

Vielen Dank für deine Hilfe.

 

Max

0 (0 Votes)
RE: SendAccelerometerDataOverBle
Answer
12/7/17 10:00 AM as a reply to Maximilian Michl.

Hallo Maximilian,

Um das Compilation Problem zu lösen musst du lediglich den include für PTD_portDriver_ih.h entfernen. Hier handelt es sich um ein veraltetes Interface, das nicht mehr im aktuellen SDK vorhanden ist.

Es sieht so aus als würdest du auf einem Projekt arbeiten, dass du in einer alten Workbench Version angefangen hast. Die Funktion BleAccelDataSentCallback() ist im Example in der neuesten Workbench vorhanden.

Ich würde empfehlen, ein neues Projekt aus dem aktuellen SendAccelerometerDataOverBle Example aus der neuen Workbench zu erstellen und deine Code-Änderungen aus dem alten Projekt zu übernehmen. Es gibt schließlich seit Workbench 3.0 eine neue Version der BLE API, die auch in den aktuellen Examples verwendet wird. Diese ist vor allem auch einfacher handzuhaben.

Ansonsten sollte es, falls meine Annahme korrekt ist, in deinem Projekt die Funktion bleAlpwDataExchangeService() geben. Füge in dieser Funktion den folgenden Code ein:

if(BLEALPWDATAEXCHANGE_EVENT_TXCOMPLETE == event) {
  PTD_pinOutClear(PTD_PORT_EXTENSION_GPIO_IN_OUT_0,PTD_PIN_EXTENSION_GPIO_IN_OUT_0);
}

an statt wie vorher vorgeschlagen in BleAccelDataSentCallback()

Ich hoffe das hilft dir weiter, falls du noch weitere Fragen hast, zögere nicht diese zu stellen.

Mit freundlichen Grüßen,
Franjo

-------------- English ----------------

 

Dear XDK Community,

Maximlian has two issues, the first being the compilation error, which should be solved by removing the include for PTD_portDriver_ih.h, since that is a deprecated header-file.

The second is the fact that he cannot find the previously mentioned function BleAccelDataSentCallback()

My assumption is, that he uses an old version of the SendAccelerometerDataOverBle example, which is why I recommended to migrate his code changes to the newest version of that example.

If he does not wish to do so, and if my assumption was correct, I advised him to add the following code to the function bleAlpwDataExchangeService():

if(BLEALPWDATAEXCHANGE_EVENT_TXCOMPLETE == event) {
  PTD_pinOutClear(PTD_PORT_EXTENSION_GPIO_IN_OUT_0,PTD_PIN_EXTENSION_GPIO_IN_OUT_0);
}


Kind regards,
Franjo

0 (0 Votes)
RE: SendAccelerometerDataOverBle
Answer
11/28/17 9:09 AM as a reply to Franjo Stjepandic.

Hallo Franjo,

vielen Dank für deine schnelle und hilfreiche Antwort. Ich habe den include aus der SendAccelerometerDataOverBle.c rausgelöscht, jedoch hat sich nichts geändert. Somit gleiche Fehlermeldung. Ich hab dann noch versucht in der GpioConfig.c den include zu löschen was jedoch die Fehler erhöhte.

 

Ich kann leider nicht die aktueller Version des Projektes nutzen, da die neuere nicht mit dem Funksystem kompatibel ist.

 

Mit freundlichen Grüßen

Max

0 (0 Votes)
RE: SendAccelerometerDataOverBle
Answer
11/28/17 4:03 PM as a reply to Maximilian Michl.

Hallo Maximilian,

ich denke es wäre das beste, wenn ich selbst einen Blick auf das Projekt werfe. Könntest du dafür deine E-Mail in diesem Thread posten, damit ich dich persönlich kontaktieren kann? Könntest du mir zudem sagen, mit welcher Version der Workbench du arbeitest?

Mit freundlichen Grüßen,
Franjo
 

-------------- English ----------------


Dear XDK Community,

as Maximilian's project has more errors now, I requested that he sents me his project, so I can directly take a look at it. Additionally, I asked which Workbench version he uses.

Kind regards,
Franjo

0 (0 Votes)
RE: SendAccelerometerDataOverBle
Answer
11/29/17 7:49 AM as a reply to Franjo Stjepandic.

Hallo Franjo,

 

super vielen Dank.

Email: michlmxi@schaeffler.com

Ich benutze aktuelleste Version (3.1.0) der Workbench zwecks der Bibiliotek für das XDK Gateway.

Mit freundlichen Grüßen

Max

0 (0 Votes)
RE: SendAccelerometerDataOverBle
Answer
11/29/17 5:20 PM as a reply to Maximilian Michl.

Hallo Maximilian,

ich habe dich über deine Mail kontaktiert.

Mit freundlichen Grüßen,
Franjo

--------------------------- ENGLISH ---------------------------

Dear XDK community,

I have contacted Maximilian directly and will report back the results here.

Kind regards,
Franjo

0 (0 Votes)