Создание собственной системы стабилизации
Что то у вас всё сложно. В чём смысл идентификации акселя? В том чтобы не заточенную под железо прошиву определить при старте?
Умолчательное значение 00000111b
bool ack = false;
uint8_t sig = 0;
ack = i2cRead(ADXL345_ADDRESS, 0x20, 1, &sig); // если я правильно понимаю параметры функции читаем аксель по адресу 0x20
if (!ack || sig != 0x07) // тут либо NACK, либо считанное занчение не равно 7
return false;
вот вроде так
ps точнее так
ack = i2cRead(LSM330ACC_ADDRESS, LSM330_CTRL_REG1_A, 1, &sig);
сдвигать внутренний адрес акселя не нужно!
Решил проблему так:
bool LSM330ACCDetect(sensor_t *acc)
{
bool ack = false;
uint8_t sig = 0;
ack = i2cRead(LSM330ACC_ADDRESS, LSM330_CTRL_REG1_A , 1, &sig);
ack = ack <<5;
sig = sig <<5;
if (!ack || sig != LSM330ACC_DEVICE_SIGNATURE)
return false;
acc->init = LSM330ACCInit;
acc->read = LSM330ACCRead;
acc->align = LSM330ACCAlign;
return true;
}
Я просто потом перезаписываю регистр как мне надо, и всё приплыли нет аксела на следующем старте, сейчас всё заработало 😃
Сгирой постораюсь обойтись проще, типа есть такой аксель значит и гира такая же…
В чём смысл идентификации акселя? В том чтобы не заточенную под железо прошиву определить при старте?
у Таймкопа автоопределение датчиков написано - типа какие установлены, так вот я туда lsm-ку и пристраиваю
у переменной ack булевый тип, некрасиво его сдигать )
зато работает 😃 определяется аксель без проблем 😃
а в булеву переменную, всякую бяку засовывать, типа чип id, то ж некрасиво
а в булеву переменную, всякую бяку засовывать, типа чип id, то ж некрасиво
нее, не так. в ack функция выгружает наличие/отсутсвие ответа от ведмого устройства. Т.е. если ack = true, то устройство ответило, если false что ответа не было.
if (!ack || sig != LSM330ACC_DEVICE_SIGNATURE)
return false;
тогда вот это загадка…
в таком случае надо
bool LSM330ACCDetect(sensor_t *acc)
{
bool ack = false;
uint8_t sig = 0;
ack = i2cRead(LSM330ACC_ADDRESS, LSM330_CTRL_REG1_A , 1, &sig);
sig = sig <<5;
if ( sig != LSM330ACC_DEVICE_SIGNATURE)
return false;
acc->init = LSM330ACCInit;
acc->read = LSM330ACCRead;
acc->align = LSM330ACCAlign;
return true;
}
Вот что вышло
#include "board.h"
#define LSM330ACC_ADDRESS 0x19
#define LSM330ACC_DEVICE_SIGNATURE 0xE0
#define LSM330_CTRL_REG1_A 0x20 /* rw */
#define LSM330_CTRL_REG2_A 0x21 /*rw */
#define LSM330_CTRL_REG3_A 0x22 /*rw */
#define LSM330_CTRL_REG4_A 0x23 /*rw */
#define LSM330_CTRL_REG5_A 0x24 /*rw */
#define LSM330_CTRL_REG6_A 0x25 /*rw */
#define LSM330_REF_DCAPTURE_A 0x26 /*rw */
#define LSM330_STATUS_REG_A 0x27 /*r */
#define LSM330_OUT_X_L_A 0x28 /*r */
//#define LSM330_OUT_X_H_A 0x29 /*r */
//#define LSM330_OUT_Y_L_A 0x2A /*r */
//#define LSM330_OUT_Y_H_A 0x2B /*r */
//#define LSM330_OUT_Z_L_A 0x2C /*r */
//#define LSM330_OUT_Z_H_A 0x2D /*r */
#define LSM330_FIFO_CTRL_REG_A 0x2E /*rw */
#define LSM330_FIFO_SRC_REG_A 0x2F /*r */
#define LSM330_INT1_CFG_A 0x30 /*rw */
#define LSM330_INT1_SRC_A 0x31 /*r */
#define LSM330_INT1_THS_A 0x32 /*rw */
#define LSM330_INT1_DURATION_A 0x33 /*rw */
#define LSM330_INT2_CFG_A 0x34 /*rw */
#define LSM330_INT2_SOURCE_A 0x35 /*r */
#define LSM330_INT2_THS_A 0x36 /*rw */
#define LSM330_INT2_DURATION_A 0x37 /*rw */
#define LSM330_CLICK_CFG_A 0x38 /*rw */
#define LSM330_CLICK_SRC_A 0x39 /*rw */
#define LSM330_CLICK_THS_A 0x3A /*rw */
#define LSM330_TIME_LIMIT_A 0x3B /*rw */
#define LSM330_TIME_LATENCY_A 0x3C /*rw */
#define LSM330_TIME_WINDOW_A 0x3D /*rw */
/* LSM330_CTRL_REG1_A */
#define LSM330_A_ODR_PDN 0x0 /* Power-down mode */
#define LSM330_A_ODR_1 0x10 /* Normal / low-power mode (1 Hz) */
#define LSM330_A_ODR_10 0x20 /* Normal / low-power mode (10 Hz) */
#define LSM330_A_ODR_25 0x30 /* Normal / low-power mode (25 Hz) */
#define LSM330_A_ODR_50 0x40 /* Normal / low-power mode (50 Hz) */
#define LSM330_A_ODR_100 0x50 /* Normal / low-power mode (100 Hz) */
#define LSM330_A_ODR_200 0x60 /* Normal / low-power mode (200 Hz) */
#define LSM330_A_ODR_400 0x70 /* Normal / low-power mode (400 Hz) */
#define LSM330_A_ODR_LP162 0x80 /* Low-power mode (1.620 kHz) */
#define LSM330_A_ODR_HI 0x81 /* Normal (1.344 kHz) / low-power mode (5.376 kHz) */
#define LSM330_A_Acsis 0X7
/* CTRL_REG2_A */
#define LSM330_A_HPM0 0 /* Normal mode (reset reading HP_RESET_FILTER)*/
#define LSM330_A_HPM1 0x40 /* Reference signal for filtering */
#define LSM330_A_HPM2 0x80 /* Normal mode */
#define LSM330_A_HPM3 0xc0 /* Autoreset on interrupt event */
#define LSM330_A_HPCF0 0 /* High-pass filter cutoff frequency selection */
#define LSM330_A_HPCF1 0x10 /* High-pass filter cutoff frequency selection */
#define LSM330_A_HPCF2 0x20 /* High-pass filter cutoff frequency selection */
#define LSM330_A_HPCF3 0x30 /* High-pass filter cutoff frequency selection */
#define LSM330_A_FDS 0x08 /* Filtered data selection. Default value: 0 (0: internal filter bypassed; 1: data from internal filter sent to output register and FIFO) */
/* CTRL_REG3_A */
#define LSM330_A_I1_CLICK 0x80 /* CLICK interrupt on INT1_A. Default value 0. (0: Disable; 1: Enable) */
#define LSM330_A_I1_AOI1 0x40 /* AOI1 interrupt on INT1_A. Default value 0. (0: Disable; 1: Enable) */
#define LSM330_A_I1_DRDY1 0x10 /* DRDY1 interrupt on INT1_A. Default value 0.(0: Disable; 1: Enable) */
#define LSM330_A_I1_DRDY2 0x08 /* DRDY2 interrupt on INT1_A. Default value 0.(0: Disable; 1: Enable) */
#define LSM330_A_I1_WTM 0x04 /* FIFO watermark interrupt on INT1_A. Default value 0.(0: Disable; 1: Enable)*/
#define LSM330_A_I1_OVERRUN 0x02 /* FIFO overrun interrupt on INT1_A. Default value 0. (0: Disable; 1: Enable) */
/*CTRL_REG4_A */
#define LSM330_BDU 0x80 /* Block data update. Default value: 0(0: continuous update; 1: output registers not updated until MSB and LSB reading) */
#define LSM330_BLE 0x40 /* Big/little endian data selection. Default value 0.(0: Data LSB at lower address; 1: Data MSB at lower address) */
/*FS1-FS0 Full-scale selection. default value: 00 (00: +/- 2G; 01: +/- 4G; 10: +/- 8G; 11: +/- 16G) */
#define LSM330_A_FS2G 0
#define LSM330_A_FS4G 0x10
#define LSM330_A_FS8G 0x20
#define LSM330_A_FS16G 0x30
#define LSM330_A_HR 0x08 /*Normal mode: default value: 0(0: normal mode disable; 1: normal mode enable */
#define LSM330_SIM 0x01 /* SPI serial interface mode selection. Default value: 0(0: 4-wire interface; 1: 3-wire interface) */
/* CTRL_REG5_A */
#define LSM330_A_BOOT 0x80 /* Reboot memory content. Default value: 0 (0: normal mode; 1: reboot memory content) */
#define LSM330_A_FIFO_EN 0x40 /* FIFO enable. Default value: 0(0: FIFO disable; 1: FIFO enable) */
#define LSM330_A_LIR_INT1 0x08 /* Latch interrupt request on INT1_SRC_A register, with INT1_SRC_A register cleared by reading INT1_SRC_A itself. Default value: 0.(0: interrupt request not latched; 1: interrupt request latched) */
#define LSM330_A_D4D_INT1 0x04 /* 4D enable: 4D detection is enabled on INT1_A when 6D bit on INT1_CFG_A is set to 1. */
/* CTRL_REG6_A */
#define LSM330_A_I2_CLICKen 0x80 /* Click interrupt on INT2_A. Default value 0. */
#define LSM330_A_I2_INT1 0x40 /* Interrupt 1 function enabled on INT2_A. Default 0. */
#define LSM330_A_BOOT_I2 0x10 /* Boot on INT2_A. */
#define LSM330_A_H_LACTIVE 0x02 /* 0: interrupt active high; 1: interrupt active low. */
/* STATUS_REG_A */
#define LSM330_A_ZYXOR 0x80 /* X-, Y- and Z-axis data overwrite. Default value: 0 (0: no overwrite has occurred; 1: a new set of data has overwritten the previous ones) */
#define LSM330_A_ZOR 0x40 /* Z-axis data overwrite. Default value: 0(0: no overrun has occurred; 1: a new data for the Z-axis has overwritten the previous one) */
#define LSM330_A_YOR 0x20 /* Y-axis data overwrite. Default value: 0 (0: no overwrite has occurred;1: new data for the Y-axis has overwritten the previous data) */
#define LSM330_A_XOR 0x10 /* X-axis data overwrite. Default value: 0 (0: no overwrite has occurred;1: new data for the X-axis has overwritten the previous data) */
#define LSM330_A_ZYXDA 0x08 /* X-, Y- and Z-axis new data available. Default value: 0(0: a new set of data is not yet available; 1: a new set of data is available) */
#define LSM330_A_ZDA 0x04 /* Z-axis new data available. Default value: 0(0: new data for the Z-axis is not yet available;1: new data for the Z-axis is available) */
#define LSM330_A_YDA 0x02 /* Y-axis new data available. Default value: 0 (0: new data for the Y-axis is not yet available;1: new data for the Y-axis is available) */
#define LSM330_A_XDA 0x01 /* X-axis new data available. Default value: 0 (0: new data for the X-axis is not yet available;1: new data for the X-axis is available) */
extern uint16_t acc_1G;
static void LSM330ACCInit(void);
static void LSM330ACCRead(int16_t *accelData);
static void LSM330ACCAlign(int16_t *accelData);
bool LSM330ACCDetect(sensor_t *acc)
{
bool ack = false;
uint8_t sig = 0;
ack = i2cRead(LSM330ACC_ADDRESS, LSM330_CTRL_REG1_A , 1, &sig);
sig = sig <<5;
if (!ack || sig != LSM330ACC_DEVICE_SIGNATURE)
return false;
acc->init = LSM330ACCInit;
acc->read = LSM330ACCRead;
acc->align = LSM330ACCAlign;
return true;
}
static void LSM330ACCInit(void)
{
i2cWrite(LSM330ACC_ADDRESS, LSM330_CTRL_REG1_A, LSM330_A_ODR_100 | LSM330_A_Acsis );
i2cWrite(LSM330ACC_ADDRESS, LSM330_CTRL_REG4_A, LSM330_A_FS4G );
acc_1G = 512;
}
static void LSM330ACCRead(int16_t *accelData)
{
uint8_t buf[6];
i2cRead(LSM330ACC_ADDRESS, LSM330_OUT_X_L_A, 6, buf);
accelData[0] = (buf[1] << 8) | buf[0];
accelData[1] = (buf[3] << 8) | buf[2];
accelData[2] = (buf[5] << 8) | buf[4];
accelData[0] >>= 2;
accelData[1] >>= 2;
accelData[2] >>= 2;
}
static void LSM330ACCAlign(int16_t *accelData)
{
int16_t temp[2];
temp[0] = accelData[0];
temp[1] = accelData[1];
// official direction is RPY
accelData[0] = temp[1] / 32;
accelData[1] = -temp[0] / 32;
accelData[2] = accelData[2] / 32;
}
но бяка полная 😦
#define LSM330ACC_ADDRESS 0x19
А почему именно такой адрес? Вроде,если верить инструкции на чтение либо 0Х30,либо 0Х32 в зависимости от подключения.
Семи биный, не восьми…
BMP085, Standard address 0x77
HMC5883L, default address 0x1E
ADXL345, Alternative address mode 0x53
#define LSM330_A_Acsis 0X7
А это за что отвечает?
addr = addr_ << 1;
reg = reg_;
writing = 1;
reading = 0;
write_p = my_data;
read_p = my_data;
bytes = len_;
busy = 1;
чтение и запись со cдвигом адреса уже прописаны в драйвере i2c
А это за что отвечает?
прописываю включение всех трёх осей…
ради экперимента можно в первый регистр число послать 0Х57 получится LSM330_A_ODR_100 0x50 /* Normal / low-power mode (100 Hz) */
- LSM330_A_Acsis 0X7
тьфу надо писать 0Х07 😦
завтра попробую обнулить все регистры акселя и ещё раз попробую…
Опять беда, решил гиру нарисовать ииии опа температура то восьмибитная - старая давно забытая проблема как знак не потерять, ладно предположим что можно записать в char, потом придумать делитель ну а дальше опять танцы с бубном…
меряем от -40 до +85, если -40 будет равно -178 а +85 равно 177😵
делитель 2 но надо ещё ноль сместить
Написал драйвер для гиры, на сколько могу судить определяется, так как, в родной паршивке нет такого понятия, пришлось для уверенности, что обращается к драйверу сделать ещё одну проверку акселя, по крайней мере раз аксель проверяет два раза значит цепляет и гиру, но бяка та-же что и с акселем, пока в растерянности…
надоест извращатся прямо в sensor.c пропишу датчики
Вот драйвер для гиры:
#include "board.h"
#define LSM330GYRO_ADDRESS 0x69
//#define LSM330GYRO_DEVICE_SIGNATURE 0xE0
#define LSM330ACC_ADDRESS 0x19
#define LSM330ACC_DEVICE_SIGNATURE 0xE0
#define LSM330_CTRL_REG1_A 0x20 /* rw */
/* адреса регистров гироскопа */
#define LSM330_CTRL_REG1_G 0x20 /*rw */
#define LSM330_CTRL_REG2_G 0x21 /*rw */
#define LSM330_CTRL_REG3_G 0x22 /*rw */
#define LSM330_CTRL_REG4_G 0x23 /*rw */
#define LSM330_CTRL_REG5_G 0x24 /*rw */
#define LSM330_REF_DCAPTURE_G 0x25 /*rw */
#define LSM330_OUT_TEMP_G 0x26 /*r */
#define LSM330_STATUS_REG_G 0x27 /*r */
#define LSM330_OUT_X_L_G 0x28 /*r */
#define LSM330_OUT_X_H_G 0x29 /*r */
#define LSM330_OUT_Y_L_G 0x2A /*r */
#define LSM330_OUT_Y_H_G 0x2B /*r */
#define LSM330_OUT_Z_L_G 0x2C /*r */
#define LSM330_OUT_Z_H_G 0x2D /*r */
#define LSM330_FIFO_CTRL_REG_G 0x2E /*rw */
#define LSM330_FIFO_SRC_REG_G 0x2F /*r */
#define LSM330_INT1_CFG_G 0x30 /*rw */
#define LSM330_INT1_SRC_G 0x31 /*r */
#define LSM330_INT1_THS_XH_G 0x32 /*rw */
#define LSM330_INT1_THS_XL_G 0x33 /*rw */
#define LSM330_INT1_THS_YH_G 0x34 /*rw */
#define LSM330_INT1_THS_YL_G 0x35 /*rw */
#define LSM330_INT1_THS_ZH_G 0x36 /*rw */
#define LSM330_INT1_THS_ZL_G 0x37 /*rw */
#define LSM330_INT1_DURATION_G 0x38 /*rw */
/* CTRL_REG1_G */
/* DR and BW configuration setting _ODR [Hz]_cutoff [Hz] */
#define LSM330_G_DR100BW12_5 0x00
#define LSM330_G_DR100BW25 0x30
#define LSM330_G_DR200BW12_5 0x40
#define LSM330_G_DR200BW25 0x50
#define LSM330_G_DR200BW50 0x60
#define LSM330_G_DR200BW70 0x70
#define LSM330_G_DR400BW20 0x80
#define LSM330_G_DR400BW25 0x90
#define LSM330_G_DR400BW50 0xA0
#define LSM330_G_DR400BW110 0xB0
#define LSM330_G_DR800BW30 0xC0
#define LSM330_G_DR800BW35 0xD0
#define LSM330_G_DR800BW50 0xE0
#define LSM330_G_DR800BW110 0xF0
#define LSM330_G_PD 0x08 /* Power-down mode enable. Default value: 0 (0: power-down mode, 1: normal mode or sleep mode) */
/* CTRL_REG2_G */
#define LSM330_G_HPM0 0 /* Normal mode (reset reading HP_RESET_FILTER)*/
#define LSM330_G_HPM1 0x10 /* Reference signal for filtering */
#define LSM330_G_HPM2 0x20 /* Normal mode */
#define LSM330_G_HPM3 0x30 /* Autoreset on interrupt event */
/* High-pass filter cutoff frequency configuration [Hz] */
/* HPCF3-0 ODR = 100 Hz ODR = 200 Hz ODR = 400 Hz ODR = 800 Hz */
#define LSM330_G_HPC0 0x00 /* 8 15 30 56 */
#define LSM330_G_HPC1 0x01 /* 4 8 15 30 */
#define LSM330_G_HPC2 0x02 /* 2 4 8 15 */
#define LSM330_G_HPC3 0x03 /* 1 2 4 8 */
#define LSM330_G_HPC4 0x04 /* 0.5 1 2 4 440 */
#define LSM330_G_HPC5 0x05 /* 0.2 0.5 1 2 220 */
#define LSM330_G_HPC6 0x06 /* 0.1 0.2 0.5 1 110 */
#define LSM330_G_HPC7 0x07 /* 0.05 0.1 0.2 0.5 55 */
#define LSM330_G_HPC8 0x08 /* 0.02 0.05 0.1 0.2 22 */
#define LSM330_G_HPC9 0x09 /* 0.01 0.02 0.05 0.1 11 */
/* CTRL_REG3_G */
#define LSM330_G_I1_Int1 0x80 /* Interrupt enable on INT1_G pin. Default value 0. (0: Disable; 1: Enable)*/
#define LSM330_G_I1_Boot 0x40 /* Boot status available on INT1_G. Default value 0. (0: Disable; 1: Enable) */
#define LSM330_G_H_Lactive 0x20 /* Interrupt active configuration on INT1_G. Default value 0. (0: High; 1:Low) */
#define LSM330_G_PP_OD 0x10 /* Push-Pull / Open drain. Default value: 0. (0: Push-Pull; 1: Open drain) */
#define LSM330_G_I2_DRDY 0x08 /* Date Ready on DRDY_G/INT2_G. Default value 0. (0: Disable; 1: Enable) */
#define LSM330_G_I2_WTM 0x04 /* FIFO watermark interrupt on DRDY_G/INT2_G. Default value: 0. (0: Disable; 1: Enable)*/
#define LSM330_G_I2_ORun 0x02 /* FIFO overrun interrupt on DRDY_G/INT2_G Default value: 0. (0: Disable; 1: Enable) */
#define LSM330_G_I2_Empty 0x01 /* FIFO empty interrupt on DRDY_G/INT2_G. Default value: 0. (0: Disable; 1: Enable) */
/* CTRL_REG4_G */
/* FS1-FS0 Full-scale selection. Default value: 00 (00: 250 dps; 01: 500 dps; 10: 2000 dps; 11: 2000 dps)*/
#define LSM330_G_FS250 0
#define LSM330_G_FS500 0x10
#define LSM330_G_FS2000 0x20
/* CTRL_REG5_G */
#define LSM330_G_BOOT 0x80 /* Reboot memory content. Default value: 0(0: normal mode; 1: reboot memory content) */
#define LSM330_G_FIFO_EN 0x40 /* FIFO enable. Default value: 0(0: FIFO disable; 1: FIFO Enable) */
#define LSM330_G_HPen 0x20 /* High-pass filter enable. Default value: 0(0: HPF disabled; 1: HPF enabled ) */
/* INT1_Sel1-INT1_Sel0 INT1 selection configuration. Default value: 0 */
#define LSM330_G_INT1_HPF 0x04 /* High-pass-filtered data are used for interrupt generation */
#define LSM330_G_INT1_LPF2 0x08 /* High-pass and low-pass-filtered data are used for interrupt generation */
/* Out selection configuration. Default value: 0 */
#define LSM330_G_OUT_HPF 0x01 /* Data in DataReg and FIFO are high-passfiltered */
#define LSM330_G_OUT_LPF2 0x02 /* Data in DataReg and FIFO are low-passfiltered by LPF2 */
/* STATUS_REG_G */
#define LSM330_G_ZYXOR 0x80 /* X-, Y-, Z-axis data overwrite. Default value: 0
(0: no overwrite has occurred; 1: new data has overwritten
the previous data before it wasread) */
#define LSM330_G_ZOR 0x40 /* Z-axis data overwrite. Default value: 0
(0: no overwrite has occurred; 1: new data for the Z-axis
has overwritten the previous data) */
#define LSM330_G_YOR 0x20 /* Y-axis data overwrite. Default value: 0(0: no overwrite has occurred;
1: new data for the Y-axis has overwritten the previous data) */
#define LSM330_G_XOR 0x10 /* X-axis data overwrite. Default value: 0 (0: no overwrite has occurred;
1: new data for the X-axis has overwritten the previous data) */
#define LSM330_G_ZYXDA 0x08 /*X-, Y-, Z-axis new data available. Default value: 0 (0: a new set of data is not yet available;
1: a new set of data is available) */
#define LSM330_G_ZDA 0x04 /* Z-axis new data available. Default value: 0 (0: new data for the Z-axis is not yet available;
1: new data for the Z-axis is available) */
#define LSM330_G_YDA 0x02 /* Y-axis new data available. Default value: 0 (0: new data for the Y-axis is not yet available;
1: new data for the Y-axis is available) */
#define LSM330_G_XDA 0x01 /* X-axis new data available. Default value: 0 (0: new data for the X-axis is not yet available;
1: new data for the X-axis is available) */
static void lsm330gyroInit(void);
static void lsm330gyroRead(int16_t *gyroData);
static void lsm330gyroAlign(int16_t *gyroData);
static uint8_t mpuLowPassFilter = LSM330_G_HPC7;
bool lsm330gyroDetect(sensor_t *gyro)
{
bool ack = false;
uint8_t sig = 0;
ack = i2cRead(LSM330ACC_ADDRESS, LSM330_CTRL_REG1_A , 1, &sig);
sig = sig <<5;
if (!ack || sig != LSM330ACC_DEVICE_SIGNATURE)
return false;
gyro->init = lsm330gyroInit;
gyro->read = lsm330gyroRead;
gyro->align = lsm330gyroAlign;
return true;
}
void lsm330gyroConfig(uint16_t lpf)
{
switch (lpf) {
case 256:
mpuLowPassFilter = LSM330_G_HPC4;
break;
case 188:
mpuLowPassFilter = LSM330_G_HPC5;
break;
case 98:
mpuLowPassFilter = LSM330_G_HPC6;
break;
case 42:
mpuLowPassFilter = LSM330_G_HPC7;
break;
case 20:
mpuLowPassFilter = LSM330_G_HPC8;
break;
case 10:
mpuLowPassFilter = LSM330_G_HPC9;
break;
}
i2cWrite(LSM330GYRO_ADDRESS, LSM330_CTRL_REG4_G, LSM330_G_FS2000);
i2cWrite(LSM330GYRO_ADDRESS, LSM330_CTRL_REG2_G, mpuLowPassFilter);
}
static void lsm330gyroInit(void)
{
delay(5);
i2cWrite(LSM330GYRO_ADDRESS, LSM330_CTRL_REG1_G, 0xBF);
//
}
static void lsm330gyroAlign(int16_t *gyroData)
{
// official direction is RPY
gyroData[0] = gyroData[0] / 4;
gyroData[1] = gyroData[1] / 4;
gyroData[2] = -gyroData[2] / 4;
}
// Read 3 gyro values into user-provided buffer. No overrun checking is done.
static void lsm330gyroRead(int16_t *gyroData)
{
uint8_t buf[6];
i2cRead(LSM330GYRO_ADDRESS, LSM330_OUT_X_L_G, 6, buf);
gyroData[0] = (buf[1] << 8) | buf[0];
gyroData[1] = (buf[3] << 8) | buf[2];
gyroData[2] = (buf[5] << 8) | buf[4];
}
/*static int16_t lsm330gyroReadTemp(void)
{
char buf[1];
i2cRead(LSM330GYRO_ADDRESS, LSM330_OUT_TEMP_G, 1, buf);
return 35 + ((int32_t)(buf[0]) + 13200) / 280;
}*/
результат тотже что и с акселем, устройство обнаружено, а дальше полная бяка в показаниях, значит что-то не так делаю? если кто-то что заметит ткните носом пожалуйста…
Поищите на github’e… Выкладывал кто-то уже ссылку эту: github.com/jrowberg/i2cdevlib/tree/…/Arduino для i2c много полезной инфы с примерами. Думаю можно много найти полезного. И решение вашей задачи тоже )))
нету там, я уже искал:(
Уряя всё заработалооо!!!
Вот оно колдунство
По образцу TC
i2cRead(LSM330GYRO_ADDRESS, LSM330_OUT_X_L_G, 6, buf);
неработает 😃,
По образцу Дмитрия omegapraim
i2cRead(LSM330GYRO_ADDRESS, LSM330_OUT_X_L_G +0x80, 6, buf);
Заработало!!!😃
Видео возвращаемых данных, плиз!!!)) сейчас сам сижу мучаюсь с APC220 )))
осталась одна проблема, аппарат то у меня последний кончился, так что только к осени проверю 😦
Видео возвращаемых данных, плиз!!!)) сейчас сам сижу мучаюсь с APC220 )))
немного по позже, на радостях оторвал программатор, и уезжать с утра надо, но щяс паяльник раскачегарю…
LSM330_OUT_X_L_G +0x80
а в чем юмор? вместо даташитного регистра 0x29h вы читатете регистр 0xA8h (29h+80h) которого даже чисто технически нет. может там вместо данных мусор какой, а вы тут радуетесь 😉