
专业版
【训练营】一只能动的修狗
1.8k
0
0
0
简介
1 基于Hi3861实现舵机控制 2 使用MG90S实现修狗的运动
简介:1 基于Hi3861实现舵机控制 2 使用MG90S实现修狗的运动开源协议
:LGPL
创建时间:2022-06-26 08:48:02更新时间:2022-07-25 08:02:20
描述
项目简介
初见这只狗子,就想取名为一只能动的修狗~,所以项目名就叫一只能动的修狗;
制作想法:对于舵机控制比较感兴趣,3D设计也是较为感兴趣;
实现功能:狗子的基本功能诸如安装、踏步、前进、后退、等已实现。本想着实现超声波测距进而实现避障,可是模块是坏的,视频录制前电源指示模块和一个舵机罢工,所以效果有点奇怪。




原理图设计说明
在已给定的基础原理图基础上,对系统的原理进行模块化绘制,如下图所示:

增加部分:
(1)电源中加入了火车头以及电源开关,这两个器件都是大电流器件,并将所需电源电压引出以供使用;
(2)对四个腿的接口进行分组,并引出剩余的8组扩展接口;
(3)加入了电源指示LED和一个功能LED;
(4)板框螺柱;
注意:若要接入电池电量指示模块,H1中的PWR替换为VIN更合理,这样才能实现开关动作时电量指示随之打开和关闭,否则的话就是一直打开消耗电池。

PCB设计说明
基本上是根据原理图进行布局传递后的布局,主要思路是左上为电源,右上为Hi3861模组,下方则是留给了PCA9685,整体较为简单。



材料选择
舵机:MG90S金属齿轮
主控:传智Hi3861模组
电池:两并两串18650锂电池 7.4V 4000mAh
电量显示:4段显示
3D外壳
顶部、底部盖板进行了加宽,侧边盖板加高,大腿加长和小腿修改,前后挡板也做了修改,前部挡板和实际的超声波尺寸有点不匹配,电量显示模块与后部挡板匹配。







程序设计
使用传智官方提供的虚拟机,VMWare16 Pro直接打开,没有任何报错,hb build可直接使用

代码编辑器
Visual Studio Code,个人比较熟悉

1 关于安装模式
由于我的狗子大腿较长,默认的安装模式狗子就站不稳了,因此需要在狗腿模拟其中输入参数进行调整。

其他的静态姿势根据该软件调整后获取alpha以及beta的度数,
在获取上述姿势的角度后通过pycarm IDE进行下载验证。
自定义狗腿安装模式

2 修改网页增加按钮并实现功能(注意html的格式)
网页修改如下,增加按钮的同时增加绑定对应的点击动作函数。

浏览器直接查看

C代码逻辑修改
主程序
#include <stdio.h>#include <string.h>#include <strings.h>#include <stdlib.h>#include <unistd.h>#include "ohos_init.h"#include "cmsis_os2.h"#include "genki_base.h"#include "genki_web_ohosdog.h"#include "genki_web.h"#include "genki_pin.h"#include "dog.h"#include "led.h"#include "beep.h"#include "lcd_st7735.h"static void init_service(void){genki_web_register(newDogService());}static void start(void){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);init_led();init_beep();init_service();dog_init();genki_services_start();dog_install();// ST7735_LCD_Init();// LCD_ShowString(8, 8, "Hello Word", BLACK, BLUE, 16, 1);}APP_FEATURE_INIT(start);
安装模式
void dog_install(void){dog_setLeftFrontAngle(45, 135);dog_setLeftBackAngle(45, 135);dog_setRightFrontAngle(45, 135);dog_setRightBackAngle(45, 135);}
静态姿势
设定dog.c中type为2时作为静态姿势的通信命令,当htm通过http下发json字符串到Hi3861时,只保留了Hi3861对代表了四种静态姿势命令“index”键值对的解析,而抛弃了其他的键值对解析。
void dog_execJson(char *buf, int len){cJSON *recv_json;recv_json = cJSON_ParseWithLength(buf, len);int type = cJSON_GetObjectItem(recv_json, "type")->valueint;if (type == 1){dog_install();}else if (type == 2){int index = cJSON_GetObjectItem(recv_json, "index")->valueint;// cJSON *data_json;// data_json = cJSON_GetObjectItem(recv_json, "data");// int alpha = cJSON_GetArrayItem(data_json, 0)->valueint;// int beta = cJSON_GetArrayItem(data_json, 1)->valueint;// if (index == 0) {// dog_setLeftFrontAngle(alpha, beta);// } else if (index == 1) {// dog_setLeftBackAngle(alpha, beta);// } else if (index == 2) {// dog_setRightFrontAngle(alpha, beta);// } else if (index == 3) {// dog_setRightBackAngle(alpha, beta);// }if (index == 0) // 蹲下{dog_setLeftFrontAngle(15, 165);dog_setLeftBackAngle(15, 165);dog_setRightFrontAngle(15, 165);dog_setRightBackAngle(15, 165);}else if (index == 1) // 起立{dog_setLeftFrontAngle(85, 70);dog_setLeftBackAngle(85, 70);dog_setRightFrontAngle(85, 70);dog_setRightBackAngle(85, 70);}else if (index == 2) // 前趴{dog_setLeftFrontAngle(-40, 45);dog_setRightFrontAngle(-40, 45);dog_setLeftBackAngle(45, 90);dog_setRightBackAngle(45, 90);}else if (index == 3) // 后趴{dog_setLeftFrontAngle(90, 135);dog_setRightFrontAngle(90, 135);dog_setLeftBackAngle(160, 180);dog_setRightBackAngle(160, 180);}}else if (type == 3){int execute_count = 1;if (cJSON_HasObjectItem(recv_json, "count")){execute_count = cJSON_GetObjectItem(recv_json, "count")->valueint;}dog_action_t *action = malloc(sizeof(dog_action_t));action->exec_count = execute_count;// 发送多条cJSON *list_json;list_json = cJSON_GetObjectItem(recv_json, "list");int count = cJSON_GetArraySize(list_json);action->len = count;action->cmds = malloc(sizeof(dog_cmd_t) * count);for (int i = 0; i < count; i++){cJSON *item_json;item_json = cJSON_GetArrayItem(list_json, i);dog_cmd_t cmd;cmd.angle[0] = cJSON_GetArrayItem(item_json, 0)->valueint;cmd.angle[1] = cJSON_GetArrayItem(item_json, 1)->valueint;cmd.angle[2] = cJSON_GetArrayItem(item_json, 2)->valueint;cmd.angle[3] = cJSON_GetArrayItem(item_json, 3)->valueint;cmd.angle[4] = cJSON_GetArrayItem(item_json, 4)->valueint;cmd.angle[5] = cJSON_GetArrayItem(item_json, 5)->valueint;cmd.angle[6] = cJSON_GetArrayItem(item_json, 6)->valueint;cmd.angle[7] = cJSON_GetArrayItem(item_json, 7)->valueint;cmd.duration = cJSON_GetArrayItem(item_json, 8)->valueint;action->cmds[i] = cmd;}dog_execAction(action);}cJSON_Delete(recv_json);}
其他的动作根据修改软件产生后写入到html中

设计图

BOM


添加到专辑
0
0
分享
侵权投诉
评论