
#第六届立创电赛#离线语音识别-凉习智能风扇“小橘子”
简介
它叫小橘子,是一个住在老风扇里的新时代小精灵。它能让老风扇听懂“新”声音,一个指令,一句话,言出必达。基于离线语音识别的智能风扇。
简介:它叫小橘子,是一个住在老风扇里的新时代小精灵。它能让老风扇听懂“新”声音,一个指令,一句话,言出必达。基于离线语音识别的智能风扇。开源协议
:GPL 3.0
描述
先不描述了,先上图!^.^
* 1、项目功能介绍
基于启英泰伦离线语音模组CI-C22GS02S的凉习智能风扇LX02,改造家里的老风扇,动嘴不动手
-
-
-
- 通过语音识别技术,无须联网即可”动动嘴“实现开关机、档位控制。
- 同时它还保留了实体按键,可以完美改造家里的老风扇。
- 按键下面搭配了插件的LED灯,可以根据原有的按键高低调整,
- 3个档位对应实现亮灯,方便识别当前档位;
- 值得一提的是,通过合理选择LED限流电阻,LED灯在夜晚也并不刺眼,睡觉也不会受到影响。
-
-
”它,叫小橘子,是一个住在老风扇里的新时代小精灵。它能让老风扇听懂”新“声音,一个指令,一句话,言出必达。还搭载了儿时听到小铃声,在休闲乘凉之际重温孩提时光。还有几个幽默小功能哦,亟待您的发现~“
基本参数:
类型:4键3档; 0 1 2 3
安装尺寸:键间尺寸18mm
供电:AC220V
*2、项目属性
项目首次公开。是原创。项目未曾在其他比赛获奖。项目未在学校参加答辩。
注:请说明项目是否首次公开;项目是否为原创;项目是否曾经在其他比赛中获奖,若有获奖则叙述获奖详情;项目是否在学校参加过答辩。
* 3、开源协议
GPL3.0
*4、硬件部分
4.1、3个继电器IO
采用模块的PWM3\PWM4\PWM5作为继电器控制端(RLY_C1、2、3)。主控这里记得引出MCLK引脚,这个是烧录程序必备的。
4.2、4个按键IO
模组CI-C22GS02S(C2759836)本来IO口引出的不多,有两个串口,真正运行时本项目用不上串口。故想把它作为按键IO来使用,通过查询它的手册 :模组CI-C22GS02S 发现可行
管脚号 | 管脚名称 | I/O类型 | IO驱动能力 | IO上电默认状态 | 功能定义 |
…… | |||||
6 | RX0 | IO,T+U | 4mA | IN,T+U | 1.UART0_RX 2.GPIO1_7 |
7 | TX0 | IO,T+U | 4mA | IN,T+U | 1.UART0_TX 2.GPIO2_0 |
…… | |||||
10 | TX1 | IO,T+U | 4mA | IN,T+U | 1.UART1_TX 2.I2C0_SCL 3.GPIO3_0 |
11 | RX1 | IO,T+U | 4mA | IN,T+U | 1.UART1_RX 2.I2C0_SDA 3.GPIO3_1 |
串口0和串口1的管脚都支持普通IO口的功能,故可以用作检测按键输入。引脚上使用TX1作为0档开关按键,RX1作为1档开关,TX0作为2档开关,RX作为3档开关。
4.3、继电器驱动
采用NUD3105(C14894)作为继电器的驱动,这个驱动芯片内部自带了MOS、限流电阻、反向的二极管等,可以很好驱动继电器且不影响MCU,极大的节省了多个元器件。非常适合我们手工撸板的DIY玩家。
4.4、PCB分区
由于风扇外壳的部分很小,按键和继电器在一块上面的话,外壳就放不下了,只好把板子分为两个部分,拿到板子后裁开两块,飞线连接。这样比较好适配风扇的外壳。
沿虚线剪开 |
|
基本完成的 |
![]() |
*5、软件部分
附件有本案的修改好的SDK,可以直接下载烧录,完美复制拥有你的“小橘子”,想要个性化修改的小伙伴继续往下看,希望可以帮到你。
5.1继电器部分:
5.1.1、初始化继电器io
void relay_init(void)//PWM3-relay1-GPIO1_4 ,PWM4-relay2-GPIO1_5,PWM5-relay3-GPIO1_6
{
//以下代码控制GPIO输出模式
Scu_SetDeviceGate((unsigned int)GPIO1,ENABLE);
Scu_SetIOReuse(PWM3_PAD,FIRST_FUNCTION);
Scu_SetIOPull(PWM3_PAD,DISABLE);
Scu_SetIOReuse(PWM4_PAD,FIRST_FUNCTION);
Scu_SetIOPull(PWM4_PAD,DISABLE);
Scu_SetIOReuse(PWM5_PAD,FIRST_FUNCTION);
Scu_SetIOPull(PWM5_PAD,DISABLE);
gpio_set_output_mode(GPIO1,gpio_pin_4|gpio_pin_5|gpio_pin_6);
}
5.1.2、继电器电器控制函数,GPIO高低输出
void Relay1_OFF(void){gpio_set_output_level_single(GPIO1,gpio_pin_4,0);} //输出低电平
void Relay2_OFF(void){gpio_set_output_level_single(GPIO1,gpio_pin_5,0);} //输出低电平
void Relay3_OFF(void){gpio_set_output_level_single(GPIO1,gpio_pin_6,0);} //输出低电平
void Relay1_ON(void){gpio_set_output_level_single(GPIO1,gpio_pin_4,1);} //输出高电平
void Relay2_ON(void){gpio_set_output_level_single(GPIO1,gpio_pin_5,1);} //输出高电平
void Relay3_ON(void){gpio_set_output_level_single(GPIO1,gpio_pin_6,1);} //输出高电平
5.1.3、档位控制函数,调用如:Gear(0);//0档,关闭
void Gear(unsigned char GearNum)
{
if(GearNum==0){Relay1_OFF();Relay2_OFF();Relay3_OFF();}//注意要先关后开
if(GearNum==1){Relay2_OFF();Relay3_OFF();Relay1_ON();}
if(GearNum==2){Relay1_OFF();Relay3_OFF();Relay2_ON();}
if(GearNum==3){Relay1_OFF();Relay2_OFF();Relay3_ON();}
}
5.2按键部分:
5.2.1、 按键清单list修改gpio_key.c内的 gpio_key_list[]
static gpio_key_info gpio_key_list[]=
{
//按键一 OFF
{4,I2C0_SCL_PAD,GPIO3,gpio_pin_0},
//按键二 1档relay1
{1,I2C0_SDA_PAD,GPIO3,gpio_pin_1},
//按键三 2档relay2
{2,UART0_TX_PAD,GPIO2,gpio_pin_0},
//按键四 3档relay3
{3,UART0_RX_PAD,GPIO1,gpio_pin_7},
};
5.2.2、添加中断处理程序,
由于4个按键中分属于不同的GPIOX组,故需要在ci112x_gpio.c文件中的void GPIO1_IRQHandler(void) 、void GPIO2_IRQHandler(void) 、void GPIO3_IRQHandler(void)
三个中断处理函数中添加以下函数:
ci_key_gpio_isr_handle();//GPIO按键处理函数
如:
/**
* @brief GPIO1中断处理函数
*
*/
void GPIO1_IRQHandler(void)
{
ci_key_gpio_isr_handle();//GPIO按键处理函数
}
PS:我下载的SDK的未完成按键的DEMO部分,”ci112x_gpio.c“文件中未引用”ci_key.h“,会导致”ci_key_gpio_isr_handle();//GPIO按键处理函数“报1次警告,在开头添加头文件即可”#include "ci_key.h"“
5.2.3、处理按键消息
在”user_msg_deal.c"内找到以下按键处理函数
void userapp_deal_key_msg(sys_msg_key_data_t *key_msg)
{
if(key_msg->key_index != KEY_NULL)
{
ci_loginfo(LOG_USER,"key_value is 0x%x ",key_msg->key_index);
//按键被按下
if(MSG_KEY_STATUS_PRESS == key_msg->key_status)
{
ci_loginfo(LOG_USER,"status : press down\n");
if(key_msg->key_index ==4){Gear(0);}
if(key_msg->key_index ==1){Gear(1);}
if(key_msg->key_index ==2){Gear(2);}
if(key_msg->key_index ==3){Gear(3);}
}
}
}
5.3烧录程序的方法:
(1)、下载附件的代码压缩包“CI1122.ZIP”
(2)、解压到纯英文路径的文件夹或直接解压到桌面
(3)、依次打开文件夹 “你的桌面\CI112X_SDK_V1.2.5\CI112X_SDK_V1.2.5\sample\internal\sample_1122\firmware ”
(4)、用TTL串口下载工具连接到板子DEBUG调试口
(5)、用短路帽短接板子上的BOOT端
(6)、检查线序,无误后将TTL串口下载工具插入电脑
(7)、打开“firmware”文件夹内的“打包升级.bat",选择固件升级
(8)、可以看到COM口已经自动识别,然后按下图打上各个选项。(仅更改了代码部分的,只勾选”擦除NV“)
(9)、拔掉板子和下载工具直接的GND杜邦线,然后再迅速插回(手动重启上电)即可进入烧录模式。约1-2min左右烧录完毕将会自动重启。进入正常运行
![]() |
![]() |
(10)、正常复原笔者的项目到这一步就结束了。
(11)、如果有自己的想法,个性化更改了代码。需要再eclipse内编译通过,观察到提示bin文件已生成即可。如下显示:
Finished building: sample_1122.bin
Finished building: sample_1122.siz
Finished building: sample_1122.lst
18:16:48 Build Finished. 0 errors, 0 warnings. (took 15s.27ms)
(12)、打开“firmware”文件夹内的“打包升级.bat",选择”固件打包“。在弹出的界面继续选择下方的”打包固件“,提示”固件已生成“
(13)、选择固件升级,重复8、9烧录程序
*如遇到未知问题,可以再详细看看厂家的指南:传送门——>固件合成及烧录
*6、BOM清单
详见右方BOM清单按钮
*7、大赛LOGO验证
* 8、避坑指南
(1)、首选避坑指南是厂家的新手指南 - 新手指南 (chipintelli.com)
(2)、软件代码入门也是厂家的SDK指南SDK概述 - 启英泰伦文档中心 (chipintelli.com),注意CI-C22GS02S模块的主控芯片是CI1122,看CI1122部分。
(3)、我下载的SDK V1.2.5的版本是未完成按键的DEMO部分的,”ci112x_gpio.c“文件中未引用”ci_key.h“,会导致ci_key_gpio_isr_handle();//GPIO按键处理函数
报1次警告,在开头添加头文件即可”#include "ci_key.h"“
(4)、添加按键的代码后会报RAM ROM不够的错,报的错误类似是:(这个错误困扰了我许久-_-)
ample_1122.elf section `.ro_data' will not fit in region `ROM'
section .data LMA [000000001ff21000,000000001ff2150f] overlaps section .ro_data LMA [000000001ff1d518,000000001ff210bf]
region `ROM' overflowed by 192 bytes
如下图:
在厂家的BBS发帖后得到厂家大佬qinglin.li@chip回复:
原因:新增代码后,增加的代码量会超出flash分配的user code地址大小,会引起这类报错。
解决方法:使用编辑器打开SDK目录下文件\sample\internal\sample_1122\src\ci112x.lds,根据实际情况增加ROM_SIZE的大小,同时相对的减少ASR_USED_SIZE的大小。
ROM_SIZE = 1024*(130+1+1+1);//上面+1
FHEAP_SIZE = 1024*(81);
ASR_USED_SIZE = 1024*(283-1-1-1);//下面就-1,直到不报错
RAM_SIZE = 1024*(18);
STACK_SIZE = 0xC00;/*inclued in RW*/
* 9、演示您的项目并录制成视频上传
视频要求:请横屏拍摄,分辨率不低于1280×720,格式Mp4/Mov,单个视频大小限100M内;
视频标题:立创电赛:{项目名称}-{视频模块名称};如立创电赛:《自动驾驶》-团队介绍。
已发布,见附件。
* 10、注意事项
1、做好了后安装在老风扇里就可以了,但是一定要注意220V的危险!危险!危险!
2、请遵守开源协议
3、转载参考请注明来源:立创开源平台https://oshwhub.com/Red_mt/li-xian-yu
4、案例仅供参考,笔者水平有限,多多包涵啦。目前实测可行不代表以后也实测可行
点个赞再走呗
设计图

BOM


评论