Помогите, ребятки, со скетчем.

morya_4ka
morya_4ka аватар
Offline
Зарегистрирован: 28.05.2012

Всем доброго времени суток. Суть проектика такова двухкоординатную систему, состоящую из двух шаговиков 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. Про дребезг не особо уловила в комментах, поэтому просто воспользовалась конденсатором.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013
morya_4ka
morya_4ka аватар
Offline
Зарегистрирован: 28.05.2012

Спасибо. Сейчас буду разбираться.