2016-11-22 1 views
1

Я работаю над проектом с использованием малины Pi и сделал код на Python. Мой проект - измерить расстояние со всех сторон велосипеда и скорость велосипеда. Я могу измерить расстояние с помощью ультразвукового датчика, но пытаюсь измерить скорость с помощью датчика эффекта Холла, но я получаю ненормальные показания скорости.Как использовать Python для измерения скорости велосипеда, как цифровой спидометр, используя малину Pi?

Например, я получаю 10 км/ч для другого экземпляра, который дает 99 км/ч и так далее. Я хочу читать, как оригинальный спидометр, который дает постепенное инкрементное или декрементальное чтение. И еще одна вещь, я использую несколько функций в одном файле и работаю на нескольких контактах GPIO, что делает мою программу медленной.

Как улучшить скорость, чтобы я не пропустил ни одного импульса от любого GPIO? Вот мой код и выходной файл.

Код для измерения расстояния

import RPi.GPIO as GPIO 
import time 
import sys 
import csv 
from time import sleep 
import math 
GPIO.setmode(GPIO.BOARD) 

TRIG1=7 #front ultrasonic sensor configuration 
ECHO1=12 

TRIG2=11 #back ultrasonic sensor configuration 
ECHO2=15 

TRIG3=13 #left ultrasonic sensor configuration 
ECHO3=16 

TRIG4=18 #right ultrasonic sensor configuration 
ECHO4=22 

j=10000 # maximum number of readings 
data=[] 


GPIO.setup(7,GPIO.OUT) 
GPIO.output(TRIG1,0)  #front us sensor setup 
GPIO.setup(12,GPIO.IN) 
time.sleep(0.0001) 

GPIO.setup(11,GPIO.OUT) 
GPIO.output(TRIG2,0) #back us sensor setup 
GPIO.setup(15,GPIO.IN) 
time.sleep(0.0001) 

GPIO.setup(13,GPIO.OUT) 
GPIO.output(TRIG1,0) #left us sensor setup 
GPIO.setup(16,GPIO.IN) 
time.sleep(0.0001) 

GPIO.setup(18,GPIO.OUT) 
GPIO.output(TRIG2,0) #right us sensor setup 
GPIO.setup(22,GPIO.IN) 
time.sleep(0.0001) 

print ("starting measurements...........") 

def front(): 
     GPIO.output(TRIG1,1) 
     time.sleep(0.0001)#distance from front sensor 
     GPIO.output(TRIG1,0) 
     start1=time.time() 
     stop1=time.time() 
     while GPIO.input(ECHO1) == 0: 
      start1=time.time() 
     while GPIO.input(ECHO1) == 1: 
      stop1=time.time() 
     time1=stop1-start1 
     distance1=time1 * 17000 
     return distance1 

def back(): 
     GPIO.output(TRIG2,1) 
     time.sleep(0.0001) 
     GPIO.output(TRIG2,0) #distance from back sensor 
     start2=time.time() 
     stop2=time.time() 
     while GPIO.input(ECHO2) == 0: 
      start2=time.time() 
     while GPIO.input(ECHO2) == 1: 
      stop2=time.time() 
     time2=stop2-start2 
     distance2=time2 * 17000 
     return distance2 
def left(): 
     GPIO.output(TRIG3,1) 
     time.sleep(0.0001) 
     GPIO.output(TRIG3,0)#distance from left sensor 
     start3=time.time() 
     stop3=time.time() 
     while GPIO.input(ECHO3) == 0: 
      start3=time.time() 
     while GPIO.input(ECHO3) == 1: 
      stop3=time.time() 
     time3=stop3-start3 
     distance3=time3 * 17000 
     return distance3 

def right(): 
     GPIO.output(TRIG4,1) 
     time.sleep(0.0001) 
     GPIO.output(TRIG4,0) #distance from right sensor 
     start4=time.time() 
     stop4=time.time() 
     while GPIO.input(ECHO4) == 0: 
      start4=time.time() 
     while GPIO.input(ECHO4) == 1: 
      stop4=time.time() 
     time4=stop4-start4 
     distance4=time4 * 17000 
     return distance4 

with open('test.csv','w') as testfile: 
     csv_writer = csv.writer(testfile) 
     while j: 
      distance1=front() 
      distance2=back() 
      distance3=left() 
      distance4=right() 
      data.append([distance1,distance2,distance3,distance4,time.ctime()]) 
      csv_writer.writerow([distance1,distance2,distance3,distance4,time.ctime()]) 
      time.sleep(0.5) 
      j=j-1 

lenth=len(data) 
print (data) 
GPIO.cleanup() 

и для измерения скорости:

#!/usr/bin/python3 
import RPi.GPIO as GPIO 
from time import sleep 
import time, math 

dist_meas = 0.00 
km_per_hour = 0 
rpm = 0 
elapse = 0 
sensor = 29 
pulse = 0 
start_timer = time.time() 

def init_GPIO():    # initialize GPIO 
    GPIO.setmode(GPIO.BOARD) 
    GPIO.setwarnings(False) 
    GPIO.setup(sensor,GPIO.IN,GPIO.PUD_UP) 

def calculate_elapse(channel):   # callback function 
    global pulse, start_timer, elapse 
    pulse+=1      # increase pulse by 1 whenever interrupt occurred 
    elapse = time.time() - start_timer  # elapse for every 1 complete rotation made! 
    start_timer = time.time()   # let current time equals to start_timer 

def calculate_speed(r_cm): 
    global pulse,elapse,rpm,dist_km,dist_meas,km_per_sec,km_per_hour 
    if elapse !=0:      # to avoid DivisionByZero error 
     rpm = 1/elapse * 60 
     circ_cm = (2*math.pi)*r_cm   # calculate wheel circumference in CM 
     dist_km = circ_cm/100000   # convert cm to km 
     km_per_sec = dist_km/elapse  # calculate KM/sec 
     km_per_hour = km_per_sec * 3600  # calculate KM/h 
     dist_meas = (dist_km*pulse)*1000 # measure distance traverse in meter 
     return km_per_hour 

def init_interrupt(): 
    GPIO.add_event_detect(sensor, GPIO.FALLING, callback = calculate_elapse, bouncetime = 20) 

if __name__ == '__main__': 
    init_GPIO() 
    init_interrupt() 
    while True: 
     calculate_speed(24) # call this function with wheel radius as parameter 
     print('rpm:{0:.0f}-RPM kmh:{1:.0f}-KMH dist_meas:{2:.2f}m pulse:{3}'.format(rpm,km_per_hour,dist_meas,pulse)) 
     sleep(0.1) 

Я получаю выход для скорости, как этот

rpm:0-RPM kmh:0-KMH dist_meas:0.00m pulse:0 

rpm:4-RPM kmh:0-KMH dist_meas:1.51m pulse:1 

rpm:4-RPM kmh:0-KMH dist_meas:1.51m pulse:1 

rpm:4-RPM kmh:0-KMH dist_meas:1.51m pulse:1 

rpm:4-RPM kmh:0-KMH dist_meas:1.51m pulse:1 

rpm:4-RPM kmh:0-KMH dist_meas:1.51m pulse:1 

rpm:104-RPM kmh:9-KMH dist_meas:3.02m pulse:2 

rpm:433-RPM kmh:39-KMH dist_meas:4.52m pulse:3 

rpm:365-RPM kmh:33-KMH dist_meas:6.03m pulse:4 

rpm:365-RPM kmh:33-KMH dist_meas:6.03m pulse:4 

rpm:365-RPM kmh:33-KMH dist_meas:6.03m pulse:4 

rpm:365-RPM kmh:33-KMH dist_meas:6.03m pulse:4 

rpm:365-RPM kmh:33-KMH dist_meas:6.03m pulse:4 

rpm:365-RPM kmh:33-KMH dist_meas:6.03m pulse:4 

rpm:365-RPM kmh:33-KMH dist_meas:6.03m pulse:4 

rpm:365-RPM kmh:33-KMH dist_meas:6.03m pulse:4 

rpm:365-RPM kmh:33-KMH dist_meas:6.03m pulse:4 

rpm:365-RPM kmh:33-KMH dist_meas:6.03m pulse:4 

rpm:365-RPM kmh:33-KMH dist_meas:6.03m pulse:4 

rpm:365-RPM kmh:33-KMH dist_meas:6.03m pulse:4 

rpm:365-RPM kmh:33-KMH dist_meas:6.03m pulse:4 

rpm:365-RPM kmh:33-KMH dist_meas:6.03m pulse:4 

rpm:365-RPM kmh:33-KMH dist_meas:6.03m pulse:4 

rpm:365-RPM kmh:33-KMH dist_meas:6.03m pulse:4 

rpm:365-RPM kmh:33-KMH dist_meas:6.03m pulse:4 

rpm:365-RPM kmh:33-KMH dist_meas:6.03m pulse:4 

rpm:365-RPM kmh:33-KMH dist_meas:6.03m pulse:4 

rpm:365-RPM kmh:33-KMH dist_meas:6.03m pulse:4 

rpm:22-RPM kmh:2-KMH dist_meas:7.54m pulse:5 

rpm:22-RPM kmh:2-KMH dist_meas:7.54m pulse:5 

rpm:229-RPM kmh:21-KMH dist_meas:9.05m pulse:6 

rpm:388-RPM kmh:35-KMH dist_meas:10.56m pulse:7 

rpm:388-RPM kmh:35-KMH dist_meas:10.56m pulse:7 

rpm:971-RPM kmh:88-KMH dist_meas:13.57m pulse:9 

rpm:627-RPM kmh:57-KMH dist_meas:15.08m pulse:10 

rpm:318-RPM kmh:29-KMH dist_meas:16.59m pulse:11 

rpm:1949-RPM kmh:176-KMH dist_meas:19.60m pulse:13 

rpm:656-RPM kmh:59-KMH dist_meas:21.11m pulse:14 
+0

Могут ли колебания быть результатом того, что вы не сглаживаете ваши показания, принимая среднее значение? Я думаю, что неточности, возникающие при измерении скорости на очень коротких расстояниях, потребуют значительного усреднения. – halfer

+0

Число оборотов в минуту увеличивается, а также уменьшается, но не показывает 0. Например, если я начал измерять, отсчет начинается с 0, увеличивается с увеличением скорости, а также уменьшается до определенного уровня, и если мы остановим колесо, то оно будет продолжать показывать последнее чтение для Например, если последнее чтение было 2 об/мин, то оно будет продолжать показывать 2 об/мин вместо того, чтобы показывать 0. –

+0

Это потому, что вы больше не получаете импульсы от датчика эффекта Холла? Думаю, это ожидалось. Если я быстро остановлю электрический велосипед, дисплей начнет обнулять текущую скорость (возможно, линейно), и это займет пару секунд, чтобы свести к нулю. Вероятно, вам придется это сделать самому. – halfer

ответ

0

я делать нашел код, которые дают быстрые результаты , возможно, это поможет вам ... в любом случае im использовать магнитные датчики эффекта зала

$ 

import RPi.GPIO as GPIO 
import time 


GPIO.setmode(GPIO.BCM) 
GPIO.setwarnings(False) 

pulse = 0 
distance = 0 
rpm = 0.00 
speed = 0.00 
wheel_c = 20 
hall = 18 
elapse = 0.00 

start = time.time() 

GPIO.setup(hall, GPIO.IN, pull_up_down = GPIO.PUD_UP) 


def get_rpm(): 
    return rpm 

def get_speed(): 
    return speed 

def get_distance(): 
    return distance 

def get_elapse(): 
    return elapse 

def get_pulse(number): 
    global elapse,distance,start,pulse,speed,rpm,multiplier 
    cycle = 0 
    pulse+=1 
    cycle+=1 
    if pulse > 0: 
     elapse = time.time() - start 
     pulse -=1 
    if cycle > 0: 
     distance += wheel_c 
     cycle -= 1 

    speed = (wheel_c*multiplier)/100000 
    rpm = 1/elapse *60 

    start = time.time() 



try: 

    time.sleep(1) 

    GPIO.add_event_detect(hall,GPIO.FALLING,callback = get_pulse,bouncetime=20) 
    while True: 
    print('rpm:{0:.2f} speed:{1:.2f} distance:{2} elapse:{3:.4f}'.format(rpm,speed,distance,elapse)) 
     time.sleep(0.1) #to reduce CPU load, print every 100 milliseconds 


except KeyboardInterrupt: 
    print('You have pressed Ctrl+C! How dare you stopped this beautiful thing?!') 
    GPIO.cleanup() 
$ 
Смежные вопросы