Go实现树莓派控制舵机

公式说明

毫秒(ms)是时间的单位,赫兹(Hz)是频率的单位,而DutyMax通常是一个PWM(脉冲宽度调制)信号中表示最大占空比的值。以下是它们之间的关系和一些相关公式:

  1. 频率(Hz)和周期(T): 频率是每秒周期性事件发生的次数。周期是频率的倒数,表示一个完整周期所需的时间。
    f=1/T, T=1/f 其中:

    • ( f ) 是频率,单位是赫兹(Hz)。
    • ( T ) 是周期,单位是秒(s)。
  2. 毫秒(ms)和周期(T): 毫秒是秒的千分之一,通常用于表示较短的时间间隔。
    Tms = T * 1000 其中:

    • ( Tms ) 是周期,单位是毫秒(ms)。
  3. 占空比(Duty Cycle): 占空比是PWM信号中高电平时间与整个周期时间的比例,通常以百分比表示。
    Duty Cycle = 高电平时间 / T * 100%

  4. DutyMax和占空比: 在某些库中,DutyMax可能代表PWM信号中最大的占空比值,用于设置PWM的占空比。在代码中,DutyMax可能是一个数值,用于表示100%的占空比。例如,如果DutyMax是255,那么一个50%的占空比将是127.5(DutyMax / 2)。

  5. 设置特定时间的占空比: 如果你想设置一个特定的高电平时间(例如2.5ms),你需要首先计算出这个时间对应的占空比,然后将其转换为PWM信号中的数值。 [
    Duty= 高电平时间ms/ Tms * DutyMax

    其中:

    • Duty 是PWM信号中的占空比数值。
    • Tms 是周期,单位是毫秒(ms)。

举个例子,如果频率是50Hz,那么周期T是20ms。如果你想要一个2.5ms的高电平时间,占空比计算如下:
Duty Cycle = 2.5ms/20ms * 100% = 12.5 %

如果DutyMax代表100%的占空比,并且是255(这是一个常见的值,用于8位PWM信号),那么对应的Duty数值将是:

Duty= 12.5%*255/100% = 31.875

在实际应用中,你可能需要将这个值四舍五入到最接近的整数,因为PWM的占空比数值通常是整数。

线路连接

在这里插入图片描述

实物连接图
在这里插入图片描述

代码

main.go

/*
getDutyCycle: 涉及的公式

	频率f单位赫兹 = 1/T
	周期T单位秒 = 1/f
	Tms = 1/f * 1000
	Duty Cycly = (Th / T) * 100% => Th指高电平时间
	Duty = Thms/Tms * DutyMax
*/
func getDutyCycle(ms float64, hz int32) gpio.Duty {
	return gpio.Duty(((ms * float64(hz)) / 1000) * float64(gpio.DutyMax))
}
func main() {
	if _, err := host.Init(); err != nil {
		log.Fatalf("failed to initialize host: %v", err)
	}

	// 获取GPIO引脚,这里以GPIO18为例
	pin := gpioreg.ByName("GPIO27")
	if pin == nil {
		log.Fatalf("failed to open GPIO pin")
	}

	if err := pin.PWM(0, 50*physic.Hertz); err != nil {
		log.Fatalf("failed to set PWM: %v", err)
	}
/*
	占空比 = t / T 相关参数如下:
t = 0.5ms —————— 舵机会转到 -90 °
t = 1.0ms —————— 舵机会转到 -45°
t = 1.5ms —————— 舵机会转到 0°
t = 2.0ms —————— 舵机会转到 45°
t = 2.5ms —————— 舵机会转到 90°
*/
	duty := getDutyCycle(0.5, 50) //gpio.Duty(int32(float64((gpio.DutyMax / 20)) * 0.5))
	fmt.Println("DUTY1111111111: ", uint32(gpio.Duty(int32(float64((gpio.DutyMax/20))*0.5))))
	fmt.Println("DUTY===", uint32(duty), pin.PWM(duty, 50*physic.Hertz))
	time.Sleep(time.Second)
	duty = getDutyCycle(1, 50) //gpio.Duty(int32(float64((gpio.DutyMax / 20)) * 0.5))
	fmt.Println("DUTY===", uint32(duty), pin.PWM(duty, 50*physic.Hertz))
	time.Sleep(time.Second)
	duty = getDutyCycle(1.5, 50) //gpio.Duty(int32(float64((gpio.DutyMax / 20)) * 0.5))
	fmt.Println("DUTY===", uint32(duty), pin.PWM(duty, 50*physic.Hertz))
	time.Sleep(time.Second)
	duty = getDutyCycle(2, 50) //gpio.Duty(int32(float64((gpio.DutyMax / 20)) * 0.5))
	fmt.Println("DUTY===", uint32(duty), pin.PWM(duty, 50*physic.Hertz))
	time.Sleep(time.Second)
	duty = getDutyCycle(2.5, 50) //gpio.Duty(int32(float64((gpio.DutyMax / 20)) * 0.5))
	fmt.Println("DUTY===", uint32(duty), pin.PWM(duty, 50*physic.Hertz))
	time.Sleep(time.Second)
}

Note

需要sudo运行, 否则报错,例如 : bcm283x-gpio (GPIO27): bcm283x-dma not initialized; try again as root?

参考

RPi Low-level peripherals
Raspberry Pi hardware

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

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

相关文章

【华为】路由策略小实验

【华为】软考中级-路由策略实验 实验需求拓扑配置AR1AR2需求1需求2 AR3 检验 实验需求 1、让 R3 可以学到R1的 192.168.10.0/24和192.168.20.0/24的 路由,不能学到192.168.30.0/24。 2、让 R1可以学到 R3 的 172.16.20.0/24和172.16.30.0/24的路由,不能…

opencv图像处理详细讲(二)

联通组件分析 联通组件定义:像素值相同,通过四邻域或者八邻域相互连通的像素块。 换句话说,就是使用四邻域或八邻域的连通性,遍历图像的像素,并确定像素值相同并且连通的像素块,将它们标记为一个联通组件 两…

虚拟机VM VirtualBox安装openEuler+UKUI的安装和卸载_2024

虚拟机VM VirtualBox安装openEuler ps. 建议先看最后的其他 下载openEuler openEuler官网下载 一般来说标准版就够用了 使用虚拟机VM VirtualBox安装openEuler 新建虚拟机 修改用户名密码,建议修改,虽然之后还可以通过命令行修改(注意密…

pyecharts绘制世界动态轨迹图(v0.5.X与v1.X版本对比)

一、问题引入 pyecharts官网:https://pyecharts.org/#/zh-cn/intro 在使用Geo或者GeoLines绘制动态轨迹图时,如果所选地区是中国的省份或者城市,是能够匹配到对应的经纬度并且正常绘制的;如果所选地区涉及到其他国家或者国外城市&…

Docker-harbor

一、搭建本地私有仓库 1.1 下载Registry镜像 1.2 添加本地私有仓库配置 1.3 重启服务并运行Registry容器 1.4.容器的操作 1.4.1 拉取Nginx镜像并为镜像打标签 1.4.2 上传到私有仓库 1.4.3 列出私有仓库所有镜像 1.4.4 列出私有仓库的镜像的所有标签 1.4.5 先删除原有…

Anaconda删除虚拟环境目录pkgs和envs|conda瘦身

这个文件夹里面是专门放不同环境中的包的,只是没有区分环境,都混在一起了, 一般在想要删除一个虚拟环境,除了在命令行中输入conda remove -n your_env_name(虚拟环境名称) --all 然后在envs中删除虚拟环境的文件夹, 还…

企业微信hook接口协议,ipad协议http,客户群发送任务,获取要发送的客户群列表

客户群发送任务,获取要发送的客户群列表 参数名必选类型说明uuid是String每个实例的唯一标识,根据uuid操作具体企业微信 请求示例 {"uuid": "1688853790533324","id":1101292747044333637, //群发任务id"keyword…

【Unity】如何获得TMP Button下的text内容

【背景】 unity项目中使用了TMP命名空间的Button UI组件。脚本中需要获得Button下Text的内容,但是发现用TextMeshPro仍然无法获得button下的text对象。 【分析】 Hierarchy结构上看明确Button下是有Text组件的: 括号里是TMP,所以理论上用TextMeshPro类型去FindComponent…

navicat 连接 阿里云 RDS mysql 数据库

首先上官方教程连接 下面是我的实操记录 1、先输入正确的账号、密码 2、再加上数据库名称

鸢尾花分类-pytorch实现

前言 本文用pytorch实现了鸢尾花分类,数据不多,只做代码展示用,后续有升级版本。 代码 -*- coding: utf-8 -*- File : main.py Author: Shanmh Time : 2024/05/06 上午9:37 Function:import torch from sklearn import datase…

算法(C++

题目:螺旋矩阵(59. 螺旋矩阵 II - 力扣(LeetCode)) 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1: 输入&am…

Java常用5大集合类详解(实战)

文章目录 1、Collection1.1 iterator 迭代器 2、List 有序集合2.1 ArrayList ⭐2.2 LinkedList2.3 Queue 3、Set 无序集合3.1 HashSet ⭐3.2 TreeSet3.3 LinkedHashSet 4、Map 键值集合4.1 HashMap ⭐4.2 TreeMap / LinkedHashMap 5、工具类5.1 Collections5.2 Arrays 【拓展】…

Socket学习记录

本次学习Socket的编程开发,该技术在一些通讯软件,比如说微信,QQ等有广泛应用。 网络结构 这些都是计算机网络中的内容,我们在这里简单回顾一下: UDP(User Datagram Protocol):用户数据报协议;TCP(Transmission Contr…

厂家自定义 Android Ant编译流程源码分析

0、Ant安装 Windows下安装Ant: ant 官网可下载 http://ant.apache.org ant 环境配置: 解压ant的包到本地目录。 在环境变量中设置ANT_HOME,值为你的安装目录。 把ANT_HOME/bin加到你系统环境的path。 Ubuntu下安装Ant: sudo apt…

【数据结构】树和二叉树基本概念和性质

目录 前言1、树的概念1.1 树的基本概念1.2 树的主要概念1.3 树的表示1.4 树在实际中的运用(表示文件系统的目录树结构) 2. 二叉树概念及结构2.1 概念2.2 特殊的二叉树2.3 二叉树的性质 3. 二叉树性质相关选择题练习4. 答案和解析5. 总结 前言 本章带来数…

2024年03月 Scratch 图形化(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch图形化等级考试(1~4级)全部真题・点这里 一、单选题(共18题,共50分) 第1题 运行程序后,角色一定不会说出的数字是?( ) A:2 B:4 C:6 D:8 答案:A 程序中随机数的取值最小为 2,最大为 20 ,那么随机数加上 2 之后的结果的最小值为 4 ,最大值为 22 。所…

单目标问题的烟花优化算法求解matlab仿真,对比PSO和GA

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 单目标问题的FW烟花优化算法求解matlab仿真,对比PSO和GA。最后将FW,GA,PSO三种优化算法的优化收敛曲线进行对比。 2.测试软件版本以及运行…

【Android项目】“追茶到底”项目介绍

没有多的介绍,这里只是展示我的项目效果,后面会给出具体的代码实现。 一、用户模块 1、注册(第一次登陆的话需要先注册账号) 2、登陆(具有记住最近登录用户功能) 二、点单模块 1、展示饮品列表 2、双向联动…

T型槽地轨承载力是如何连接整个制造过程的强力桥梁(北重公司设计)

T型槽地轨承载力的定义和计算 T型槽地轨是一种用于工业设备运输和装配的关键组件。它由世界上各行各业的生产商广泛采用,其有效的承载力使其成为连接整个制造过程的强力桥梁。本文将介绍T型槽地轨的承载力以及相关的设计要点和应用。 承载力的定义和计算 承载力是…

【前沿模型解析】一致性模型CM(一)| 离散时间模型到连续时间模型数学推导

文章目录 1 离散时间模型2 连续时间模型 得到 SDE 随机微分方程2.1 从离散模型到SDE的推理步骤 3 补充:泰勒展开近似 1 − β i \sqrt{1-\beta_i} 1−βi​ ​ CM模型非常重要 引出了LCM等一系列重要工作 CM潜在性模型的数学公式推导并不好理解 一步一步&#xf…