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/fTms = 1/f * 1000Duty 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

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

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

相关文章

设计模式之建造者模式BuilderPattern(七)

一、建造者模式 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 二、代码实例 1、OrderItem类 Data:这是Lombok中提供的Ge…

ADS过孔---过孔建模自动化

当前快速建模的方法有两类:一是脚本自动化,也就是今天要分享的方法,但该方法需要工程师有基本的脚本编辑能力,然后根据自己的需要去修改,难度较大一点点;二是参数化建模,也就是在GUI界面输入相应…

百度语音识别开发笔记

目录 简述 开发环境 1、按照官方文档步骤开通短语音识别-普通话 2、创建应用 3、下载SDK 4、SDK集成 5、相关接口简单说明 5.1权限和key 5.2初始化 5.3注册回调消息 5.4开始转换 5.5停止转换 6、问题 简述 最近想做一些语音识别的应用,对比了几个大厂…

华为手机连接电脑后电脑无反应、检测不到设备的解决方法

本文介绍华为手机与任意品牌电脑连接时,出现连接后电脑无反应、检测不到手机连接情况的解决方法。 最近,因为手机的存储空间愈发紧缺,所以希望在非华为电脑中,将华为手机内的照片、视频等大文件备份、整理一下。因此,需…

aardio爬虫) 实战篇:逆向有道翻译web接口

前言 之前的文章把js引擎(aardio封装库) 微软开源的js引擎(ChakraCore))写好了,这篇文章整点js代码来测一下bug。测试网站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻译js逆向(MD5加密,AES加密&…

cmake进阶:定义函数的内部变量

一. 简介 前一篇文章学习 cmake中的定义函数基本用法。文章如下: cmake进阶:定义函数的使用方法-CSDN博客 本文继续学习 cmake中的定义函数,主要学习函数的内部变量。 二. cmake进阶:定义函数的内部变量 上一篇文章说过&…

Elasticsearch:理解人工智能相似性搜索

理解相似性搜索(也称为语义搜索)的指南,这是人工智能最新阶段的关键发现之一。 最新阶段人工智能的关键发现之一是根据相似性搜索和查找文档的能力。相似性搜索是一种比较信息的方法,其基于含义而非关键字。 相似性搜索也被称为语…

Stable Diffusion学习记录

文章目录 前言电脑配置推荐环境搭建下载地址安装步骤步骤一,打开下载的秋叶整合包,路径秋叶整合包/sd-wenui-aki步骤二,打开下载好的sd-webui-aki-v4.8.7解压包 Stable Diffusion软件配置,插件安装,模型下载Stable Dif…

Codeforces Round 943 (Div. 3) C-G

C. Assembly via Remainders 思路: 我们可以注意到,数组的长度只有 500 500 500 ,并且每个数的大小都在 500 500 500 以内,再看向这题,容易知道,当第一个数确定之后,之后所有的数字都会确定下…

leetcode-没有重复项的全排列-97

题目要求 思路 1.递归,如果num和n的元素个数一样就可以插入res中了,这个作为递归的结束条件 2.因为这个题是属于排列,并非组合,两者的区别是排列需要把之前插入的元素在回退会去,而组合不需要,因此会存在一…

14【PS作图】像素画尺寸大小

【背景介绍】本节介绍像素图多大合适 下图是160*144像素大小,有一个显示文本的显示器,还有一个有十几个键的键盘 像素画布尺寸 电脑16像素,但还有一个显示屏 下图为240*160 在场景素材,和对话素材中,用的是不同尺寸的头像,对话素材中的头像会更清楚,尺寸会更大 远处…

【软考高项】三十三、质量管理

一、管理基础 质量定义 国际标准:反映实体满足主体明确和隐含需求的能力的特性总和。 国家标准:一组固有特性满足要求的程度。固有特性是指在某事或某物中本来就有的,尤其是那种永久的可区分的特征。 ➢ 对产品来说,例如…

查看微信小程序主包大小

前言 略 查看微信小程序主包大小 在微信开发者工具右上角找到“详情->基本信息” 查看微信小程序主包构成 通过微信开发者工具中的“代码依赖分析”工具查看

Unity 性能优化之光照优化(七)

提示:仅供参考,有误之处,麻烦大佬指出,不胜感激! 文章目录 前言一、测试目的一、实时光源是什么?二、开始测试1.场景中只有一个光照的数值情况2.添加4个点光源后4.结果 总结 前言 实时光源数量越多&#x…

分享一个国内可用的AIGC网站,免费无限制,支持AI绘画

背景 AIGC作为一种基于人工智能技术的自然语言处理工具,近期的热度直接沸腾🌋。 作为一个AI爱好者,翻遍了各大基于AIGC的网站,终于找到一个免费!免登陆!手机电脑通用!国内可直接对话的AIGC&am…

保持亮灯:监控工具如何确保 DevOps 中的高可用性

在快速发展的 DevOps 领域,保持高可用性 (HA) 至关重要。消费者期望应用程序具有全天候响应能力和可访问性。销售损失、客户愤怒和声誉受损都是停机的后果。为了使 DevOps 团队能够在问题升级为中断之前主动检测、排除故障并解决问题,监控工具成为这种情…

nginx--tcp负载均衡

mysql负载均衡 安装mysql yum install -y mariadb-server systemctl start mariadb systemctl enable mariadb ss -ntl创建数据库并授权 MariaDB [(none)]> create database wordpress; Query OK, 1 row affected (0.00 sec)MariaDB [(none)]> grant all privileges o…

设计模式(十一):外观模式

设计模式(十一):外观模式 1. 外观模式的介绍2. 外观模式的类图3. 外观模式的实现3.1 创建一个接口3.2 创建接口的实现3.3 创建一个外观类3.4 测试 1. 外观模式的介绍 外观模式(Facade Pattern)属于结构型模式&#xf…

数据结构与算法之经典排序算法

一、简单排序 在我们的程序中,排序是非常常见的一种需求,提供一些数据元素,把这些数据元素按照一定的规则进行排序。比如查询一些订单按照订单的日期进行排序,再比如查询一些商品,按照商品的价格进行排序等等。所以&a…

IT养生知识之:子午流注

《子午流注口诀》 肺寅大卯胃辰宫, 脾巳心午小未中, 申膀酉肾心包戌, 亥焦子胆丑肝通。 何为子午流注? 子午流注是中医圣贤发现的一种规律,中医认为人体中十二条经脉对应着每日的十二个时辰,由于时辰在…