2013-07-03 137 views
1

我想從我的傳感器接收信息,但是我的輸出始終只是0,在我的代碼中是否有錯誤?所有硬件相關的都做得很好。Arduino超聲波距離傳感器

loop() 
{ 
    long duration, inches, cm; 

    pinMode(pingPin, OUTPUT); 
    digitalWrite(pingPin, LOW); 
    delayMicroseconds(2); 
    digitalWrite(pingPin, HIGH); 
    delayMicroseconds(5); 
    digitalWrite(pingPin, LOW); 

    pinMode(pingPin, INPUT); 
    duration = pulseIn(pingPin, HIGH); 

    inches = microsecondsToInches(duration); 
    cm = microsecondsToCentimeters(duration); 

    Serial.print(inches); 
    Serial.print("in; "); 
    Serial.print(cm); 
    Serial.print("cm"); 
    Serial.println(); 
} 

long microsecondsToInches(long microseconds) 
{ 
    return microseconds/74/2; 
} 

long microsecondsToCentimeters(long microseconds) 
{ 
    return microseconds/29/2; 
} 
+0

你打印'duration'了呢? – zmo

+0

'pingPin'? '持續時間'的價值是什麼? –

+0

pingPin是我用來ping的引腳,我知道這個網站堅持不把自己理解的代碼,但它是一個值爲7的常量整數。我使用最後兩個函數來使用它們各自的公式將持續時間轉換爲距離。此外,這是我使用的傳感器的型號http://www.amazon.co.uk/gp/product/B008AFFC9G/ref=oh_details_o01_s00_i00?ie=UTF8&psc=1 – Ted

回答

1

多次嘗試和感謝約翰·B的幫助後,將其計算出的正確答案就如何正確使用這種傳感器,它工程完全按照需要,輸出完美地測量

#include <SoftwareSerial.h> 

// TX_PIN is not used by the sensor, since that the it only transmits! 
#define PING_RX_PIN 6 
#define PING_TX_PIN 7 

SoftwareSerial mySerial(PING_RX_PIN, PING_TX_PIN); 

long inches = 0, mili = 0; 
byte mybuffer[4] = {0}; 
byte bitpos = 0; 

void setup() { 
    Serial.begin(9600); 

    mySerial.begin(9600); 
} 


void loop() { 
    bitpos = 0; 
    while (mySerial.available()) { 
    // the first byte is ALWAYS 0xFF and I'm not using the checksum (last byte) 
    // if your print the mySerial.read() data as HEX until it is not available, you will get several measures for the distance (FF-XX-XX-XX-FF-YY-YY-YY-FF-...). I think that is some kind of internal buffer, so I'm only considering the first 4 bytes in the sequence (which I hope that are the most recent! :D) 
    if (bitpos < 4) { 
     mybuffer[bitpos++] = mySerial.read(); 
    } else break; 
    } 
    mySerial.flush(); // discard older values in the next read 

    mili = mybuffer[1]<<8 | mybuffer[2]; // 0x-- : 0xb3b2 : 0xb1b0 : 0x-- 
    inches = 0.0393700787 * mili; 
    Serial.print("PING: "); 
    Serial.print(inches); 
    Serial.print("in, "); 
    Serial.print(mili); 
    Serial.print("mili"); 
    Serial.println(); 

    delay(100); 
} 
1

您正在使用Parallax PING代碼,該代碼使用與您擁有的協議不同的協議。 Here is a link to the datasheet of your sensor。它每隔50ms以9600bps的速度通過標準串行輸出。

+0

我不明白基於數據表如何在代碼中使用它,請問我可以告訴我,我怎麼把這個輸入和輸出?因爲我根本不明白它上面說的是什麼 – Ted

2

您擁有的傳感器不使用PWM作爲發送距離的方式。而是它使用了一個水路連接。問題是你在Arduino上沒有額外的串行硬件。

您可以使用Arduino的的逃端口讀取傳感器的數據,但你將無法登錄任何內容到屏幕

在該串行連接上運行的9600波特,這是快的速度在軟件中模擬。

我建議你購買使用標準PWM通信模式的傳感器。這樣做會節省幾個頭痛。但我應該告訴你有一種方法。它使用軟件串行庫。圖書館將幫助你使用數字引腳,就像它們是導軌一樣。

http://arduino.cc/en/Reference/SoftwareSerial

http://www.suntekstore.com/goods-14002212-3-pin_ultrasonic_sensor_distance_measuring_module.html

http://iw.suntekstore.com/attach.php?id=14002212&img=14002212.doc

+0

「串行連接運行的速度是9600波特」 - 當我使用Serial.begin(9600)時,是否設置爲以該速度讀取此設置? ?我在流浪有沒有可能使用這種傳感器?任何額外的硬件或什麼? – Ted

+1

所有的arduinos都有一個內置的serail端口。因此,您可以使用該端口來讀取傳感器,但是您將無法使用計算機讀取arduino的值。這合乎邏輯嗎? –

+0

嗯,我有興趣獲取信息,並根據它做一些其他操作,我看到你建議我的圖書館,它會允許我從數字引腳獲取信息,當它用作串行引腳時? – Ted

相關問題