close

 2017.07.28 星期五

測量車子速度看起來應該簡單,但還是要實作才能發覺真正的問題,其實看別人做好像很簡單,但實際上也是很多程式碼要寫,要做到完善似乎也是不容易的。所以記錄下來,以作參考。
這個範例使用web server 去呈現轉速資料,要修改成自己能用的。

 

 

There are 2 methods for calculating speed using Python.

The first method is using "pre-defined interval".
The second method is using "calculated interval".

#---------------------------------------

CALCULATED INTERVAL METHOD


Using calculated interval method is better and more precise than pre-defined interval.
 (1)using the time.time() module in Python to precisely measure time duration of each interrupt interval.
(2)using add_event_detect() to take advantage of the GPIO pin interrupt event handler.
(3)useing one callback function called "calculate_elapse(channel)".
     This function will get called anytime interrupt event happens.

#-------公式----------------------------------
Round Per Minute (rpm) can be calculated using : rpm = 1/elapse * 60
where 1 is referring to 1 complete rotation and 60 is referring to 60 seconds.

circ_cm (wheel circumference) can be calculated using : 2 x pi x radius

dist_km (distance moved in km) can be calculated using : dist_km = circ_cm/100000

km_per_sec (speed in KM/s) calculated using: km_per_sec =  dist_km / elapse

km_per_hour (speed in KM/h) calculated using: km_per_hour =  km_per_sec * 3600

#-------------------------------

#!/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 = 12
pulse = 0
start_timer = time.time()

def init_GPIO(): # initialize GPIO
     GPIO.setmode(GPIO.BCM)
     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(20)                          # 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)

 

 

參考資料

Raspberry Pi based Speedometer using Hall Effect Sensor

Speed sensor calculation using Python

https://stackoverflow.com/questions/40738776/how-to-use-python-to-measure-speed-of-bike-like-a-digital-speedometer-using-a-r

 

arrow
arrow

    stanley 發表在 痞客邦 留言(0) 人氣()