Проблемы с питанием шагового двигателя от веб-сервера (кнопка) через Arduino Yun

У меня есть Arduino Yun с веб-сервером. На веб-странице есть ряд кнопок, которые управляют зуммером, воспроизводящим различные звуки, и кнопка для управления шаговым двигателем. Я использую связанный код, который использует библиотеку 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>

1 ответ

.run() метод должен вызываться повторно, чтобы выполнить более одного шага.

Обратите внимание, что каждый звонок run() будет сделан не более одного шага, и только тогда, когда шаг должен быть выполнен, основываясь на текущей скорости и времени с последнего шага. ссылка

Так что либо позвони .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();
}
Другие вопросы по тегам