OpenHarmony轻量系统开发【13】鸿蒙小车开发

13.1 小车介绍

基于鸿蒙系统 + Hi3861 的WiFi小车

首先,我们得有一套WiFi小车套件,其实也是Hi3861 加上电机、循迹模块、超声波等模块。

小车安装完大概是这样:

13.2 电机驱动

我们这里先只做最简单的,驱动小车的电机,让小车跑起来。

电机的驱动板如下图,目前电机驱动芯片用的是L9110S芯片。

典型的应用电路如下图:

我们可以看到,如果要控制电机,我们芯片至少需要2路PWM信号,一路用于控制正转,一路用于控制反转。

然后我们小车有两个轮子,需要两个电机,所以我们需要 4 路IO口

基于鸿蒙系统 + Hi3861 的wifi小车,可以通过电脑、手机控制

需要注意,实际代码并没有使用PWM,而是直接IO控制。

void pwm_init(void)
{IoTGpioInit(IO_NAME_GPIO_0);IoTGpioInit(IO_NAME_GPIO_1);IoTGpioInit(IO_NAME_GPIO_9);IoTGpioInit(IO_NAME_GPIO_10);//寮曡剼澶嶇敤//hi_io_set_func(IO_NAME_GPIO_0, 0); //hi_io_set_func(IO_NAME_GPIO_1, 0); 	//hi_io_set_func(IO_NAME_GPIO_9, 0); //hi_io_set_func(IO_NAME_GPIO_10, 0); 
}//鍋滄
void pwm_stop(void)
{//鍏堝仠姝WMgpio_control(GPIO0, IOT_GPIO_VALUE1);gpio_control(GPIO1, IOT_GPIO_VALUE1);gpio_control(GPIO9, IOT_GPIO_VALUE1);gpio_control(GPIO10, IOT_GPIO_VALUE1);
}
void car_stop(void)
{car_info.cur_status = car_info.go_status;printf("pwm_stop \r\n");pwm_stop();
}//鍓嶈繘
void pwm_forward(void)
{//鍏堝仠姝WMgpio_control(GPIO0, IOT_GPIO_VALUE1);gpio_control(GPIO1, IOT_GPIO_VALUE0);gpio_control(GPIO9, IOT_GPIO_VALUE1);gpio_control(GPIO10, IOT_GPIO_VALUE0);//鍚姩A璺疨WM//左轮//IoTPwmStart(PWM_PORT_PWM3, 64000, 64000);//右轮//IoTPwmStart(PWM_PORT_PWM0, 64000, 64000);
}
void car_forward(void)
{if(car_info.go_status != CAR_STATUS_FORWARD){//鐩存帴閫€鍑?return ;}if(car_info.cur_status == car_info.go_status){//鐘舵€佹病鏈夊彉鍖栵紝鐩存帴鎺ㄥ嚭return;}car_info.cur_status = car_info.go_status;printf("pwm_forward \r\n");pwm_forward();step_count_update();
}//鍚庨€€
void pwm_backward(void)
{//鍏堝仠姝WMgpio_control(GPIO0, IOT_GPIO_VALUE0);gpio_control(GPIO1, IOT_GPIO_VALUE1);gpio_control(GPIO9, IOT_GPIO_VALUE0);gpio_control(GPIO10, IOT_GPIO_VALUE1);//鍚姩A璺疨WM//IoTPwmStart(PWM_PORT_PWM4, 64000, 64000);//IoTPwmStart(PWM_PORT_PWM1, 64000, 64000);
}
void car_backward(void)
{if(car_info.go_status != CAR_STATUS_BACKWARD){//鐩存帴閫€鍑?return ;}if(car_info.cur_status == car_info.go_status){//鐘舵€佹病鏈夊彉鍖栵紝鐩存帴鎺ㄥ嚭return;}car_info.cur_status = car_info.go_status;printf("pwm_backward \r\n");pwm_backward();step_count_update();
}//宸﹁浆
void pwm_left(void)
{//鍏堝仠姝WMgpio_control(GPIO0, IOT_GPIO_VALUE0);gpio_control(GPIO1, IOT_GPIO_VALUE0);gpio_control(GPIO9, IOT_GPIO_VALUE1);gpio_control(GPIO10, IOT_GPIO_VALUE0);//鍚姩A璺疨WM//IoTPwmStart(PWM_PORT_PWM0, 64000, 64000);}
void car_left(void)
{if(car_info.go_status != CAR_STATUS_LEFT){//鐩存帴閫€鍑?return ;}if(car_info.cur_status == car_info.go_status){//鐘舵€佹病鏈夊彉鍖栵紝鐩存帴鎺ㄥ嚭return;}car_info.cur_status = car_info.go_status;printf("pwm_left \r\n");pwm_left();step_count_update();
}//鍙宠浆
void pwm_right(void)
{//鍏堝仠姝WMgpio_control(GPIO0, IOT_GPIO_VALUE1);gpio_control(GPIO1, IOT_GPIO_VALUE0);gpio_control(GPIO9, IOT_GPIO_VALUE0);gpio_control(GPIO10, IOT_GPIO_VALUE0);//鍚姩A璺疨WM//IoTPwmStart(PWM_PORT_PWM3, 64000, 64000);
}
void car_right(void)
{if(car_info.go_status != CAR_STATUS_RIGHT){//鐩存帴閫€鍑?return ;}if(car_info.cur_status == car_info.go_status){//鐘舵€佹病鏈夊彉鍖栵紝鐩存帴鎺ㄥ嚭return;}car_info.cur_status = car_info.go_status;printf("pwm_right \r\n");pwm_right();step_count_update();
}

最后,要使用pwm功能,我们需要修改

device/soc/hisilicon/hi3861v100/sdk_liteos/build/config/usr_config.mk

增加这两行,这里是打开PWM功能

CONFIG_PWM_SUPPORT=yCONFIG_PWM_HOLD_AFTER_REBOOT=y

13.3 WiFi控制部分

我们在小车上面简单编写一个UDP程序,监听50001端口号。这里使用的通信格式是json,小车收到UDP数据后,解析json,并根据命令执行相应的操作,例如前进、后退、左转、右转等,代码如下:

电脑端,使用C#编写一个测试程序,可以手动输入小车的IP地址,也可以不输入IP地址,这样,电脑端程序会发送广播包给小车,也可以起到控制的功能。

13.4 WiFi热点连接

注意,我这里WiFi小车固件默认连接热点的ssid是:

读者需要自己修改成自己的热点。

文件:sta_entry.c

小车的源码,C#控制端的代码均开源,大家可以自由修改,发挥自己的想象,创造出更厉害炫酷的DIY产品。

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/818227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ModuleNotFoundError: No module named ‘llama_index.readers“解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

怎样将PDF转成PPT,有免费的工具吗?

PDF转换为PPT的需求在现代办公和学习中越来越常见。很多人可能遇到过需要将PDF文件中的内容转移到PPT中以方便编辑和展示的情况。幸运的是,现在市面上有许多工具可以帮助我们实现这一目标,而且其中不乏一些免费的选项。本文将详细介绍如何使用这些免费工…

自然语言处理、大语言模型相关名词整理

自然语言处理相关名词整理 零样本学习(zero-shot learning)词嵌入(Embedding)为什么 Embedding 搜索比基于词频搜索效果好? Word2VecTransformer检索增强生成(RAG)幻觉采样温度Top-kTop-p奖励模…

Python | Leetcode Python题解之第24题两两交换链表中的节点

题目: 题解: class Solution:def swapPairs(self, head: ListNode) -> ListNode:dummyHead ListNode(0)dummyHead.next headtemp dummyHeadwhile temp.next and temp.next.next:node1 temp.nextnode2 temp.next.nexttemp.next node2node1.next…

Hello算法11:排序

https://www.hello-algo.com/chapter_sorting/ 选择排序 初始未排序的区间是[0,n-1]在[0,n-1]中查找最小元素,和索引0交换,此时未排序的区间是[1,n-1]在[1,n-1]中查找最小元素,和索引1交换,此时未排序区间是[2,n-1]以此类推&…

基于springboot+vue+Mysql的藏区特产销售平台

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

TC387实现SPI自通讯

TC387实现SPI自通讯 预期效果: TC387上定义两个SPI通讯接口,一个用于发数据一个用于收数据。准确无误的收到一次数据就对核心板led灯的状态进行一次翻转。 由于实验设备有限,只能想办法通过现有设备进行实验。 实现过程: 最开…

linux 设置定时任务---学习

1、设置定时任务 crontab -e 设置格式参考:【Linux】Linux crontab 命令定时任务设置_crontab 设置每天10:30执行-CSDN博客 测试过程: */1 * * * * /root/cronjob.sh 脚本内容: echo "hell0 cronjob" >> /root/test/hello.txt 实现…

extends继承

目录 什么时候用继承? 继承的格式? 继承的特点 子类可以继承父类的哪些呢? 是否可以继承父类的构造方法呢? 是否可以继承成员变量? 是否可以继承成员方法? 在Java中,extends关键字用于实现继承关系。通过使用…

24年重庆三支一扶报名照不通过怎么处理?

24年重庆三支一扶报名照不通过怎么处理?

Laravel 11入门:使用ServBay打造高效开发环境

Laravel 11发布,改进了不少功能。 它引入了更加流畅的应用结构、每秒限速、健康路由等特性。 此外,Laravel还推出了第一方可扩展的WebSocket服务器Laravel Reverb,为你的应用提供强大的实时功能。 在今天的指南中,我将设置一个…

ASP.NET基于BS课件发布系统

摘 要:本文在分析建立动态网站的技术细节和课件发布工作流程的基础上,阐述了网站的结构与功能设计。本网站采用的是B/S结构,网站使用 Microsoft Visual Studio .NET2003作为主要开发工具,采用Dreamweaver 作为辅助开发工具实现网…

ELK日志分析系统之Zookeeper

一、Zookeeper简介 ZooKeeper是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务,它提供了一项基本服务:分布式锁服务。分布式应用可以基于它实现更高级的服务,实现诸如同步服务、配置维护和集群管理或者命名的服务。 Zookeepe…

3_3.Apache的管理及优化web

### 一.Apache的作用 ### 在web被访问时通常使用http://的方式 http:// ##超文本传输协议 http:// 超文本传输协议提供软件: Apache nginx stgw jfe Tengine ### 二.Apache的安装 ### dnf install httpd.x86_64 -y ### 三.Apache的启用 ### systemctl enable --…

C语言 03 VSCode开发

安装好 C 语言的开发环境后,就需要创建项目进行开发了。 使用 IDE(集成开发环境)进行开发了。 C 语言的开发工具很多,现在主流的有 Clion、Visual Studio、VSCode。 这里以 VSCode 作为演示。 创建项目 安装 VSCode。 推荐直接在…

【C语言】<动态内存管理>我的C语言终末章

<动态内存管理> 1. 为什么要有动态内存分配2. malloc和free2.1 malloc2.2 free 3. calloc和realloc3.1 calloc3.2 realloc 4.常见的动态内存错误4.1 对NULL指针的解引用操作4.2 对动态开辟空间的越界访问4.3 对非动态开辟内存使用free释放4.4 使用free释…

Navicat的安装与破解

个人介绍 hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 🦁作者简介:一名喜欢分享和记录学习的…

linux下常见解压命令gz、tar、zip详解

常见解压缩命令汇总 # .tar.gz解压 tar -zxvf jdk-17_linux-aarch64_bin.tar.gz # .tar.gz压缩 tar -czvf archive.tar.gz /path/to/directory# .gz解压 gzip -d file.gz # .gz压缩 gzip filename# zip解压 unzip filename.zip # zip压缩 zip archive.zip /path/to/file.tar.g…

累积分布函数图(CDF)的介绍、matlab的CDF图绘制方法(附源代码)

在对比如下两个误差的时候,怎么直观地分辨出来谁的误差更低一点?: 通过这种误差时序图往往不容易看出来。 但是如果使用CDF图像,以误差绝对值作为横轴,以横轴所示误差对应的累积概率为纵轴,绘制曲线图&am…