600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 树莓派输出pwm波c语言 树莓派Ubuntu18.04使用pigpio库产生PWM波实现舵机控制

树莓派输出pwm波c语言 树莓派Ubuntu18.04使用pigpio库产生PWM波实现舵机控制

时间:2022-12-13 21:29:27

相关推荐

树莓派输出pwm波c语言 树莓派Ubuntu18.04使用pigpio库产生PWM波实现舵机控制

树莓派Ubuntu18.04使用pigpio库产生PWM波实现舵机控制

树莓派Ubuntu18.04使用pigpio库产生PWM波实现舵机控制

一:pigpio库简介

pigpio是一个用于树莓派的库,它允许控制树莓派的通用输入输出(GPIO)引脚。

它的下载与安装步骤请参考:http://abyz.me.uk/rpi/pigpio/download.html

它提供了c语言风格与python语言风格的库函数,我们可以调用相关的库函数实现跟GPIO相关的操作。

与PWM操作相关的几个函数的详细解释可以参考http://abyz.me.uk/rpi/pigpio/python.html#get_PWM_frequency

二:产生PWM波相关的几个库函数

更详细的解释请参考:

http://abyz.me.uk/rpi/pigpio/python.html

三:具体的实现过程

此处实现了使用遥控器控制舵机1,2的旋转角度,与舵机3的连续旋转/反向旋转/与停止。

关于如何获取遥控器信号可参考上一篇博客。

#!/usr/bin/env python

#导入相关的库文件

import rospy

from std_msgs.msg import String

from geometry_msgs.msg import Twist

import sys, select, termios, tty

#导入pigpio库

import pigpio

import time

#建立实体化对象

pi=pigpio.pi()

#tick_0用于存储低电平捕获的时间戳

tick_0=[None,None,None]

#tick_1用于存储高电平捕获的时间戳

tick_1=[None,None,None]

#diff用于存储脉宽

diff=[1500,None,1500]

#定义回调函数

def in_callback(argu,gpio,level,tick):

#如果是低电平,则说明下降沿到来,通过数组diff将两次捕获的时间差存储起来

if level==0:

#存储此次时间戳

tick_0[argu]=tick

#如果高电平捕获的时间戳不为0

if tick_1[argu] is not None:

#获取两次的时间戳差值,即为高电平持续时间,即为脉冲宽度

diff[argu]=pigpio.tickDiff(tick_1[argu],tick)

#打印

print "number: " + str(argu) + " high for " + str(diff)+" microseconds"

#如果是高电平,存储此次时间戳

else:

tick_1[argu]=tick

def mycallback1(gpio,level,tick):

in_callback(0,gpio,level,tick)

def mycallback2(gpio,level,tick):

in_callback(1,gpio,level,tick)

def mycallback3(gpio,level,tick):

in_callback(2,gpio,level,tick)

#将遥控器获得的控制信号映射为舵机的转角

def map_range(x,first_range=[1000,2000],second_range=[100,500]):

x = second_range[0]+(int(str(x))-first_range[0])*(second_range[1]-second_range[0])/(first_range[1]-first_range[0])

return x

if __name__=='__main__':

settings = termios.tcgetattr(sys.stdin)

angle1 =14;

angle2 = 460;

angle3 = 0;

#产生PWM波,设置频率范围与角度

pi.write(26, 0)

pi.set_PWM_frequency(26, 50)

pi.set_PWM_range(26, 4000)

pi.set_PWM_dutycycle(26,angle1)

pi.write(20, 0)

pi.set_PWM_frequency(20, 50)

pi.set_PWM_range(20, 4000)

pi.set_PWM_dutycycle(20,angle2)

pi.write(16, 0)

pi.set_PWM_frequency(16, 50)

pi.set_PWM_range(16, 4000)

pi.set_PWM_dutycycle(16,angle3)

#初始化ROS节点

rospy.init_node('duoji_control')

rate=rospy.Rate(60)

cb1=pi.callback(13,pigpio.EITHER_EDGE,mycallback1)

cb9=pi.callback(19,pigpio.EITHER_EDGE,mycallback2)

cb4=pi.callback(22,pigpio.EITHER_EDGE,mycallback3)

try:

while not rospy.is_shutdown():

angle1 = map_range(diff[0],second_range=[100,500])

pi.set_PWM_dutycycle(26,angle1)

angle2 = map_range(diff[1],second_range=[250,500])

pi.set_PWM_dutycycle(20,angle2)

if int(str(diff[2])) > 1700:

angle3= 450;

elif int(str(diff[2])) < 1300:

angle3 = 150;

else:

angle3 = 0;

pi.set_PWM_dutycycle(16,angle3)

rate.sleep()

except rospy.ROSInterruptException:

pass

finally:

pi.set_PWM_dutycycle(26,330)

pi.set_PWM_dutycycle(20,480)

pi.write(16,0)

termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)

树莓派Ubuntu18.04使用pigpio库产生PWM波实现舵机控制相关教程

安装 Ubuntu18.04并与Windows10系统共存

安装 Ubuntu18.04并与Windows10系统共存 1.下载UltralSO和Ubuntu18.04源 1.1下载UltralSO,这是用来制作启动盘的软件 下载链接:/uiso9_cn.exe 使用:/article/a3761b2b66fe141577f9aa51.html ps: 以前安装u

在 Ubuntu 和其他 Linux 发行版上使用 Yarn | Linux 中国

在 Ubuntu 和其他 Linux 发行版上使用 Yarn | Linux 中国 导读: 本速成教程向你展示了在 Ubuntu 和 Debian Linux 上安装 Yarn 包管理器的官方方法。你还将学习到一些基本的 Yarn 命令以及彻底删除 Yarn 的步骤。 本文字数:4539,阅读时长大约:6分钟 https:

使用互联网协议替代方案 Gemini 简化你的 Web 体验 | Linux 中国

使用互联网协议替代方案 Gemini 简化你的 Web 体验 | Linux 中国 导读: 用 Gemini 协议发现更安静、更简单的互联网新角落。 本文字数:1940,阅读时长大约:2分钟 /article-12738-1.html 作者:Seth Kenlon 译者:geekpi 用 Gemini 协议发现

使用Idea搭建Springboot项目-bug记录

使用Idea搭建Springboot项目-bug记录 首先感谢这篇非常非常优秀的博客。对于初学Springboot的同学这可以作为第一个springboot的实战小项目,非常详

『爬虫四步走』手把手教你使用Python抓取并存储网页数据!

『爬虫四步走』手把手教你使用Python抓取并存储网页数据! 爬虫是Python的一个重要的应用,使用Python爬虫我们可以轻松的从互联网中抓取我们想要的数据, 本文将基于爬取B站视频热搜榜单数据并存储为例,详细介绍Python爬虫的基本流程。 如果你还在入门爬虫阶

echarts使用鼠标滚轮控制区域滚动

echarts使用鼠标滚轮控制区域滚动 当echarts图表的数据过多时,页面就会放不下 ,这个时候就需要他可以滚动查看数据 在echarts的属性中有dataZoom属性用来控制区域缩放和滚动 dataZoom:[ //Y轴滑动条 { type: 'slider', //滑动条 show: true, //开启 yAxisInd

C++核心准则T.5:结合使用泛型和面向对象技术应该增强它们的效果

C++核心准则T.5:结合使用泛型和面向对象技术应该增强它们的效果而不是成本 T.5: Combine generic and OO techniques to amplify their strengths, not their costs T.5:结合使用泛型和面向对象技术应该增强它们的效果而不是成本 Reason(原因) Generic and

this.$confirm 弹框的使用

this.$confirm 弹框的使用 this.$confirm('此操作将永久失效该数据, 是否继续?', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'error' // type: 'warning' }).then(() = { console.log('确定操作'); }).catch(() = { console.log('取消操

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。