script werkt maar éénmaal na button press?
3 berichten
• Pagina 1 van 1
script werkt maar éénmaal na button press?
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:
k heb geen ervaring met switches dus waarschijnlijk is het iets eenvoudig wat ik over het hoofd zie
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
Re: script werkt maar éénmaal na button press?
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
shooter@home.nl
Re: script werkt maar éénmaal na button press?
Je fout zit waarschijnlijk in de volgende statements.
Static variabele worden maar 1 maal geset en in dit geval wil je waarschijnlijk als de functie move wordt gestart met de initiele waarden.
Verder kan op de code nog wel wat aanpassingen worden gemaakt die het beter en overzichtelijker maken.
Succes met je project.
- 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.
3 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 27 gasten