運動學需要位置和時間兩個訊息,用這兩個訊息就可以把位移、速度、加速度都算出來。
一、位置部分:
概念上大概是這樣,超音波測距的library裡面,本來就有抓取聲音來回的時間和距離資訊。我不抓距離,只抓聲音來回時間。然後依照聲速和溫度的關係,把來回時間除以二,乘以聲速就變成距離了。溫度則是從DHT 溫濕度計得到。
二、時間部分:
這時間其實就是設定的delay time,這個時間決定了多少時間間隔要測量一個數據。這部分由一個可變電阻來控制,順時針旋轉就會讓取樣頻率變高。設定最長是一秒最短是50毫秒取一次數據。
這兩個有了之後,後面就是運動學定義輸入給arduino請它計算,然後顯示就行了。
實際的實驗效果還得要測試就是了。其實我覺得用VideoPhysics 或者 tracker就可以測到很好的運動學數據了啦
這兩個有了之後,後面就是運動學定義輸入給arduino請它計算,然後顯示就行了。
實際的實驗效果還得要測試就是了。其實我覺得用VideoPhysics 或者 tracker就可以測到很好的運動學數據了啦
#include <Wire.h> // Arduino IDE 內建// LCD I2C Library,從這裡可以下載:// https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads#include <LiquidCrystal_I2C.h>// Set the pins on the I2C chip used for LCD connections:// addr, en,rw,rs,d4,d5,d6,d7,bl,blpolLiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // 設定 LCD I2C 位址//面對藍色網格的情況下,從左往右的腳位是Signal, +, -#include <dht.h>#define dht_dpin 3 //定義訊號要從Pin D3 進來dht DHT; //用DHT抓取環境溫度作為聲音速度計算的參考#include <Ultrasonic.h>#define trigPin 12#define echoPin 13#define LEDR 9int potPinR = 1;Ultrasonic ultrasonic(trigPin, echoPin);float intervaltime; //測量的時間間隔(由電阻決定)float x0, v0,cmMsec, duration, distance,velocity,acceleration;int showtime;void setup() {Serial.begin (9600);pinMode(trigPin, OUTPUT);pinMode(echoPin, INPUT);pinMode(LEDR, OUTPUT);lcd.begin(16, 2);}void loop() {intervaltime = analogRead(potPinR);intervaltime = map (intervaltime , 0, 900, 50, 1000);showtime = intervaltime;DHT.read11(dht_dpin); //去library裡面找DHT.read11float c=(331.5+0.6*DHT.temperature)*0.0001;//單位是每微秒幾公分long microsec = ultrasonic.timing();digitalWrite(trigPin, HIGH);delayMicroseconds(1000);digitalWrite(trigPin, LOW);distance = (microsec/2)*c;velocity=(distance-x0)/(intervaltime/1000);//每秒幾公分acceleration=(velocity-v0)/(intervaltime/1000);//每秒每秒幾公分加速度lcd.clear();lcd.setCursor(0,0);lcd.print("T=");lcd.print(showtime);lcd.setCursor(7,0);lcd.print(" D=");lcd.print(distance);lcd.setCursor(0,1);lcd.print("V:");lcd.print(velocity);lcd.setCursor(6,1);lcd.print(" a:");lcd.print(acceleration);Serial.print("E");Serial.print(distance);Serial.print(",");Serial.print(velocity);Serial.print(",");Serial.println(acceleration);x0 = distance;v0 = velocity;delay(intervaltime);}
沒有留言:
張貼留言