2016年9月27日 星期二

SciCore運動學修改

之前在阿簡那邊看到的程式,自己測試了一下,有點小問題,但是看了半天抓不出bug,阿簡自己弄狀況也很好,因為搞不定所以就用大概相同的概念把原本超音波測距的程式改成運動學的。





運動學需要位置和時間兩個訊息,用這兩個訊息就可以把位移、速度、加速度都算出來。

一、位置部分:
概念上大概是這樣,超音波測距的library裡面,本來就有抓取聲音來回的時間和距離資訊。我不抓距離,只抓聲音來回時間。然後依照聲速和溫度的關係,把來回時間除以二,乘以聲速就變成距離了。溫度則是從DHT 溫濕度計得到。

二、時間部分:
這時間其實就是設定的delay time,這個時間決定了多少時間間隔要測量一個數據。這部分由一個可變電阻來控制,順時針旋轉就會讓取樣頻率變高。設定最長是一秒最短是50毫秒取一次數據。


這兩個有了之後,後面就是運動學定義輸入給arduino請它計算,然後顯示就行了。

實際的實驗效果還得要測試就是了。其實我覺得用VideoPhysics 或者 tracker就可以測到很好的運動學數據了啦


附加兩個實驗數據,用一台IKEA木製小火車,從斜坡滑下來測。看位移時間圖形還不錯,看速度或加速度就很糟








#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,blpol
LiquidCrystal_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 9
int 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.read11
float 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);

}

沒有留言: