• [立创&传智&黑马程序员&CSDN]训练营——仿生机械狗


    功能描述

    四足机器人:目前已经支持语音控制前进、后退、左转、右转、扭身子、握手、跳跃等;支持AP模式,用终端连接热点,访问网页进行控制;还支持使用HC05和蓝牙调试器进行控制;超声波避障还在优化中。

    成品展示

    视频展示

    1.自己的方案:【立创训练营–听话的狗子-哔哩哔哩】
    2.官方作业:【立创训练营–仿生机器狗(丐版)-哔哩哔哩】
    其他的学习作品:
    1.【Hi3861+oled播放动画-哔哩哔哩】
    2.OpenHarmony学习笔记——Hi3861+ASR-01的语音识别助手
    3.【OpenHarmony南向开发日常–基于Hi3861与onenet的远程温湿度检测-哔哩哔哩】

    硬件介绍

    电源部分

    由于整个项目需要驱动9个舵机,需要比较大的电流,所以供电选用两节18(直径)65(长度)0(圆柱形)锂电池,电源部分主要使用12V-5V,以及5V-3.3V的LDO(这里有个优化点,作者当时图简单,使用的都是LDO,实测发热还是比较严重,后面有打算换成DCDC进行供电)。

    手册参考电路

    LM1084(商城料号:C259973):
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ffpZyWjU-1657773575958)(//image.lceda.cn/pullimage/gACjDLG8vONimqY4X50v8s1RIpLYqWG4yfi9x6lW.png)]

    UZ1084:(商城料号:C84897)
    在这里插入图片描述

    实际使用电路

    在这里插入图片描述

    主控电路

    主控使用的是传智教育的HI3861模组(商城料号C2923578),该模组内置最小系统电路,简化了该部分电路设计,只需要额外增加一个复位电路以及在电源部分添加一个100nF的旁路电容C7(大电容滤除低频噪声,小电容滤除高频噪声)即可。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lRr5ahCN-1657773575959)(//image.lceda.cn/pullimage/BgNwWxfOx765uRSJqUA5Io6cqbSgPcJYtxBh23g4.png)]

    下载电路

    上一期鸿蒙训练营,没有添加CH340需要外部接线,给我人接麻了,疼定思痛,加上了CH340G模块,由于使用的是Typec接口,所以在CC1和CC2要下来俩个电阻,方便电脑识别如果不加有可能会识别不到。另外,Hi3861是3.3V电压基准,为了保证统一电平,这里CH340G采用3.3V供电(上一期笔者有用5V供电烧录失败的经历)所以对应的V3端口也要接3.3V,而非5V供电时的那样。
    在这里插入图片描述

    舵机驱动模块

    由于PCA9685商城没有现货,在某宝查了一下价格,买个芯片和买个模块要花差不多的米,本着提高成功率的态度,买了模块。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7yDP66sx-1657773575961)(//image.lceda.cn/pullimage/qlNEwTnusKDa6lZo2W71JgydFiXp6JFL9iwEQss2.png)]

    语音识别模块

    语音识别使用的是鹿小班语音识别模块,官方简介:
    ASR-01是一颗专用于语音处理的人工智能芯片,可广泛应用于家电、家居、照明、玩具等产品领域,实现语音交互及控制。
    ASR-ONE内置自主研发的脑神经网络处理器BNPU,支持200条命令词以内的本地语音识别,内置CPU核和高性能低功耗Audio Codec模块,集成多路UART、IIC、PWM、GPIO等外围控制接口,可以开发各类高性价比单芯片智能语音产品方案。
    在这里插入图片描述

    想要购买的戳这——「LU-ASR01鹿小班智能语音识别模块 离线识别 自定义词条远超LD3320」他们近期出了一款PRO版本,据说是支持声纹识别的,笔者还没买来尝鲜,有兴趣的同学自行了解吧。

    其他注意事项

    可能是由于这个模组BootLoader的影响,在上电和烧录时,如果其它引脚接入了模块就会造成乱码和无法复位的问题,所以在设计电路的时候,对于IO的使用尽量用排针排母引出使用而不是在电路中焊死,例如串口1的TX、RX如果上电之前已经接了CH340之类的就有可能出现无法启动,无法复位,无法烧录的问题。

    软件简介

    主体框架

    程序主体还是用的传智官方的示例,在此基础上进行了亿点点修改,主要是增加了一个串口任务和动作逻辑。

    
    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("=======================================\r\n");
            printf("*************SIZU_example**************\r\n");
            printf("=======================================\r\n");
    
            // //通过串口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\r\n", 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!\n");
        }
    }
    
    APP_FEATURE_INIT(start);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    动作逻辑主要参考的B站——【金属舵机+3D打印四足机器人-哔哩哔哩】

    //  --------                 --------
    // |  D9    |               |  D7    |
    // | joint9 |               | joint7 |
    //  ----- --------     --------- -----
    //       |  D8    |   |  D6    |
    //       | joint8 |   | joint6 |
    //        --------     --------
    //       |  D2    |  |   D4    |
    //       | joint2 |  |  joint4 |
    //  ----- --------    --------- -----
    // |  D3    |               |  D5    |
    // | joint3 |               | joint5 |
    //  --------                 --------
    //                Front
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    然后是语音识别,参考的笔者上期鸿蒙做的笔记——OpenHarmony学习笔记——Hi3861+ASR-01的语音识别助手,由于功能比较简单,也就没有去弄数据包,一个简单的开头和一个数字,然后使用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\r\n");
    				break;
    			case Hand_shake:	// 握手G1
                    wink(10);
                    printf("Handshake\r\n");
    				break;
    			case Go_Forward:	// 前进G2
                    forward(5);
                    printf("Go_Forward\r\n");
    				break;
    			case Go_Backward:	// 后退G3
                     backward(5);
                     printf("Go_Backward\r\n");
    				break;
                case Go_Left:	// 左转G4
                    leftturn(5);
                     printf("Go_Left\r\n");
    				break;
                 case Go_Right:	// 右转G5
                     rightturn(5);
                     printf("Go_Right\r\n");
    				break;
                case Twist_Body:	// 扭身子
                     twist();
                     printf("LED_Add\r\n");
    				break;
                case Stretch_Oneself:	//伸懒腰
                     printf("LED_Reduce\r\n");
                     stand3();
    				break;
    			default:
    				printf("%s ERROR",str);
                    standhome();
    				break;
    		}
    	}
        memset(uart_buff,0,sizeof(uart_buff));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66

    语音识别代码

    语音识别使用的是天问的鹿小班模块,内置图形化编程模块,YYDS,会拖动模块就可以了,想玩语音识别的,强烈推荐此款。
    在这里插入图片描述

    蓝牙APP

    由于笔者没有学习过APP的制作,这里用的是蓝牙调试器来制作的上位机,这个调试器功能还是蛮强的,有兴趣的可以去试试。
    在这里插入图片描述

    顺便问一下,哪位同学有好的APP制作教程啊,就做做简单上位机的那种。

    机械结构

    笔者也是第一次自己绘制3D结构件,还不太OK啊,跟着画了个锤子,然后觉着自己画的结构实在不太靠谱,于是去海鲜市场捞了一下,找到了这个,有相同烦恼的同学可以去看看,38米——四足机器人3D打印件(打印件不是整机,电子件、螺丝等自备)
    在这里插入图片描述
    在这里插入图片描述

    学习笔记

    这里有亿点点鸿蒙学习笔记,放在这欢迎大家交流学习,有错误之处欢迎私信教我修改,不然误人子弟了。
    OpenHarmony学习笔记——南向开发环境搭建
    OpenHarmony学习笔记——编辑器访问Linux服务器进行编译
    OpenHarmony学习笔记——点亮你的LED
    OpenHarmony学习笔记——多线程的创建
    OpenHarmony学习笔记——I2C驱动0.96OLED屏幕
    OpenHarmony学习笔记——Hi3861使用DHT11获取温湿度
    OpenHarmony学习笔记——Hi3861接入OneNET
    手把手教你OneNET数据可视化
    OpenHarmony学习笔记——Hi386+ASR-01的语音识别助手
    Hi3861网络通信——UDP收发

    总结

    文中如有不妥之处欢迎批评指出,工程资料链接——听话的狗子

  • 相关阅读:
    Linux 中的 cd 命令及示例
    webpack学习笔记(十)模块与依赖
    企业实践 | 国产操作系统之光? 银河麒麟KylinOS-V10(SP3)高级服务器操作系统基础安装篇
    C# WPF Threads 和 Dispatchers 有什么区别
    通信达行情接口是什么意思?
    [iOS开发]-暑期二-3GShare-协议传值的多方面运用
    Spring MVC中如何进行页面重定向呢?
    xgboost 中的二阶导数为什么收敛更快?
    java每日一记 —— List创建的方式判断
    Tmux教学【有图有代码】
  • 原文地址:https://blog.csdn.net/qq_41954556/article/details/125781948