Ви не увійшли.
Здравствуйте,
Помогите советом с кодом. Хочу с помощью энкодера управлять скоростью вращения шагового двигателя. Получается только в одном направлении и то, пока 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);
}
Неактивний
Проблема решена, переписал скетч и всё работает. Правда не совсем понимаю как полностью отключать питание от двигателя когда он не крутится - а то он заметно греется. Может есть у кого-то идеи на этот счёт?
/*
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);
}
}
Неактивний
Правда не совсем понимаю как полностью отключать питание от двигателя когда он не крутится - а то он заметно греется. Может есть у кого-то идеи на этот счёт?
вы шаговик подключаете через драйвер.
вот на драйвере и отключайте питание во время простоя
Неактивний
gorenkov пише:Правда не совсем понимаю как полностью отключать питание от двигателя когда он не крутится - а то он заметно греется. Может есть у кого-то идеи на этот счёт?
вы шаговик подключаете через драйвер.
вот на драйвере и отключайте питание во время простоя
Спасибо за ответ. прошу прощения, я не правильно выразился. Правильный вопрос - Как отключать питание программно ?
Неактивний
обычно на драйвере есть выход enable
вот его бросайте на пин дуни и вкл -выкл
В документации к драйверу такого не было. Спасибо большое, буду экспериментировать. Бросать через отдельный резистор или можно использовать встроенный?
Неактивний
если бы вы вышли из подполья и указали каким драйвером пользуетесь - шанс получить поддержку значительно возрастает
Прошу прощения, что не написал об оборудовании.
Шаговик - 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. Могу пальцами остановить вращение вала двигателя (хоть и с усилием), читал что правильно настроив двигатель его ОЧЕНЬ трудно остановить.
Но я пока большой новичёк в этом деле, поэтому не отчаиваюсь - надо только время! В интернете есть вся информация + форумы.
Неактивний