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