Библиотека AccelStepper
- Войдите на сайт для отправки комментариев
Пнд, 18/02/2013 - 12:29
Код на основе 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 - шаговик вернулся в положение потенциометра с другой скоростью.
Добавил ещё кнопку. Перевод в сохранённое положение и положение потенциометра только при удержании кнопок. Как сделать, чтобы степпер заработал от одного клика - не могу придумать (опыта совсем маловато). С сервой работает, а здесь нет.
#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; } }Додавил, работает.