• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 шага,
А у вас полушаговый режим? И тут надо найти правильный вариант? (но это так, незначительный отступ от темы...)
 
Сверху Снизу