嵌入式比赛海思赛道(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盘目录,点击"下一步"。
根据安装向导提示,安装依赖软件python以及vscode,显示ok后,点击安装
4.打开vscode 进入DevEco Decive Tool工具界面
点击那个三角形
5.下载简体中文语言包,用户可以在VSCode工具商店安装"chinese(Simplified)(简体中
文)Language Pack for Visual Studio Code"插件,将VSCode设置为中文模式。
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
8.导入工程
将第6步下载好的文件导入
在导入工程弹窗中选择Hi3861 SDK目录,点击“导入”。导入路径选择与src、build目录层
级(如果采用zip包下载,SDK名称为hi3861_hdu_iot_application-master,如果采用git下载
SDK名称为hi3861_hdu_iot_application,此处以采用zip下载为例,注意如果出现无法导入的问
题,请检查目录层级是否正确,防止目录层级嵌套)
到这里编译环境就搭建好了
这里就可以编译运行啦!!!
串口的脚记得改,不然会烧入报错
进入代码编写部分
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
最后成功啦!!!
具体的代码,我就不说啦,官方给的案例里有
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点发出这篇文章
提前发了,没进决赛,评委说他不知道我的作品想表达什么。好吧,确实我的题目有点太泛了。给大家一个小建议,选题尽量小而精准。就是功能要很明确
作者:子小 金艮 卅