当前位置: 首页 > 科技观察

小灵送玩OLED+手势操作

时间:2023-03-15 16:47:55 科技观察

了解更多开源请访问:51CTO开源基础软件社区https://ost.51cto.com1.前言我拿到了一块小灵牌板子,自带手势传感器,感觉很不错,来玩吧。二、小灵派开发板概述板子还是很不错的,io口丰富,内存大,可以做很多case。3.搭建开发环境参考官方文档,使用vbox导入虚拟机。我手头有现成的开发环境,所以不需要这些步骤,直接用git拉下代码。gitclonehttps://gitee.com/Lockzhiner-Electronics/lockzhiner-rk2206-openhARMony3.0lts.gitcdlockzhiner-rk2206-openharmony3.0lts然后配置gcc,需要下载gcc编译器。wgethttps://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2并解压:mkdir-p~/toolchain/tar-jxvfgcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2-C~/toolchain/设置环境变量:vim~/.bashrc复制以下命令到.bashrc文件最后一行,保存退出。exportPATH=~/toolchain/gcc-arm-none-eabi-10.3-2021.10/bin:$PATH然后使环境变量生效:source~/.bashrc可以编译。hbset-root.hbsetlockzhinerlockzhiner-rk2206selectlockzhiner-rk2206hbbuild-f这里有个问题,需要把shell脚本的shell改成bashell。sudodpkg-reconfiguredash没问题就说明构建成功,有问题就排查。4.编译手势案例修改这个文件:vendor/lockzhiner/rk2206/samples/BUILD.gn。然后修改makefile:device/rockchip/rk2206/sdk_liteos/Makefile。然后执行编译命令,加上-b=release。hbbuild-b=release-f过段时间就编译好了。这里有一个问题。如果不加-f,修改不会生效,但是如果加了,编译会耗费很多时间。我希望这个问题能尽快得到解决。编译好后下载(需要把u***转vbox或vmware),按开发板上的MASKROM键,再按RESET键,然后执行下面的命令。./flash.py会在一段时间后下载成功。5.运行手势案例打开你的串口终端软件,查看日志信息。您可以通过在传感器前挥动手来看到灯光。共支持上、下、左、右、距离、距离、顺时针、逆时针、挥手等10种手势。6.OLED驱动官方demo里居然有oled测试用例,准备一块ssd1306屏就行了,我这个老鸿蒙肯定不缺,所以立马找了一个oled模块。官方演示在这里:vendor/lockzhiner/rk2206/samples/b5_oled。只要在BUILD.gn和Makefile中稍微改动一下就可以运行,但是运行之后发现刷新太慢了。事实证明代码没有使用缓存。然后找到之前万润和板的代码。简单的说就是预先把点阵信息保存在一个大数组中,然后刷新的时候只改变数据中的内容,最后更新所有的点阵数据。.不过原来那套代码用的是润和的i2c接口,现在需要改成小玲的方法:IF(ret!=0){printf("%s,%s,%d:LzI2cWritefailed(%d)!\n",__FILE__,__func__,__LINE__,ret);}returnret;}staticuint32_tssd1306_WiteByte(uint8_tregAddr,uint8_tbyte){uint8_tbuffer[]={regAddr,byte};uint32_tret=LzI2cWrite(OLED_I2C_BUS,OLED_I2C_ADDRESS,缓冲区,2);if(ret!=0){printf("%s,%s,%d:LzI2cWritefailed(%d)!\n",__FILE__,__func__,__LINE__,ret);}returnret;}//发送一个字节到命令寄存器voidssd1306_WriteCommand(uint8_tbyte){ssd1306_WiteByte(SSD1306_CTRL_}D,byte//发送数据voidssd1306_WriteData(uint8_t*buffer,size_tbuff_size){uint8_tdata[SSD1306_WIDTH*2]={0};for(size_ti=0;i=text_area_width){y+=font_height;x=0;}showed_num++;如果(y>=text_area_height){break;}}ssd1306_DrawRegion(64,0,64,64,picture_arr,sizeof(picture_arr),0);ssd1306_UpdateScreen();while(1){uint32_t标志=0;uint32_trLen=4;printf(">>>>>>queueId=%d\n",queueId);ret=LOS_QueueReadCopy(queueId,&flag,&rLen,LOS_WAIT_FOREVER);//LOS_Msleep(OLED_INTERVAL_TIME_US);printf("READret=%d,FLAG=%02x\n",ret,flag);intidx=0;for(;idx<9;idx++){if(flag&(1<>获取手势状态:0x%x\n",flag);if(flag&GES_UP){printf("\tUp\n");}if(flag&GES_DOWM){printf("\tDown\n");}if(flag&GES_LEFT){printf("\tLeft\n");}if(flag&GES_RIGHT){printf("\tRight\n");}if(flag&GES_FORWARD){printf("\tForward\n");}if(flag&GES_BACKWARD){printf("\tBackward\n");}if(flag&GES_clockWISE){printf("\tClockwise\n");}if(flag&GES_COUNT_CLOCKWISE){printf("\tCountClockwise\n");}如果(标志和GES_WAVE){printf("\t波\n");}e53_gs_led_up_set((标志&GES_UP)?(1):(0));e53_gs_led_down_set((标志和GES_DOWM)?(1):(0));e53_gs_led_left_set((标志和GES_LEFT)?(1):(0));e53_gs_led_right_set((标志和GES_RIGHT)?(1):(0));e53_gs_led_forward_set((标志和GES_FORWARD)?(1):(0));e53_gs_led_backward_set((标志和GES_BACKWARD)?(1):(0));e53_gs_led_cw_set((标志和GES_CLOCKWISE)?(1):(0));e53_gs_led_ccw_set((标志和GES_COUNT_CLOCKWISE)?(1):(0));e53_gs_led_wave_set((标志和GES_WAVE)?(1):(0));ret=LOS_QueueWriteCopy(queueId,&flag,4,0);printf("队列写入ret=%d\n",ret);}else{/*如果没有数据,等待更多*/LOS_Msleep(100);}}}最终效果如上视频所示,可以看出上下左右的效果很容易测试,而顺时针、逆时针、远、近就比较难测了。挥手的效果更是让人捉摸不透试了一下,还好模块化不错,终于有了挥手的效果。后期准备做菜单模块,用手势切换菜单项。了解更多开源信息,请访问:51CTO开源基础软件社区https://ost.51cto.com。