script werkt maar éénmaal na button press?

Arduino specifieke Software
Berichten: 1
Geregistreerd: 02 Nov 2023, 19:50

script werkt maar éénmaal na button press?

Berichtdoor owi844 » 02 Nov 2023, 20:04

Hi

Voor een projectje loop ik tegen een vervelend probleem aan, hopelijk kan iemand me op weg helpen.

Ik probeer een motor (Nema17) van links naar rechts te laten lopen, waarbij limitswitches de richting moeten aanpassen.
Het aantal "loops" kan ik ingeven via een keypad. Geef ik 12# op, dan loopt hij dus 12 maal van links naar rechts (of omgekeerd).
Geef ik een nulwaarde op (met * of #) dan gaat hij zich links of rechts plaatsen aan de betreffende sensor.

Ik heb het script grotendeels werkende, maar het vervelende is, dat bij contact (limit switch) het script nadien niet meer wil werken.
bv ik geef 0* in, dan gaat hij homen naar links, wanneer klaar vraag de loop nieuwe input. Geef ik dan bv 0# in (waarbij hij naar rechts moet) dan doet hij niks meer. Reset ik de Arduino dan loopt het weer goed.

Vermoedelijk moet ik dus iets aanpassen ivm de waarde die ik uitlees van de switch maar geraak er niet aan uit :s

Hier mijn code:
Code: Alles selecteren
#include <Keypad.h>
#include <AccelStepper.h>

AccelStepper stepper1(AccelStepper::DRIVER, 11, 10);  //  Define the stepper and the pins it will use

#define  SPEED_PIN A0                                 //  Define Pot meter pin
#define  LEFT_PIN  A1                                 //  Define sensor pin
#define  RIGHT_PIN A2                                 //  Define sensor pin
#define  MAX_SPEED 500                                //  Define our maximum and minimum speed in steps per second (scale pot to these)
#define  MIN_SPEED 0.1
#define  RELAY_PIN A3                                 //  Define relay pin


const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] =
{
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};

byte colPins[COLS] = {3, 4, 5 };                      //  column pins
byte rowPins[ROWS] = {6, 7, 8, 9};                    //  row pins
/*  On keypad:
    4 2 6

    1 2 3   3 
    4 5 6   8
    7 8 9   7
    * 0 #   5

    or:
    1 = 3+4
    2 = 2+3
    3 = 3+6
    4 = 5+6
    5 = 2+8
    6 = 6+8
    7 = 4+7
    8 = 2+7
    9 = 6+7
    0 = 2+5
    * = 4+5
    # = 5+6

    Count from Left ro Right 1 2 3 4 5 6 7 8 9
*/

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

char key;
byte keyAsANumber;
boolean entryComplete;
unsigned int total = 0;

void setup()
{
  Serial.begin(115200);
  stepper1.setMaxSpeed(10000.0);            //  The only AccelStepper value we have to set here is the max speed, which is higher than we'll ever go
  stepper1.setEnablePin(12);                //  Enable Driver
  stepper1.setPinsInverted(false, false, true);
  pinMode(LEFT_PIN, INPUT_PULLUP);          //  Set up the two sensor inputs, with pullups
  pinMode(RIGHT_PIN, INPUT_PULLUP);
  pinMode(RELAY_PIN, OUTPUT);               //  Enable relay pin as output
  Serial.println("");
  Serial.println("Accepting key input now..");
}

void loop()
{
  entryComplete = false;                    //  Will be checked after reading a key
  readKeypad();                             //  Get a key if available
  if (entryComplete)                        //  Number entry is complete
  {
    Serial.print("Loops entered : ");
    Serial.println(total);

    if (total <1)                           //  Call homing function
    {
      homing(key);

    }else if (total >0){                    //  Call heater function
      homing(key);                          //  Homing, just to be sure
      digitalWrite(RELAY_PIN, HIGH);        //  Switch on relay
      Serial.println("Relay activated");
      move(key, total);              //  Start moving
      digitalWrite(RELAY_PIN, LOW);         //  Switch off relay
      Serial.println("Relay deactivated");

      }
    total = 0;                              //  reset the total on the keypad
    Serial.println("Ready for next action!");
  }
 
}


void readKeypad()
{
  key = keypad.getKey();
  if (key == '#' || key == '*')           //  user signal that entry has finished
  {
    entryComplete = true;                 //  flag completion
    Serial.println(key);
    Serial.println("entry is complete");
    return; //exit the function
  }
  if (key >= '0' && key <= '9')           //  only act on numeric keys
  {
    keyAsANumber = key - 48;
    total = total * 10;
    total = total + keyAsANumber;         //  add the new number
    Serial.println(keyAsANumber);
  }
}


void homing(char end_key){

  Serial.println("HOMING");
  static char while_1 = 0;                 //  Holds while loop value

  if (end_key == '*'){
    Serial.println("* Left");

    if (digitalRead(LEFT_PIN) == 0){
      Serial.println("Sensor triggered");
      stepper1.disableOutputs();

    }else{
      while (while_1 < 1){                 // Travel to home
        if (digitalRead(LEFT_PIN) == 0){
          Serial.println("");
          Serial.println("Sensor triggered");
          stepper1.disableOutputs();
          while_1 = 10;
        }
        else{
          Serial.print("<");
          stepper1.setSpeed(1 * 500);
          stepper1.enableOutputs();
          stepper1.runSpeed();
          while_1 = -1;
        }
        while_1++;
      }
    }
    // Maybe clear the sensor a bit?
  }

  else if (end_key == '#'){
    Serial.println("# Right");

    if (digitalRead(RIGHT_PIN) == 0){
      Serial.println("Sensor triggered");
      stepper1.disableOutputs();

    }else{
      while (while_1 < 1){                 // Travel to home
        if (digitalRead(RIGHT_PIN) == 0){
          Serial.println("");
          Serial.println("Sensor triggered");
          stepper1.disableOutputs();
          while_1 = 10;
        }
        else{
          Serial.print(">");
          stepper1.setSpeed(-1 * 500);
          stepper1.enableOutputs();
          stepper1.runSpeed();
          while_1 = -1;
        }
        while_1++;
      }
    }
    // Maybe clear the sensor a bit?
  }

  else{
    Serial.println("This option does not exist!");
  }

  Serial.println("Homing DONE");
}



void move(char end_key, char total_loops)
{
  static float current_speed_2 = 0.0;         //  Holds current motor speed in steps/second
  static int analog_read_counter_2 = -1000;    //  Counts down to 0 to fire analog read
  static int analog_value_2 = 0;              //  Holds raw analog value
  static char dir_2 = 0;                      //  Holds -1, 1 or 0 to turn the motor on/off and control direction
  static char while_2 = 0;                    //  Holds while loop value
  static char counted_loops = 0;              //  Holds count value from sensor trigger

  Serial.println("Calling funtion: MOVE");

  if (end_key == '*'){                          //  Set direction of travel
    Serial.print("End key: * :");
    Serial.println("Making a LEFT loop");
    dir_2 = -1;                                 // Need to move to --> then to <-- for 1 loop, so flip start direction!
    Serial.println("Direction set");

  }else if (end_key == '#'){                    //  Set direction of travel
    Serial.print("End key: # :");
    Serial.println("Making a RIGHT loop");
    dir_2 = 1;                                  // Need to move to <-- then to --> for 1 loop, so flip start direction!
    Serial.println("Direction set");

  }else{                                        //  Invalid scenario with 3x4 keypad
    Serial.println("End key: unknown");
    Serial.println("Going NOWHERE");
    dir_2 = 0;

  }

  Serial.println("Moving");
  while (while_2 < 1){                          //  Actually move the steppermotor
    Serial.print(".");

    if (digitalRead(LEFT_PIN) == 0){
      Serial.println("Sensor LEFT triggered, changing direction");
      dir_2 = -1;
      while_2 = -1;                             //  Stay in the while loop
      if (end_key == '*'){
        counted_loops = counted_loops+1;        //  Loop completed, add to loop count
      }

    }else if (digitalRead(RIGHT_PIN) == 0){
      Serial.println("Sensor RIGHT triggered, changing direction");
      dir_2 = 1;
      while_2 = -1;                             //  Stay in the while loop
      if (end_key == '#'){
        counted_loops = counted_loops+1;        //  Loop completed, add to loop count
      }
    }

    if (counted_loops == total_loops){          //  Check if we reached maximum loops
      Serial.println("Reached maximum loops, prepare stop");
      dir_2 = 0;
      while_2 = 10;
    }else{
      while_2 = -1;                             //  Stay in the while loop
    }

    if (analog_read_counter_2 < 0) {             //  Check if we need to adjust speed based on Pot meter
      analog_read_counter_2 = analog_read_counter_2+1;                   //  Decrease countdown counter
      stepper1.enableOutputs();
      stepper1.runSpeed();                       //  Give the stepper a chance to step if it needs to MIGHT NOT BE NEEDED
      current_speed_2 = dir_2 * (((analog_value_2/1023.0) * (MAX_SPEED - MIN_SPEED)) + MIN_SPEED); //  And scale the pot's value from min to max speeds
      stepper1.setSpeed(current_speed_2);        //  Update the stepper to run at this new speed

    }else{                                      //  Adjust speed based on Pot meter
      Serial.println("Adjust speed based Pot meter");
      analog_read_counter_2 = -1000;              //  Set countdown counter             
      analog_value_2 = analogRead(SPEED_PIN);    //  Now read the pot (from 0 to 1023)
      //stepper1.runSpeed();                       //  Give the stepper a chance to step if it needs to MIGHT NOT BE NEEDED
      current_speed_2 = dir_2 * (((analog_value_2/1023.0) * (MAX_SPEED - MIN_SPEED)) + MIN_SPEED); //  And scale the pot's value from min to max speeds
      stepper1.setSpeed(current_speed_2);        //  Update the stepper to run at this new speed
    }
    stepper1.enableOutputs();
    stepper1.runSpeed();
    while_2++;
  }

  Serial.println("Ending funtion: MOVE");
}


k heb geen ervaring met switches dus waarschijnlijk is het iets eenvoudig wat ik over het hoofd zie :)

Advertisement

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: script werkt maar éénmaal na button press?

Berichtdoor shooter » 03 Nov 2023, 11:01

ik zou eerst eens while_1 veranderen in bijv zolang dat maakt het beter leesbaar en het is niet slim om een gereserveerd woord in je variabelen te gebruiken net zoals dir_2 value_2, verder kun je misschien accelstepper gebruiken is lekker simpel en bekend terrein.
paul deelen
shooter@home.nl

Berichten: 80
Geregistreerd: 02 Nov 2022, 13:03

Re: script werkt maar éénmaal na button press?

Berichtdoor ThHe » 03 Nov 2023, 13:57

Je fout zit waarschijnlijk in de volgende statements.

Code: Alles selecteren
  static char dir_2 = 0;                      //  Holds -1, 1 or 0 to turn the motor on/off and control direction
  static char while_2 = 0;                    //  Holds while loop value
  static char counted_loops = 0;              //  Holds count value from sensor trigger


Static variabele worden maar 1 maal geset en in dit geval wil je waarschijnlijk als de functie move wordt gestart met de initiele waarden.

Code: Alles selecteren
char dir_2 = 0;                      //  Holds -1, 1 or 0 to turn the motor on/off and control direction
char while_2 = 0;                    //  Holds while loop value
char counted_loops = 0;              //  Holds count value from sensor trigger


Verder kan op de code nog wel wat aanpassingen worden gemaakt die het beter en overzichtelijker maken.
Succes met je project.

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: awaboyox en 100 gasten