2013-07-01 2 views
1

Итак, я немного поработал с моим шаговым двигателем и датчиком моей кнопки (я хочу, чтобы двигатель остановился при нажатии кнопки , которые я по большей части выяснил). Однако, чтобы упростить мой код, мне удалось заставить мой мотор вообще перестать двигаться. В приведенном ниже коде идея заключалась в том, чтобы сконденсировать основные действия двигателя (поднять платформу до стекла, сфотографировать, затем опустить назад и повторить процесс), сместив большинство действий в пределах одного если утверждение так, что компьютер будет лучше стрелять, читая его так, как я предполагал.Я не могу заставить мой шаговый двигатель работать через петлю, которую я построил для нее

#include <AccelStepper.h> 
const int buttonPin=4; //number of the pushbutton pin 
const int opto_shoot=2; // Pin that controls the shoot function 
int maxDistance=-12000; //intial distance for motor to move 
int button_state=0; 
int sensorPin=0; //select input pin for the photocell 
int sensorValue=0; //variable to store the vaule coming from the photocell 
int motorSpeed = 9600; //maximum steps per second (about 3rps/at 16 microsteps) 
int motorAccel = 80000; //steps/second/second to accelerate 
int motorDirPin = 8; //digital pin 8 
int motorStepPin = 9; //digital pin 9 


//set up the accelStepper intance 
//the "1" tells it we are using a driver 
AccelStepper stepper(1, motorStepPin, motorDirPin); 


void setup(){ 
    pinMode(buttonPin,INPUT); //set that the button is an input 
    pinMode(opto_shoot,OUTPUT); // set the pin that controls the shoot function 
    stepper.setMaxSpeed(motorSpeed); 
    stepper.setSpeed(motorSpeed); 
    stepper.setAcceleration(motorAccel); 

} 

void loop(){ 
    stepper.moveTo(maxDistance); //move 2000 steps (gets close to the top) 
    stepper.run(); 
    if (digitalRead(buttonPin) == HIGH){ 
     stepper.stop(); 
     stepper.runToPosition(); 
     digitalWrite(opto_shoot,HIGH); //SHOOT 
     delay(500); 
     digitalWrite(opto_shoot,LOW); 
     delay(1); 
     goto Lower; } 
//  for(int i=0;i<36;i++) 
//  Serial.read(); 
// 
     else{ 
    if(stepper.distanceToGo() == 0){ 
    stepper.stop(); 
    stepper.runToPosition(); 
    stepper.moveTo(maxDistance); 
    } 
    } 
    Lower:{ 
    maxDistance=-1*(maxDistance+500); 
     stepper.moveTo(maxDistance);} 
    //these must be called as often as possible to ensure smooth operation 
    //any delay will cause jerky motion 
    stepper.run(); 
} 

Пожалуйста, помогите мне понять, где я поступил неправильно с этим кодом.

ответ

1

Одна вещь, которую я бы изменил, это использовать прерывание для цифрового вывода. Сейчас у меня нет моего Arduino, но я считаю, что метод attachInterrupt будет работать. Это позволит вам запустить блок кода только тогда, когда произойдет определенное событие (т. Е. Нажата кнопка).

int isPressed = 0; // Init to off state 
// Other init stuff goes here. 

void setup(){ 
    // Other setup code... 

    // Set up the interrupt so that when the button is pressed, myISR function 
    // runs. I opted to run it on the rising edge (i.e. low to high). 
    attachInterrupt(buttonPin, myISR, RISING); 
} 

void loop(){ 
    // Check the state of isPressed. 
    if (isPressed == 0){ 
     // Do stuff, let the motor move. 
    } 
    else{ 
     // This runs when the button has been pressed. 
     // Turn off the flag so this runs just once. 
     isPressed = 0; 

     // Then stop the motor until further notice. 
     stepper.stop(); 
     stepper.runToPosition(); 

     // Do other stuff now that it's off. 
    } 
} 

// ISR = interrupt service routine 
void myISR() { 
    // Set the state of isPressed to ON. 
    isPressed = 1; 
} 

Кроме того, может быть, вы хотите, чтобы включить двигатель снова? Поэтому просто настройте еще один ISR, возможно, attachInterrupt(anotherButtonPin, anotherISR, RISING);, который будет звонить anotherISR, когда anotherButtonPin удерживается (т. Е. Контакт отличается от него, чтобы отключить его).

Вот простой example, который останавливает двигатель, и here являются документами прерываний.

Наконец, у вас есть что-то работающее после запроса your other question? Я предлагаю сохранить ваш сломанный код отдельно и вернуться к тому, что сработало. Попытайтесь понять, что другое. Другое предложение было бы создать простейший код, который останавливает движущийся двигатель, скажем, через некоторое время. Затем попробуйте интегрировать прерывание так, чтобы оно управляло остановкой двигателя вместо этого. Удачи!


EDIT: Я также заметил, что вы используете goto Lower;, а не делать Lower функции и назвав его как Lower();. Команда goto обычно считается плохой практикой. См. GOTO still considered harmful? для более подробной информации.

+1

и еще один +1 для 'goto' bashing! :-) – zmo

+0

@zmo спасибо, я чувствовал себя вынужденным обратиться к нему. – gary

+0

Да, мне было очень плохо, когда я использовал его самостоятельно, но я работал с другим программистом, и он предложил это как взломать то, что я делал. Работая в cahoots с другим моим другом-программистом, код в настоящее время базируется в основном вокруг функций и, похоже, в основном делает то, что я хочу. Спасибо за вашу помощь! Я должен буду заплатить за это и постараюсь больше помочь моим коллегам-программистам в будущем. – MikePinnell

Смежные вопросы