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
10/17/17 4:43 PM as a reply to Maximilian Michl.

Hallo Maximallian,

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)