BWP-WS19-02/Dokumentation/SensorenKartierung: Unterschied zwischen den Versionen

Aus Verteilte Systeme - Wiki
Zur Navigation springen Zur Suche springen
(Die Seite wurde geleert.)
Markierung: Geleert
 
(15 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
=Teamstruktur=
 
Phase 1:
 
* Jan (Manager)
 
* Jonas (Tester)
 
* Mario (Dokumentation)
 
 
Phase 2:
 
* Jan (Tester)
 
* Jonas (Dokumentation)
 
* Mario (Manager)
 
 
Phase 3:
 
* Jan (Dokumentation)
 
* Jonas (Manager)
 
* Mario (Tester)
 
 
=Arbeitspakete=
 
Die Arbeitspakete des Teams werden als [https://zenon.cs.hs-rm.de/wahlprojekt_explorativer_roboter/bwp_ws19/issues GitLab Issues] unter dem Tag Sensor gepflegt.
 
 
=Sensoren & Kartierung=
 
 
==Adafruit BNO055 Absolute Orientation Sensor==
 
 
Der [https://cdn-shop.adafruit.com/datasheets/BST_BNO055_DS000_12.pdf BNO055-Sensor] beinhaltet drei Accelerometer, drei Gyroscope und drei Magnetometer (jeweils X-, Y- und Z-Achse). Außerdem steht ein ARM-Cortex-M0 zur Verfügung, welcher mittels Sensor Fusion direkt auswertbare Daten liefert.
 
 
Folgende Daten stehen als Output zur Verfügung:
 
* '''Absolute Orientation (Euler Vector, 100Hz)'''
 
: Three axis orientation data based on a 360° sphere
 
* '''Absolute Orientation (Quaterion, 100Hz)'''
 
: Four point quaternion output for more accurate data manipulation Angular
 
* '''Velocity Vector (100Hz)'''
 
: Three axis of 'rotation speed' in rad/s
 
* '''Acceleration Vector (100Hz)'''
 
: Three axis of acceleration (gravity + linear motion) in m/s^2
 
* '''Magnetic Field Strength Vector (20Hz)'''
 
: Three axis of magnetic field sensing in micro Tesla (uT)
 
* '''Linear Acceleration Vector (100Hz)'''
 
: Three axis of linear acceleration data (acceleration minus gravity) in m/s^2
 
* '''Gravity Vector (100Hz)'''
 
: Three axis of gravitational acceleration (minus any movement) in m/s^2
 
* '''Temperature (1Hz)'''
 
: Ambient temperature in degrees celsius
 
 
Nachfolgendes Bild zeigt einen Testaufbau mit BNO055 und einem nRF52 Feather auf einem Steckbrett. Das nRF52 Feather kommuniziert über I2C mit dem BNO055.
 
 
[[Datei:BNO055.jpg|Testaufbau mit BNO055 und einem nRF52 Feather auf einem Steckbrett|300px]]
 
 
Um den Sensor für das Projekt zu benutzen, musste ein eigener Treiber entwickelt werden. Dieser basiert im wesentlichen darauf, dass über I2C-Aufrufe von Zephyr in bestimmte Register des Sensor geschrieben bzw. von ihnen gelesen wird. Anhand des Datenblatts wurde bestimmt welche Register zu welchem Zweck dienen. Daraus ergab sich eine API, welche zum jetzigen Zeitpunkt alle benötigten Funktionen des Sensors abbildet, jedoch nicht den selben Umfang wie die Bibliothek von Adafruit aufweist.
 
 
==Positionbestimmung mit einer optischen Maus==
 
 
For the determination of the X-Y position we used a PS/2 optical mouse.Thanks the "Computer Mouse Project" from [https://homofaciens.de/technics-base-circuits-computer-mouse_en.htm hofaciens.de].We were able to read the X-Y positions of the mouse using an Arduino UNO:
 
<br/>
 
[[Datei:mouse_uno.png|mouse-uno-conections|300px]]
 
<br/> <br/>
 
===Basic overview of the PS/2 protocol of a mouse===
 
The PS2 mouse uses a bidirectional synchronous serial communication. Where both lines(Data and Clock) are open collector. If nothing is done they are in “idle” state/high impedance(two external or internal pull up resistors pull the lines to high state). <br/>The Clock signal is always generated by the Mouse device. In order to get Clock signals, the Host(Micro-controller) need to put the bus lines in “request to send” mode: Put the Clock bus to low, wait at least 100us, put the Data bus low and release the Clock. Now commands can be sent to the mouse.<br/>
 
 
There is a ''command set'' that may be sent to the mouse or that the mouse may sent to the Host. For example, for this implementation the following commands were used:<br/>
 
Reset Mode <code>0xFF</code>: set default values.<br/>
 
Remote Mode <code>0xF0</code>: mouse send data only when the<br/>
 
Read Data <code>0xEB</code> command is received. <br/><br/>
 
 
*'''Host to Mouse Communication'''
 
<br/> [[Datei:Host_to_mouse.png|left|400px]]''Data is sent in a 12 bit frame:''<br/>
 
-start bit<br/>
 
-data byte : For example the reset command.<br/>
 
-Parity bit<br/>
 
-stop bit<br/>
 
-acknowledgment bit<br/>
 
 
 
*'''Mouse to Host Communication'''
 
<br/> [[Datei:Mouse_to_host.png|left|400px]]''Data is sent in a 11 bit frame:''<br/>
 
-start bit<br/>
 
-data byte: For example data byte with the X or Y position.<br/>
 
-Parity bit<br/>
 
-stop bit.<br/>
 
<br/>
 
===Implementation using the "feather_board"===
 
For the implementation using the feather board, some problems popped up:<br/>
 
-Voltage of the nRF52 is 3.3v, mouse is 5v.<br/>
 
-The Data and Clock signals from the mouse are both open-collector. Zephyr OS does not support open collector configuration at this moment.
 
<br/><br/>'''To solve this, two additional modules were added:''' <br/>
 
-Level Conversion Module 5-3v System.[[Datei:Lvl_converter.png|150px]]<br/>
 
-SN74LS07 IC with Open-Collector output. [[:File:74LS07.pdf | 74LS07_Datasheet ]]<br/>
 
 
[[Datei:Nrf52_mouse.png|left|400px]][[Datei:Nrf52_mouse_breadboard.png|400px]]
 
<br/>
 
===Test Cases===
 
 
{| class="wikitable"
 
 
|-
 
! Test Case !! Description !! Expected-Actual Results !! Pass/Fail
 
|-
 
|01 || Check Measurements against a Physical Object || 130mm - 130mm<br/> 128/132mm - 130mm || NA
 
|-
 
| 02||Check Measurements against a Physical Object with appropriate equipment ||NA ||NA
 
|-
 
| 03 ||Check Measurements when "ITSE" fully assembly is complete ||NA || NA
 
|-
 
|}
 
 
*Test Case 01
 
In order to emulate a Linear movement some Physical Objects were used.<br/>
 
[[Datei:Test1.png|left|200px]][[Datei:Test2.png|130px]]
 
[[Datei:Test3.png|left|300px]][[Datei:Test01mouse.png|120px]]
 
 
 
Note that for a better test perform a mechanical system for the linear movement should be used.
 
 
===References===
 
 
THE DESIGN AND DEVELOPMENT OF A PS/2 MOUSE CONTROLLER AND
 
MULTIPLE I/O BUS SYSTEM INTEGRATION[http://eprints.utar.edu.my/1186/1/CT-2014-1005810-1.pdf ]<br/>
 
[[:File:Design of a PS2 Mouse Controller.pdf | The PS/2 Mouse/Keyboard Protocol ]]
 
 
==VL53L0X Time-Of-Flight Distance Sensor==
 
Der VL53L0X Time of Flight (ToF) Laser Distanzsensor kann Distanzen bis zu einer Entfernung von 2m genau bestimmen. Angesprochen wird der Sensor über I2C, was sich jedoch bei der Verwendung mehrerer Sensor als ziemlich schwierig erwies.
 
Dabei traten vorlegende Probleme auf:
 
 
Die I2C-Adresse des VL53L0X kann über I2C Programmiert werden, jedoch kann der Sensor sich diese Adresse diese Adresse nicht dauerhaft merken. Bei Neustart des Roboters verlieren somit alle Sensoren ihre gesetzte I2C-Adresse und nehmen die Standard Adresse 0x29 an, was zu Chaoss auf dem I2C-Bus führt. Die Sensoren haben einen XSHUT-Pin, über den sie sich ausschalten lassen und den GPIO1-Pin, über den man Interrupts an den Sensor senden kann. Der Hersteller der Sensoren gibt an, dass man die Sensoren über diese Pins alle ausschalten, anschließend nacheinander wieder einschalten und dann über den GPIO1-Pin interrupten soll, um dann die I2C-Addressen setzen zu können. Dies hat in der Praxis auch gut funktioniert, jedoch gab es dann das Problem, dass zu jedem Sensor zwei zusätzliche GPIO-Pins auf unserem Feather-Board belegt werden würden. Da wir 6 ToF-Sensoren geplant hatten, wären das insgesamt 12 zusätzliche GIOP-Pins die belegt worden wären.
 
 
Als Abhilfe dafür haben wir zwei PCF8574N 8 Bit I2C GPIO Portexpander verwendet, einer der Portexpander wird für alle XSHUT-Pins und der andere wird für alle GPIO1-Pins der Sensoren verwendet. Dadurch lassen sich alle ToF-Sensoren nacheinander über I2C starten und ihre I2C-Adresse neu setzen.
 
 
Zephyr hat eine eigene Sensor-API, die das Handling und die Integration von Sensoren in das System vereinfachen soll. Es gibt auch bereist implementierte Treiber für unseren ToF-Sensor, jedoch wird in diesem Treiber nicht berücksichtigt, dass man auch mehrere dieser Sensoren mit unterschiedlichen I2C-Adressen initialisieren und verwenden können soll.
 
Hierfür wurde der ToF-Sensoren Init-Prozess, um das nacheinander Starten der ToF-Sensoren und das Vergeben der I2C-Adressen erweitert. Des weiteren wurden noch einige Funktionen zum vereinfachten Abfragen der Sensorwerte bereitgestellt und eine Mailbox eingerichtet, die Permanent alle Sensorwerte bereitgestellt.
 
 
>>>Hier Bild des Testaufbaus<<<
 
 
Die ToF-Sensoren sollen wie folgt auf ITS-E angebracht werden:
 
 
>>>Hier ITS-E Bild einfügen<<<
 
 
==Zephyr Scientific Library (zscilib)==
 
Für die Berechnungen, die für den Kalman Filter benötigt werden, wurde eine zusätzliche Library in das Projekt eingebunden. Es handelt sich dabei um die [https://github.com/zscilib/zscilib Zephyr Scientific Library (zscilib)].
 
Die Library wurde mit folgenden Schritten eingebunden:
 
 
1. In the manifest/remotes section add:
 
<pre>
 
remotes:
 
- name: zscilib
 
url-base: https://github.com/zscilib
 
</pre>
 
 
2. In the manifest/projects section add:
 
<pre>
 
- name: zscilib
 
remote: zscilib
 
path: modules/lib/zscilib
 
revision: master
 
</pre>
 
 
3. Save the file, and run <code>west update</code> from the project root to retrieve the latest version of zscilib from Github, or whatever revision was specified above.
 
 
4. Folgende Parameter wurden in der .conf ergänzt:
 
<pre>
 
CONFIG_FLOAT=y
 
CONFIG_FP_SHARING=y
 
CONFIG_NEWLIB_LIBC=y
 
CONFIG_NEWLIB_LIBC_FLOAT_PRINTF=y
 
CONFIG_ZSL=y
 
CONFIG_ZSL_PLATFORM_OPT=2
 
CONFIG_ZSL_SINGLE_PRECISION=y
 
CONFIG_ZSL_VECTOR_INLINE=n
 
CONFIG_ZSL_MATRIX_INLINE=n
 
CONFIG_ZSL_BOUNDS_CHECKS=y
 
</pre>
 
 
=Quellen=
 
[https://cdn-learn.adafruit.com/downloads/pdf/adafruit-bno055-absolute-orientation-sensor.pdf?timestamp=1573732933 Adafruit Learning Systems]
 
 
[https://cdn-shop.adafruit.com/datasheets/BST_BNO055_DS000_12.pdf BNO055 Datasheet]
 
 
[https://github.com/zscilib/zscilib Zephyr Scientific Library (zscilib)]
 

Aktuelle Version vom 18. Februar 2020, 17:18 Uhr