2014-08-30 1 views
0

J'ai mon Arduino Yun configuré avec un serveur Web. La page Web comporte une série de boutons, qui contrôlent le buzzer en jouant divers sons, et un bouton pour contrôler un stepper motor. J'utilise le code lié qui utilise la bibliothèque AccelStepper.Problèmes d'alimentation du moteur pas à pas à partir du serveur Web (bouton) via Arduino Yun

Le bouton fonctionne bien pour le buzzer, je clique dessus et il joue le son. Pour le moteur cependant, je clique sur le bouton, et la LED s'allume sur la carte du pilote pendant une seconde après que le bouton est cliqué mais c'est tout.

Je soupçonne que le moteur, contrairement au buzzer, a besoin de la commande pour être vrai tout le temps pendant qu'il se déplace dans sa position, sinon il s'arrête. Le bouton de la page Web doit donc ressembler davantage à un bouton - cliquez pour continuer, cliquez à nouveau pour continuer et rester à l'écart. Mais je ne sais pas comment faire ça. Ou alors, peut-être que quelqu'un a de l'expérience avec ce moteur pas à pas et sait comment l'utiliser sans accelstepper. (Tout ce que j'essaie de faire, c'est d'amener le moteur à tourner dans une position donnée.)

J'espère que ce n'est pas trop confus. Je suis si proche, pourtant ce moteur me cause une énorme douleur. Merci beaucoup!

Le code croquis:

//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); 

} 

Code 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

* «Je soupçonne que le moteur , contrairement au buzzer, a besoin de la commande pour être vrai tout le temps pendant qu'il se déplace à sa position, sinon il s'arrête. "* Ne serait-ce pas une bonne idée de tester cette théorie hors ligne avec un simple Arduino Sketch? – GolezTrol

+0

@GolezTrol Eh bien, j'ai essayé le moteur avec un bouton poussoir physique, et il a dû être pressé tout le temps pour que le moteur tourne. Mais je ne sais pas comment reproduire cela en utilisant un bouton numérique et les commandes indiquées ci-dessus. toute aide serait grandement appréciée. – peyroux

+0

Ok. Donc, il semble que la théorie est juste. Maintenant, peut-être, il est également plus facile d'utiliser le bouton physique pour programmer votre objectif. Il suffit de lire la valeur du bouton et si elle est en baisse, définissez un drapeau et faites tourner le stepper alors qu'il est en place. Tout ce que vous devez savoir, c'est combien de temps pour garder le drapeau. Une fois que cela fonctionne, passer d'un bouton physique à un bouton web devrait être trivial.Le drapeau peut aussi être un compteur (pour vous souvenir du nombre de pas que vous avez faits). – GolezTrol

Répondre

1

La méthode .run() doit être appelé à plusieurs reprises pour faire plus d'une seule étape.

Notez que chaque appel à run() fera au plus une étape, et seulement lorsqu'une étape est due, en fonction de la vitesse et le temps écoulé depuis la dernière étape. reference

Donc, soit appeler .run() dans une boucle:

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

Sinon, utilisez .runToPosition(), qui fait la même chose que la boucle au-dessus de toute façon, mais bloque et ne retourne pas jusqu'à ce qu'il soit fait il à sa nouvelle position.

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

Si vous voulez sauter l'accélération, assurez-vous de régler la vitesse que vous voulez après vous définissez la position cible, et vous pouvez utiliser runSpeedToPosition():

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