2296|4

124

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

蜜袋鼯 第⑦贴 基于RSL10的蜜袋鼯--运动奖励系统之软件设计 [复制链接]

 

 

前要简介

     上一贴介绍了基于RSL10的蜜袋鼯健康监测项目中的运动奖励系统,运动奖励子系统主要可以实现 主机端通过蓝牙协议 与其通讯,当有奖励指令下达后,该系统则驱动电磁阀导通,推出装有小虫的盒子,已达到给蜜袋鼯奖励食物的作用。

 

 

本帖正文

 

上一贴讲解了运动奖励子系统的结构设计和硬件设计部分

 

本帖主要讲下软件设计部分内容。

 

这个子系统的软件实现相对比较简单,首先是要控制电磁铁的通断只需要实现几个IO的功能,

 

我选择了ble_peripheral_server_bond作为基础工程

 

app.h中定义了输出引脚号

app.h 

........
/* 喂食继电器 DIO 端口定义 */
#define TS1_DIO_NUM						0
#define TS2_DIO_NUM						1
#define TS3_DIO_NUM						2
#define TS4_DIO_NUM						3
#define TS5_DIO_NUM						4
........

app_config.c中做了初始化

void Device_Initialize(void)
{

    .........

    Sys_DIO_Config(TS1_DIO_NUM, DIO_MODE_GPIO_OUT_0);
    Sys_DIO_Config(TS2_DIO_NUM, DIO_MODE_GPIO_OUT_0);
    Sys_DIO_Config(TS3_DIO_NUM, DIO_MODE_GPIO_OUT_0);
    Sys_DIO_Config(TS4_DIO_NUM, DIO_MODE_GPIO_OUT_0);
    Sys_DIO_Config(TS5_DIO_NUM, DIO_MODE_GPIO_OUT_0);

    Sys_GPIO_Set_Low(TS1_DIO_NUM);
    Sys_GPIO_Set_Low(TS2_DIO_NUM);
    Sys_GPIO_Set_Low(TS3_DIO_NUM);
    Sys_GPIO_Set_Low(TS4_DIO_NUM);
    Sys_GPIO_Set_Low(TS5_DIO_NUM);

    ...........

}

 

然后是通讯方面,使用customss协议定义好uuid实现上下位机双向通讯,BLE最大可发送的包大小为20字节,

 

因为这部分控制也很简单,只要控制对应奖励盒弹出即可,所以协议只用了两个字节,如下

 

 

其中 第一个字节为指令,固定为0XFF

第二个字节   按位控制对应奖励器开关,例如0x01为第一个盒子,0x02为第二个盒子,0x04为第三个盒子…

 

然后在app_customss.c中修改接收、和发送的订阅协议,如下所示

 

 发送给上位机的订阅实现

// 订阅的内容修改为当前奖励器的触发状态

void CUSTOMSS_MsgHandler(ke_msg_id_t const msg_id, void const *param,
                         ke_task_id_t const dest_id, ke_task_id_t const src_id)
{
        .........

        case CUSTOMSS_NTF_TIMEOUT:
        {
            uint8_t conidx = KE_IDX_GET(dest_id);

            app_env_cs.to_air_buffer[0] = 0xff;
            app_env_cs.to_air_buffer[1] = 0x00;
            for(int i=0;i<5;i++)
            {
            	if(DIO->CFG&0x01)
            		app_env_cs.to_air_buffer[1] |= 1<<i;
            }
            if ((app_env_cs.to_air_cccd_value[0] == ATT_CCC_START_NTF &&
                    app_env_cs.to_air_cccd_value[1] == 0x00)
                 && GAPC_IsConnectionActive(conidx))
            {
                /* Send notification to peer device */
                GATTC_SendEvtCmd(conidx, GATTC_NOTIFY, 0, GATTM_GetHandle(CS_TX_VALUE_VAL0),
                                 2 , app_env_cs.to_air_buffer);
            }

       ........
}

 上位机发送给下位机的接收实现


//接收到消息后,判断帧数据是否为指令,并执行操作
uint8_t CUSTOMSS_RXCharCallback(uint8_t conidx, uint16_t attidx, uint16_t handle,
                                uint8_t *to, const uint8_t *from, uint16_t length,
                                uint16_t operation)
{
    memcpy(to, from, length);
#if RSL10_DEBUG
    PRINTF("RXCharCallback (%d): (%d)  ", conidx, length);
    for (int i = 0; i < length; i++)
    {
        PRINTF("%02x ", app_env_cs.from_air_buffer);
    }
    PRINTF("\n\r");
#endif    /* if RSL10_DEBUG */
    /* 判断协议是否正确
     * 协议简易设置为 0xff 0xxx 第二个字节 按位控制IO开关 */
    if(length == 2 && to[0] == 0xff)
    {
    	ke_timer_set(APP_FSIO_TIMEOUT, TASK_APP, TIMER_SETTING_MS(200));
    	for(int i=0; i < 5; i++)
    	{
    		if(((to[1]>>i)&0x01) == 1)
    		{
    			Sys_GPIO_Set_High(i);
#if RSL10_DEBUG
    			PRINTF("Open TS%d.\r\n", i);
#endif    /* if RSL10_DEBUG */
    		}
    		else
    		{
    			Sys_GPIO_Set_Low(i);
#if RSL10_DEBUG
    			PRINTF("Close TS%d.\r\n", i);
#endif    /* if RSL10_DEBUG */
    		}
    	}
    }

    return ATT_ERR_NO_ERROR;
}

需要注意的是,奖励系统的电磁铁只要通电一下就能弹出来并且自己维持

 

所以为了避免浪费电量,增加了个软件定时器,来执行关闭电磁铁的操作,代码修改如下:


//新增奖励IO触发超时定时回调函数

void APP_FSio_Timeout_Handler(ke_msg_id_t const msg_id, void const *param,
                             ke_task_id_t const dest_id, ke_task_id_t const src_id)
{
    Sys_GPIO_Set_Low(TS1_DIO_NUM);
    Sys_GPIO_Set_Low(TS2_DIO_NUM);
    Sys_GPIO_Set_Low(TS3_DIO_NUM);
    Sys_GPIO_Set_Low(TS4_DIO_NUM);
    Sys_GPIO_Set_Low(TS5_DIO_NUM);
}

 并在app.c中注册上述函数的回调


app.c

int main(void)
{
    ........
    MsgHandler_Add(APP_FSIO_TIMEOUT, APP_FSio_Timeout_Handler);

    .......
}

以上就是运动奖励子系统上的代码实现过程。

 

 

别急啦,下一贴零件就到啦,给你装起来~ 要不你给我写个上位机吧?

 

 

 

最新回复

每次看到这种小动物都很揪心 小时候养的仓鼠被坐化了   详情 回复 发表于 2021-7-3 16:09
点赞 关注
 
 

回复
举报

2万

帖子

71

TA的资源

管理员

沙发
 

这跑完就吃虫,不会得盲肠炎吗?

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

点评

哈哈哈哈   它得现有盲肠~  详情 回复 发表于 2021-7-2 12:25
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 
 

回复

124

帖子

1

TA的资源

一粒金砂(中级)

板凳
 
soso 发表于 2021-7-2 10:29 这跑完就吃虫,不会得盲肠炎吗?

哈哈哈哈   它得现有盲肠~

点评

哈哈  详情 回复 发表于 2021-7-2 13:44
 
 
 

回复

2万

帖子

71

TA的资源

管理员

4
 
justd0 发表于 2021-7-2 12:25 哈哈哈哈   它得现有盲肠~

哈哈

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 
 

回复

3416

帖子

0

TA的资源

纯净的硅(高级)

5
 

每次看到这种小动物都很揪心

小时候养的仓鼠被坐化了

个人签名

So TM what......?

 

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表