2014-01-16 80 views
0

我試圖編寫一個Arduino迴避機器人作爲一個學習項目。當我運行下面的代碼時,只有一個電機(左邊的)工作。如果我註釋掉使用checkDistance()函數的if語句,並且僅循環forward()函數,則兩個電機都可以正常工作。我使用的是Adafruit Motorshield v1.2,我相信這是電機:Link。我嘗試過直接通過USB供電,並且還通過外部電源(4 x AAs)供電,並且具有相同的問題。任何指針將不勝感激。謝謝!Arduino Uno迴避機器人:兩個電機不工作之一

#include <AFMotor.h> 
#define trigPin 3 
#define echoPin 2 

AF_DCMotor left_motor(2, MOTOR12_64KHZ); // create motor #1, 64KHz pwm 
AF_DCMotor right_motor(1, MOTOR12_64KHZ); // motor #2\ 

int maxDistance = 30; 
//int minDistance = 0; 

void setup() { 
    Serial.begin(9600);   // set up Serial library at 9600 bps 
    pinMode(trigPin, OUTPUT); 
    pinMode(echoPin, INPUT); 
    left_motor.setSpeed(255); 
    right_motor.setSpeed(255); 
} 

void forward(int delayTime) { 
    left_motor.run(FORWARD); 
    right_motor.run(FORWARD); 
    delay(delayTime); 
} 

void backward(int delayTime) { 
    left_motor.run(BACKWARD); 
    right_motor.run(BACKWARD); 
    delay(delayTime); 
} 

void stop(int delayTime) { 
    left_motor.run(RELEASE); 
    right_motor.run(RELEASE); 
    delay(delayTime); 
} 

void right(int delayTime) { 
    left_motor.run(FORWARD); 
    right_motor.run(BACKWARD); 
    delay(delayTime); 
} 

void left(int delayTime) { 
    left_motor.run(BACKWARD); 
    right_motor.run(FORWARD); 
    delay(delayTime); 
} 

int checkDistance(){ 
    long duration, distance; 
    /* The following trigPin/echoPin cycle is used to determine the 
    distance of the nearest object by bouncing soundwaves off of it. */ 

    digitalWrite(trigPin, LOW); 
    delayMicroseconds(2); 

    digitalWrite(trigPin, HIGH); 
    delayMicroseconds(10); 

    digitalWrite(trigPin, LOW); 
    duration = pulseIn(echoPin, HIGH); 

    //Calculate the distance (in cm) based on the speed of sound. 
    distance = duration/59.1; 
    return distance; 
} 

void loop() { 
    int currentDistance = checkDistance(); 
    Serial.print(currentDistance); 
    if (currentDistance >= maxDistance){ 
    Serial.println(" cm. No immediate obstacles detected. Moving forward."); 
    forward(2000); 
    stop(1000); 
    } 
    else { 
    Serial.println(" cm. Obstacle detected. Changing direction."); 
    right(1500); 
    stop(1000); 
    } 
} 
+0

嘗試更具體地確定問題的根源。通過註釋checkDistance()函數中的特定行,然後循環forward()函數以查看兩個電機是否工作正常。我會從pulseIn開始。我在哪裏看不到圖書館之間的任何初始資源衝突。 – mpflaga

回答

0

如果我試圖調試這一點,我將第一測試每個的馬達功能,而不從所述傳感器的任何邏輯檢查。 (例如,當左,右,後等等從循環()中調用時,兩個輪都轉動並且在正確的方向上)。這會讓人相信它不是佈線或其他硬件問題。如果他們不工作,那麼整理出來給你一個開始的地方。

如果他們工作,那麼它必須是傳感器的值,對嗎?你是如何確定maxDistance價值的?如果它太高,則此行:

if (currentDistance >= maxDistance){ 

可能永遠不會評估爲真。你在那裏有一些日誌語句,所以你對currentDistance的價值有一些瞭解。當您將物體放置在距離傳感器不同距離時,它是否似乎反映了準確的值?

無論如何......有些想法。

+0

感謝您的想法。我檢查了每個功能和電機工作正常,沒有添加邏輯(即只用forward();在循環中兩個電機都向前轉動)。我還檢查了串行輸出,並且當我移動我的手可變距離時,它可以準確報告距離。正當我使用該邏輯塊時,只有一個電機轉動。無法弄清楚是什麼導致它。 – Geomon

+0

所以你說的邏輯塊,只有'else'子句執行?或者它在適當的時候執行,但是'right'函數沒有被調用,或者沒有轉動兩個電機?另外'maxDistance' - 如果你減半,會發生什麼? –

+0

if和else子句都得到了適當的執行,但是語句中的forward()和right()不能正常工作(只有一個電機會轉動,如果我只是使用forward()或right() – Geomon