0

arduinoのリードスイッチを介してPythonでrpmを計算しようとしています。私はそれを正しく理解できないようです。誰かがコードを正しくするのを手伝ってくれませんか。私の結果は一貫していません。

私の問題は、1分あたりの回転数を数​​えようとしていることですが、分の部分に問題があります。リードスイッチを通過するたびに回転カウンターが正常に動作し、カウントが 1、2、3、4、5、6 (など) 増加します。しかし、rpm部分の魔女はrev / ((time.time() - t)/60)であり、回転速度に応じて値が十分に速く増減しないという結果が得られます。したがって、リード スイッチが毎分 30 回転で通過すると、30 RPM でリードする必要があります。リード スイッチを毎分 90 回転で通過すると、90 RPM でリードするはずです。毎分回転数を取得する必要があることはわかっています。プログラミングに苦労しているのは、毎分の部分だと思います。

私を助けてくれてありがとう、これは何ヶ月も私を悩ませてきました.

import serial
import time
ser = serial.Serial('/dev/ttyACM0', 9600) 
t = time.time()
a = ser.read()

rev = 0

while  (a == ser.read()):


    rev += 1
    print rev / ((time.time() - t)/60)

新しい問題です。今、2 つのリード スイッチを追加しようとしています。両方を別々に動作させることはできますが、2 番目のリード スイッチを通過すると、スクリプトが終了します。私は今、スクリプトの終了を取得している理由(1つはtrueの場合、もう1つはfalseの終了)ですが、適切にコーディングする方法がわかりません。b'1' と b'2' は arduino から入ってくるものです

私の目標は、両方のリードを同時に読めるようにすることです。

import serial
import time
ser = serial.Serial('/dev/ttyACM0', 9600) 
a = ser.read()
t0 = time.time()


while(a == ser.read()):

    if a == b'2':
        t1 = time.time()
        try:
            print(1 / ((t1-t0)/60))
        except ZeroDivisionError:
            pass
        t0 = t1
    if a == b'1':
        t1 = time.time()
        try:
            print(1 / ((t1-t0)/60))
        except ZeroDivisionError:
            pass
        t0 = t1

私の何も機能しないコードなので、私が何をしようとしているのかがわかります。どうにかして b'1' と b'2' を分割できれば。下のフォント オブジェクト部分に m と r が表示されます。

import serial
import time
ser = serial.Serial('/dev/ttyACM0', 9600)
import pygame, sys
from pygame.locals import *
t0 = time.time()

pygame.init()
DISPLAYSURF = pygame.display.set_mode((400, 300))
pygame.display.set_caption('MPH!')

WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
BLUE = (148, 228, 255)
BLACK = (0, 0, 0)


while True:
    a = ser.read()

    if a == b'2':

        t1 = time.time()
        try:
            rpmm = (1 / ((t1-t0)/60))
            m = str((7.065 *rpmm * 60)/5280).strip("\n,\r")

        except ZeroDivisionError:
            pass
        t0 = t1
    if a == b'1':
        t1 = time.time()
        try:
            r = str((1 / ((t1-t0)/60))).strip("\n,\r")


        except ZeroDivisionError:
            pass
        t0 = t1



    fontObj = pygame.font.SysFont('digitaldream', 40)
    textSurfaceObj = fontObj.render('MPH:'+m, True, BLUE, BLACK)
    textRectObj = textSurfaceObj.get_rect()
    textRectObj.center = (200, 150)

    fontObj2 = pygame.font.SysFont('digitaldream', 40)
    textSurfaceObj2 = fontObj2.render('RPM:'+r, True, BLUE, BLACK)
    textRectObj2 = textSurfaceObj2.get_rect()
    textRectObj2.center = (200, 200)




    DISPLAYSURF.fill(BLACK)
    DISPLAYSURF.blit(textSurfaceObj, textRectObj)
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    pygame.display.update()
4

2 に答える 2

1

今のところ、コードは読み取りが開始されてからの平均RPM を出力します。ser.read()回転ごとに 1 回返される場合は、次のようにして瞬時の回転速度を取得できます。

import serial
import time
ser = serial.Serial('/dev/ttyACM0', 9600) 
a = ser.read()
t0 = time.time()

while(a == ser.read()):
    t1 = time.time()
    try:
        print(1 / ((t1-t0)/60))
    except ZeroDivisionError:
        pass
    t0 = t1

新しいコードを見るとa、while ループ中に変数に新しい値が割り当てられていないことに気付くはずです。ser.read()for ループに入る前の値と等しいかどうかのみを確認します。これはser.read()、while ループに入る前の値とは別の値を取る場合、ステートメントa == ser.read()が になることを意味しますFalse

このコードは、ser.read() の両方の値に対して機能します。

import serial
import time


ser = serial.Serial('/dev/ttyACM0', 9600) 
t0 = time.time()

while True:
    a = ser.read()
    if a == b'2' or a == b'1':
        t1 = time.time()
        try:
            print(1 / ((t1-t0)/60))
        except ZeroDivisionError:
            pass
        t0 = t1
    else:
        break
于 2013-10-29T00:58:59.323 に答える