... | @@ -84,113 +84,4 @@ Events from the volume up and down push buttons are delivered via the `/dev/inpu |
... | @@ -84,113 +84,4 @@ Events from the volume up and down push buttons are delivered via the `/dev/inpu |
|
* https://community.nxp.com/thread/381834
|
|
* https://community.nxp.com/thread/381834
|
|
|
|
|
|
### I2C
|
|
### I2C
|
|
* https://elinux.org/Interfacing_with_I2C_Devices
|
|
See the [Devkit I2C notes](devkit-i2c-notes) page for information. |
|
* `/usr/sbin/i2cdetect -r 2`
|
|
\ No newline at end of file |
|
* https://learn.sparkfun.com/tutorials/raspberry-pi-spi-and-i2c-tutorial/all
|
|
|
|
* `/usr/sbin/i2cdetect -l`
|
|
|
|
* https://github.com/vsergeev/python-periphery
|
|
|
|
|
|
|
|
Add the user to the `i2c` group:
|
|
|
|
```
|
|
|
|
sudo usermod -a -G i2c <user>
|
|
|
|
```
|
|
|
|
|
|
|
|
**Magnetometer:**
|
|
|
|
* https://github.com/sparkfun/LSM9DS1_Breakout
|
|
|
|
* https://learn.sparkfun.com/tutorials/lsm9ds1-breakout-hookup-guide?_ga=2.53511264.972233989.1546204376-751046110.1546204376
|
|
|
|
|
|
|
|
Inspect the chip addresses available:
|
|
|
|
```
|
|
|
|
/usr/sbin/i2cdetect -y 2
|
|
|
|
```
|
|
|
|
|
|
|
|
Read the `WHO_AM_I_M` register for the magnetometer:
|
|
|
|
```
|
|
|
|
/usr/sbin/i2cget -y 2 0x1e 0x0f
|
|
|
|
```
|
|
|
|
This should return `0x3d` for the magnetometer.
|
|
|
|
|
|
|
|
Read the `CTRL_REG3_M` register:
|
|
|
|
```
|
|
|
|
/usr/sbin/i2cget -y 2 0x1e 0x22
|
|
|
|
```
|
|
|
|
This should return `0x03`, indicating an operating mode of binary `11` (power-down mode). Set it to `00` (continuous-conversion mode):
|
|
|
|
```
|
|
|
|
/usr/sbin/i2cset -y 2 0x1e 0x22 0
|
|
|
|
```
|
|
|
|
|
|
|
|
Enable temperature compensation, setting `0x80` in addition to the existing `0x18` in the `CTRL_REG1_M` register:
|
|
|
|
```
|
|
|
|
/usr/sbin/i2cset -y 2 0x1e 0x20 0x98
|
|
|
|
```
|
|
|
|
|
|
|
|
Now read the values for each axis (x, y, z respectively) from the 16-bit registers, `OUT_X_[LH]_M`, `OUT_Y_[LH]_M` and `OUT_Z_[LH]_M`:
|
|
|
|
```
|
|
|
|
/usr/sbin/i2cget -y 2 0x1e 0x28 w
|
|
|
|
/usr/sbin/i2cget -y 2 0x1e 0x2a w
|
|
|
|
/usr/sbin/i2cget -y 2 0x1e 0x2c w
|
|
|
|
```
|
|
|
|
|
|
|
|
Set the operating mode to power-down again:
|
|
|
|
```
|
|
|
|
/usr/sbin/i2cset -y 2 0x1e 0x22 3
|
|
|
|
```
|
|
|
|
|
|
|
|
**Accelerometer and Gyroscope:**
|
|
|
|
|
|
|
|
These are not visible to user space programs via `/dev/i2c-2` if the `st_gyro_i2c` module is enabled. With it removed, the `WHO_AM_I_G` register can be read:
|
|
|
|
```
|
|
|
|
/usr/sbin/i2cget -y 2 0x6a 0x0f
|
|
|
|
```
|
|
|
|
The output from this should be `0x68`.
|
|
|
|
|
|
|
|
The accelerometer can be enabled by setting certain combinations of the top three bits in the `CTRL_REG6_XL` register. Setting the lowest of these three bits causes values to be supplied at a rate of 10 Hz:
|
|
|
|
```
|
|
|
|
/usr/sbin/i2cset -y 2 0x6a 0x20 0x20
|
|
|
|
```
|
|
|
|
|
|
|
|
Reading the status from the `STATUS_REG` register indicates whether data is available:
|
|
|
|
```
|
|
|
|
/usr/sbin/i2cget -y 2 0x6a 0x27
|
|
|
|
```
|
|
|
|
This may return values with bit 2 set if temperature data is available, and bit 0 set if accelerometer data is available.
|
|
|
|
|
|
|
|
If new temperature data is available, it can be read from the 16-bit `OUT_TEMP_[LH]` register:
|
|
|
|
```
|
|
|
|
/usr/sbin/i2cget -y 2 0x6a 0x15 w
|
|
|
|
```
|
|
|
|
|
|
|
|
If new accelerometer data is available, it can be read from the 16-bit `OUT_X_XL`, `OUT_Y_XL` and `OUT_Z_XL` registers:
|
|
|
|
```
|
|
|
|
/usr/sbin/i2cget -y 2 0x6a 0x28 w
|
|
|
|
/usr/sbin/i2cget -y 2 0x6a 0x2a w
|
|
|
|
/usr/sbin/i2cget -y 2 0x6a 0x2c w
|
|
|
|
```
|
|
|
|
|
|
|
|
Reset the `CTRL_REG6_XL` register to its original value to disable the accelerometer:
|
|
|
|
```
|
|
|
|
/usr/sbin/i2cset -y 2 0x6a 0x20 0x0
|
|
|
|
```
|
|
|
|
The bits in the status register will remain set until any remaining temperature or accelerometer data is read.
|
|
|
|
|
|
|
|
The gyroscope can be read via sysfs if the `st_gyro_i2c` module is enabled.
|
|
|
|
Finding [this commit](https://github.com/dwery/beagleboard-linux/commit/5d2d79435d62063dfe9da5f0e549af76bc6a1cb6) which mentions iio, and looking for an `iio` node under `/dev`, I found `/dev/iio:device0`. Looking inside `/sys/class/i2c-adapter/i2c-2` (knowing that bus 2 is used), I found the nodes called `2-000a`, `2-003c`, `2-005a` and `2-006a`. Since chip address `0x6a` was used above to access the accelerometer, I looked inside the last of these nodes to find `iio:device0` which contains nodes with names related to angular velocity as well as other relevant nodes:
|
|
|
|
|
|
|
|
* `current_timestamp_clock`
|
|
|
|
* `in_anglvel_scale_available`
|
|
|
|
* `in_anglvel_x_raw`
|
|
|
|
* `in_anglvel_x_scale`
|
|
|
|
* `in_anglvel_y_raw`
|
|
|
|
* `in_anglvel_y_scale`
|
|
|
|
* `in_anglvel_z_raw`
|
|
|
|
* `in_anglvel_z_scale`
|
|
|
|
* `sampling_frequency`
|
|
|
|
* `sampling_frequency_available`
|
|
|
|
|
|
|
|
**Using iio-sensor-proxy:**
|
|
|
|
|
|
|
|
* https://developer.gnome.org/iio-sensor-proxy/1.0/
|
|
|
|
|
|
|
|
**Using libiio:**
|
|
|
|
|
|
|
|
* https://github.com/analogdevicesinc/libiio |
|
|
|
\ No newline at end of file |
|
|