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)
{
	//鍏堝仠姝WM
    gpio_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)
{
	//鍏堝仠姝WM
    gpio_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)
{
	//鍏堝仠姝WM
    gpio_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)
{
	//鍏堝仠姝WM
    gpio_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)
{
	//鍏堝仠姝WM
    gpio_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=y

CONFIG_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.鸿蒙南向开发方向

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Simlab python二次开发1-将所有缸套内表面半径加大1mm

Simlab python二次开发1-将所有缸套内表面半径加大1mm 1、打开模型文件2、getBodiesWithSubString()从名字得到Bodies3、建Body类Group3.1、定义放入Group中的Bodies3.2、建Group 4、将缸套内表面建组,并扩半径1mm4.1、simlab.getBodiesFromG…

【嵌入式之中断】

Cortex-M4集成了嵌套式矢量型中断控制器(Nested Vectored Interrupt Controller (NVIC))来实现高效的异常和中断处理。NVIC实现了低延迟的异常和中断处理,以及电源管理控制。它和内核是紧密耦合的。 凡是打断程序顺序执行的事件都称为异常(exception&am…

Gitlab: Python项目CI/CD实践

目录 1. 说明 2. 准备工作 2.1 服务器 2.2 开发机hosts文件 2.3 项目 3. 步骤过程 3.1 建仓Fastapi T1 3.2 开发机测试构建与推送 ​编辑 3.3 在工作站添加gitlab-runner 3.4 提交代码,查看Pipelines结果 3.5 观察部署情况 4. 参考 1. 说明 分别以一个…

线程互斥及基于线程锁的抢票程序

我们实现一个简单的多线程抢票程序。 #include<iostream> #include<thread> #include<unistd.h> #include<functional> #include<vector> using namespace std; template<class T> using func_tfunction<void(T)>;//返回值为void,…

leetcode刷题(python)——(四)

01.02.03 练习题目&#xff08;第 04 天&#xff09; 1. 0048. 旋转图像 1.1 题目大意 描述&#xff1a;给定一个 n n n \times n nn 大小的二维矩阵&#xff08;代表图像&#xff09; m a t r i x matrix matrix。 要求&#xff1a;将二维矩阵 m a t r i x matrix matr…

点云的投影------PCL

点云的投影 /// <summary> /// 参数化模型投影点云 /// </summary> /// <param name"cloud">点云</param> /// <param name"x">投影平面x面的系数</param> /// <param name"y"></param> /// &…

【Qt-Qt Creator使用技巧】

工具-Qt Creator ■ 使用技巧■ 定义触发片段■ Qt Creator 行编辑■ 代码注释■ 代码补全■ 快速给函数添加定义■ 创建书签■ 同步列输入■ 局部替换■ 源代码阅读■ 源码调试■ 使用技巧 ■ 定义触发片段 ■ Qt Creator 行编辑 shift + alt + up / down来获得多个游标。 …

第二部分 Python提高—GUI图形用户界面编程(三)

简单组件学习 Radiobutton 单选按钮、Checkbutton 复选按钮和canvas 画布 文章目录 Radiobutton 单选按钮Checkbutton 复选按钮canvas 画布 Radiobutton 单选按钮 Radiobutton 控件用于选择同一组单选按钮中的一个。Radiobutton 可以显示文本&#xff0c;也可以显示图像。 f…

CUDA编程---线程束洗牌指令

从Kepler系列的GPU&#xff08;计算能力为3.0或更高&#xff09;开始&#xff0c;洗牌指令&#xff08;shuffle instruction&#xff09;作为一种机制被加入其中&#xff0c;只要两个线程在相同的线程束中&#xff0c;那么就允许这两个线程直接读取另一个线程的寄存器。 洗牌指…

程序员购车指南

哈喽大家好&#xff0c;我是咸鱼。 爱车可以说是大部分男人的天性&#xff0c;而我对汽车的热情却远不及对手表的钟爱&#xff08;痴迷劳力士&#xff09;。以至于我的朋友掏出车钥匙指着上面的苹果树标志跟我介绍奔驰 AMG 系列的强劲性能和马力时&#xff0c;我只能尽量假装自…

C++的继承

目录 前言 继承的概念和定义 访问权限表 基类和派生类对象的赋值转换 继承中的作用域 派生类的默认成员函数 继承与友元 继承与静态成员 复杂的菱形继承和菱形虚拟继承 菱形虚拟继承 观察内存 注意事项&#xff1a;对象在内存中的存储顺序是按声明的顺序存储的 …

Python分析之3 种空间插值方法

插值是一个非常常见的数学概念,不仅数据科学家使用它,而且各个领域的人们也使用它。然而,在处理地理空间数据时,插值变得更加复杂,因为您需要基于几个通常稀疏的观测值创建代表性网格。 在深入研究地理空间部分之前,让我们简要回顾一下线性插值。 为了演示的目的,我将使…

ansible模块实战-部署rsync服务端

目录 1、根据部署流程所用到的命令找出模块 2.实战部署 2.1 服务部署&#xff1a;yum 安装 2.2 准备好rsync服务的配置文件 &#xff0c;并将配置文件通过copy模块分发给192.168.81.136这台受控主机 2.3 创建虚拟机用户 2.4 创建密码文件和改权限 2.5 模块对应目录&…

2024百度网盘超级会员怎么购买才能最省钱且不会踩坑?我来给你分享一下

不知道百度网盘超级会员怎么买最便宜&#xff0c;我来告诉你通过百度网盘最新优惠活动最低仅需188元/年。下面就和大家详细分享百度网盘会员最便宜的购买方法&#xff0c;值得你收藏和点赞&#xff01;当我们需要选择网盘时&#xff0c;大部分同学都会选择百度网盘&#xff0c;…

2024年五一杯数学建模B题思路分析

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

python聊天室

python聊天室 文章目录 python聊天室chat_serverchat_client使用方式1.局域网聊天2.公网聊天 下面是一个简单的示例&#xff0c;包含了chat_client.py和chat_server.py的代码。 chat_server chat_server.py监听指定的端口&#xff0c;并接收来自客户端的消息&#xff0c;并将消…

蓝桥杯2024年第十五届省赛真题-好数

思路&#xff1a;枚举所有数&#xff0c;每个数分别判断。代码时间复杂度虽然是n^2&#xff0c;但是由于判断的数长度最长是7位&#xff0c;用字符串处理最多只循环7次&#xff0c;所以最大时间复杂度小 7*10的七次方&#xff0c;不会超时。库中的to_string时间复杂度太大&…

自己的事情自己做:使用 Python Turtle 绘制 Python Logo

以下代码中&#xff0c;将向你展示一个有趣的程序&#xff0c;如何使用 Python Turtle 中绘制 Python Logo。Python 翻译成汉语是蟒蛇的意思&#xff0c;Python 的 Logo 也是两条缠绕在一起的蟒蛇。 import turtlepen turtle.Turtle() turtle.bgcolor("black") pe…

元宇宙VR虚拟线上展馆满足企业快速布展的需要

想要拥有一个VR线上虚拟展馆&#xff0c;展现您的城市风采或企业特色吗? 相比实体展馆搭建&#xff0c;VR线上虚拟展馆投入资金少&#xff0c;回报周期短&#xff0c;只需几个月的时间&#xff0c;您就能开始资金回笼。那么一个VR线上虚拟展馆多少钱呢? 深圳VR公司华锐视点基…

LeetCode701:二叉搜索树中的插入操作

题目描述 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 &#xff0c;新值和原始二叉搜索树中的任意节点值都不同。 代码 递归法 class Solution { public…