原文引自CSDN社区 《[立创&传智&黑马程序员&CSDN]训练营——仿生机械狗》
编者按 昨天的《玩嗨OpenHarmony:基于OpenHarmony的仿生四足狗开发分享》,大家看到了一只12个自由度可在3D空间移动的机械狗的开发心得。今天分享的机械狗会更上一层楼,不仅仅支持蓝牙操控实现复杂动作,而且还是支持通过语音控制的哦。相信大家会喜欢。 1. 功能描述 话不多说,我们先上图上视频: 正视图:
俯视图:
视频展示: 狗狗名字叫小嘉,目前这只狗狗已经支持语音控制前进、后退、左转、右转、扭身子、握手、跳跃等;支持AP模式,用终端连接热点,访问网页进行控制;还支持使用HC05和蓝牙调试器进行控制;超声波避障还在优化中。 2. 硬件介绍 电源: 由于整个项目需要驱动9个舵机,需要比较大的电流,所以供电选用两节18(直径)65(长度)0(圆柱形)锂电池,电源部分主要使用12V-5V,以及5V-3.3V的LDO(这里有个优化点,当时图简单,使用的都是LDO(编者注:Low Dropout Regulator 线性稳压电源 的英文缩写),实测发热还是比较严重,后面有打算换成DC/DC进行供电)。 用到了LM1084 (商城料号:C259973)和UZ1084(商城料号:C84897)。
实际使用电路如下:
2.1 主控电路: 主控使用的是传智教育的HI3861模组(商城料号C2923578),该模组内置最小系统电路,简化了该部分电路设计,只需要额外增加一个复位电路以及在电源部分添加一个100nF的旁路电容C7(大电容滤除低频噪声,小电容滤除高频噪声)即可。
下载电路: 在之前的鸿蒙训练营,没有添加CH340需要外部接线,给我人接麻了,疼定思痛,加上了CH340G模块,由于使用的是Typec接口,所以在CC1和CC2要下来俩个电阻,方便电脑识别如果不加有可能会识别不到。另外,Hi3861是3.3V电压基准,为了保证统一电平,这里CH340G采用3.3V供电(上一期笔者有用5V供电烧录失败的经历)所以对应的V3端口也要接3.3V,而非5V供电时的那样。
PCB实物如下:
2.2 舵机驱动模块: 由于PCA9685商城没有现货,在某宝查了一下价格,买个芯片和买个模块要花差不多的米,本着提高成功率的态度,买了模块。
2.3 语音识别模块:
语音识别使用的是鹿小班语音识别模块,官方简介:
ASR-01是一颗专用于语音处理的人工智能芯片,可广泛应用于家电、家居、照明、玩具等产品领域,实现语音交互及控制。
ASR-ONE内置自主研发的脑神经网络处理器BNPU(编者注:Brain Neural Network Processing Unit的英文缩写),支持200条命令词以内的本地语音识别,内置CPU核和高性能低功耗Audio Codec模块,集成多路UART(编者注:通用非同步收发传输器Universal Asynchronous Receiver/Transmitter的英文缩写)、IIC(编者注:Inter-Integrated Circuit 内部集成电路的英文缩写)、PWM(编者注:Pulse Width Modulation 脉冲宽度调制的英文缩写)、GPIO(编者注:General-purpose input/output 通用输入输出的英文缩写)等外围控制接口,可以开发各类高性价比单芯片智能语音产品方案。
他们近期出了一款PRO版本,据说是支持声纹识别的,笔者还没买来尝鲜,有兴趣的同学自行了解吧。 2.4 超声波模块:
这里笔者使用的是2022款的超声波测距模块HC-SR04 超声波传感器,支持兼容UNO R3/51/STM32,该模块支持普通GPIO模式、IIC模式、UART模式、1-Wire模式,由于串口和IIC已经被用到了其他地方,所以只能选择GPIO模式或者是1-Wire模式。笔者使用的是GPIO模式,不需要更改电阻。如果使用其他模式需要根据操作手册进行修改。 3. 软件介绍 3.1 主体框架: 程序主体还是用的传智官方的示例,在此基础上进行了亿点点修改,主要是增加了一个串口任务和动作逻辑。
static void UART_Task(void) { IotUartAttribute uart_attr = { //baud_rate: 9600 .baudRate = 9600, //data_bits: 8bits .dataBits = 8, .stopBits = 1, .parity = 0, .rxBlock = 0, .txBlock = 0, }; //Initialize uart driver IoTUartInit(HI_UART_IDX_1, &uart_attr); while (1) { printf("======================================= "); printf("*************SIZU_example************** "); printf("======================================= "); // //通过串口1发送数据 // IoTUartWrite(HI_UART_IDX_1, (unsigned char *)data, strlen(data)); //通过串口1接收数据 IoTUartRead(HI_UART_IDX_1, uart_buff_ptr, UART_BUFF_SIZE); SIZU_Uart_Cmd((char *)uart_buff_ptr); printf("Uart1 read data:%s ", uart_buff_ptr); usleep(500000); } } static void start(void) { osThreadAttr_t attr; //设置GPIO_2引脚复用功能为PWM IoTIoSetFunc(IOT_IO_NAME_5, IOT_IO_FUNC_5_UART1_RXD); IoTIoSetFunc(IOT_IO_NAME_6, IOT_IO_FUNC_6_UART1_TXD); IoTIoSetFunc(IOT_IO_NAME_10, IOT_IO_FUNC_10_I2C0_SDA); IoTIoSetFunc(IOT_IO_NAME_9, IOT_IO_FUNC_9_I2C0_SCL); IoTI2cInit(0, 400000); dog_init(); genki_services_start(); init_service(); attr.name = "UART_Task"; attr.attr_bits = 0U; attr.cb_mem = NULL; attr.cb_size = 0U; attr.stack_mem = NULL; attr.stack_size = UART_TASK_STACK_SIZE; attr.priority = UART_TASK_PRIO; if (osThreadNew((osThreadFunc_t)UART_Task, NULL, &attr) == NULL) { printf("[ADCExample] Falied to create UART_Task! "); } } APP_FEATURE_INIT(start);动作逻辑主要参考如下视频:
// -------- -------- // | D9 | | D7 | // | joint9 | | joint7 | // ----- -------- --------- ----- // | D8 | | D6 | // | joint8 | | joint6 | // -------- -------- // | D2 | | D4 | // | joint2 | | joint4 | // ----- -------- --------- ----- // | D3 | | D5 | // | joint3 | | joint5 | // -------- -------- // Front ————————————————3.2 语音识别: 语音识别参考的笔者之前做的笔记: 《OpenHarmony学习笔记——Hi3861+ASR-01的语音识别助手》(https://blog.csdn.net/qq_41954556/article/details/123905578)。 由于功能比较简单,也就没有去弄数据包,一个简单的开头和一个数字,然后使用atoi函数获取数字,进行判断,最后执行操作即可。
// An highlighted block enum{ Get_Down,//趴下 Hand_shake,//握手 Go_Forward,//前进 Go_Backward,//后退 Go_Left,//左转 Go_Right,//右转 Twist_Body,//扭身子 Stretch_Oneself,//伸懒腰 WAIT//d }; //检测串口指令 void SIZU_Uart_Cmd(char *str) { char *Str; unsigned char ID=255; Str=&str[1];//定位到指令的数字部分“U1” ID=atoi(Str); if(strstr((const char *)str,"G")!=NULL) //如果字符串str中包含有“G” { switch(ID) { case Get_Down: //趴下 G0 sithome(); printf("Get_Down "); break; case Hand_shake: // 握手G1 wink(10); printf("Handshake "); break; case Go_Forward: // 前进G2 forward(5); printf("Go_Forward "); break; case Go_Backward: // 后退G3 backward(5); printf("Go_Backward "); break; case Go_Left: // 左转G4 leftturn(5); printf("Go_Left "); break; case Go_Right: // 右转G5 rightturn(5); printf("Go_Right "); break; case Twist_Body: // 扭身子 twist(); printf("LED_Add "); break; case Stretch_Oneself: //伸懒腰 printf("LED_Reduce "); stand3(); break; default: printf("%s ERROR",str); standhome(); break; } } memset(uart_buff,0,sizeof(uart_buff)); }OLED显示表情,这个需要找到表情包GIF然后分离出单帧表情,取模,显示,详细的取模过程参考博客:《0.96寸OLED取模教程——字符与图片取模》(https://blog.csdn.net/qq_39400113/article/details/108036400) 语音识别的关键词使用的是天问的鹿小班模块,内置图形化编程模块,YYDS!会拖动模块就可以了,想玩语音识别的,强烈推荐此款。
3.3 超声波测距: 这里笔者使用的是GPIO模式,利用两个GPIO口进行控制和捕获,进而计算出距离,详细介绍请参考笔者的博客《OpenHarmony南向学习笔记——Hi3861+HC-SR04超声波检测》(https://blog.csdn.net/qq_41954556/article/details/125910794)
通信流程:
主控芯片与TRIG连接的IO配置为输出模式,与ECHO连接的IO配置为输入模式;
MCU(编者注:Micro Controller Unit 微控制单元的英文缩写)给TRIG引脚输出一个大于10us的高电平脉冲;
模块通过ECHO脚返回一个高电平脉冲信号;
主控记录ECHO脚高电平脉冲时间T并代入公式计算。
代码:
// An highlighted block #define Echo 8 //Echo //GPIO8 #define Trig 7 //Trig //GPIO7 #define GPIO_FUNC 0 float GetDistance (void) { static unsigned long start_time = 0, time = 0; float distance = 0.0; IotGpioValue value = IOT_GPIO_VALUE0; unsigned int flag = 0; /*========GPIO通信模式流程1初始化GPIO =============== */ IoTIoSetFunc(Echo, GPIO_FUNC);//设置Echo连接IO为普通GPIO模式,无复用 IoTGpioSetDir(Echo, IOT_GPIO_DIR_IN);//设置Echo连接IO为输入模式 IoTGpioSetDir(Trig, IOT_GPIO_DIR_OUT);//设置Trig连接IO为输出模式 /* ======== GPIO通信模式流程 2输出起始信号 =============== */ IoTGpioSetOutputVal(Trig, IOT_GPIO_VALUE1);//拉高Trig IoTUdelay(20);//20us IoTGpioSetOutputVal(Trig, IOT_GPIO_VALUE0);//拉低Trig /* ======== GPIO通信模式流程 3检测Echo脚输出的高电平时间 ==== */ while (1) { IoTGpioGetInputVal(Echo, &value);//读取Echo脚的电平状态 if ( value == IOT_GPIO_VALUE1 && flag == 0) {//如果为高 start_time = IoTGetUs();//获取此时时间 flag = 1; } if (value == IOT_GPIO_VALUE0 && flag == 1) {//高电平结束变成低电平 time = IoTGetUs() - start_time;//计算高电平维持时间 start_time = 0; break; } } /* ======== GPIO通信模式流程 4代入公式计算 ====== */ distance = time * 0.034 / 2; // printf("distance is %f ",distance); return distance; }4. 机械结构 笔者也是第一次自己绘制3D结构件,还不太OK啊,跟着画了个锤子,然后觉着自己画的结构实在不太靠谱,于是去海鲜市场捞了一个,有相同烦恼的同学可以去看看。
4.1 物料清单:
四足机器人3D打印件(打印件不是整机,电子件、螺丝等自备)38 * 1
SG90 MG90S 9g舵机 固定翼航模遥控飞机 9克 马达航模5.99 * 9
16路PWM舵机驱动板PCA9685控制器机器人IIC适用MG90S SG90 MG995 19.6 * 1
锂电池两节18650或者2S,大约30-40,加上OLED、超声波模块,M3螺丝、螺母、铜柱、模组、芯片一起大约200成本。
总结 感谢立创EDA、传智、黑马程序员、CSDN提供的鸿蒙物联网实战训练营活动,在本次活动中学到了很多之前未接触的知识,受益良多。 写在最后 我们最近正带着大家玩嗨OpenHarmony。如果你有好玩的东东,欢迎投稿,让我们一起嗨起来!有点子,有想法,有Demo,立刻联系我们: 合作邮箱:zzliang@atomsource.org
原文标题:玩嗨OpenHarmony:基于OpenHarmony的机械狗进阶版——听话的狗子
文章出处:【微信公众号:开源技术服务中心】欢迎添加关注!文章转载请注明出处。
-
机械狗
+关注
关注
0文章
18浏览量
4834 -
OpenHarmony
+关注
关注
25文章
3716浏览量
16273
原文标题:玩嗨OpenHarmony:基于OpenHarmony的机械狗进阶版——听话的狗子
文章出处:【微信号:开源技术服务中心,微信公众号:共熵服务中心】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论