2014-08-30 59 views
0

我的Arduino Yun設置了網絡服務器。該網頁上有一系列按鈕,控制蜂鳴器播放各種聲音,以及一個按鈕來控制stepper motor。我使用的是使用AccelStepper庫的鏈接代碼。通過Arduino Yun從網絡服務器(按鈕)給步進電機供電的問題

該按鈕適用於蜂鳴器,我點擊它並播放聲音。然而,對於電機,我點擊按鈕,點擊按鈕後,驅動板上的LED亮起一秒鐘,但就是這樣。

我懷疑電動機不像蜂鳴器一樣需要命令在它移動到其位置時始終爲真,否則它會停止。因此,網頁上的按鈕需要更像是一個開關 - 單擊以繼續並繼續,再次單擊以停止。但我不確定如何做到這一點。

否則,也許任何人都有這個步進電機的經驗,並知道如何使用它沒有accelstepper。 (所有我試圖做的是讓電機轉向給定的位置。)

我希望這不是太困惑。我非常接近,但這種電機給我帶來了巨大的痛苦。 非常感謝!

草圖代碼:

//Bridge Setup 
#include <Bridge.h> 
#include <YunServer.h> 
#include <YunClient.h> 

YunServer server; 
String readString; 

//Motor Setup 
#include <AccelStepper.h> 
#define HALFSTEP 8 

// Motor pin definitions 
#define motorPin1 3  // IN1 on the ULN2003 driver 1 
#define motorPin2 4  // IN2 on the ULN2003 driver 1 
#define motorPin3 5  // IN3 on the ULN2003 driver 1 
#define motorPin4 6  // IN4 on the ULN2003 driver 1 

// Initialize with pin sequence IN1-IN3-IN2-IN4 for using the AccelStepper with 28BYJ-48 
AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4); 
////////////// 
//const int thereader = 8; 
int Buzzer1 = 9; 
//int readerstate = 0; 


void setup() { 
stepper1.setMaxSpeed(1000.0); 
stepper1.setAcceleration(100.0); 
stepper1.setSpeed(200); 
stepper1.moveTo(20000); 

pinMode(3, OUTPUT); 
pinMode(4, OUTPUT); 
pinMode(5, OUTPUT); 
pinMode(6, OUTPUT); 
pinMode(9, OUTPUT); 
digitalWrite(3, LOW); 
digitalWrite(4, LOW); 
digitalWrite(5, LOW); 
digitalWrite(6, LOW); 
digitalWrite(9, LOW); 

Bridge.begin(); 
//digitalWrite(13, HIGH); 



    // Listen for incoming connection only from localhost 
    // (no one from the external network could connect) 
    server.listenOnLocalhost(); 
    server.begin(); 


    //////////// 
    //pinMode(Buzzer1, OUTPUT); 
    // initialize the pushbutton pin as an input: 
    //pinMode(thereader, INPUT); 

}//--(end setup)--- 

void loop() { 

YunClient client = server.accept(); 

// There is a new client? 
if (client) { 
    // read the command 
String command = client.readString(); 
command.trim();  //kill whitespace 
Serial.println(command); 



    if (command == "rolloutcarpet") { 
    stepper1.run(); 
    //delay(2000); 
    //stepper1.moveTo(-stepper1.currentPosition()); 

    } 

if (command == "playfanfare") { 
    tone(Buzzer1,400,200); 
    delay(500); 
    tone(Buzzer1,400,200); 
    delay(500); 
    tone(Buzzer1,450,225); 
    delay(300); 
    tone(Buzzer1,450,225); 
    delay(500); 
    tone(Buzzer1,400,200); 
    delay(500); 
    tone(Buzzer1,450,200); 
    delay(300); 
    tone(Buzzer1,600,300); 
    delay(3000); 

} 

else if (command == "stopfanfare") { 
    delay(10000); 
} 
    client.stop(); 
} 

delay(50); 

} 

HTML代碼:

<!DOCTYPE html> 
<html> 
<head> 
<script type="text/javascript" src="zepto.min.js"></script> 

<script type="text/javascript"> 
function rolloutcarpet() 
{ 
$('#content').load('/arduino/rolloutcarpet'); 
} 

function playfanfare() 
{ 
$('#content').load('/arduino/playfanfare'); 
} 

function stopfanfare() 
{ 
$('#content').load('/arduino/stopfanfare'); 
} 
</script> 



</head> 
<body onload="setInterval(refresh, 500);"> 
    <span id="content"></span> 
    <button onclick="rolloutcarpet()">Roll Out the Carpet</button> 
    &nbsp;&nbsp;&nbsp;&nbsp; <button onclick="ledoff()">LED BLUE OFF</button> 
<br><br><br> 
    <button onclick="playfanfare()">PLAY FANFARE</button> 
    &nbsp; &nbsp;&nbsp;&nbsp;&nbsp; <button onclick="stopfanfare()">STOP FANFARE</button> 
<img src="yun.png" align="right"> 

    </body> 

</html> 
+0

*「我懷疑電機,與蜂鳴器不同的是,它需要命令始終保持真實,同時它移動到它的位置,否則它會停止。「*使用簡單的Arduino Sketch離線測試該理論不是一個好主意嗎? – GolezTrol 2014-08-30 12:27:08

+0

@GolezTrol嗯,我用一個物理按鈕試了一下電動機,它必須一直按着電動機轉動。但我不確定如何使用數字按鈕和上面顯示的命令來複制它。任何幫助將不勝感激。 – peyroux 2014-08-30 12:29:25

+0

好的。所以看來這個理論是正確的。現在也許,使用物理按鈕來編程你的目標也更容易。只需讀取按鈕值,如果它已關閉,則設置一個標記並在步進器啓動時旋轉它。所有你需要知道的是保持旗幟持續多久。一旦這個工作正常,從一個物理按鈕切換到一個web按鈕應該是微不足道的。該標誌也可以是一個計數器(記住你已經完成了多少步驟)。 – GolezTrol 2014-08-30 12:40:07

回答

1

.run()該方法需要被反覆調用,使比單個步驟的更多。

注意,每次調用run()將最多一步,然後只有當一個步驟是因爲,基於當前的速度,因爲最後一個步驟的時間。 reference

因此,要麼調用.run()在一個循環:

if (command == "rolloutcarpet") { 
    while (stepper1.distanceToGo() != 0) { 
     stepper1.run(); 
    } 
} 

否則使用.runToPosition(),它不一樣的上述循環無論如何,但塊,不會返回,直到它是由它這是它的新位置。

if (command == "rolloutcarpet") { 
    stepper1.runToPosition(); 
} 

如果你想跳過加速,請確保您設置要後您設置的目標位置的速度,並且可以使用runSpeedToPosition()

if (command == "rolloutcarpet") { 
    stepper1.moveTo(200); 
    stepper1.setSpeed(200); 
    stepper1.runSpeedToPosition(); 
}