Библиотека AccelStepper

vvadim
Offline
Зарегистрирован: 23.05.2012

Код на основе ProportionalControl из библиотеки AccelStepper. 

Кнопка 1 сохраняет положени.

Кнопка 2 возвращает в сохранённое положение.

Кнопка 3 переводит в положение потенциометра.

Скорость переводов при нажатии кнопок 2 и 3 разная.





#include <Bounce.h>
#include <EEPROM.h>
#include <AccelStepper.h>

AccelStepper stepper(1, 9, 10);
int button1Pin = 17;             
int button2Pin = 18;
int button3Pin = 19;
Bounce bouncer1 = Bounce( button1Pin,5 );
Bounce bouncer2 = Bounce( button2Pin,5 );
Bounce bouncer3 = Bounce( button3Pin,5 );
int value1;
int value2;
int value3;
int inputMode = 1;
int potpin = 0;
int valPot;
int val1;

void setup()
{
  pinMode(button1Pin, INPUT);   
  pinMode(button2Pin, INPUT);
  pinMode(button3Pin, INPUT);
}
void loop()
{
  if(inputMode) {
    valPot = analogRead(potpin);           
    valPot = map(valPot, 0, 1024, 0, 530);
    stepper.setMaxSpeed(3000);
    stepper.moveTo(valPot);
    stepper.setSpeed(2500);
    stepper.runSpeedToPosition();
  }
  bouncer1.update ( );
  value1 = bouncer1.read();
  if(value1 == HIGH) {
    byte *x1 = (byte *)&valPot;      
    EEPROM.write(10, x1[0]);
    EEPROM.write(11, x1[1]); 
    delay(15);
  }
  bouncer2.update ( );
  value2 = bouncer2.read();  
  if(value2 == HIGH ) {
    inputMode=0;
    byte xx1[] = {
      EEPROM.read(10), EEPROM.read(11)     };
    int *y1 = (int *)&xx1;
    val1 = y1[0];
    stepper.setMaxSpeed(300);
    stepper.moveTo(val1);
    stepper.setSpeed(300);
    stepper.runSpeedToPosition();
  } 
  bouncer3.update ( );
  value3 = bouncer3.read(); 
  if(value3 == HIGH) {
    inputMode=0; 
    byte xx1[] = {
      EEPROM.read(10), EEPROM.read(11)     };
    int *y1 = (int *)&xx1;
    val1 = y1[0]; 
    stepper.setMaxSpeed(300);
    stepper.moveTo(valPot);
    stepper.setSpeed(100);
    stepper.runSpeedToPosition(); 
    inputMode=1;
  }
}

Возвращение в сохранённое положение происходит медленно , но только при удержании кнопки 2.

Перевод в положение потенциометра происходит при клике кнопки 3, но мгновенно.

Нужно так - нажал кнопку 2- шаговик перешёл в положение val1 с определённой скоростью, нажал кнопку 3 - шаговик вернулся в положение потенциометра с другой скоростью.

 

 

 

vvadim
Offline
Зарегистрирован: 23.05.2012

Добавил ещё кнопку. Перевод в сохранённое положение и положение потенциометра только при удержании кнопок. Как сделать, чтобы степпер заработал от одного клика  - не могу придумать (опыта совсем маловато).  С сервой работает, а здесь нет. 



#include <Bounce.h>
#include <EEPROM.h>
#include <AccelStepper.h>

AccelStepper stepper(1, 9, 10);
int button1Pin = 17;             
int button2Pin = 18;
int button3Pin = 19;
int button4Pin = 16;
Bounce bouncer1 = Bounce( button1Pin,5 );
Bounce bouncer2 = Bounce( button2Pin,5 );
Bounce bouncer3 = Bounce( button3Pin,5 );
Bounce bouncer4 = Bounce( button4Pin,5 );
int value1;
int value2;
int value3;
int value4;
int inputMode = 1;
int potpin = 0;
int valPot;
int val1;

void setup()
{  
  pinMode(button1Pin, INPUT);   
  pinMode(button2Pin, INPUT);
  pinMode(button3Pin, INPUT);
  pinMode(button4Pin, INPUT);
}
void loop()
{
  if(inputMode) {
    valPot = analogRead(potpin);           
    valPot = map(valPot, 0, 1024, 0, 530);
    stepper.setMaxSpeed(3000);
    stepper.moveTo(valPot);
    stepper.setSpeed(2500);
    stepper.runSpeedToPosition();
  }
  bouncer1.update ( );
  value1 = bouncer1.read();
  if(value1 == HIGH) {
    byte *x1 = (byte *)&valPot;      
    EEPROM.write(10, x1[0]);
    EEPROM.write(11, x1[1]); 
    delay(15);
  }
  bouncer2.update ( );
  value2 = bouncer2.read();  
  if(value2 == HIGH ) {
    inputMode=0;
    byte xx1[] = {
      EEPROM.read(10), EEPROM.read(11)     };
    int *y1 = (int *)&xx1;
    val1 = y1[0];
    stepper.setMaxSpeed(300);
    stepper.moveTo(val1);
    stepper.setSpeed(300);
    stepper.runSpeedToPosition();
  } 
  bouncer3.update ( );
  value3 = bouncer3.read(); 
  if(value3 == HIGH) {
    inputMode=0; 
    byte xx1[] = {
      EEPROM.read(10), EEPROM.read(11)     };
    int *y1 = (int *)&xx1;
    val1 = y1[0]; 
    stepper.setMaxSpeed(200);
    stepper.moveTo(valPot);
    stepper.setSpeed(100);
    stepper.runSpeedToPosition(); 
  }
  bouncer4.update ( );
  value4 = bouncer4.read(); 
  if(value4 == HIGH) {
    inputMode=1;
  }
}

 

vvadim
Offline
Зарегистрирован: 23.05.2012

Додавил,  работает.