- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图在 Raspberry Pi 中使用 python 控制连续伺服(DF15RSMG),但连续伺服无法停止。代码如下:
import RPi.GPIO as GPIO
import time
import signal
import atexit
atexit.register(GPIO.cleanup)
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT, initial=False)
p = GPIO.PWM(17,50) #50HZ
p.start(0)
time.sleep(2)
while(True):
for i in range(0,181,10):
p.ChangeDutyCycle(2.5 + 10 * i / 180)
time.sleep(0.02)
p.ChangeDutyCycle(0)
time.sleep(0.2)
for i in range(181,0,-10):
p.ChangeDutyCycle(2.5 + 10 * i / 180)
time.sleep(0.02)
p.ChangeDutyCycle(0)
time.sleep(0.2)
上面的代码适用于 SG90 Servo。看到这个问题 Raspberry pi servo doesn't stop ,但我仍然不知道如何解决这个问题,我该怎么办?
最佳答案
我认为您可能有多个问题 - 例如,您似乎使用整数运算来计算占空比。要对此进行测试,请在每个循环中添加一个 print i,i/180, 2.5+10*i/180
语句。使用我正在使用的 python 2.7,您请求的占空比在循环中每秒以 1 为单位跳跃,因为计算 10*i/180 是使用整数算法进行的。您所要做的就是更改宽度计算以使用例如10.0*i/180 - 但稍后会详细介绍。
但是查看您的代码,它似乎确实将 PWM 短暂设置为 7.5%,因此电机应停止 0.2 秒。
此外,无需在每次设置后将占空比设置回 0 - 不确定为什么要这样做。
并且 0.2 秒在速度增量之间等待的时间并不多(因此您可能会错过停止时间),使其变慢可能会更容易看到正在发生的事情。
最重要的是,对于连续运动伺服来说,伺服的速度是由脉冲宽度控制的——所以当驱动脉冲宽度增加到标称“零”宽度以上时,伺服“前进”得更快,并且更快随着脉冲宽度减小到小于零宽度而向后。
因此脉宽为 w 毫秒的 Helm 机速度计算如下:
speed% = (w-1.5)*100
其中 w 在 0.5 到 2.5 毫秒之间变化。 100%正向速度需要2.5ms的脉冲宽度,100%反向(即-100%)速度需要0.5ms的脉冲宽度。对于 20 毫秒的重复间隔,这些对应于 2.5-12.5%。
请注意,伺服系统将有一个大约 1.5 毫秒的小死区,因此它会在大约 1.45-1.55 毫秒的输入脉冲宽度范围内停止,否则很难从中获得精确的零速度。
因此,要停止此 Helm 机,请将脉冲宽度设置为“零”宽度 1.5ms 并使其保持在该宽度运行, Helm 机将不会旋转。 while true 没问题 - 它可以让脉冲继续运行,这是经典模拟伺服系统所需要的。这个伺服是一个数字伺服,所以可以有更快的重复率,所以你可以使用 5ms,例如,这给你更多的脉冲宽度分辨率,从 10-50% 不等。而作为一个数字 Helm 机,它似乎只需要一个脉冲来设置它的速度,你也可以在没有 20ms 重复率的情况下工作,当你想改变速度时只产生一个脉冲。
回到您的代码,基本上,对于 20 毫秒的重复和 1.5 毫秒的标称宽度,您需要将占空比设置为 7.5%,伺服将停止。您的代码应围绕此增加和减少,以使伺服器前后移动。
我的引用资料是 amazon.co.uk 上的信息 https://www.amazon.com/DFRobot-DF15RSMG-Degree-Standard-Servo/dp/B014L5CBBA这是 HitTest 门的搜索结果。
我没有硬件来测试这个,但像这样的东西应该工作得更好,我假设你使用的初始化代码有效:
import RPi.GPIO as GPIO
import time
import signal
import atexit
atexit.register(GPIO.cleanup)
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT, initial=False)
p = GPIO.PWM(17,50) #50HZ
p.start(0)
time.sleep(2)
STEPS=10 # the number of steps either side of nominal
NOMINAL=7.5 # the 'zero' PWM %age
RANGE=1.0 # the maximum variation %age above/below NOMINAL
while(True):
# loop first over "forward" ramp up/down, then reverse.
for direction in [+1.0,-1.0]:
# step from 0 to 100% then back to just above zero
# (next time round the loop will do the 0)
for step in list(range(STEPS+1))+list(range(STEPS-1,0,-1)):
dutycycle = NOMINAL + direction*RANGE*step/STEPS
print direction, step, dutycycle
p.ChangeDutyCycle(dutycycle)
time.sleep(1.0)
最后的评论——如果你想更多地了解你的代码在做什么,单独计算占空比这个非常简单的步骤允许你添加一个打印语句,而不用写两次计算。老实说,这就是我不喜欢 python 非常强大的单行结构(如列表理解)的原因:一旦你让它们工作,它们就很棒,但对于初学者来说,当它们不工作时,它们会剥夺你的能力看看里面发生了什么。简单地使用更多代码行和一个 for 循环要好得多,如果有问题就添加打印,一旦你的循环工作就注释掉打印。
FINAL 最后一件事 - 如果您希望伺服在退出代码时停止,请给它一个零宽度 1.5ms 的脉冲,否则它不会停止。为确保伺服获得此脉冲,请在设置后至少休眠 20 毫秒:
p.ChangeDutyCycle(NOMINAL)
time.sleep(0.1)
关于python - 树莓派python控制连续 Helm 机,但是连续 Helm 机停不下来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45488233/
如何检查一个元素是否立即隐藏。即如何通知元素的可见性。 在我的例子中,该元素是通过 slideUp 函数隐藏的。我应该立即收到有关该元素的可见性的通知。 我想到了使用bind()方法。但它没有类似 o
if (srcbloc == NULL) { fprintf(stderr, "warning!: memrip source is null!\n"); exit(1); } if
当我在数据库的旧 View 中清理一些问题时,我遇到了这个“奇怪”的连接条件: from tblEmails [e] join tblPersonEmails [pe]
如何水平对齐多张图像,一张一张地?它们不必适合宽度屏幕:相反,我希望它们超过后者的宽度,如果这有任何意义的话。 我已经检查了很多类似问题的答案,但找不到任何可以解决我的问题的答案。 HTML:
我知道 Cassandra 中的列有 TTL。但是也可以在一行上设置 TTL 吗?在每列上设置 TTL 并不能解决我的问题,如下面的用例所示: 在某些时候,一个进程想要删除一个带有 TTL 的完整行(
我有一个 NSTextField 和 Label,其值绑定(bind)到 View Controller 中的相同 NSString 这里的问题是标签只有在我按 Tab 时才会更新。 如何使其连续,以
例如。 1."abc"; ===>abc 2."ab c"; ===>ab_c 3."ab c"; ===>ab_c 4."ab c" ===>ab_c 对于多个连续空格也是如此。 我怎样
大家好,我想获取前一天或最后一天的信息,只有当我按下按钮时,它才会显示最后一天(星期六)的所有信息,如果我再次单击按钮,它将显示最后一天的信息(星期五)如果我再次点击它(星期四)谢谢你们帮助我 编辑:
我需要从实时音频流中提取ICY元数据,并正在使用mplayer进行此操作,因为它在播放音频流时会输出元数据。我欢迎其他方式执行此操作,目标是将更新的元数据(歌曲信息)保存到文本文件中,只要歌曲(或数据
语音识别有没有解决方案 只有几个字(2 个就够了,10 个就不错了。100 个就很棒了。不需要更多) 也在移动浏览器上运行(是否可以为此使用 flash(而不是 java)?) 可以安装在您自己的服务
我有一个单词列表, list1 = ['hello', 'how', 'are', 'you?', 'i', 'am', 'fine', 'thanks.', 'great!'] 我想加入, list
我正在开发一个程序,但我不断收到“对‘dosell’的 undefined reference ”,我不太明白发生了什么。这是函数的声明: void dosell(int *cash, int *nu
我无法提出执行我要做的事情所需的查询。 我有三个这样的表: client_files ----------------------- client_id file_id ---------
我一直在寻找一个插件/脚本,当到达底部时,它会从头开始继续滚动网站,就像一个连续的循环。 示例:http://unfold.no/和 http://www.aquiesdonde.com.ar/ 我尝
这个问题在这里已经有了答案: How to prevent scanf causing a buffer overflow in C? (6 个答案) 关闭 6 年前。 我一直在使用一个非常简单的程
给定一个整数数组,找到具有相同数量的 x 和 y 的连续子序列的总数。例如 x=1 和 y=2 的数组 [1,2,1] ans = 2 表示它的两个子数组 [1,2] 和 [2,1]。检查每个连续的子
所以,我有一个所有正自然数的数组。我得到了一个阈值。我必须找出总和小于给定阈值的数字(连续)的最大计数。 For example, IP: arr = {3,1,2,1} Threshold = 5
我制作了像内置相机一样的相机应用。 我想实现像内置相机一样的连续对焦功能。(此功能我不触摸屏幕,但相机会尝试自行对焦。) 因此,将其设置为 surfaceCreated : Camera.Pa
我有这样的数据: f x A 1.1 A 2.2 A 3.3 B 3.5 B 3.7 B 3.9 B 4.1 B 4.5 A 5.1 A 5.2 C 5.4 C 5.5 C 6.1 B 6.2 B
假设我有一个包含一组数据点的表,每个数据点由一个时间戳和一个值组成。如果至少有 N 个连续记录(按时间戳排序)高于给定值 X,我将如何编写返回 true (1) 的查询,否则返回 false (0)?
我是一名优秀的程序员,十分优秀!