Помогите, ребятки, со скетчем.
- Войдите на сайт для отправки комментариев
Всем доброго времени суток. Суть проектика такова двухкоординатную систему, состоящую из двух шаговиков http://www.clever.ru/viewcat.php?section=&subsection=&vendor=&article=1724 подключить к ардуино через драйвер http://www.cncshop.cz/PDF/M880A.pdf, таким образом, чтобы первый блок(позиционный), устанавливать с помощью энкодера на определённый угол, а второй блок одним и тем же энкодером при переключении кнопки/тумблера можно было перемещать на определённый угол(так же как первый) либо во втором режиме менять энкодером скорость его вращения, ну и соответственно всё это должно отображаться на дисплее. Пока я застряла на реализации одновременного вращения ручки энкодера и поворота блока 1 на определённый угол. Думаю, это не сложно, но от программирования далека. Пользуюсь в основном готовыми скетчами и вот, что у меня есть.
#define pulPin 8
#define dirPin 9
#define numMsInOneSec 10
#define numMicroSecInOneMs 100
#define stepPulseWidthInMicroSec 2
#define setupTimeInMicroSec 1
#define inputBufferSize 128
#include <LiquidCrystal.h>
int serialCharIn;
char serialInString[inputBufferSize];
int serialInIndex = 0;
int sensorValue = 1;
int value = 1; // поворот, начинаем с половины(энкодер)
int fadeAmount = 10; // шаг изменения(энкодер)
unsigned long timeBetweenInputPollsInMicroSec = ( (unsigned long)(numMsInOneSec /4) * numMicroSecInOneMs ); // 250 = 1/4th of a second
unsigned long timeBetweenStepsInMicroSec = (1 * numMicroSecInOneMs);
unsigned long loopCheck = 0;
boolean lineReady = false;
boolean successfullyParsed = false;
boolean currentDirection = false;
boolean shouldStep = true;
boolean speedChanged = true;
unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 12; // pin 12
const int pin_B = 11; // pin 11
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
void setCurrentDirection(boolean dir)
{
if(dir == false)
{
digitalWrite(dirPin, LOW);
} else {
digitalWrite(dirPin, HIGH);
}
currentDirection = dir;
delayMicroseconds(setupTimeInMicroSec);//задержка
}
void changeDirection()
{
setCurrentDirection(!currentDirection);
}
void takeSinglePul()
{
digitalWrite(pulPin, LOW);
delayMicroseconds(stepPulseWidthInMicroSec);
digitalWrite(pulPin, HIGH);
delayMicroseconds(stepPulseWidthInMicroSec);
digitalWrite(pulPin, LOW);
}
void setup()
{
// We set the enable pin to be an output
pinMode(pulPin, OUTPUT);
pinMode(dirPin, OUTPUT);
// get into a known state.
//enableStepper(false);
// we set the direction pin in an arbitrary direction.
setCurrentDirection(false);
//setHalfStep();
setCurrentDirection(true);
lcd.begin(16, 2);
// sensorValue=analogRead(sensorPin);
pinMode(9, OUTPUT); // устанавливаем pin 9 как выход
pinMode(pin_A, INPUT);
pinMode(pin_B, INPUT);
currentTime = millis();
loopTime = currentTime; }
void loop()
{
//timeBetweenStepsInMicroSec = (analogRead(sensorPin)+100)* numMicroSecInOneMs/2;
// stop the program for <sensorValue> milliseconds:
//delayMicroseconds(sensorValue);
//{
// sensorValue=analogRead(sensorPin);
//}
timeBetweenStepsInMicroSec= ((sensorValue/3)+100)*(numMicroSecInOneMs);;
int j;
int loops, ramp;
int rampspeed=4; // bigger numbers = quicker ramp
for(j=0; j<10; j++) {
takeSinglePul();
delayMicroseconds(timeBetweenStepsInMicroSec);
}
lcd.setCursor(0, 1);
lcd.print(timeBetweenStepsInMicroSec/10);
lcd.print(" ");
{
currentTime = millis();
if(currentTime >= (loopTime + 5)){ // проверяем каждые 5мс (200 Гц)
encoder_A = digitalRead(pin_A); // считываем состояние выхода А энкодера
encoder_B = digitalRead(pin_B); // считываем состояние выхода А энкодера
if((!encoder_A) && (encoder_A_prev)){ // если состояние изменилось с положительного к нулю
if(encoder_B) { // выход В в полож. сост., значит вращение по часовой стрелке
// увеличиваем яркость, не более чем до 255
if(value + fadeAmount <= 255) value += fadeAmount; }
else { // выход В в 0 сост., значит вращение против часовой стрелки
// уменьшаем яркость, но не ниже 0
if(value - fadeAmount >= 0) value -= fadeAmount; }
}
encoder_A_prev = encoder_A; // сохраняем значение А для следующего цикла
analogWrite(9, value); // устанавливаем скорость на 9 ножку
loopTime = currentTime; }
}
В общем, с подключением кнопок, вывода на дисплей и с тем как заставить двигатель вращаться у меня нет проблем. А вот с энкодером и с тем как заставить двигатель перемещаться на 10 град. соосно с вращением ручки экодера это да. Подскажите чего-нибудь пожалуйста. Может ссылочки какие на подобные проектике. Буду вам очень признательна.
P.S. Для подключения энкодера пользовалась вот этой темой http://arduino.ru/forum/apparatnye-voprosy/ispolzuem-enkoder. Про дребезг не особо уловила в комментах, поэтому просто воспользовалась конденсатором.
http://forum.arduino.cc/index.php?topic=177371.0
Спасибо. Сейчас буду разбираться.