嘉立创产业服务站群
发作品签到
专业版

【训练营】一只能动的修狗

工程标签

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设计也是较为感兴趣;
实现功能:狗子的基本功能诸如安装、踏步、前进、后退、等已实现。本想着实现超声波测距进而实现避障,可是模块是坏的,视频录制前电源指示模块和一个舵机罢工,所以效果有点奇怪。
正面.jpg 俯视.jpg
左面.jpg 右后.jpg

原理图设计说明

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

增加部分:

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

PCB设计说明

基本上是根据原理图进行布局传递后的布局,主要思路是左上为电源,右上为Hi3861模组,下方则是留给了PCA9685,整体较为简单。
image.png
image.png
引脚连接.jpg

材料选择

舵机:MG90S金属齿轮
主控:传智Hi3861模组
电池:两并两串18650锂电池 7.4V 4000mAh
电量显示:4段显示

3D外壳

顶部、底部盖板进行了加宽,侧边盖板加高,大腿加长和小腿修改,前后挡板也做了修改,前部挡板和实际的超声波尺寸有点不匹配,电量显示模块与后部挡板匹配。
image.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.png

程序设计

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

image.png

代码编辑器

Visual Studio Code,个人比较熟悉
image.png

1 关于安装模式

由于我的狗子大腿较长,默认的安装模式狗子就站不稳了,因此需要在狗腿模拟其中输入参数进行调整。
image.png
其他的静态姿势根据该软件调整后获取alpha以及beta的度数,
在获取上述姿势的角度后通过pycarm IDE进行下载验证。

自定义狗腿安装模式

image.png

2 修改网页增加按钮并实现功能(注意html的格式)

网页修改如下,增加按钮的同时增加绑定对应的点击动作函数。
image.png
浏览器直接查看
image.png

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中

image.png

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

附件

序号文件名称下载次数
1
ProProject_【训练营】一只能动的修狗_2022-07-23.zip
6
2
ohosdog_beiguoxia007.7z
7
3
修狗的乱舞.html
6
4
3D模型.zip
6
克隆工程
添加到专辑
0
0
分享
侵权投诉

工程成员

评论

全部评论(1)
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航