• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

WebServer CustomStepper

IgorFX

New member
Доброго дня. Не могу разобраться где ошибка. Двигатель делает только один шаг по запросу.
Код:
#include <ESP8266WiFi.h>
#include <CustomStepper.h>

// -- USER EDIT --
const char* ssid     = "SweetHome";    // YOUR WIFI SSID
const char* password = "555555";    // YOUR WIFI PASSWORD

// change this to your motor if not NEMA-17 200 step
//#define STEPS 2048  // Max steps for one revolution
#define RPM 5     // Max RPM
#define DELAY 5    // Delay to allow Wifi to work
CustomStepper stepper(13, 12, 16, 14, (byte[]){8, B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001}, 4075.7728395, 12, CW);// -- END --

boolean uppoint = false;
boolean downpoint = false;

int STBY = 5;     // GPIO 5 TB6612 Standby
int LED = 2;      // GPIO 0 (built-in LED)

// GPIO Pins for Motor Driver board
//Stepper stepper(STEPS, 13, 12, 14, 16);

// Create an instance of the server
// specify the port to listen on as an argument
WiFiServer server(80);

void setup()
  {
  stepper.setRPM(8);
  stepper.setSPR(4075.7728395);
  Serial.begin(115200);
  delay(5);

  // prepare onboard LED
  pinMode(LED, OUTPUT);
  digitalWrite(LED, HIGH);

  // prepare STBY GPIO and turn on Motors
  //pinMode(STBY, OUTPUT);
  //digitalWrite(STBY, HIGH);
 
  // Set default speed to Max (doesn't move motor)
  //stepper.setSpeed(RPM);
 
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("STEPPER: Connecting to ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
 
  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());

  // Blink onboard LED to signify its connected
blink();
blink();
}

void loop()
   {
    // Check if a client has connected
    WiFiClient client = server.available();
    if (!client)
      {
        return;
      }

      String respMsg = "";    // HTTP Response Message
 
      // Wait until the client sends some data
      Serial.println("new client");
      while(!client.available()){delay(1);}
 
      // Read the first line of the request
      String req = client.readStringUntil('\r');
      Serial.println(req);
      //client.flush();
 
   if (req.indexOf("/stepper/up") != -1)
      {
         if (stepper.isDone() && uppoint == false)
        stepper.setDirection(CW);
        stepper.rotate(2);
        uppoint = true;
        //digitalWrite(STBY, LOW);
        blink();
        respMsg = "OK: MOTOR Going Up";
      }
    if (req.indexOf("/stepper/down") != -1)
      {
        if (stepper.isDone() && downpoint == false)
        stepper.setDirection(CCW);
        stepper.rotate(2);
        uppoint = false;
        downpoint = true;
        //digitalWrite(STBY, HIGH);
        blink();
        respMsg = "OK: MOTOR Going Down";
      }

        client.flush();
  // Prepare the response
  String s = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\n";
  if (respMsg.length() > 0)
    s += respMsg;
  else
    s += "OK";
    s += "\n";

  // Send the response to the client
  client.print(s);
  delay(1);
  Serial.println("Client disconnected");

  // The client will actually be disconnected
  // when the function returns and 'client' object is detroyed
      // Match the request
  stepper.run();
}
void blink() {
  digitalWrite(LED, LOW);
  delay(500);
  digitalWrite(LED, HIGH);
  delay(500);
}
 

gerkimuyda

New member
По программе вы сами ей говорите срабатывать только один раз
[inline]if (stepper.isDone() && uppoint == false)[/inline] - сработать только, если вверх не работали
[inline]uppoint = true;[/inline] - отметить, что вверх уже срабатывали и больше не надо обрабатывать команду "вверх"

Тоже самое и "вниз".
Вы это имели ввиду? Или что-то другое?
 

IgorFX

New member
И так пробовал. Делает шаг по запросу и все. Без разницы вверх или вниз запрос, шагает в одну сторону
 

gerkimuyda

New member
Без [inline]{ }[/inline] условие выполняет только переключение [inline]stepper.setDirection()[/inline] - плохой тон писать так программы. Когда надо будет что-то дополнительно дописать - будете долго ловить ошибку, почему не работает.

Добавьте вывод отладочной инфы [inline]Serial.println();[/inline] и посмотрите, что там выводится у вас.

[inline]stepper.isDone()[/inline] - что выполняет (я с этой библиотекой не работал, не знаю)?

[inline]stepper.rotate(2);[/inline] - туда передается что? шаг? или угол поворота? Что даст [inline]stepper.rotate(2); stepper.rotate(4); stepper.rotate(2);[/inline]
 

kab

New member
@IgorFX
Вы осознаёте, что по логике программы можно делать только по одному шагу, то в одну, то в другую сторону?
 

gerkimuyda

New member
Не понятно, что вам надо. Попробуйте вариант постоянного вращения [inline]stepper.rotate();[/inline] без задания параметров

Также перепроверьте правильность подключения пинов, а то у вас там две настройки разных (одна наполовину закомментирована, лучше удалить ее совсем, чтобы не мешала и не вносила путаницу)
 
Последнее редактирование:

IgorFX

New member
То есть движение есть, только вместо двух оборотов он поворачивается на меньший угол? В этом проблема?
Да он просто делает шаг, когда инструкция прописана на два оборота stepper.rotate(2). А stepper.run() должен её выполнить
 

kab

New member
Да он просто делает шаг, когда инструкция прописана на два оборота stepper.rotate(2). А stepper.run() должен её выполнить
попробуй вместо
stepper.rotate(2)
вставить
stepper.rotateDegrees(720)

Похоже, в stepper.rotate(2) 2 - это стало число не оборотов, а шагов. Почему-то съехали так настройки.
 

gerkimuyda

New member
Продолжаем набор на спиритические сеансы экстрасенсов :)))

Как думаете, что данная строка у вас выполняет?
[inline] if (!client) { return; } [/inline]
Я предполагаю, что она, наверное, не дает запускаться [inline]stepper.run()[/inline] а вы как считаете?

И еще, вам не кажется, что в приведенном тексте написано
двигатель за один оборот осуществляет 4075.7728395 шага. Данный двигатель поддерживает полушаговый режим и за один полный оборот может совершать 4076 шага,
А у вас полушаговый режим? И тут надо найти правильный вариант? (но это так, незначительный отступ от темы...)
 
Сверху Снизу