This is the MBED AccelStepper library. It provides an object-oriented interface for 2, 3 or 4 pin stepper motors. Based on the Arduino AccelStepper library by Airspayce.com Translated for MBED by Jaap Vermaas <jaap@tuxic.nl>, 03-2015

Dependencies:   mbed motorController2

main.cpp

Committer:
MatteusCarr
Date:
2020-04-08
Revision:
1:8707e26bf33d
Parent:
0:3bdd295c3b0e

File content as of revision 1:8707e26bf33d:

#include "mbed.h"
#include "AccelStepper.h"
#include <avr/wdt.h>

Serial pc(USBTX, USBRX);

//Pins
#define STP_PIN 4 // AnalogOut STP_PIN(nome do pino da placa) ##DESCOMENTAR ESSE BLOCO##
#define DIR_PIN 3 // AnalogOut DIR_PIN(nome do pino da placa)
#define ENA_PIN 2 // DigitalOut ENA_PIN(nome do pino da placa)
#define HOM_PIN 12 // DigitalIn HOM_PIN(nome do pino da placa)

//Max
#define MAX_ACCEL_mms2 500.0
#define MAX_SPEED_mms  75.0
#define MAX_POS_mm 100.0

//Stepper Motor parameters
#define STEPS_by_REV  400.0
#define mm_by_REV 25.0

//Home Parameters
#define HOME_SPEED_mms  10.0
#define HOME_INCREMENT_mm  1.0
#define HOME_PRESS_POSITION_mm  2.0

//Consts
const unsigned int MAX_ACCEL_STEPS2 = (MAX_ACCEL_mms2 *  STEPS_by_REV) / mm_by_REV;
unsigned int MAX_SPEED_STEPS = (MAX_SPEED_mms *  STEPS_by_REV) / mm_by_REV;
const unsigned int HOME_SPEED_STEPS = (HOME_SPEED_mms *  STEPS_by_REV) / mm_by_REV;
const unsigned int HOME_INCREMENT_STEP = (HOME_INCREMENT_mm  *  STEPS_by_REV) / mm_by_REV;
const unsigned int HOME_PRESS_POSITION_STEP = (HOME_PRESS_POSITION_mm  *  STEPS_by_REV) / mm_by_REV;

//vars
unsigned int MaxPos_step =  (MAX_POS_mm *  STEPS_by_REV) / mm_by_REV;
bool CycleOn = true;
bool HomeDone = false;

public void MotorGoHome(AccelStepper *stpr)
{
  int CurrentPos = 0;
  pc.printf("Finding Home...");
  stepper.setCurrentPosition(0);
  stepper.setMaxSpeed(HOME_SPEED_STEPS);
  while (digitalRead(HOM_PIN) == HIGH)
  {
    CurrentPos = CurrentPos - HOME_INCREMENT_STEP;
    stepper.runToNewPosition(CurrentPos);
  }
  stepper.setCurrentPosition(0);
  stepper.runToNewPosition(HOME_PRESS_POSITION_STEP);
  stepper.setCurrentPosition(0);
  HomeDone = true;
  pc.printf("Finding Home...");
}

public void setup(AccelStepper *stpr)
{
  pc.baud(250000) descomentar se tiver certo
  //pinMode(10  , OUTPUT); ###OS COMENTÁRIOS ABAIXO SÃO PRA APAGAR ESSAS DECLARAÇÕES (SÓ FAZEM SENTIDO EM ARDUINO)
  //pinMode(STP_PIN  , OUTPUT);
  //pinMode(DIR_PIN    , OUTPUT);
  //pinMode(ENA_PIN    , OUTPUT);
  DigitalWrite(ENA_PIN , HIGH); 
  stepper.setMaxSpeed(MAX_SPEED_STEPS);
  stepper.setAcceleration(MAX_ACCEL_STEPS2);
  MotorGoHome(&stpr);
  stepper.setMaxSpeed(MAX_SPEED_STEPS);
  stepper.setAcceleration(MAX_ACCEL_STEPS2);
  wdt_enable(WDTO_2S);
}

int main(){
    
    AccelStepper stepper(AccelStepper::DRIVER, STP_PIN, DIR_PIN );
    
    setup(&stepper);
    
    while(1){
        wdt_reset();
        if (CycleOn)
        {
            if (stepper.currentPosition() == 0)
            {
                delay(500);
                stepper.moveTo(MaxPos_step);
            }
            else if (stepper.currentPosition() == MaxPos_step)
            {
                delay(500);
                stepper.moveTo(0);
            }
        }
        analogWrite(10, map(stepper.currentPosition(), 0, MaxPos_step, 0, 250));
        stepper.run();
        if((digitalRead(HOM_PIN) == LOW) && (HomeDone)) while(1);

        if (pc.readable())
        {
            char Option = pc.getc();
            if (Option == 'P')
            {
                float NewPos = Serial.parseFloat();
                stepper.moveTo((NewPos *  STEPS_by_REV) / mm_by_REV);
            }
            else if (Option == 'C')
            {
                CycleOn = !CycleOn ;
            }
            else if (Option == 'S')
            {
                float NewSpeed= Serial.parseFloat(); //pc.??
                stepper.setMaxSpeed((NewSpeed *  STEPS_by_REV) / mm_by_REV);
            }
            else if (Option == 'H')
            {
                MotorGoHome(&stepper);
            }
        }         
    }
    return 0;    
}