Browse Source
Added a sample for using the PAJ7620 gesture sensor Signed-off-by: Paul Timke Contreras <ptimkec@live.com>pull/88880/head
7 changed files with 205 additions and 0 deletions
@ -0,0 +1,9 @@
@@ -0,0 +1,9 @@
|
||||
# Copyright (c) 2025 Paul Timke <ptimkec@live.com> |
||||
# SPDX-License-Identifier: Apache-2.0 |
||||
|
||||
cmake_minimum_required(VERSION 3.20.0) |
||||
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) |
||||
project(paj7620_gesture) |
||||
|
||||
FILE(GLOB app_sources src/*.c) |
||||
target_sources(app PRIVATE ${app_sources}) |
@ -0,0 +1,10 @@
@@ -0,0 +1,10 @@
|
||||
# Copyright (c) 2025 Paul Timke <ptimkec@live.com> |
||||
# SPDX-License-Identifier: Apache-2.0 |
||||
|
||||
mainmenu "PAJ7620 sample application" |
||||
|
||||
config APP_USE_POLLING |
||||
bool "Select y to use polling, otherwise the sample will use triggers" |
||||
default y |
||||
|
||||
source "Kconfig.zephyr" |
@ -0,0 +1,41 @@
@@ -0,0 +1,41 @@
|
||||
.. zephyr:code-sample:: paj7620_gesture |
||||
:name: PAJ7620 Gesture Sensor |
||||
:relevant-api: sensor_interface |
||||
|
||||
Get hand gesture data from PAJ7620 sensor. |
||||
|
||||
Overview |
||||
******** |
||||
|
||||
This sample application gets the output of a gesture sensor (paj7620) using either polling or |
||||
triggers (depending on CONFIG_APP_USE_POLLING) and outputs the corresponding gesture to the |
||||
console, each time one is detected. |
||||
|
||||
Requirements |
||||
************ |
||||
|
||||
To use this sample, the following hardware is required: |
||||
|
||||
* A board with I2C support and GPIO to detect external interrutps |
||||
* PAJ7620 sensor |
||||
|
||||
Building and Running |
||||
******************** |
||||
|
||||
This sample outputs data to the console. It requires a PAJ7620 sensor. |
||||
|
||||
.. zephyr-app-commands:: |
||||
:zephyr-app: samples/sensor/paj7620_gesture |
||||
:board: nucleo_f334r8 |
||||
:goals: build |
||||
:compact: |
||||
|
||||
Sample Output |
||||
============= |
||||
|
||||
.. code-block:: console |
||||
|
||||
Gesture LEFT |
||||
Gesture RIGHT |
||||
Gesture UP |
||||
Gesture DOWN |
@ -0,0 +1,13 @@
@@ -0,0 +1,13 @@
|
||||
&gpioa { |
||||
status = "okay"; |
||||
}; |
||||
|
||||
&i2c1 { |
||||
status = "okay"; |
||||
|
||||
paj7620: paj7620@73 { |
||||
compatible = "pixart,paj7620"; |
||||
reg = <0x73>; |
||||
int-gpios = <&gpioa 9 (GPIO_PULL_UP)>; |
||||
}; |
||||
}; |
@ -0,0 +1,5 @@
@@ -0,0 +1,5 @@
|
||||
CONFIG_GPIO=y |
||||
CONFIG_STDOUT_CONSOLE=y |
||||
CONFIG_I2C=y |
||||
CONFIG_SENSOR=y |
||||
CONFIG_PAJ7620_TRIGGER_OWN_THREAD=y |
@ -0,0 +1,17 @@
@@ -0,0 +1,17 @@
|
||||
sample: |
||||
name: PAJ7620 gesture trigger sample |
||||
tests: |
||||
sample.sensor.paj7620_gesture_trig: |
||||
build_only: true |
||||
tags: sensors |
||||
platform_allow: nucleo_f334r8 |
||||
depends_on: |
||||
- i2c |
||||
- gpio |
||||
filter: dt_compat_enabled("pixart,paj7620") |
||||
sample.sensor.paj7620_gesture_polling: |
||||
build_only: true |
||||
tags: sensors |
||||
platform_allow: nucleo_f334r8 |
||||
depends_on: i2c |
||||
filter: dt_compat_enabled("pixart,paj7620") |
@ -0,0 +1,110 @@
@@ -0,0 +1,110 @@
|
||||
/*
|
||||
* Copyright (c) 2025 Paul Timke <ptimkec@live.com> |
||||
* |
||||
* SPDX-License-Identifier: Apache-2.0 |
||||
*/ |
||||
|
||||
#include <zephyr/kernel.h> |
||||
#include <zephyr/drivers/sensor.h> |
||||
#include <zephyr/drivers/sensor/paj7620.h> |
||||
|
||||
#define GESTURE_POLL_TIME_MS 100 |
||||
|
||||
K_SEM_DEFINE(sem, 0, 1); /* starts off "not available" */ |
||||
|
||||
static void trigger_handler(const struct device *dev, const struct sensor_trigger *trigger) |
||||
{ |
||||
ARG_UNUSED(trigger); |
||||
|
||||
if (sensor_sample_fetch(dev) < 0) { |
||||
printf("sensor_sample_fetch failed\n"); |
||||
return; |
||||
} |
||||
|
||||
k_sem_give(&sem); |
||||
} |
||||
|
||||
static void print_hand_gesture(uint16_t gest_flags) |
||||
{ |
||||
if ((gest_flags & PAJ7620_FLAG_GES_UP) != 0) { |
||||
printf("Gesture UP\n"); |
||||
} |
||||
if ((gest_flags & PAJ7620_FLAG_GES_DOWN) != 0) { |
||||
printf("Gesture DOWN\n"); |
||||
} |
||||
if ((gest_flags & PAJ7620_FLAG_GES_LEFT) != 0) { |
||||
printf("Gesture LEFT\n"); |
||||
} |
||||
if ((gest_flags & PAJ7620_FLAG_GES_RIGHT) != 0) { |
||||
printf("Gesture RIGHT\n"); |
||||
} |
||||
if ((gest_flags & PAJ7620_FLAG_GES_FORWARD) != 0) { |
||||
printf("Gesture FORWARD\n"); |
||||
} |
||||
if ((gest_flags & PAJ7620_FLAG_GES_BACKWARD) != 0) { |
||||
printf("Gesture BACKWARD\n"); |
||||
} |
||||
if ((gest_flags & PAJ7620_FLAG_GES_CLOCKWISE) != 0) { |
||||
printf("Gesture CLOCKWISE\n"); |
||||
} |
||||
if ((gest_flags & PAJ7620_FLAG_GES_COUNTERCLOCKWISE) != 0) { |
||||
printf("Gesture COUNTER CLOCKWISE\n"); |
||||
} |
||||
} |
||||
|
||||
static void trigger_main_loop(const struct device *dev) |
||||
{ |
||||
struct sensor_value data; |
||||
|
||||
while (1) { |
||||
k_sem_take(&sem, K_FOREVER); |
||||
|
||||
(void)sensor_channel_get(dev, (enum sensor_channel)SENSOR_CHAN_PAJ7620_GESTURES, |
||||
&data); |
||||
|
||||
print_hand_gesture(data.val1); |
||||
} |
||||
} |
||||
|
||||
static void polling_main_loop(const struct device *dev) |
||||
{ |
||||
struct sensor_value data; |
||||
|
||||
while (1) { |
||||
(void)sensor_sample_fetch(dev); |
||||
(void)sensor_channel_get(dev, (enum sensor_channel)SENSOR_CHAN_PAJ7620_GESTURES, |
||||
&data); |
||||
|
||||
print_hand_gesture(data.val1); |
||||
k_msleep(GESTURE_POLL_TIME_MS); |
||||
} |
||||
} |
||||
|
||||
int main(void) |
||||
{ |
||||
int ret; |
||||
const struct device *dev = DEVICE_DT_GET_ONE(pixart_paj7620); |
||||
|
||||
struct sensor_trigger trig = { |
||||
.type = SENSOR_TRIG_MOTION, |
||||
.chan = (enum sensor_channel)SENSOR_CHAN_PAJ7620_GESTURES, |
||||
}; |
||||
|
||||
if (!device_is_ready(dev)) { |
||||
printf("Device %s is not ready\n", dev->name); |
||||
return -ENODEV; |
||||
} |
||||
|
||||
if (IS_ENABLED(CONFIG_APP_USE_POLLING)) { |
||||
polling_main_loop(dev); |
||||
} else { |
||||
/* App was configured to NOT use polling, so use triggers */ |
||||
ret = sensor_trigger_set(dev, &trig, trigger_handler); |
||||
if (ret < 0) { |
||||
printf("Could not set trigger\n"); |
||||
return ret; |
||||
} |
||||
|
||||
trigger_main_loop(dev); |
||||
} |
||||
} |
Loading…
Reference in new issue