基于SYD8801的蓝牙遥控器设计方案【按键功能】【安卓手机功能演示】【ios功能演示】

SYD8801是一款低功耗高性能蓝牙低功耗SOC,集成了高性能2.4GHz射频收发机、32位ARM Cortex-M0处理器、128kB Flash存储器、以及丰富的数字接口。SYD8801片上集成了Balun无需阻抗匹配网络、高效率DCDC降压转换器,适合用于可穿戴、物联网设备等。具体可咨询:http://www.sydtek.com/

本文摘录于:https://i-blog.csdnimg.cn/blog_migrate/f318663167eb2577989a60444a9433c1.png

 

 BLE芯片兴起已经有好几年了,从最初的TICC254x的火热到后期之秀Dialog在小米手环的绽放,产品形态也从最初的防丢器应用延时到可穿戴产品,智能家居和消费类产品等各个方面。

        采用BLE技术的蓝牙遥控器,也是最近兴起的产品,有很大的市场空间。相比普通的红外遥控器,蓝牙遥控有很明显的优点:1.360°无死角遥控,遥控距离更远 2.通过与智能电视或者机顶盒配对,可以实现独立无干扰的控制 3.可扩展性强,可以集成简单的语音控制和体感游戏控制 4.增加很低的成本,即可兼具红外遥控器功能和红外学习功能。

        本文描述了基于SYD8801的蓝牙遥控器设计方案,供开发人员参考。

 

1. 首先看看SYD8801的系统框图和改芯片的主要性能参数,对芯片有大致的了解:

 

2. 原理图设计

 

         由于SYD8801 片上集成了Balun ,无需阻抗匹配网络,无需外挂晶振负载电容,最大限度地节省BOM 成本。外部也只需要矩阵键盘和简单的元器件,极具成本优势。

 

3. 软件架构描述

 

int main(void)

{

__disable_irq();

 

ble_init(); //clk init

gpio_init();

dbg_init();dbg_printf("RCU Power On!\r\n"); 

 

#ifdef CONFIG_LED

led_config(LEDALL);

led_flash();

#endif

 

RCU_set_work_mode(RCU_MODE_BT);

 

io_irq_enable(BIT16|BIT17|BIT18|BIT19|IFR, &gpio_int_callback);

 

__enable_irq();

 

while(1)

{

if(work_mode == RCU_MODE_IR_RECEIVING)//瞬态的自加模式,会自动降到下一模式

{

__disable_irq();

pulse_time++;

__enable_irq();

}

else if(work_mode == RCU_MODE_IR_RECEIVE_WAITING)//红外学习模式

{

if(IR_receive_CMP == 1)

{

IR_receive_CMP = 0;

RCU_receive_decode();

enable_IR_receive(1);

}

KeyEvent_Handle();

}

else //蓝牙模式、红外发射模式

{

ble_sched_execute();

KeyEvent_Handle();

SystemSleep();

}

 

}

在BLE初始化中调用:

evt.evt_mask=(GAP_EVT_CONNECTION_SLEEP|GAP_EVT_CONNECTION_INTERVAL);

evt.p_callback=&ble_evt_callback;

SetEvtCallback(&evt);

给底层协议栈注册ble_evt_callback(),当发生蓝牙事件的时候,会调用:

 

 

 

static void ble_evt_callback(struct gap_ble_evt *p_evt) 

{

if(p_evt->evt_code == GAP_EVT_ADV_END)

{

//广播结束

}

else if(p_evt->evt_code == GAP_EVT_ATT_READ)

{

//读特征

}

else if(p_evt->evt_code == GAP_EVT_ATT_HANDLE_CONFIGURE)

{

//配置服务

}

else if(p_evt->evt_code == GAP_EVT_ENC_KEY)

{

//配对

}

else if(p_evt->evt_code == GAP_EVT_CONNECTED)

{

//连接

}

else if(p_evt->evt_code == GAP_EVT_DISCONNECTED)

{

//断开

}

}

通过调用该函数,处理相应的蓝牙事件。

矩阵扫描通过中断触发gpio_int_callback();

按键事件处理函数KeyEvent_Handle();

通过主函数可以看到,遥控器一共有3种主要的运行模式:蓝牙模式、红外发送模式、红外接收(学习)模式。

红外学习也采用中断方式解码红外接收头数据,目前红外主要采用NEC模式的红外协议。红外接收解码基本上准确无误。

 

4. 蓝牙服务描述

 

The Remote control reference application implements the following services:

--GAP

--GATT

--DIS

--HID over GATT

--Battery

 

其中HID服务可支持keyborad,mouse,system control,consumer key等HID报告。

 

5. 功耗测试情况

 

    目前已经在iphone4s,iphone5s,iphone6,华为P9,创维电视盒子上运行OK。


 

6. 软件开发环境采用MDK,目前蓝牙遥控器的代码空间使用情况

 功能:蓝牙遥控、红外遥控、红外学习

Program Size: Code=18962 RO-data=546 RW-data=212 ZI-data=7804  

 

 

按键功能

官方手册上指定的按键功能如下:

注意:音量加和减按键为上图中的UP和DOWN按键,这里删除flash中的绑定数据后系统会重启,并且开始新的广播,也就说可以连接新的设备。

    如果不知道按键的功能下载好程序后按下遥控器的按键,在串口上会显示按键的意义。

比如有如下的按键功能:

DVD:控制主机的音量加

VCR:控制主机的音量减

 

安卓手机功能演示

这里下载好程序后复位SYD8801可以在设置中看到蓝牙设备,然后点击进行连接,并且进行配对,然后进行连接,最后连接成功:

连接成功后按下音量DVD按钮(音量加)即可控制手机音量:

操作视频可看:https://download.csdn.net/download/chengdong1314/10337251

整个流程串口打印如下(连接上一段时间不按下按键后断开连接然后按下按键重新连接):

RCU Power On!
start_adv - ADV_TYPE: RANDOM_ADDRESS_TYPE
Adv Completely!

key 8080400
start_adv - ADV_TYPE: RANDOM_ADDRESS_TYPE
key 18 Pressed:DOWN
Delete bond info & reset!!!
RCU Power On!
start_adv - ADV_TYPE: No bonds_device
GAP_EVT_CONNECTED
GAP_EVT_ENC_START
GAP_EVT_ENC_KEY
GAP_EVT_ATT_HANDLE_CONFIGURE
GAP_EVT_ATT_HANDLE_CONFIGURE
GAP_EVT_ATT_HANDLE_CONFIGURE
GAP_EVT_ATT_HANDLE_CONFIGURE
GAP_EVT_ATT_HANDLE_CONFIGURE
GAP_EVT_ATT_HANDLE_CONFIGURE
key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020000
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8010100
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8010100
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8010100
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8020000
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

PDown:send Disconnect req!
GAP_EVT_DISCONNECTED
key 8020100
start_adv - ADV_TYPE: RANDOM_ADDRESS_TYPE
key 8 Pressed:VOL-
key 8 Loose:VOL-

GAP_EVT_CONNECTED
GAP_EVT_ATT_HANDLE_CONFIGURE
GAP_EVT_ATT_HANDLE_CONFIGURE
GAP_EVT_ATT_HANDLE_CONFIGURE
GAP_EVT_ATT_HANDLE_CONFIGURE
GAP_EVT_ATT_HANDLE_CONFIGURE
GAP_EVT_ATT_HANDLE_CONFIGURE
GAP_EVT_ATT_HANDLE_CONFIGURE
GAP_EVT_ENC_START
key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8010100
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8010000
key 0 Pressed:VOL+
key 7 Pressed:RECORD
key 0 Loose:VOL+

key 7 Loose:RECORD

key 8010000
key 0 Pressed:VOL+
key 7 Pressed:RECORD
key 0 Loose:VOL+

key 7 Loose:RECORD

key 8010000
key 0 Pressed:VOL+
key 7 Pressed:RECORD
key 0 Loose:VOL+

key 7 Loose:RECORD

key 8010100
key 0 Pressed:VOL+
key 6 Pressed:RETURN
key 7 Pressed:RECORD
key 0 Loose:VOL+

key 6 Loose:RETURN

key 7 Loose:RECORD

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 14 Pressed:HOME
key 8 Loose:VOL-

key 14 Loose:HOME

key 8020100
key 8 Pressed:VOL-
key 14 Pressed:HOME
key 14 Loose:HOME

key 8 Loose:VOL-

key 8020000
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020000
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020000
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8010100
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8010100
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8010000
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8010100
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8010100
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8010100
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8010000
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8010100
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8010000
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8010000
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8010100
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8020000
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020000
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8010100
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8010100
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8010100
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8010100
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8010100
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8010100
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8010100
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020000
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8010000
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8010000
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8010000
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8010100
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8010000
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8010100
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8010100
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8010000
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020000
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

PDown:send Disconnect req!
GAP_EVT_DISCONNECTED
 

 

ios功能演示

下载好代码后在IOS的设置中可以看到蓝牙遥控器,然后连接、配对、最后连接成功:

下来按下遥控器的音量控制按钮(VCR或者DVD按键)就可以控制IOS手机的音量了:

实际情况如下:

操作视频可看:https://download.csdn.net/download/chengdong1314/10337404

整个流程串口打印如下(从安卓删除绑定,并且绑定到IOS,最后发送音量按键):

key c080000
start_adv - ADV_TYPE: No bonds_device
key 18 Pressed:DOWN
Delete bond info & reset!!!
RCU Power On!
start_adv - ADV_TYPE: No bonds_device
GAP_EVT_CONNECTED
GAP_EVT_ENC_START
GAP_EVT_ENC_KEY
GAP_EVT_ATT_HANDLE_CONFIGURE
GAP_EVT_ATT_HANDLE_CONFIGURE
GAP_EVT_ATT_HANDLE_CONFIGURE
GAP_EVT_ATT_HANDLE_CONFIGURE
key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

PDown:send Disconnect req!
GAP_EVT_DISCONNECTED
key 8010100
start_adv - ADV_TYPE: RANDOM_ADDRESS_TYPE
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8010100
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8010100
key 0 PresGAP_EVT_CONNECTED
NNECTED
key 0 Loose:VOL+

key 8010100
key 0 Pressed:VOL+
GAP_EVT_ATT_HANDLE_CONFIGURE
GAP_EVT_ATT_HANDLE_CONFIGURE
GAP_EVT_ATT_HANDLE_CONFIGURE
GAP_EVT_ATT_HANDLE_CONFIGURE
GAP_EVT_ATT_HANDLE_CONFIGURE
GAP_EVT_ATT_HANDLE_CONFIGURE
GAP_EVT_ATT_HANDLE_CONFIGURE
GAP_EVT_ENC_START
key 0 Loose:VOL+

key 8010100
keyGAP_EVT_ATT_HANDLE_CONFIGURE
_EVT_ATT_HANDLE_CGAP_EVT_ATT_HANDLE_CONFIGURE
GAP_EVT_ATT_HANDLE_CONFIGURE
key 0 LGAP_EVT_ATT_HANDLE_CONFIGURE
_ATT_HANDLE_Ckey 8010100
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8010100
key 0 Pressed:VOL+
key 0 Loose:VOL+

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020000
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

key 8020100
key 8 Pressed:VOL-
key 8 Loose:VOL-

PDown:send Disconnect req!
GAP_EVT_DISCONNECTED

时下智能语音交互市场火热,越来越多的设备都开始支持远场AI语音交互。 例如:智能音箱,智能电视等等。但这类产品的识别率和误唤醒率还需再不断的优化提升,以至于日常生活中人们还是离不开各式各样的遥控器。而蓝牙语音遥控器这一产品,作为远场语音交互的一个近场配件,也搭上了这趟语音交互的快速列车,成长速度令人惊讶。基于Actions炬芯的ATB1103芯片的语音遥控器,打造了一个AIoT时代的高性价比精品。 一、遥控器应用总体架构 遥控器总体架构分四层,从上到下依次为应用层、应用框架层、硬件抽象层、底层驱动层 1.1、应用层 • 应用状态机– 事件触发让遥控器应用处理不同的状态 • 应用定时器– 定时触发不同的事件,驱动遥控器正常运行 • 应用输入处理– 处理底层来的不同按键消息 • 应用音频输入处理– 将底层的音频处理消息,进行编码,然后通过蓝牙发送给对端设备 • BLE profile – HID profile,提供按键输入输出接口服务 – BAS service,提供电池服务 – DIS service,提供读取设备基本信息的接口服务 – ota profile,提供OTA 升级服务 1.2、应用框架层 • 输入管理– 按键映射处理、按键过滤机制 • 消息管理– 消息分配和释放、 消息发送和接收 • 内存管理– 动态内存管理 • 闪灯管理– 灯资源分配和释放 • 电池管理– 电量读取、电量管理策略 1.3、硬件抽象层 将应用层和驱动层剥离开的中间件层 1.4、底层驱动层 底层硬件操作接口 二、遥控器模块流程概述 2.1、系统启动 系统相关初始化、板级相关外设初始化、蓝牙协议栈相关初始化、HidApp 应用初始化,并进入Main 主循环,等待消息处理 2.2、遥控器状态机 遥控器在运行过程中,主要靠如下3 种状态维持他的正常运行。 2.2.1. 触发遥控器进去空闲状态的事件: > 广播状态,没有连接成功,出现超时事件,进入idle > 连接状态,断开连接,如无操作主动断开连接,然后进入idle 2.2.2. 触发遥控器进入激活状态的事件: > 空闲状态,有按键、首次上电,进入激活状态 > 连接状态,出现异常断开,需要回连,进入激活状态 2.2.3. 触发遥控器进入工作状态的事件: > 激活状态下,配对成功或者回连成功,进入工作状态。 2.3、按键处理 由于遥控器的键值较多,通常用矩阵键盘方式以节省pin 的使用。当使能Key 模块后,Key 控制器就会处于矩阵扫描状态,当检测到外部按键有值时,就会产生中断,中断就将按键信息上报给应用。 2.4、红外处理 • 在非连接状态下,按下按键,就会发射红外码,进而通过红外操作对端设备,如使用红外进行配对. • IRC 协议上,最短的红外码重发时间为108 ms,而按键的重复上报时间,可能小于108ms,也可能大于108ms,因此按键输入和红外发送模块时间上存在三种可能: 2.4.1. 慢速点按 慢速点按动作特征是在大于Trpc 时间后有多次的按键输入。在Ta 时刻,发出初次按键值,在Tb 时刻,不做任何响应,在Tc 时刻,继续发送检测到的按键值,不会发送重复码. 2.4.2. 快速点按 快速点按的动作特征是用户在Trpc 时间内有两次或者以上的按键按下弹起的动作. 在Ta 时刻,将发送出初次按键,而Tb 时刻并不发送按键值,在Tc 时刻,如果按键仍然是按下状态,将发出按键值,否则将丢掉按键值. 2.4.3. 长按 长按的动作特征是按键按下后,一直不放开。此时CPU 检测到按键的持续按下,则在Ta 时刻发送出初次按键,发送出此时按键对应的红外键码,而在Trpc 时间内没有检测到按键的松开,则在Tb 时间输出重复码,直至检测到按键弹起为止. 2.5、语音采集 • 当启动Voice Key 后,ADC 开始采集 • 采集的数据通过DMA 搬运到应用的循环buffer 中,同时发送消息给Main 线程,让其处理语音数据。 • 如果Main 线程处理速度不够快,audioin 驱动就会因为分不到buffer,而将采集的语音数据丢弃。 2.6、BLE数据传送 • 将audioin 驱动发送上来的数据进行编码压缩。 • 然后将编码后的压缩数据切成几个20byte 的数据包 • 最后通过hid profile notify 接口发送给BLE 协议栈 2.7、应用软件Timer管理模块 2.8、LED管理模块 遥控器定义了几种LED 指示灯,用于指示遥控器的一些状态,如下表所示 通常遥控器只有一个物理的LED 灯用于各种场景的指示,这就需要软件上让其分时复用,如果同时需要显示两种状态,状态需要定义优先级,优先级高的状态先指示。如在配对模式下,处于闪灯状态下,这时候按下按键,那么灯还是处于快闪状态。 2.9、O
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值