2016-02-27 48 views
2

我已經爲我的原型再次做了我的新代碼,我的問題是: 當arduino開始運行時,三臺SG90微型伺服電機同時旋轉360度,沒有停止。當我按下圓形按鈕時,它會減慢伺服電機的旋轉速度。SG90微型伺服電機按鈕Arduino自動售貨機Machie原型

當我試圖模擬我的程序123d.circuits.io,它的工作。由於沒有圓形按鈕,我使用了瞬時按鈕。

我想要實現的是:

當按鈕A/B/C被推動時,伺服電機A/B/C將旋轉360度,以分配一個項目爲我的自動售貨機的原型。

這是我的代碼。希望您能夠幫助我。

#include <Servo.h> 

const int pushButtonA = 2; 
const int pushButtonB = 4; 
const int pushButtonC = 7; 

Servo myservoA; 
Servo myservoB; 
Servo myservoC; 

int pos = 0; 
int buttonStateA = 0; 
int buttonStateB = 0; 
int buttonStateC = 0; 

void setup() { 

    Serial.begin(9600); 
    pinMode(pushButtonA, INPUT); 
    pinMode(pushButtonB, INPUT); 
    pinMode(pushButtonC, INPUT); 

    myservoA.attach(3); 
    myservoB.attach(5); 
    myservoC.attach(9); 
} 

void loop() { 

    buttonStateA = digitalRead (pushButtonA); 
    buttonStateB = digitalRead (pushButtonB); 
    buttonStateC = digitalRead (pushButtonC); 

    if((buttonStateA == LOW) && (buttonStateB == HIGH) && (buttonStateC == HIGH)){ 
    digitalWrite(3, HIGH); 
    for(pos = 0; pos <=360; pos++); 
    myservoA.write(pos); 
    delay(15); 
    digitalWrite(3, HIGH); 
    } 
     if((buttonStateB == LOW) && (buttonStateA == HIGH) && (buttonStateC == HIGH)){ 
    digitalWrite(5, HIGH); 
    for(pos = 0; pos <=360; pos++); 
    myservoB.write(pos); 
    delay(15); 
    digitalWrite(5, HIGH); 
    } 
      if((buttonStateC == LOW) && (buttonStateB == HIGH) && (buttonStateA == HIGH)){ 
    digitalWrite(9, HIGH); 
    for(pos = 0; pos <=360; pos++); 
    myservoC.write(pos); 
    delay(15); 
    digitalWrite(9, HIGH); 
    }; 
} 
+0

'爲(位置= 0; POS <= 360; POS ++);'相當於'POS = 361;' – MikeCAT

+0

所以它應該是正<360? – Chrys

+0

我的意思是'for'循環不會像循環一樣工作,因爲除了增加'pos'之外,它們沒有做任何工作。 – MikeCAT

回答

0

您的代碼有兩個問題。

  1. 正如@MikeCAT所述,代碼中的for循環是空的,因爲您在它們後面添加了一個分號。有關詳細說明,請參見Effect of semicolon after 'for' loop

  2. 在伺服引腳中不需要執行digitalWrite。爲了控制它們只需使用Servo類中的方法write

更正代碼:

#include <Servo.h> 

const int pushButtonA = 2; 
const int pushButtonB = 4; 
const int pushButtonC = 7; 

Servo myservoA; 
Servo myservoB; 
Servo myservoC; 

int pos = 0; 
int buttonStateA = 0; 
int buttonStateB = 0; 
int buttonStateC = 0; 

void setup() { 

    Serial.begin(9600); 
    pinMode(pushButtonA, INPUT); 
    pinMode(pushButtonB, INPUT); 
    pinMode(pushButtonC, INPUT); 

    myservoA.attach(3); 
    myservoB.attach(5); 
    myservoC.attach(9); 
} 

void loop() { 

    buttonStateA = digitalRead (pushButtonA); 
    buttonStateB = digitalRead (pushButtonB); 
    buttonStateC = digitalRead (pushButtonC); 

    if((buttonStateA == LOW) && (buttonStateB == HIGH) && (buttonStateC == HIGH)){ 
    for(pos = 0; pos <=360; pos++) { 
     myservoA.write(pos); 
     delay(15); 
    } 
    } 

    if((buttonStateB == LOW) && (buttonStateA == HIGH) && (buttonStateC == HIGH)){ 
    for(pos = 0; pos <=360; pos++) { 
     myservoB.write(pos); 
     delay(15); 
    } 
    } 

    if((buttonStateC == LOW) && (buttonStateB == HIGH) && (buttonStateA == HIGH)){ 
    for(pos = 0; pos <=360; pos++) { 
     myservoC.write(pos); 
     delay(15); 
    } 
    } 
} 
+0

另外,你確定電機可以旋轉360度嗎?通常這種電機在0到180度之間旋轉。 –

+0

是的,我確定。我們修改了伺服電機旋轉360度。 當我上傳新程序時,它只是做了同樣的事情。它不停地同時旋轉360度。但我知道你說的代碼是正確的。我想現在是因爲我的佈線或圓形按鈕? – Chrys

+0

當您打開電源時,通常這些電機旋轉到0度。如果所有電機同時從0旋轉到360,那麼這種行爲可能是由於您的佈線導致的,因爲上面的代碼只允許一個電機同時旋轉。 –