LIS2DH as motion sensor

Hi, 

I want to use the LIS2DH sensor to any motion interrupt on int2. It seem that it's implemented by the driver so I started with the code found in this issue (https://github.com/zephyrproject-rtos/zephyr/issues/20285).

The interrupt don't seem to be triggered on motion and when I reconnect with RTTViewer the motion callback is called multiple times. 
Here is my code and my prj.conf. 

 

#include <zephyr.h>
#include <device.h>
#include <drivers/sensor.h>
#include <stdio.h>
#include <sys/util.h>

struct device *dev_lis2dh;
int motion_counter = 0; 
double xyz[3] = {0,0,0};

static int read_sensor(struct device *sensor, enum sensor_channel channel)
{
	struct sensor_value val[3];
	int ret = 0;

	ret = sensor_sample_fetch(sensor);
	if (ret < 0 && ret != -EBADMSG) {
		//printf("Sensor sample update error\n");
		goto end;
	}

	ret = sensor_channel_get(sensor, channel, val);
	if (ret < 0) {
		printf("Cannot read sensor channels\n");
		goto end;
	}

	printf("\n( x y z ) = ( %f  %f  %f )\n\n", sensor_value_to_double(&val[0]),
					       sensor_value_to_double(&val[1]),
					       sensor_value_to_double(&val[2]));

end:
	return ret;
}

static int store_sensor(struct device *sensor, enum sensor_channel channel)
{
	struct sensor_value val[3];
	int ret = 0;

	ret = sensor_sample_fetch(sensor);
	if (ret < 0 && ret != -EBADMSG) {
		//printf("Sensor sample update error\n");
		goto end;
	}

	ret = sensor_channel_get(sensor, channel, val);
	if (ret < 0) {
		printf("Cannot read sensor channels\n");
		goto end;
	}

	for(int i=0;i<3;i++) {
		xyz[i] = sensor_value_to_double(&val[i]);
	}
	
end:
	return ret;
}


static void lis2dh_handler_data_ready(const struct device *dev, const struct sensor_trigger *trig) 
{
	//printf("lis2dh_handler_data_ready ~~> ##################### DATA \n");
}


static void lis2dh_handler_motion(const struct device *dev, const struct sensor_trigger *trig) 
{
	//printf("lis2dh_handler_motion ~~> ##################### MOTION\n");
	//read_sensor(dev_lis2dh, SENSOR_CHAN_ACCEL_XYZ);
	motion_counter++;
	store_sensor(dev_lis2dh, SENSOR_CHAN_ACCEL_XYZ);
}


float lis2dh_from_lsb_hr_to_celsius(int16_t lsb)
{
  return ( ( (float)lsb / 64.0f ) / 4.0f ) + 25.0f;
} 

void main(void)
{
	printf("\n\n\rLIS2DH example %s %s\n\r", __DATE__, __TIME__);
	printf("lis2dh app test starting...\n");

	int err = 0;

	dev_lis2dh = DEVICE_DT_GET_ANY(st_lis2dh);
	

	if (dev_lis2dh == NULL) {
		printf("Device %s is not ready\n", dev_lis2dh->name);
		return;
	}



	if (IS_ENABLED(CONFIG_LIS2DH_TRIGGER)) {

		struct sensor_trigger trig = {
			.type = SENSOR_TRIG_DELTA,
			.chan = SENSOR_CHAN_ACCEL_XYZ,
		};
		if (sensor_trigger_set(dev_lis2dh, &trig, lis2dh_handler_motion) < 0) {
			printf("Cannot configure trigger 2: lis2dh_handler_motion\n");
			return;
		};


	 	// SENSOR_ATTR_SLOPE_TH
		//
		static struct sensor_value val_threshold; // = {0,200};
		//sensor_degrees_to_rad(10, &val_threshold);
		val_threshold.val1 = 19;
		val_threshold.val2 = 613300;
		err = sensor_attr_set(dev_lis2dh, SENSOR_CHAN_ACCEL_XYZ, SENSOR_ATTR_SLOPE_TH, &val_threshold);
		if (err) {
			printf("dev_lis2dh - Unable to set attrs TH\n");
		}


		// SENSOR_ATTR_SLOPE_DUR
		// just val1 ... is used 0..127
		static struct sensor_value val_duration;

		val_duration.val1 = 1;
		val_duration.val2 = 0;

		err = sensor_attr_set(dev_lis2dh, SENSOR_CHAN_ACCEL_XYZ, SENSOR_ATTR_SLOPE_DUR, &val_duration);
		if (err) {
			printf("dev_lis2dh - Unable to set attrs DUR\n");
		}

	}

	while (1) {


		//printf("dev_lis2dh read data:\n");
		if (read_sensor(dev_lis2dh, SENSOR_CHAN_ACCEL_XYZ) < 0) {
			//printf("Failed to read accelerometer data\n");
		}
		
		printf("\nmotion %d ( x y z ) = ( %f  %f  %f )\n\n",motion_counter, xyz[0],xyz[1],xyz[2]);

		k_busy_wait(1000000);
	}
}

CONFIG_STDOUT_CONSOLE=y
CONFIG_I2C=y
CONFIG_SENSOR=y
CONFIG_LIS2DH=y
CONFIG_LIS2DH_TRIGGER_OWN_THREAD=y
CONFIG_LIS2DH_ACCEL_RANGE_2G=y
CONFIG_LIS2DH_ODR_1=y

CONFIG_MAIN_STACK_SIZE=16384
CONFIG_HEAP_MEM_POOL_SIZE=16384

CONFIG_CBPRINTF_FP_SUPPORT=y


CONFIG_UART_CONSOLE=n
CONFIG_LOG_BACKEND_UART=n
CONFIG_USE_SEGGER_RTT=y
CONFIG_RTT_CONSOLE=y
CONFIG_LOG_BACKEND_RTT=y
CONFIG_SHELL_BACKEND_SERIAL=n
CONFIG_SHELL_BACKEND_RTT=n


CONFIG_LOG=y
CONFIG_DEBUG=y
CONFIG_PRINTK=y
CONFIG_I2C_LOG_LEVEL_DBG=y
CONFIG_GPIO_LOG_LEVEL_DBG=y
CONFIG_SENSOR_LOG_LEVEL_DBG=y
CONFIG_REGULATOR_LOG_LEVEL_DBG=y
CONFIG_GPIO_AS_PINRESET=n

Parents Reply Children
No Data
Related