#1 2015-12-04 21:47:03

gorenkov
Учасник
З Кіев
Зареєстрований: 2015-11-05
Повідомлень: 41

Нужен совет. Ардуино + энкодер + шаговый двигатель

Здравствуйте,

Помогите советом с кодом. Хочу с помощью энкодера управлять скоростью вращения шагового двигателя. Получается только в одном направлении и то, пока  dir больше нуля. Как только dir становится меньше нуля - двигатель останавливается. Что я делаю не так? Может кто-то уже сталкивался с таким? В интернете в основном примеры в которых двигатель повторяет движения энкодера.

Заранее благодарен.

/*
 Stepper Motor Control - one revolution

 This program drives a unipolar or bipolar stepper motor.
 The motor is attached to digital pins 8 - 11 of the Arduino.

 The motor should revolve one revolution in one direction, then
 one revolution in the other direction.


 Created 11 Mar. 2007
 Modified 30 Nov. 2009
 by Tom Igoe

 */

#include <Stepper.h>

const int stepsPerRevolution = 200;  // change this to fit the number of steps per revolution

int beg = 1;
int dir = 1;
// for your motor

Stepper myStepper(stepsPerRevolution, 2, 3);

//these pins can not be changed 2/3 are special pins
// Setting up the counter
int reading = 0;
int lowest = -200;
int highest = 200;
int changeamnt = 20;

// Timing for polling the encoder
unsigned long currentTime;
unsigned long lastTime;


// Pin definitions
const int pinA = 4;
const int pinB = 5;

// Storing the readings

boolean encA;
boolean encB;
boolean lastA = false;



void setup() {


 // set the two pins as inputs with internal pullups
  pinMode(pinA, INPUT_PULLUP);
  pinMode(pinB, INPUT_PULLUP);
  // Set up the timing of the polling
  currentTime = millis();
  lastTime = currentTime; 
  // Start the serial monitor for debugging
  Serial.begin(9600);
  
  
  
}

void loop() {


// Read elapsed time
  currentTime = millis(); 
  // Check if it's time to read
  if(currentTime >= (lastTime + 5))
  {
    // read the two pins
    encA = digitalRead(pinA);
    encB = digitalRead(pinB);
    // check if A has gone from high to low
    if ((!encA) && (lastA))
    {
      // check if B is high 
      if (encB)
      {
        // clockwise
        if (reading + changeamnt <= highest)
        {
          reading = reading + changeamnt; 
          beg = reading;
      //    myStepper.setSpeed(200);
      //    myStepper.step(200);
        }
      }
      else
      {
        // anti-clockwise
        if (reading - changeamnt >= lowest)
        {
          reading = reading - changeamnt; 
          beg = reading;
        }
      }
      // Output reading for debugging
      Serial.println(reading);
      
    }
    // store reading of A and millis for next loop
    lastA = encA;
    lastTime = currentTime;

  }


if (beg > 0)
  {
    dir = 1;
  }
  else if (beg < 0)
  {
  dir = -1;
  }
  else {}


myStepper.setSpeed(beg);

myStepper.step(dir);
 

}

Неактивний

#2 2015-12-08 19:07:10

gorenkov
Учасник
З Кіев
Зареєстрований: 2015-11-05
Повідомлень: 41

Re: Нужен совет. Ардуино + энкодер + шаговый двигатель

Проблема решена, переписал скетч и всё работает. Правда не совсем понимаю как полностью отключать питание от двигателя когда он не крутится - а то он заметно греется. Может есть у кого-то идеи на этот счёт?

/*
 Stepper Motor Control - one revolution

 This program drives a unipolar or bipolar stepper motor.
 The motor is attached to digital pins 8 - 11 of the Arduino.

 The motor should revolve one revolution in one direction, then
 one revolution in the other direction.


 Created 11 Mar. 2007
 Modified 30 Nov. 2009
 by Tom Igoe

 */

#include <Stepper.h>

const int stepsPerRevolution = 200;  // change this to fit the number of steps per revolution

int beg = 0;
int dir = 1;
// for your motor

// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 2, 3);

//these pins can not be changed 2/3 are special pins
// Setting up the counter
int reading = 0;
int lowest = -200;
int highest = 200;
int changeamnt = 20;

// Timing for polling the encoder
unsigned long currentTime;
unsigned long lastTime;


// Pin definitions
const int pinA = 4;
const int pinB = 5;

// Storing the readings

boolean encA;
boolean encB;
boolean lastA = false;



void setup() {
  // set the speed at 60 rpm:
  //myStepper.setSpeed(200);
  // initialize the serial port:

 // set the two pins as inputs with internal pullups
  pinMode(pinA, INPUT_PULLUP);
  pinMode(pinB, INPUT_PULLUP);
  // Set up the timing of the polling
  currentTime = millis();
  lastTime = currentTime; 
  // Start the serial monitor for debugging
  Serial.begin(9600);
  
  
  
}

void loop() {



// Read elapsed time
  currentTime = millis(); 
  // Check if it's time to read
  if(currentTime >= (lastTime + 5))
  {
    // read the two pins
    encA = digitalRead(pinA);
    encB = digitalRead(pinB);
    // check if A has gone from high to low
    if ((!encA) && (lastA))
    {
      // check if B is high 
      if (encB)
      {
        // clockwise
        if (reading + changeamnt <= highest)
        {
          reading = reading + changeamnt; 
          beg = reading;
//          myStepper.setSpeed(beg);
//          myStepper.step(1000);
        }
      }
      else
      {
        // anti-clockwise
        if (reading - changeamnt >= lowest)
        {
          reading = reading - changeamnt; 
          beg = reading;
//          myStepper.setSpeed(beg);
//          myStepper.step(1000);   
        }
      }
      // Output reading for debugging
      Serial.print("Reading ");
      Serial.println(reading);
      Serial.print("Dir ");
      Serial.println(dir);      
      
    }
    // store reading of A and millis for next loop
    lastA = encA;
    lastTime = currentTime;

  }


if (beg == 0)
  {
myStepper.setSpeed(0);
myStepper.step(0);  
  
  }

if (beg > 0)
  {
//    dir = 1;
myStepper.setSpeed(beg);
myStepper.step(dir);
  }

if (beg < 0)
  {
myStepper.setSpeed(-beg);
myStepper.step(-dir);  
  }
 

  

}

Неактивний

#3 2015-12-09 20:54:36

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 878

Re: Нужен совет. Ардуино + энкодер + шаговый двигатель

gorenkov пише:

Правда не совсем понимаю как полностью отключать питание от двигателя когда он не крутится - а то он заметно греется. Может есть у кого-то идеи на этот счёт?

вы шаговик подключаете через драйвер.
вот на драйвере и отключайте питание во время простоя

Неактивний

#4 2015-12-09 20:58:11

gorenkov
Учасник
З Кіев
Зареєстрований: 2015-11-05
Повідомлень: 41

Re: Нужен совет. Ардуино + энкодер + шаговый двигатель

vvr пише:
gorenkov пише:

Правда не совсем понимаю как полностью отключать питание от двигателя когда он не крутится - а то он заметно греется. Может есть у кого-то идеи на этот счёт?

вы шаговик подключаете через драйвер.
вот на драйвере и отключайте питание во время простоя

Спасибо за ответ. прошу прощения, я не правильно выразился. Правильный вопрос - Как отключать питание программно ?

Неактивний

#5 2015-12-10 13:29:46

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 878

Re: Нужен совет. Ардуино + энкодер + шаговый двигатель

обычно на драйвере есть выход enable
вот его бросайте на пин дуни и вкл -выкл smile

Неактивний

#6 2015-12-10 15:47:05

gorenkov
Учасник
З Кіев
Зареєстрований: 2015-11-05
Повідомлень: 41

Re: Нужен совет. Ардуино + энкодер + шаговый двигатель

vvr пише:

обычно на драйвере есть выход enable
вот его бросайте на пин дуни и вкл -выкл smile

В документации к драйверу такого не было. Спасибо большое, буду экспериментировать. Бросать через отдельный резистор или можно использовать встроенный?

Неактивний

#7 2015-12-10 17:34:32

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 878

Re: Нужен совет. Ардуино + энкодер + шаговый двигатель

если бы вы вышли из подполья и указали каким драйвером пользуетесь - шанс получить поддержку значительно возрастает  smile

Неактивний

#8 2015-12-23 20:04:59

gorenkov
Учасник
З Кіев
Зареєстрований: 2015-11-05
Повідомлень: 41

Re: Нужен совет. Ардуино + энкодер + шаговый двигатель

vvr пише:

если бы вы вышли из подполья и указали каким драйвером пользуетесь - шанс получить поддержку значительно возрастает  smile

Прошу прощения, что не написал об оборудовании.

Шаговик - http://arduino-ua.com/prod531-Shagovii_ … -1004A_27V
Драйвер - http://arduino-ua.com/index.php?productID=527
Энкодер - http://arduino-ua.com/prod803-enkoder

Со скоростью и направлением вращения двигателя я разобрался. Не разобрался ещё в нескольких вопросах.
1. Не могу заставить при нажатии кнопки на энкодере, останавливать двигатель (а ещё лучше отключать питание на драйвере)
2. Текущий код/аппаратная реализация не свсегда идеально понимают вращение ручки энкодера.
3. Могу пальцами остановить вращение вала двигателя (хоть и с усилием), читал что правильно настроив двигатель его ОЧЕНЬ трудно остановить.

Но я пока большой новичёк в этом деле, поэтому не отчаиваюсь - надо только время! В интернете есть вся информация + форумы.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму