- 2025-06-08
-
回复了主题帖:
【CY8CKIT_062S2_AI测评】3、雷达存在检测以及MQTT数据上报
lugl4313820 发表于 2025-6-8 09:45
这个雷达可以检测的项目多吗?比如能检测活体存吗?
可以,区域内的活动检测是可以实现的。
- 2025-06-02
-
发表了主题帖:
【CY8CKIT_062S2_AI测评】3、雷达存在检测以及MQTT数据上报
本帖最后由 EPTmachine 于 2025-6-2 10:36 编辑
开发板板载的雷达芯片为XENSIV 60GHz RADAR sennor。型号为BGT60TR13,雷达的配置1发1收的配置,只可以检测距离信息。
雷达芯片的介绍网站为
https://www.infineon.com/cms/en/product/sensor/radar-sensors/radar-sensors-for-iot/60ghz-radar/bgt60tr13c/
该款雷达芯片有配套的 Radar Development Kit用于配置雷达芯片的工作模式以及数据处理接口函数。
雷达的工作原理是通过发出FMCW(Frequency Modulated Continuous Wave,调频连续波),接收反射的电磁波,依据反射的时间和波形来确定物体的存在信息。在使用雷达前需要对雷达芯片发出的波形的进行配置。雷达波形可以通过json文件来描述。
```bash
./bgt60-configurator-cli -c radar_low_framerate_config.json -d -o radar_low_framerate_config.h
```
得到的`radar_low_framerate_config.h`文件中存放配置雷达芯片寄存器的值,用于雷达发送设定的FMCW波。英飞凌官方示例中有雷达探测的示例,参考其中的示例的流程,可以快速实现雷达探测输出的应用。
# 1、添加工程需要的库
在library manager中打开添加库的界面,搜索FreeRTOS、雷达探测相关的库
添加完成后,点击library manager中的Update按钮,对库进行更新,然后关闭该界面。
回到主工程,在工程顶层目录中创建src文件夹用于存放源代码,将main.c文件移动该文件夹。
在mtb_shared文件夹中可以找到添加的库组件的ReadME.md文件,依据其中的说明,修改工程配置,从而可以使用库开发应用程序。
# 2、初始化雷达芯片
设定雷达芯片使用的SPI引脚和通讯速率,用于初始化用于与雷达芯片通讯的SPI接口。
```c++
#define PIN_XENSIV_BGT60TRXX_SPI_SCLK CYBSP_RSPI_CLK
#define PIN_XENSIV_BGT60TRXX_SPI_MOSI CYBSP_RSPI_MOSI
#define PIN_XENSIV_BGT60TRXX_SPI_MISO CYBSP_RSPI_MISO
#define PIN_XENSIV_BGT60TRXX_SPI_CSN CYBSP_RSPI_CS
#define PIN_XENSIV_BGT60TRXX_IRQ CYBSP_RSPI_IRQ
#define PIN_XENSIV_BGT60TRXX_RSTN CYBSP_RXRES_L
```
之前获得`radar_low_framerate_config.h`可以用于配置雷达芯片发出指定的Chirp。定义用于处理雷达数据就绪中断的回调函数,将数据传输到radar_data_management模块,用于后续的处理。
```c++
static int32_t init_sensor(void)
{
if (cyhal_spi_init(&spi_obj,
PIN_XENSIV_BGT60TRXX_SPI_MOSI,
PIN_XENSIV_BGT60TRXX_SPI_MISO,
PIN_XENSIV_BGT60TRXX_SPI_SCLK,
NC,
NULL,
8,
CYHAL_SPI_MODE_00_MSB,
false) != CY_RSLT_SUCCESS)
{
printf("[MSG] ERROR: cyhal_spi_init failed\n");
return -1;
}
/* Reduce drive strength to improve EMI */
Cy_GPIO_SetSlewRate(CYHAL_GET_PORTADDR(PIN_XENSIV_BGT60TRXX_SPI_MOSI), CYHAL_GET_PIN(PIN_XENSIV_BGT60TRXX_SPI_MOSI), CY_GPIO_SLEW_FAST);
Cy_GPIO_SetDriveSel(CYHAL_GET_PORTADDR(PIN_XENSIV_BGT60TRXX_SPI_MOSI), CYHAL_GET_PIN(PIN_XENSIV_BGT60TRXX_SPI_MOSI), CY_GPIO_DRIVE_1_8);
Cy_GPIO_SetSlewRate(CYHAL_GET_PORTADDR(PIN_XENSIV_BGT60TRXX_SPI_SCLK), CYHAL_GET_PIN(PIN_XENSIV_BGT60TRXX_SPI_SCLK), CY_GPIO_SLEW_FAST);
Cy_GPIO_SetDriveSel(CYHAL_GET_PORTADDR(PIN_XENSIV_BGT60TRXX_SPI_SCLK), CYHAL_GET_PIN(PIN_XENSIV_BGT60TRXX_SPI_SCLK), CY_GPIO_DRIVE_1_8);
/* Set the data rate to 25 Mbps */
if (cyhal_spi_set_frequency(&spi_obj, XENSIV_BGT60TRXX_SPI_FREQUENCY) != CY_RSLT_SUCCESS)
{
printf("[MSG] ERROR: cyhal_spi_set_frequency failed\n");
return -1;
}
#if defined (TARGET_APP_CYSBSYSKIT_DEV_01) || (TARGET_APP_KIT_BGT60TR13C_EMBEDD)
/* Enable LDO */
if (cyhal_gpio_init(PIN_XENSIV_BGT60TRXX_LDO_EN,
CYHAL_GPIO_DIR_OUTPUT,
CYHAL_GPIO_DRIVE_STRONG,
true) != CY_RSLT_SUCCESS)
{
printf("[MSG] ERROR: LDO_EN cyhal_gpio_init failed\n");
return -1;
}
#endif
/* Wait LDO stable */
(void)cyhal_system_delay_ms(5);
if (xensiv_bgt60trxx_mtb_init(&bgt60_obj,
&spi_obj,
PIN_XENSIV_BGT60TRXX_SPI_CSN,
PIN_XENSIV_BGT60TRXX_RSTN,
register_list_macro_only, // default config with macro settings
XENSIV_BGT60TRXX_CONF_NUM_REGS_MACRO) != CY_RSLT_SUCCESS)
{
printf("[MSG] ERROR: xensiv_bgt60trxx_mtb_init failed\n");
return -1;
}
if (xensiv_bgt60trxx_mtb_interrupt_init(&bgt60_obj,
NUM_SAMPLES_PER_FRAME*2,
PIN_XENSIV_BGT60TRXX_IRQ,
GPIO_INTERRUPT_PRIORITY,
xensiv_bgt60trxx_interrupt_handler,
NULL) != CY_RSLT_SUCCESS)
{
printf("[MSG] ERROR: xensiv_bgt60trxx_mtb_interrupt_init failed\n");
return -1;
}
return 0;
}
#if defined(CYHAL_API_VERSION) && (CYHAL_API_VERSION >= 2)
static void xensiv_bgt60trxx_interrupt_handler(void *args, cyhal_gpio_event_t event)
#else
static void xensiv_bgt60trxx_interrupt_handler(void *args, cyhal_gpio_irq_event_t event)
#endif
{
CY_UNUSED_PARAMETER(args);
CY_UNUSED_PARAMETER(event);
mgr.run(true);
}
```
# 3、创建数据采集任务
使用示例程序的radar_date_managment结构体以及接口函数,使用一个可以容纳6帧雷达数据的FIFO,设置FIFO的可读出的帧个数为2,当通过SPI总线读取的雷达数据达到两帧后,在雷达数据就绪中断函数中调用`mgr.run(true)`进行数据的缓存和发布。调用TasKNotifyGive函数通知订阅雷达数据的main_task任务处理读取出的数据。
```c
/*
* trigger radar data manager
*/
#ifdef FREERTOS_AWARE
void
radar_data_manager_run(bool run_from_isr)
#else
void
radar_data_manager_run()
#endif
{
uint32_t samples;
if (manager.tail < manager.buff_size)
{
int32_t result = manager_interface->in_read_radar_data((void*)(manager.buffer + manager.tail), &samples,
(manager.buff_size - manager.tail));
if (result >= 0)
{
if ( samples = manager.fill_level)
{
#ifdef FREERTOS_AWARE
//now inform all subscribers about available data
for (int sub = 1; sub range_bin,
event->timestamp);
snprintf(publisher_q_data.data, sizeof(publisher_q_data.data), "{\"PRESENCE\": \"IN macro%d\"}",event->range_bin);
break;
case XENSIV_RADAR_PRESENCE_STATE_MICRO_PRESENCE:
cyhal_gpio_write(USER_LED1, true);
cyhal_gpio_write(USER_LED2, false);
printf("[INFO] micro presence %" PRIi32 " %" PRIi32 "\n",
event->range_bin,
event->timestamp);
break;
case XENSIV_RADAR_PRESENCE_STATE_ABSENCE:
printf("[INFO] absence %" PRIu32 "\n", event->timestamp);
cyhal_gpio_write(USER_LED1, false);
cyhal_gpio_write(USER_LED2, true);
snprintf(publisher_q_data.data, sizeof(publisher_q_data.data), "{\"PRESENCE\": \"OUT\"}");
break;
default:
printf("[MSG] ERROR: Unknown reported state in event handling\n");
break;
}
/* Send message back to publish queue. */
xQueueSendToBack(publisher_task_q, &publisher_msg, 0 );
}
```
# 6、运行演示
将编译好的程序烧录到开发板,在电脑上部署MQTT服务器。
开发板连接到电脑后,可以在收集端的APP对雷达的检测效果进行查看,可以看到可以检测到活动的物体出现在不同的检测区域。由于雷达是1发1收的,只能检测到距离信息。
[localvideo]12105a4080e2b5e7aa78619df079da6e[/localvideo]
# 7、总结
英飞凌的雷达芯片的探测和反应速度都比较平稳,在市面上也可以找到很多采用英飞凌的雷达模块,而且英飞凌提供的库函数支持便于使用,使用英飞凌做雷达应用很方便。完整的程序在附件中
- 2025-05-24
-
发表了主题帖:
【CY8CKIT_062S2_AI测评】2、AI处理IMU传感器数据,识别不同轨迹
本帖最后由 EPTmachine 于 2025-5-25 15:54 编辑
2023年5月17日,英飞凌宣布已收购瑞典斯德哥尔摩初创企业Imagimob。经过整合之后,现在使用DEEPCRAFT Studio来表示英飞凌的边缘AI开发工具。该工具安装在ModusTool Setup查看安装状态。
# 1、DEEPCRAFT Studio开发流程
以下链接为DEEPCRAFT Studio的使用说明。本文根据以下链接中的指南进行,具体开发时建议参考官方最新文档操作,版本更新变化会导致以下操作对不上。
https://developer.imagimob.com/
DEEPCRAFT Studio集成数据采集和标注、管理、分析并处理数据用于构建模型,迭代选取最优模型,并最终部署到边缘AI设备整套流程的功能。利用DEEPCRAFT Studio开发边缘AI的流程如下。
按照上述流程,通过收集在不同运动轨迹(圆形、水平、上下、静止)下IMU惯性传感器的数据,对数据进行收集、标注后,训练轨迹识别模型。部署模型到开发板,采集IMU数据,通过部署的模型识别轨迹的类型,并通过串口上报。
# 2、Data Preparation数据收集
CY8CKIT_062S2_AI开发套件烧录支持Tensor Streaming Protocol Version 2传输协议的固件`streaming-firmware-ai-eval-kit.hex`。关于固件的具体烧录方法可以查看以下链接。
https://developer.imagimob.com/getting-started/infineon-ai-evaluation-kit
使用ModusToolBox Programmer烧录采集采集传感器信息的固件。
烧录完成后,PC与开发板的J1 USB接口连接,在DEEPCRAFT Studio中进行数据收集。
DEEPCRAFT Studio中创建Graph UX工程,通过图形化的方式完成数据收集和标记的过程。在工程的Node Explore中添加IMU数据输入点。
同时添加一个Visualization->Data Track用于收集数据,连接创建出来的连个结点,从而创建一个收集IMU数据的工作流。
点击工具栏中的Start按钮,开始收集IMU数据。采集时长为一分钟的数据,保持开发板在某种轨迹中运动,采集满一分钟后停止数据记录。
保存采集到的数据,设置采集的数据集名称为对应的运动轨迹(这样有助于模型训练进行分类)
重复上述过程,收集开发板在四种不同运动(static、circle、horizontal、vertical)状态下的IMU数据,每种状态收集25组数据用于模型的训练。
# 3、Preprocessing数据预处理
创建Classification工程用于对采集到数据进行处理和后续的模型训练。
将收集到的数据复制粘贴到工程的Data文件中(如果没有,则创建一个Data文件夹),导入数据后,在面板上可以查看数据的状态。
数据出错一般是有在采集数据时标注的范围有问题,打开有问题的文件,拖动标注条即可。修改该完成后,重新扫描数据集即可。
数据校验完成后,对数据集进行分配,分别用于模型训练过程中的训练和验证,以及模型的测试。
接下来在Preprocessor栏中添加数据预处理项。
添加完成后,执行相应的配置,完成对数据的预处理
# 4、Model Training模型训练
完成上述数据处理流程,在Training面板,设置模型的参数。
点击“Start New Training Job”登录到Imagimob Cloud执行模型训练任务。
在Imagimob Cloud的面板中可以查看当前任务的进度。等待模型训练完成即可
模型训练完成后可以查看训练的效果。
# 5、Code Generation and Model Deployment 代码生成和模型部署
从Imagimob Cloud下载训练完成的模型。
打开下载文件中.h5文件,设定代码生成的目标芯片、模型文件路径以及加速参数,生成相应的代码文件。
得到的文件中模型代码文件为model.c/h,模型函数接口说明如下。
https://developer.imagimob.com/deployment
在英飞凌的官方示例中,给出了一个IMU传感器进行运动检测的`DEEPCRAFT_Deploy_Model_Motion`示例,将训练好的模型文件model.c/h替换掉工程中原有的文件即可对训练好的模型进行验证,替换完成后编译工程。
烧录到开发板上后,通过串口获取模型识别结果。
可以正确识别出轨迹的发生,但是识别的稳定性存在抖动,IMU这种灵敏的传感器,在AI的加持下可以用来识别轨迹,但是也存在不稳定的问题。
# 6、总结
英飞凌的DEEPCRAFT Studio提供从数据采集、标注、模型训练、模型优化以及代码部署的功能,工具提供的功能可以满足开发者的需要,使用起来还是很方便的。
- 2025-05-23
-
回复了主题帖:
2025ST峰会见闻和感受
秦天qintian0303 发表于 2025-5-23 12:10
老哥收获满满啊
上午场发了块板卡,参加活动很不错
-
回复了主题帖:
2025ST峰会见闻和感受
吾妻思萌 发表于 2025-5-23 16:04
最后那个残影是拍摄原因还是屏幕原因啊?我感觉不应该啊
应该是设置问题,TouchGFX用得不熟练
-
回复了主题帖:
2025ST峰会见闻和感受
nmg 发表于 2025-5-23 14:20
这些GUI的效果很cool啊
“STLINK-V3PWR测量STM32U3在不同功耗模式下的电流消耗”, ...
出了很久了,只不过因为价格高,用的人少
- 2025-05-22
-
发表了主题帖:
2025ST峰会见闻和感受
本帖最后由 EPTmachine 于 2025-5-23 11:44 编辑
本次ST峰会有幸得到ST和EEWorld论坛提供的特邀参会机会。展会展出ST以及合作伙伴的产品的最新进展。
# 1 展会见闻
在N6的展台,星瞳科技和正点原子都在展位上展出自家基于STM32N6的开发板。星瞳科技的OpenMV系列产品专门为视觉应用准备,外观小巧,搭载STM32N6,很适合创客开发有创意的视觉应用。正点原子的ATK-DNN647开发目前还在SOP阶段,相信很快就能上市与开发者见面,搭载的芯片为STM32N647XOH3Q,提供的很多的接口,比如CAN-FD、RS232、RS485、以太网接口、音频输入输出接口、USB、RGBLCD、MIPI、CSI等。
在低功耗产品展台,展示的STM32U3系列芯片在Standby模式下的电流值为9.8μA,使用的测量工具是STLINK-PWRV3。这样的低功耗设计,在业内算是排得上号的。
STM32MP系列的展台比较多,展示合作伙伴的产品,比如正点原子的ATK-DLMP257B开发板.
STM32MP系列部署Codesys构成的传感器监控网络和显示面板.
在慕尼黑上展示的STM32MP2视觉手势识别控制机械手的方案在现场也有展示,效果挺好.
[localvideo]89f9561b2913b2cf1fedb80072953c03[/localvideo]
STM32在智能家居方面展出KNX连接智能家居的解决方案,在树莓派上部署HomeAssistant显示连接的智能家居产品,比如ToF传感器,触摸面板,空调控制器,RGB驱动,STM32系列产品在智能家居中给的解决方案形式还是很多的,其中的一些成品可以参考.
# 2 现场实训
ST在现场还提供不同产品的实训,上午参加U3超低功耗编程,体验如何使用STLINK-V3PWR测量STM32U3在不同功耗模式下的电流消耗.经过现场的实操,在开启SMPS功能后,在run模式下的电流消耗在2000μA.Sleep模式下能达到800μA,STOP2模式下在20μA,Standby模式下在10μA.和展台上展示的效果是一致的.
同时体验如何开启在STOP模式下的调试功能,一方面要确认Debug接口的引脚配置为调试模式,另一方面要在程序中调用以下函数.
```c
HAL_DBGMCU_EnableDBGStopMode();
```
这样就可以在STOP模式中使用调试功能来调试代码.
下午场参加GUI解决方案的实训,现场使用正点原子的H7RX开发板体验lvgl解决方案,同时修改原有代码,调用lvgl函数实现界面之间的跳转,实际效果如下.
后续还使用TouchGFX设计界面UI实现动态的GUI效果.
通过参加上述两场实训,收获很多,体验不同产品的同时,而且锻炼自己的编程技巧,是不可多得的好活动.
# 3 总结
这次ST峰会不仅展示不同产品的解决方案,同时也提供现场的操作演示,在现场就可以了解产品的实际性能,是十分不错的活动.
- 2025-05-14
-
发表了主题帖:
【CY8CKIT_062S2_AI测评】1、MQTT监控开发板LED、按键和气压传感器信息
本帖最后由 EPTmachine 于 2025-5-15 16:41 编辑
开发板的系统框图如下,其中带有Wifi模块,可以用于MQTT应用。
在VSCode中创建新的工程,在弹出的BSP选择页面中,根据开发板的类型选择CY8CKIT-062S2-AI。
在应用选择界面,选择MQTT应用实例,并设置工程名。完成后,点击创建按钮,完成工程创建。
在该示例的基础上进行修改即可实现MQTT应用。
## 1、硬件资源
板载的两个LED灯,一个SW2用户按键,一个dps368气压计、bmi270六轴惯性传感器、bmm350磁力计。使用不同的MQTT TOPIC来管理不同外设的信息,在对应的TOPIC值中设置对象的字符串信息,调用MQTT的消息API,对开发板上的外设进行管理。
https://www.infineon.com/cms/en/product/evaluation-boards/cy8ckit-062s2-ai/
通过上面的链接查看CY8CKIT-062S20AI的产品页面,下载开发套件的用户手册。
在硬件介绍页面可以找到上述硬件的原理图和引脚信息。
LED的信息如下
SW2的信息如下
DPS368气压传感器的信息如下,I2C地址为0x77
## 2、程序开发
CY8CKIT-062S20AI是英飞凌官方的开发套件,开发板上的外设都有相应的示例程序和库函数用于开发,很多程序可以参考官方的示例来实现。在参考示例的前提下,实现通过MQTT协议,监控板载的按键、气压传感器、六轴惯性传感器和三轴磁力计的数据;
英飞凌提供的示例代码结构清晰,注释也很多。板上外设都有对应的驱动库,只需要添加相应的库函数,通过调用接口API,就可以完成相应的应用。
这里参考示例中的Wifi MQTT Client来实现MQTT通讯。
### 2.1 运行示例
修改Wifi MQTT Client示例`configs/wifi_config.h`的WIFI_SSID和WIFI_PASSWORD,指定连接Wiif热点信息,和`configs/mqtt_client_config.h`的MQTT_BROKER_ADDRESS等MQTT通讯配置信息。编译工程后,就可以运行示例。
在PC端使用mosquitto部署本地的MQTT服务器用于演示。下载安装mosquitto软件。
https://mosquitto.org/download/
修改安装路径下的mosquitto.conf文件,设置MQTT Borker服务器的监听地址、登录授权配置。
```bash
listener 1883 #服务器监听端口
allow_anonymous false #禁止匿名登录
password_file pwfile.example #指定验证信息位置
```
在命令行中运行下列指令,添加登录ID,根据提示输入密码,完成登录账户的配置
```powershell
“./mosquitto_passwd -c pwfile.example eeworld
```
运行`.\mosquitto -c .\mosquitto.conf -v`运行配置好的服务器。
利用手机端的MQTT客户端配置服务器,可以看到服务器端接收连接和订阅信息。
示例程序中通过发布和订阅“ledstatus”的主题,实现板载LED的控制。在手机端的MQTT客户端配置主题为“ledstatus”的控件。
打开示例程序后,在VSCode中选择Terminal->Run_Task指令。
在弹出的对话框中选择编译和烧录任务,将程序烧录到开发板上。
程序运行后,设备连接到搭建好的MQTT服务器,可以通过按键改变LED状态,发布“ledstatus”主题的消息,在APP上现实。同时也可以通过APP应用发布相同的主题消息,来控制板载LED。
### 2.2 程序修改
Wifi MQTT Client示例实现对板载的LED的状态控制,在示例的基础上,添加读取气压传感器、六轴IMU传感器和三轴磁力计数据的程序,并将数据以不同的MQTT消息,发布到MQTT网络中,即可实现对开发板状态的监控。
在英飞凌官方的驱动库中,可以找到板载传感器的驱动库,使用Library Manager工具可以对工程需要使用的库进行管理。
在Library Manager界面中根据需要添加额外的库文件。
在VSCode的文件标签栏中,可以查看添加的库文件中的ReadME.md文件,了解如何使用接口API。
dps368气压传感器可用于监测环境的气压值。查看库函数的ReadMe.md可以了解如何初始化传感器和获取气压数据。主要使用的库函数如下.
```c
xensiv_dps3xx_mtb_init_i2c(&pressure_sensor, &i2c, XENSIV_DPS3XX_I2C_ADDR_DEFAULT);
xensiv_dps3xx_read(&pressure_sensor, &pressure, &temperature);
```
参考英飞凌例程中用于采集传感器数据的例程,添加读取气压传感器数据并发送到MQTT网络的功能.
在工程新添加的文件夹和文件如下.
dev_dps368.h/c中完成传感器的初始化和数据读取函数.主要的函数如下.
```c
typedef struct {
float data_buffer[2];
xensiv_dps3xx_t dps3xx;
} dev_dps368_t;
static dev_dps368_t* dps368_p;
/*******************************************************************************
* Function Prototypes
*******************************************************************************/
static bool _init_hw(dev_dps368_t* dps, cyhal_i2c_t* i2c)
{
cy_rslt_t result;
/* Initialize pressure sensor */
result = xensiv_dps3xx_mtb_init_i2c(&dps->dps3xx, i2c, DPS368_ADDRESS);
if (result != CY_RSLT_SUCCESS)
{
return false;
}
printf("dps368: Initialized device.\r\n");
return true;
}
bool dev_dps368_register(cyhal_i2c_t* i2c)
{
int status;
dps368_p= (dev_dps368_t*)malloc(sizeof(dev_dps368_t));
if(dps368_p == NULL)
{
return false;
}
memset(dps368_p, 0, sizeof(dev_dps368_t));
/* Initialize the DPS device with the provided I2C interface */
if(!_init_hw(dps368_p, i2c))
{
free(dps368_p);
return false;
}
return true;
}
void dev_dps368_read(float* p_pressure,float* p_temperature)
{
xensiv_dps3xx_read(&dps368_p->dps3xx, p_pressure, p_temperature);
}
```
system.c/h中完成I2C外设和传感器的初始化.主要的代码如下
```c
static bool _init_i2c(cyhal_i2c_t* i2c)
{
cy_rslt_t result;
/* I2C config structure */
cyhal_i2c_cfg_t i2c_config =
{
.is_slave = false,
.address = 0,
.frequencyhal_hz = 400000
};
/* Initialize I2C for IMU communication */
result = cyhal_i2c_init(i2c, CYBSP_I2C_SDA, CYBSP_I2C_SCL, NULL);
if(result != CY_RSLT_SUCCESS)
{
return false;
}
/* Configure the I2C */
result = cyhal_i2c_configure(i2c, &i2c_config);
if(result != CY_RSLT_SUCCESS)
{
return false;
}
return true;
}
void system_load_device_drivers(void)
{
static cyhal_i2c_t i2c;
/* Enable i2c */
if(!_init_i2c(&i2c))
{
printf("Init i2c failed.\n");
}
#ifdef IM_ENABLE_DPS368
if(!dev_dps368_register(&i2c))
{
printf("DPS368 registration failed.\n");
}
#endif
}
```
dps_task.c/h完成周期读取传感器数据,并发送数据到MQTT发布队列中,触发MQTT消息发布.任务函数如下
```c
void dps368_task(void *pvParameters)
{
publisher_data_t publisher_q_data;
/* Assign the publish command to be sent to the publisher task. */
publisher_q_data.cmd = PUBLISH_MQTT_MSG_DPS368;
while(true)
{
dev_dps368_read(&dps368_data_buff.press,&dps368_data_buff.temprature);
/* Send the command and data to publisher task over the queue */
xQueueSend(publisher_task_q, &publisher_q_data,portMAX_DELAY);
vTaskDelay(30000);
}
}
```
在publish_task.c/h中添加用于管理dps368数据发布的定义和函数调用,相关的代码如下
```c
/* Commands for the Publisher Task. */
typedef enum
{
PUBLISHER_INIT,
PUBLISHER_DEINIT,
PUBLISH_MQTT_MSG_BUTTON,
PUBLISH_MQTT_MSG_DPS368
} publisher_cmd_t;
void publisher_task(void *pvParameters)
{
......
case PUBLISH_MQTT_MSG_DPS368:
{
sprintf(dsp368_msg,"press is %f,temp is %f\n",dps368_data_buff.press,dps368_data_buff.temprature);
publish_dps368.payload=dsp368_msg;
publish_dps368.payload_len=strlen(publish_dps368.payload);
result = cy_mqtt_publish(mqtt_connection, &publish_dps368);
if (result != CY_RSLT_SUCCESS)
{
printf(" Publisher: MQTT Publish failed with error 0x%0X.\n\n", (int)result);
/* Communicate the publish failure with the the MQTT
* client task.
*/
mqtt_task_cmd = HANDLE_MQTT_PUBLISH_FAILURE;
xQueueSend(mqtt_task_q, &mqtt_task_cmd, portMAX_DELAY);
}
print_heap_usage("publisher_task: After publishing an MQTT message");
break;
}
......
}
```
添加上述代码后,实现5秒更新一次传感器数据的功能。发出的数据消息在APP上以文字标签的样式显示。订阅设定的MQTT主题,连接开发板后,可以看到程序接收到开发板发送的气压传感器数据.
[localvideo]64343133c0637703a257947e21e764d3[/localvideo]
同样地,在按键按下后,根据当前按键控制的状态变量的值,切换不同的消息,以MQTT信息的方式发布到MQTT网络中。相关的代码如下
```c
//按键回调函数,检测按键事件,发送发布MQTT数据的信号量
static void isr_button_press(void *callback_arg, cyhal_gpio_event_t event)
{
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
publisher_data_t publisher_q_data;
/* To avoid compiler warnings */
(void) callback_arg;
(void) event;
/* Assign the publish command to be sent to the publisher task. */
publisher_q_data.cmd = PUBLISH_MQTT_MSG_BUTTON;
if(current_button_state==BUTTON_ON_STATE)
{
publisher_q_data.data = (char *)MQTT_BUTTON_PRESSED_MESSAGE;
current_button_state = BUTTON_OFF_STATE;
}
else
{
publisher_q_data.data = (char *)MQTT_BUTTON_RELEASED_MESSAGE;
current_button_state = BUTTON_ON_STATE;
}
/* Send the command and data to publisher task over the queue */
xQueueSendFromISR(publisher_task_q, &publisher_q_data, &xHigherPriorityTaskWoken);
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
//发布按键事件对应的MQTT消息。
case PUBLISH_MQTT_MSG_BUTTON:
{
/* Publish the data received over the message queue. */
publish_info.payload = publisher_q_data.data;
publish_info.payload_len = strlen(publish_info.payload);
printf("\nPublisher: Publishing '%s' on the topic '%s'\n",
(char *) publish_info.payload, publish_info.topic);
result = cy_mqtt_publish(mqtt_connection, &publish_info);
if (result != CY_RSLT_SUCCESS)
{
printf(" Publisher: MQTT Publish failed with error 0x%0X.\n\n", (int)result);
/* Communicate the publish failure with the the MQTT
* client task.
*/
mqtt_task_cmd = HANDLE_MQTT_PUBLISH_FAILURE;
xQueueSend(mqtt_task_q, &mqtt_task_cmd, portMAX_DELAY);
}
print_heap_usage("publisher_task: After publishing an MQTT message");
break;
}
```
在接收到信息后改变APP端的图标状态。
[localvideo]1be5c2bbf8b1477564b7399c17e92657[/localvideo]
在APP上设置状态切换控件,通过发布“TURN ON”和“TURN OFF”两个不同的消息。开发板的订阅任务通过订阅"ledstatus"主题的消息,控制开发板上的LED灯状态。主要的代码如下。
```c
//接收到订阅的消息后,对消息数据进行解析,发送更新状态的信号量。
void mqtt_subscription_callback(cy_mqtt_publish_info_t *received_msg_info)
{
/* Received MQTT message */
const char *received_msg = received_msg_info->payload;
int received_msg_len = received_msg_info->payload_len;
/* Data to be sent to the subscriber task queue. */
subscriber_data_t subscriber_q_data;
printf(" \nSubsciber: Incoming MQTT message received:\n"
" Publish topic name: %.*s\n"
" Publish QoS: %d\n"
" Publish payload: %.*s\n",
received_msg_info->topic_len, received_msg_info->topic,
(int) received_msg_info->qos,
(int) received_msg_info->payload_len, (const char *)received_msg_info->payload);
/* Assign the command to be sent to the subscriber task. */
subscriber_q_data.cmd = UPDATE_DEVICE_STATE;
/* Assign the device state depending on the received MQTT message. */
if ((strlen(MQTT_DEVICE_ON_MESSAGE) == received_msg_len) &&
(strncmp(MQTT_DEVICE_ON_MESSAGE, received_msg, received_msg_len) == 0))
{
subscriber_q_data.data = DEVICE_ON_STATE;
}
else if ((strlen(MQTT_DEVICE_OFF_MESSAGE) == received_msg_len) &&
(strncmp(MQTT_DEVICE_OFF_MESSAGE, received_msg, received_msg_len) == 0))
{
subscriber_q_data.data = DEVICE_OFF_STATE;
}
else
{
printf(" Subscriber: Received MQTT message not in valid format!\n");
return;
}
print_heap_usage("MQTT subscription callback");
/* Send the command and data to subscriber task queue */
xQueueSend(subscriber_task_q, &subscriber_q_data, portMAX_DELAY);
}
//根据更新信号,设置LED灯状态。
case UPDATE_DEVICE_STATE:
{
/* Update the LED state as per received notification. */
cyhal_gpio_write(CYBSP_USER_LED, subscriber_q_data.data);
/* Update the current device state extern variable. */
current_device_state = subscriber_q_data.data;
print_heap_usage("subscriber_task: After updating LED state");
break;
}
```
LED灯的变化以及MQTT数据的变化如下。
[localvideo]f802b548001466c2f89645d752f1be23[/localvideo]
# 总结
在英飞凌提供的MQTT示例基础上,添加传感器读取和消息发布的功能,可以快速开发类似的应用,进行原型验证。本文对示例程序进行修改,添加dps368气压传感器的数据库,实现对开发板上按键、LED和气压传感器数据的监控。
- 2025-05-12
-
回复了主题帖:
【CY8CKIT-062S2-AI】0.ModusToolBox环境搭建以及注意事项
lugl4313820 发表于 2025-5-12 17:59
他这个支持matter协议吗?如果可以,大佬是否出个教程。
暂时没有了解Matter的示例,会尝试做一个。
-
回复了主题帖:
【CY8CKIT-062S2-AI】0.ModusToolBox环境搭建以及注意事项
Jacktang 发表于 2025-5-12 07:45
VSCode用的人也比较多,安装相对不很复杂
Eclipse IDE用起来存在代码引用的问题(官方现在也没有解决办法),VSCode却没有,VSCode对于一般用户来说,功能够用了。
- 2025-05-11
-
发表了主题帖:
【CY8CKIT-062S2-AI】0.ModusToolBox环境搭建以及注意事项
# 开发环境搭建
英飞凌提供的开发工具支持Eclipse、VSCode、CLI多个平台,其中使用VSCode开发体验最好。以下是VSCode安装环境的使用手册的连接。
https://www.infineon.com/dgdl/Infineon-Visual-Studio-Code-user-guide-UserManual-v07_00-EN.pdf?fileId=8ac78c8c92416ca50192787be52923b2
根据手册中的安装指导,首先安装ModusToolBoxsetup。
下载[ModusToolBoxsetup](https://softwaretools.infineon.com/tools/com.ifx.tb.tool.modustoolboxsetup),方便管理安装ModusTool Box配套工具,使用该工具额可以查看已安装软件,并且提示用户缺少的依赖项。
接下来安装开发所需的工具链、编译工具等,[ModusToolBox Installation Guide](https://www.infineon.com/ModusToolboxInstallguide)文档介绍如何安装,文档详细介绍如何安装ModusTool Box相关的软件。需要安装的软件有多个,要耐心读完开发指南,避免使用的时候无从下手。
软件的安装方式分为在线安装和离线安装,在线安装对网络的要求高,对网络不稳定和无法访问网络的用户,参考[ModusToolBox 离线安装指南](https://www.infineon.com/cms/en/design-support/tools/sdk/modustoolbox-software/modustoolbox-offline-installation/)对如何进行离线安装进行介绍。
最后安装在VSCode中所需的插件,到此开发所需的开发环境搭建完成。通过ModusToolBoxsetup可以查看软件的安装情况。
## 关于应用开发的软件支持包
在VSCode中创建新的工程应用。弹出的"Project Creator"界面中根据芯片和开发板来选择不同的应用模板和示例。
在数据源设置国内数据源,提高访问速度。这种方式是在线的,速度受网络连接限制。
对于离线开发的情况,英飞凌提供离线功能。可以在网络连接有效时使用lcs-mananger-cli来使用Local Content Storage(LCS)功能来管理本地的离线BSP支持。以下为工具说明书的链接。
https://www.infineon.com/ModusToolboxLCSManager
在Windows上使用需要运行modus_shell,在搜索栏内输入"modus_shell",在搜索结果中运行modus_shell。
打开shell后,根据手册中的指引找到lcs-manager-cli工具的安装目录,运行
在用户的环境变量中设置`MTB_LOCAL_CONTENT_PATH`为数据库的安装位置,参考手册的第2节,运行“--add-all”指令,可以把在线的数据库复制到本地,大约5,6个G。
在实际使用时,Local Content的选项有时候选不上,本文的解决方法是,在用户的环境变量中添加
`MTB_USE_LOCAL_CONTENT`为True,强制使用本地数据库,这样就可以使用本地的离线数据进行开发。如果要使用在线的,将环境变量删除,注销重新登录即可。
# 总结
在安装开发环境时,软件有的功能在不断迭代和更新,参考官方最新的文档操作。
- 2025-05-10
-
回复了主题帖:
ESP32P4-Function-EV-Board小智AI演示
小智AI接口不收费,移植到H7上,语音唤醒功能可以不实现,实时音频传输功能需要想办法实现。
- 2025-05-08
-
发表了主题帖:
ESP32P4-Function-EV-Board小智AI演示
# ESP32P4-Function-EV-Board小智AI演示
小智AI在ESP32系列芯片上有很多实现方案,最近尝试在ESP32P4上移植小智AI,屏大看上去感觉不错。分享下移植的效果。
[localvideo]09eb518a9268a29553b12e70ab8e0260[/localvideo]
- 2025-05-03
-
发表了主题帖:
ESP32P4-Function-EV-Board 参考资料
# ESP32P4-Function-EV-Board 参考资料
乐鑫开发板的优势是示例程序丰富,程序开源。ESP32P4相关的资料也有很多。ESP32P4-Function-EV-Board官方的介绍页面提供开发的简要说明和硬件说明书。
https://docs.espressif.com/projects/esp-dev-kits/zh_CN/latest/esp32p4/esp32-p4-function-ev-board/user_guide.html
在ESP32P4页面可以找到芯片使用的具体说明,不过乐鑫资料之间的缺少相互索引功能,找资料时有些困难。
https://docs.espressif.com/projects/esp-idf/zh_CN/v5.4.1/esp32p4/index.html
ESP-IDF中提供芯片外设的使用示例,同时其中也有开发板的示例。包括外设的基本使用、音频、物联网应用等,配合乐鑫的idf.py 工具,方便开发应用。
对于音频应用,乐鑫的ADF框架提供了很多不同场景的示例,包括音频录播、HTTP推流等。
https://docs.espressif.com/projects/esp-adf/en/latest/get-started/index.html
https://github.com/espressif/esp-adf
AI语音方面,乐鑫提供的esp-skainet,智能语音助手方案,支持命令词唤醒等智能音频功能。
https://www.espressif.com/zh-hans/solutions/audio-solutions/esp-skainet/overview
ESP32P4的一个亮点时视频功能,在视频应用方面,乐鑫推出esp-brookesia IOT UI设计框架,为UI设计提供便利。
https://github.com/espressif/esp-brookesia
来自开源社区的资源更多,包括最近火爆的基于ESP32S3的小智AI。相比EPS32S3,ESP32P4的性能更为强大,ESP32P4正式上市后,可以期待更多有趣的应用。
- 2025-05-02
-
回复了主题帖:
ESP32P4-Function-EV-board JTAG调试问题
秦天qintian0303 发表于 2025-5-2 23:17
官方板不给带调试接口?
官方的串口支持下载、输出log。JTAG的USB接口没有接出来,需要连接额外的USB线。
-
发表了主题帖:
ESP32P4-Function-EV-board JTAG调试问题
ESP32P4-Function-EV-board开发板提供USB转串口的数据传输,但是该接口只提供烧录和log打印功能。无法进行JTAG调试,参考esp32p4文档中关于JTAG调试文档,利用ESP32P4内置的JTAG调试器进行相关的操作。
https://docs.espressif.com/projects/esp-idf/zh_CN/release-v5.4/esp32p4/api-guides/jtag-debugging/index.html
在工程板上用于使用内置JTAG的P24和P25引脚没有被引出到USB口,需要自制一根USB线。官方关于调试器配置的说明中GPIO25接USB D-,GPIO24接USB D+。
https://docs.espressif.com/projects/esp-idf/zh_CN/release-v5.4/esp32p4/api-guides/jtag-debugging/configure-builtin-jtag.html
v5.4 这里的说明是错误的。
查看正点原子的硬件原理图,GPIO25接USB D-,GPIO24接USB D+。对换接线即可正常使用ESP32P4的内置JTAG调试器,在ESP32P4-Function-EV-board上调试程序。
-
回复了主题帖:
ESP32-P4-Function-EV-Board 运行官方示例
秦天qintian0303 发表于 2025-5-1 22:10
今明两面P4会大量出现吧
各家的开发板出了不少了,应该快了。
- 2025-04-30
-
发表了主题帖:
ESP32-P4-Function-EV-Board 运行官方示例
本帖最后由 EPTmachine 于 2025-5-1 14:52 编辑
# 认识ESP32-P4-Function-EV-Board
ESP32-P4工程评估板在官网上有相关的介绍页面。
https://docs.espressif.com/projects/esp-dev-kits/zh_CN/latest/esp32p4/esp32-p4-function-ev-board/user_guide.html
开发板系统框图如下:
官方工程板套件包含的内容包含
- ESP32-P4-Function-EV-Board 主板
- 7 英寸 MIPI DSI 电容式触摸屏,分辨率为 1024 x 600 像素,以及FPC排线
- 200 万像素 MIPI CSI 接口摄像头、转接板和配件
开发板、屏幕和摄像头组装后,如下所示。
# VSCode开发拓展
使用VScode的ESP-IDF扩展管理ESP32芯片开发十分方便。
ESP-IDF扩展提供便捷的开发环境的配置和应用开发工具。
同时官方的[在线文档](https://docs.espressif.com/projects/vscode-esp-idf-extension/zh_CN/latest/index.html)指导用户使用相关的工具。
# 示例程序
对ESP32-P4-Function-EV-Board,乐鑫官方提供综合应用、Lvgl的Demo示例,用于展示开发板的功能和提供开发示例。相关的代码可以从[ESP32-Kit-Dev](https://github.com/espressif/esp-dev-kits/tree/master/examples/esp32-p4-function-ev-board)中获取相关的示例代码。
### lvgl示例
乐鑫提供lvgl运行示例。在下载下来的示例代码文件夹中打开VSCode,加载示例工程,通过VSCode底部的图标工具设置工程的目标芯片、通讯端口、烧录方式,然后编译和烧录工程。
开发板上电后,的运行效果如下图所示。
开发板的屏幕刷新频率能达到60fps。
### 综合应用示例
官方提供基于 [ESP_Brookesia](https://github.com/espressif/esp-brookesia),展示了一个类似 Android 的界面,其中包含许多不同的应用程序。该示例使用了开发板的 MIPI-DSI 接口、MIPI-CSI 接口、ESP32-C6、SD 卡和音频接口。示例代码中提供计算器、相机(带有人脸检测模式)、2048游戏、音乐播放器、视频播放器。
计算器运行演示
时钟演示
音乐播放器演示
# 总结
ESP32-P4-Function-EV-Board 开发板搭配的外设很多,ESP-IDF开发工具使用方便,便于开发应用。
现在也有一些开源项目来展示芯片的可能应用
https://oshwhub.com/esp-college/esp-hdmi-bridge
- 2025-04-27
-
回复了主题帖:
测评入围名单: 多传感器的AI评估板CY8CKIT-062S2-AI
已查看我的测评计划,可在活动期间内完成并发帖分享;
- 2025-04-25
-
回复了主题帖:
聊一聊:从ARM到RISC-V,架构的变化,对单片机开发者有何影响?
只要生态支持的够好,硬件性能的API的支持好,开发都差不多。