Шаговый двигатель,ошибки в скетче(Решено)

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем VenkarD, 20 сен 2016.

  1. VenkarD

    VenkarD Нерд

    Всем привет,на вашем форуме впервые)Моя цель сделать управление из порта шаговым двигателем,отправляется градус ,где он должен находиться и он должен переместиться на этот градус,но появилась одна проблемка:она заключается в том,что данный код компилируется,но шаговик не крутится...Я думаю,что проблема в функции.Но точно определить ошибку не смог,вся надежда на вас...:(
    Код (C++):

    const byte stepsPin=7;  //контакт для шага
    const byte directionPin=8;//контакт для управления вращением
    const byte enablePin=11; //контакт включения
    const int  delayTime=20;//регулирование скорости двигателя
    const float KSG=1.1111111111;//умножая на это градусы получаем шаги
    float NewCord;//Новые координаты
    float OldCord=0;//Старые)
    float PortValue;//Значение,которое пришло из порта
    float Steps;//шаги
    void setup()
    {
      pinMode (stepsPin,OUTPUT);
      pinMode (directionPin,OUTPUT);
      pinMode (enablePin,OUTPUT);
      Serial.begin(9600);
    }
    void StepGo()//Функция для *ходьбы* вперед
    {
      digitalWrite(directionPin,HIGH);//направление вперед
      for(int i=0;i<Steps;i++)
      {
      digitalWrite(stepsPin, HIGH);
      delay(delayTime);
      digitalWrite(stepsPin, LOW);
      delay(delayTime);
      }
    }
    int StepBack()
    {
      Steps*=(-1);
      digitalWrite(directionPin,LOW);//Направление назад
      for(int i=0;i<Steps;i++)
      {
      digitalWrite(stepsPin, HIGH);
      delay(delayTime);
      digitalWrite(stepsPin, LOW);
      delay(delayTime);
      }
    }
    void loop()
    {
      if (Serial.available()>0)
      {
      PortValue=Serial.parseInt();
    Serial.println(PortValue);
      }
      NewCord=PortValue*KSG;
      Steps=(NewCord-OldCord);
      if (Steps>=0)
      {
      void StepGo();//вызов функции вращения вперед
      }
      else
      {
      void StepBack();//вызов функции вращения назад
      }
      OldCord=NewCord;
    }


     
     
    Последнее редактирование: 20 сен 2016
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    Код (C++):
    const int KSG=1.1111111111;
    int не может быть дробным числом, поэтому умножение реально идет всегда ровно на единицу, т.е. никакого приращения.
     
    VenkarD нравится это.
  3. VenkarD

    VenkarD Нерд

    Ага,сделаю пока всё вещественным типом,но это не помогло(
     
  4. Tomasina

    Tomasina Сушитель лампочек Модератор

    Что это такое?
    Код (C++):
    Steps*=(-1);
    Далее, если Steps равно -1, то из цикла сразу вылетам, ни разу не шагнув.

    P.S. нажмите в IDE Ctrl-T, а то скобки уехали.
     
    VenkarD нравится это.
  5. VenkarD

    VenkarD Нерд

    Это Steps=Steps*(-1);// в c++ такая запись работает
    Там получается отрицательное значение и оно умножается на отрицательное
    -x*(-1)=x
     
  6. Tomasina

    Tomasina Сушитель лампочек Модератор

    А зачем вообще использовать отрицательные?
    В обеих функциях по сути одно и тоже, так и пусть это будет одна функция с двумя входными параметрами - направление и количество шагов.
     
    VenkarD нравится это.
  7. VenkarD

    VenkarD Нерд

    Хм,действительно это будет гораздо лучше.
     
  8. Tomasina

    Tomasina Сушитель лампочек Модератор

    У тебя строка
    Код (C++):
    PortValue=Serial.parseInt();
    выполняется всегда (сотни раз в секунду), независимо от наличия чего-либо в Serial.
    Возможно поэтому там всегда ноль вместо коэффициента.
    Надо проверить что там есть.
     
    VenkarD нравится это.
  9. VenkarD

    VenkarD Нерд

    Тут же вроде идет проверка данных в порте
     
  10. Tomasina

    Tomasina Сушитель лампочек Модератор

    Поставь после нее Serial.println(PortValue);
    Число будет один раз выводиться или постоянно?
     
    VenkarD нравится это.
  11. VenkarD

    VenkarD Нерд

    Один раз,потом выводятся нули:(
     
  12. Tomasina

    Tomasina Сушитель лампочек Модератор

    Ага, подозрение подтвердилось. Одна точка с запятой лишняя.
    Надо или так
    Код (C++):
    while (Serial.available()>0)
    {
    PortValue=Serial.parseInt();
    }
    Или так
    Код (C++):
    if (Serial.available()>0)
    {
    PortValue=Serial.parseInt();
    }
    И уже потом разбираться с фигурными скобками после этого выражения.
     
  13. VenkarD

    VenkarD Нерд

    Да,теперь постоянно значение,которое я ввёл
     
  14. VenkarD

    VenkarD Нерд

    Только вот до функции оно не добирается...
     
  15. Tomasina

    Tomasina Сушитель лампочек Модератор

    Почему постоянно? Должно быть однократно. Где-то не так скобки стоят.
    Где новый код?
     
    VenkarD нравится это.
  16. Tomasina

    Tomasina Сушитель лампочек Модератор

    Код (C++):
    if (Steps>=0)
      {
      int StepGo();//вызов функции вращения вперед
      }
      else
      {
      int StepBack();//вызов функции вращения назад
      }
    int здесь не нужно, и в объявлении функции тоже надо void, а не int.
     
    VenkarD нравится это.
  17. VenkarD

    VenkarD Нерд

    Забыл исправить,пробовал передавать значения
     
  18. Tomasina

    Tomasina Сушитель лампочек Модератор

    Я это вижу так:
    Код (C++):
    if (Steps>=0)
      {
        rotate(1, Steps);//вызов функции вращения вперед
      }
      else
      {
        rotate(0, Steps);//вызов функции вращения назад
      }
    Код (C++):
    void rotate(byte dir, float stepsValue)//Функция для *ходьбы* вперед или назад
    {
      digitalWrite(directionPin,dir);//направление
      for(float i=0.0; i<abs(stepsValue); i++)
      {
      digitalWrite(stepsPin, HIGH);
      delay(delayTime);
      digitalWrite(stepsPin, LOW);
      delay(delayTime);
      }
    }
     
    Последнее редактирование: 20 сен 2016
    VenkarD нравится это.
  19. Tomasina

    Tomasina Сушитель лампочек Модератор

    На Enable должно быть HIGH или LOW?
    А то сейчас всегда LOW.
     
    VenkarD нравится это.
  20. VenkarD

    VenkarD Нерд

    digitalWrite(enablePin, HIGH);
    Да,на него надо подать питание