Создание собственной системы стабилизации

rual

Что то у вас всё сложно. В чём смысл идентификации акселя? В том чтобы не заточенную под железо прошиву определить при старте?
Умолчательное значение 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);
сдвигать внутренний адрес акселя не нужно!

SergDoc

Решил проблему так:


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;
}

Я просто потом перезаписываю регистр как мне надо, и всё приплыли нет аксела на следующем старте, сейчас всё заработало 😃

Сгирой постораюсь обойтись проще, типа есть такой аксель значит и гира такая же…

rual:

В чём смысл идентификации акселя? В том чтобы не заточенную под железо прошиву определить при старте?

у Таймкопа автоопределение датчиков написано - типа какие установлены, так вот я туда lsm-ку и пристраиваю

rual

у переменной ack булевый тип, некрасиво его сдигать )

SergDoc

зато работает 😃 определяется аксель без проблем 😃

а в булеву переменную, всякую бяку засовывать, типа чип id, то ж некрасиво

rual
SergDoc:

а в булеву переменную, всякую бяку засовывать, типа чип id, то ж некрасиво

нее, не так. в ack функция выгружает наличие/отсутсвие ответа от ведмого устройства. Т.е. если ack = true, то устройство ответило, если false что ответа не было.

SergDoc
SergDoc:

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;
}
SergDoc

Вот что вышло


#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;
}

но бяка полная 😦

soliada
SergDoc:

#define LSM330ACC_ADDRESS 0x19

А почему именно такой адрес? Вроде,если верить инструкции на чтение либо 0Х30,либо 0Х32 в зависимости от подключения.

SergDoc

Семи биный, не восьми…
BMP085, Standard address 0x77
HMC5883L, default address 0x1E
ADXL345, Alternative address mode 0x53

SergDoc

addr = addr_ << 1;
    reg = reg_;
    writing = 1;
    reading = 0;
    write_p = my_data;
    read_p = my_data;
    bytes = len_;
    busy = 1;

чтение и запись со cдвигом адреса уже прописаны в драйвере i2c

soliada:

А это за что отвечает?

прописываю включение всех трёх осей…

ради экперимента можно в первый регистр число послать 0Х57 получится LSM330_A_ODR_100 0x50 /* Normal / low-power mode (100 Hz) */

  • LSM330_A_Acsis 0X7

тьфу надо писать 0Х07 😦

завтра попробую обнулить все регистры акселя и ещё раз попробую…

SergDoc

Опять беда, решил гиру нарисовать ииии опа температура то восьмибитная - старая давно забытая проблема как знак не потерять, ладно предположим что можно записать в char, потом придумать делитель ну а дальше опять танцы с бубном…

меряем от -40 до +85, если -40 будет равно -178 а +85 равно 177😵

делитель 2 но надо ещё ноль сместить

SergDoc

Написал драйвер для гиры, на сколько могу судить определяется, так как, в родной паршивке нет такого понятия, пришлось для уверенности, что обращается к драйверу сделать ещё одну проверку акселя, по крайней мере раз аксель проверяет два раза значит цепляет и гиру, но бяка та-же что и с акселем, пока в растерянности…

SergDoc

надоест извращатся прямо в sensor.c пропишу датчики

SergDoc

Вот драйвер для гиры:


#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;
}*/

результат тотже что и с акселем, устройство обнаружено, а дальше полная бяка в показаниях, значит что-то не так делаю? если кто-то что заметит ткните носом пожалуйста…

IvanDeft

Поищите на github’e… Выкладывал кто-то уже ссылку эту: github.com/jrowberg/i2cdevlib/tree/…/Arduino для i2c много полезной инфы с примерами. Думаю можно много найти полезного. И решение вашей задачи тоже )))

SergDoc

Уряя всё заработалооо!!!
Вот оно колдунство
По образцу TC


i2cRead(LSM330GYRO_ADDRESS, LSM330_OUT_X_L_G, 6, buf);

неработает 😃,
По образцу Дмитрия omegapraim


i2cRead(LSM330GYRO_ADDRESS, LSM330_OUT_X_L_G +0x80, 6, buf); 

Заработало!!!😃

IvanDeft

Видео возвращаемых данных, плиз!!!)) сейчас сам сижу мучаюсь с APC220 )))

SergDoc

осталась одна проблема, аппарат то у меня последний кончился, так что только к осени проверю 😦

IvanDeft:

Видео возвращаемых данных, плиз!!!)) сейчас сам сижу мучаюсь с APC220 )))

немного по позже, на радостях оторвал программатор, и уезжать с утра надо, но щяс паяльник раскачегарю…

HikeR
SergDoc:

LSM330_OUT_X_L_G +0x80

а в чем юмор? вместо даташитного регистра 0x29h вы читатете регистр 0xA8h (29h+80h) которого даже чисто технически нет. может там вместо данных мусор какой, а вы тут радуетесь 😉