嵌入式比赛海思赛道(HI3861v100)使用心得及总结

IDE编译环境的构建

1.安装vscode(此步不多说)

2.下载devicetool-windows-tool-3.1.0.500.zip版

    下载地址:华为集成开发环境IDE DevEco Device Tool下载 | HarmonyOS设备开发

3.解压DevEco Device Tool压缩包,双击安装包程序,点击"下一步"进行安装

设置DevEco Device Tool的安装路径,请注意安路径不能包含中文字符,同时建议不要安
装到C盘目录
,点击"下一步"。

eca4e8a3570f4f49abcb3565939297e3.png

根据安装向导提示,安装依赖软件python以及vscode,显示ok后,点击安装

5e5d9685f97d4e3f9bcb8412c95963fc.png

4.打开vscode 进入DevEco Decive Tool工具界面

点击那个三角形

4e310428ce41429684557a879f17bc75.png

5.下载简体中文语言包,用户可以在VSCode工具商店安装"chinese(Simplified)(简体中
文)Language Pack for Visual Studio Code"插件,将VSCode设置为中文模式。

76a7709838e64d9bb2e31cf240507f45.png

6.SDK下载

下载SDK网址:https://gitee.com/HiSpark/hi3861_hdu_iot_application

注意:由于windows自身限制,路径不能超过260个字符,在git下载和解压Hi3861 SDK代码时尽
量放在D盘或者其他盘根目录下,防止导致的编译错误问题。 (名字太长会造成报错,千万注意)

7.开发工具下载

下载地址:https://hispark-obs.obs.cn-east-3.myhuaweicloud.com/DevTools_Hi3861V100_v1.0.zip

f9d8963d04d2451fa0115d7e1061b2d3.jpeg

8.导入工程

aa3f484193c440bc800c28dbbb7e0392.png

将第6步下载好的文件导入

在导入工程弹窗中选择Hi3861 SDK目录,点击“导入”。导入路径选择与src、build目录层
级(如果采用zip包下载,SDK名称为hi3861_hdu_iot_application-master,如果采用git下载
SDK名称为hi3861_hdu_iot_application,此处以采用zip下载为例,注意如果出现无法导入的问
题,请检查目录层级是否正确,防止目录层级嵌套)

447ab029777d4601b85601a87bde581c.png

e7106b7c461e4b90818bb2cb9cf7a705.png

到这里编译环境就搭建好了

0816e68201ed48cbb550e2d06cbfbc18.png

这里就可以编译运行啦!!!

串口的脚记得改,不然会烧入报错

进入代码编写部分

1.PWM的编写

首先来说说hi3861v100的PWM与STM32F4的区别

STM32F4一个PWM有4个通道!但是hi3861v100一个PWM只有一个通道

直接上代码

这是我写的pwm驱动电机的代码,只展示PWM部分

//引脚:2、3、4、5、6、8、9、10、11、14
#include <stdio.h>
#include <unistd.h>

#include "ohos_init.h"
#include "cmsis_os2.h"
#include "iot_pwm.h"
#include "iot_gpio.h"
#include "iot_gpio_ex.h"
#include "iot_uart.h"
#include "hi_io.h"
#include "hi_pwm.h"
#include "io_init.h"

void PWM_init(void)
{
    //1号电机(2,5,11)
    //设置GPIO_2引脚复用功能为PWM
    IoTGpioInit(IOT_IO_NAME_GPIO_2);
    hi_io_set_func(IOT_IO_NAME_GPIO_2, HI_IO_FUNC_GPIO_2_PWM2_OUT);
    IoTGpioSetDir(IOT_IO_NAME_GPIO_2, IOT_GPIO_DIR_OUT);
    IoTPwmInit(HI_PWM_PORT_PWM2);
   
}

主函数的部分(可以忽略互斥锁部分,因为和PWM没关系)

void PWM_Task(void)
{
    PWM_init();
    while (1)
    {
        IoTPwmStart(HI_PWM_PORT_PWM2, 55, 4000);
        IoTPwmStart(HI_PWM_PORT_PWM1, 60, 4000);
        IoTPwmStart(HI_PWM_PORT_PWM5, 60, 4000);
        // 获取互斥锁
        osMutexAcquire(runMutexId, osWaitForever);
        //没识别到门
        //Remote.Mode == '0'
        //if(Remote.Run == 1 && Remote.Mode == '0' )
        if(Remote.Run == 1)
        {
           LF_control_due();
           RF_control_due();
           LB_control_due();
           RB_control_due();
        }
        else if(Remote.Run == 0)
        {
            //    LF_control_stop();
            //    RF_control_stop();
            //    LB_control_stop();
            //    RB_control_stop();

             //识别到门&&没识别到数字
           if(Remote.Mode == '0') //停止不动
           {
               // 安全地访问共享变量
               LF_control_stop();
               RF_control_stop();
               LB_control_stop();
               RB_control_stop();
           }
           //识别到门&&识别到数字1
           else if(Remote.Mode == '1') //左转
           {
               // 安全地访问共享变量
               LF_control_opposite();
               RF_control_due();
               LB_control_due();
               RB_control_opposite();
           }
           //识别到门&&没识别到数字
          else if(Remote.Mode == '2')//右转
          {
               // 安全地访问共享变量
              RF_control_opposite();
              LF_control_due();
              RB_control_due();
              LB_control_opposite();
          }
          else if(Remote.Mode == '3')//直走 
         {
              RF_control_due();
              LF_control_due();
              RB_control_due();
              LB_control_due();
         }
          else if(Remote.Mode == '4')//后退 
         {
              RF_control_opposite();
              LF_control_opposite();
              RB_control_opposite();
              LB_control_opposite();
         }
        }
          // 释放互斥锁
        osMutexRelease(runMutexId);
    }
}


BUILD文件下的配置是这样的

static_library("control"){
    sources = [
        "src/io_init.c",
        "src/speed_control.c",
        "src/E53_IS1.c",
        "control.c"

    ]
    include_dirs = [
        "//commonlibrary/utils_lite/include",
        "//kernelteos_m/components/cmsis/2.0",
        "//base/iot_hardware/peripheral/interfaces/kits",
        "//device/soc/hisilicon/hi3861v100/sdk_liteos/include",
        "//base/iothardware/peripheral/interfaces/inner_api",
        "//foundation/communication/wifi_lite/interfaces/wifiservice",
        "/endor/hisilicon/hispark_pegasus/demo/oc_demo",
        "//device/hisilicon/hispark_pegasus/hi3861_adapterl/cmsis",
        "//base/hiviewdfx/hiview_lite",
        "include"
    ]
}

app目录下的BUILD文件下的配置是这样的

import("//build/lite/config/component/lite_component.gni")

lite_component("app") {
    features = [
        #"iothardware:uart_demo",
        #"D4_iot_tcp_server:tcp_server",
        #"car_clin:control",
        "sg92r_demo:sg92r_control",
        #"demolink:example_demolink",
    ]
}

然后编译,烧入

2.uart部分(uart1和uart2同时打开)


一开始只能配置一个串口,同时配置2个串口会导致,其中一个串口初始化失败,这个问题困扰了我很久,合理怀疑

(1)资源抢占:用了类似说stm32的任务系统,还是出现无法配置2个串口的问题

(2)基础配置错误:只开串口1时,串口1正常通信。只开串口2时,串口2正常通信

!!!解决办法:

src/device/hisilicon/hispark_pegasus/sdk_liteos/app/wifiiot_app/src/app_main.c  第74行,4修改为7

4444288cd33a4f1f9b10398624429521.png

最后成功啦!!!
具体的代码,我就不说啦,官方给的案例里有

3.红外学习模块

码内学习后,单片机如何发送信息呢?

(1)配置发送的位数

直接上代码

uint16_t IR_Send_Pack(uint8_t *data,uint8_t index) {
	uint8_t *p = data;
	*p++ = 0x68;   //开始帧
	*p++ = 0x08;   
	*p++ = 0x00;
	*p++ = 0x00;
	*p++ = 0x12;
	*p++ = index;   //组数
	*p = Get_Check(&data[3], p - data - 3);
	p++;
	*p++ = 0x16;    //结束帧
	return p - data;
}

记不清了,记得其中有一个是配置发生内码还是外码的

然后通过串口发送

bufLen = IR_Send_Pack(buf,0x00);//发送第一组码
         IoTUartWrite(IOT_UART_IDX_2, buf, bufLen); 

这样就成功啦!!!

4.doft

doft的使用分为2种:

复杂的:需要Linux,但是一个小电脑太贵了,于是果断采用第二种

简单的:我直接把他当超声波去使用

具体的使用方法及代码,参考官方的嵌入式dtof模组开发学习资料

5.TCP通信

我的比赛作品是自己做了一个小程序,使用小程序通过DUP与hi3861v100实现无线通讯

这里只说小熊派的通信

(1)首先可以参考官方的案例,然后在案例的基础上进行更改。直接上我修改部分的代码

 

(2)改完后进行测试(注意DUP通信的服务器和客户端要在同一个局域网上

        这个代码会打印出DUP连接的信息,会把分配给客户端的IP地址打印出来。再把这个IP地址,写到小程序的代码上即可。

缺点:我用手机开的热点,每一次小熊派重启时都会造成,分配给客户端的IP地址改变。

尝试解决这个问题:

方法1:设置为静态IP:设置后,直接造成无法连接。

所以最后这个问题没有解决,只能凑合的用了

6.和K210的通信(串口)

7.蓝牙模块进行双板通信

8.DS1820数字温度传感器

通过蓝牙模块进行小熊派与STM32F4的无线通信

总结:我做的是一个小车,可以实现自动移动,然后控教室的空调和电灯的功能,可以在小程序上显示温度的功能。

小熊派1号:控制底盘的四个轮子

                    控制红外发射模块

                    与小熊派2号进行通信

                    dotf模组

小熊派2号:接收K210的数据

                    通过DUP和小程序进行通信

                    温度传感器

                    蓝牙模块与模拟教室通信

                    与小熊派1号进行通信

                    控制舵机

模拟教室(STM32F4):红外遥控(模拟空调)

                                         蓝牙模块

                                         12v的LED灯条

 

这个作品就结束了,但是因为K210的识别不是准的问题,小车的移动效果不是很好.

此文章是在2024年7月23号写完,因为25号才结束比赛,26号出结果,为了避免不必要的争议,所以我定时在27号18点发出这篇文章

提前发了,没进决赛,评委说他不知道我的作品想表达什么。好吧,确实我的题目有点太泛了。给大家一个小建议,选题尽量小而精准。就是功能要很明确

 

 

 

 

  • 17
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值