在Python 3中,将齿轮箱的转数转换为RPM

在Python 3中,将齿轮箱的转数转换为RPM,python,python-3.x,robotics,Python,Python 3.x,Robotics,我正在用蟒蛇3建造一个机器人。我有一台发动机,它可以报告其变速箱在较长时间的完全停机之间的总转数: import ftrobopy Motor1 = Robo.motor(1) Motor1.getCurrentDistance() 因此,在停止后,该值将从0开始,然后上升到任意值(以六位数表示),直到在某个点重置 现在我想根据rpm运行一些代码。当转速超过一定值时,换到更高档位。因此,我需要找到一种方法,将马达报告的转速转换为每个时间间隔的转速 我需要一些与rpm的短期变化密切相关的

我正在用蟒蛇3建造一个机器人。我有一台发动机,它可以报告其变速箱在较长时间的完全停机之间的总转数:

import ftrobopy    
Motor1 = Robo.motor(1)
Motor1.getCurrentDistance()
因此,在停止后,该值将从0开始,然后上升到任意值(以六位数表示),直到在某个点重置

现在我想根据rpm运行一些代码。当转速超过一定值时,换到更高档位。因此,我需要找到一种方法,将马达报告的转速转换为每个时间间隔的转速

我需要一些与rpm的短期变化密切相关的东西,反映在最后几秒钟发生的事情。我不知道如何实现这一点

我已尝试实施此解决方案:

卸下串行部件并使用电机1.getCurrentDistance()for=a

但它似乎根本不符合我的要求。如果你能给我一些建议,我将不胜感激

编辑2:这是目前的情况:

from __future__ import print_function
import time
import ftrobopy
import threading


txt=ftrobopy.ftrobopy('auto')

joystick1 = txt.joystick(0,1,1)
joystick2 = txt.joystick(1,1,1)
Motor1 = txt.motor(1)
Motor1.setDistance(0)
txt.updateWait()

def infiniteloop1():  # this controls the motor via a remote
    while True:
        Motor1.setSpeed(joystick1.leftright() * 512)


def infiniteloop2():  # this is for the rpm meter
    while True:
        curRev = Motor1.getCurrentDistance()
        t0 = time.time()
        lastRev = 0

        while (curRev == Motor1.getCurrentDistance()):
            t1 = time.time()
            try:
                rpm = (curRev - lastRev / ((t1 - t0) / 4320))
                print("RPM: " + "%.1f" % rpm)
                print("RevsTotal: " + str(Motor1.getCurrentDistance()))
                time.sleep(5)
                txt.updateWait()

            except ZeroDivisionError:
                pass
            t0 = t1
            lastRev = curRev
            txt.updateWait()






thread1 = threading.Thread(target=infiniteloop1)
thread1.start()

thread2 = threading.Thread(target=infiniteloop2)
thread2.start()

当我执行此命令时,它将以RPM和TotalRev=0开始,然后RPM和TotalRev保持相同的值(100..200..)。当我停止时,电机总转速保持在最后一个值,转速变成一个负数,随着时间的推移会慢慢变大。我一定是在什么地方搞砸了?

你不计算马达的转数,只计算所经过的时间

rpm = (1 / ((t1 - t0) / 60))
您需要包含一个变量来存储最后的转数,然后从当前转数中减去该数字

def infiniteloop2():  # this is for the rpm meter
    while True:
        Motor1 = txt.motor(1)
        a = Motor1.getCurrentDistance()
        t0 = time.time()
        lastRev = 0

        while (curRev == Motor1.getCurrentDistance()):
            t1 = time.time()
            try:
                rpm = (curRev - lastRev / ((t1 - t0) / 60))
                print("RPM: " + "%.1f" % rpm)

            except ZeroDivisionError:
                pass
            time.sleep(2)
            t0 = t1
            lastRev = curRev

谢谢我已经解决了这个问题,一个成年人正在按照链接中的说明与我一起使用这个网站。你提供的另一个问题中的算法似乎也适用于你的情况。让我们看看你到目前为止都做了些什么。谢谢你的帮助。到目前为止,我已经编辑了OP中的内容。它基本上只显示随机数。我只找到了
ftrobopy
模块的德语文档()-有英文文档吗?(我会读德语,这里的大多数人可能不会)旁注:文档中说,自从上一个
setCurrentDistance()
命令以来,“距离”是以每转72步测量的。我假定这台电动机是步进电动机。如果不调用
setCurrentDistance()!我已经实现了代码,并为TotalRevs添加了第二次打印以进行调试。看起来totalRev和RPM现在显示的是相同的数字。托马拉克:谢谢!我已经编辑了最初设置Motor1.setDistance(0)的代码,这样我就可以得到一个连续的计数,如果我理解正确的话,应该可以做到这一点。它现在工作得很好。非常感谢Jørgen R!!!我唯一改变的是把60除法放在一个单独的行中,否则它将不起作用。@Grindtime记住,如果答案解决了你的问题,请将答案标记为正确problem@Jørgen R-刚刚做到了!谢谢你提醒我。仍然在学习这个网站的细节。