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