Sida 1 av 2

Hitta stegmotors nollpunkt med en switch

Postat: 28 november 2012, 13:18:27
av Karlsson25
Tjenare!
Jag håller på med ett projekt där jag ska ha en stegmotor som driver en "vagn" på en räls (likt en cnc) med Arduino. Nu har jag kommit till de steget där jag vill att vagnen ska gå till ett läge där den aktiverar en switch eller knapp innan den börjar utföra de ursprungliga koden. Alltså att den ska gå till sin nollpunkt.

Detta är koden jag jobbar med:

Kod: Markera allt

#include <AccelStepper.h>


AccelStepper stepper(1, 49, 47);

int switchPin = 33;

boolean lastButton = LOW;
boolean currentButton = LOW;
boolean ledOn = false;

void setup()
{
  pinMode(switchPin, INPUT);
  
  stepper.setMaxSpeed(200.0);
    stepper.setAcceleration(100.0);
}

boolean debounce(boolean last)
{
  boolean current = digitalRead(switchPin);
  if (last != current)
  {
    delay(5);
    current = digitalRead(switchPin);
  }
  return current;
}

void loop()
{
  currentButton = debounce(lastButton);
  if (lastButton == LOW && currentButton == HIGH)
  {
    delay(1000);
    stepper.runToNewPosition(0);
    stepper.runToNewPosition(500);
    stepper.runToNewPosition(100);
    stepper.runToNewPosition(120);
  }
  


}

 
Problemet jag har är att jag inte vet hur jag ska programera den så att stegmotorn tar ett steg "bakåt" hela tiden tills kanppen trycks.

Re: Hitta stegmotors nollpunkt med en switch

Postat: 28 november 2012, 15:00:17
av Helgesson
http://www.open.com.au/mikem/arduino/Ac ... index.html

http://www.open.com.au/mikem/arduino/Ac ... ource.html

Arduino är inte riktigt min grej men efter att ha kollat lite på länkarna ovan så borde nedanstående kod kanske ge en liten fingervisning i rätt riktning?

Kod: Markera allt

#include <AccelStepper.h>
   stepper.setMaxSpeed(200);
 
//Startar nollning
   stepper.setSpeed(-50);
      while(limitswitch==0){ //medans limitswitchen ligger låg, dvs ej aktiverad
         stepper.runSpeed(); //så Uppdaterar vi runSpeed() som behöver uppdateras 
      }                      //så ofta som möjligt då det är den som genererar stegen.

   stepper.setSpeed(0);
   stepper.setCurrentPosition(0); //sätter nuvarande position som nolla.

//Nollad/Hemma



Re: Hitta stegmotors nollpunkt med en switch

Postat: 28 november 2012, 17:39:51
av Karlsson25
Tack så mycket, men får tyvärr inte ihop de :doh:

Re: Hitta stegmotors nollpunkt med en switch

Postat: 28 november 2012, 17:43:17
av Helgesson
1.Vad får du inte ihop?

2.Vad funkar och vad funkar inte?

3.Har du fått motorn att röra sig?

4.Funkar positioneringen på motorern?

Re: Hitta stegmotors nollpunkt med en switch

Postat: 28 november 2012, 18:12:54
av Karlsson25
Motorn fungerar och jag har fått den att röra sig till önskade destinationer i följd.

Det är mina kunskaper inom programmering som ställer till det. Jag vet inte vart jag ska skriva t.ex.

Kod: Markera allt

 stepper.setSpeed(-50);
      while(limitswitch==0){ //medans limitswitchen ligger låg, dvs ej aktiverad
         stepper.runSpeed(); //så Uppdaterar vi runSpeed() som behöver uppdateras 
      }                      //så ofta som möjligt då det är den som genererar stegen.

   stepper.setSpeed(0);
   stepper.setCurrentPosition(0); //sätter nuvarande position som nolla. 


Alltså jag har ingen aning om hur jag ska bemöta problemet. Men motorn är funktionell.

Re: Hitta stegmotors nollpunkt med en switch

Postat: 28 november 2012, 18:19:40
av Icecap
Det är bara att tänka till lite...

När programmet startar ska det:
1: Initiera portar och pinnar och allt sånt.
2: Nolla stegmotorn.
3: Köra programmet vidare, den delen man brukar kalla "main loop"

Sedan är det ett problem med den kodsnudd du har fått! Om stegmotorn redan är på noll är det inte till att svara på om den är över noll eller inte så rent teknisk ska det finnas en punkt 2A som kollar om nollpunkten är påverkat, är den det ska stegmotorn köra framåt till den släpper och sedan ska steg 2B köra den tillbaka till det passar.

Re: Hitta stegmotors nollpunkt med en switch

Postat: 28 november 2012, 18:25:02
av Karlsson25
Min tanke var att en knapp ska finnas på sidan utav rälsen så när motorn är i position 0 så är knappen intryckt. Borde inte det fungera istället för 2A och 2B?

Re: Hitta stegmotors nollpunkt med en switch

Postat: 28 november 2012, 18:35:46
av Helgesson
Icecap:
Jo självklart finns det rum för förbättring och ökad säkerhet, var bara ett litet exempel.
menar du inte

Kod: Markera allt

Main()
{
     Initiera portar o sånt;
     Nollar motor;
          Loopar{
              Pollar knappen och uppdaterar positionen för stegmotorn
          }
}
Avsaknaden av main() är ju som sagt lite problematiskt, ser heller inte nånstanns där setup() anropas så den koden som står i den funktionen har jag svårt att förstå hur den kan göra nån nytta.

Vad har du för krav på nogranhet på nollningen?
Att nolla rakt mot en knapp brukar inte vara nån höjdare, bättre med en microswitch med en arm på så att brytaren inte går sönder om vagnen inte hinner stanna direkt. Ungefär som bilden http://www.micro-machine-shop.com/Taig_ ... imit_5.jpg

Re: Hitta stegmotors nollpunkt med en switch

Postat: 28 november 2012, 18:48:44
av Karlsson25
Jag är tacksam för alla tips! :)
Och det är en sådan switch jag ska använda, just nu har ja motorn på bordet och försöker bara få ihop de med prgrammeringen.

Kod: Markera allt

#include <AccelStepper.h>
   int limitswitch = 33;
   AccelStepper stepper(1, 49, 47);
   boolean lastButton = LOW;
boolean currentButton = LOW;


//Startar nollning
void setup()
{
  stepper.setMaxSpeed(390);
  stepper.setAcceleration(200);
  pinMode(limitswitch, INPUT);
  
   stepper.setSpeed(-50);
      while(lastButton == LOW && currentButton == LOW){ //medans limitswitchen ligger låg, dvs ej aktiverad
         stepper.runSpeed(); //så Uppdaterar vi runSpeed() som behöver uppdateras 
      }                      //så ofta som möjligt då det är den som genererar stegen.

   stepper.setSpeed(0);
   stepper.setCurrentPosition(0); //sätter nuvarande position som nolla.
}
   boolean debounce(boolean last)
{
  boolean current = digitalRead(limitswitch);
  if (last != current)
  {
    delay(5);
    current = digitalRead(limitswitch);
  }
  return current;
}

void loop() 
{
  
  currentButton = debounce(lastButton);
  if (lastButton == LOW && currentButton == HIGH)
  {
    delay (1000);
   
    stepper.runToNewPosition(0);
    stepper.runToNewPosition(500);
    stepper.runToNewPosition(100);
    stepper.runToNewPosition(120);
    stepper.run();
  }
 

}

//Nollad/Hemm
Denna har jag provat nu, och jag har fått den att vandra mot "bakåt", men det händer inget när jag trycker på knappen..

Re: Hitta stegmotors nollpunkt med en switch

Postat: 28 november 2012, 19:00:52
av Helgesson
Vad är "lastbutton" och "currentbutton"?
Pröva att enbart använda en knapp till en början och se om det funkar. Hur har du kopplat knappen?

Re: Hitta stegmotors nollpunkt med en switch

Postat: 28 november 2012, 19:10:39
av Karlsson25
Om jag bara kör på att läsa knappen (HIGH och LOW) så händer ingenting. lastbutton och currentbutton är för att läsa av när knappen blir tryckt, så att inte knappen behöver vara intryckt.
Den är kopplad som vanligt tror jag. Ena "benet" till + och de andra till minus och pin 33.

Re: Hitta stegmotors nollpunkt med en switch

Postat: 28 november 2012, 19:28:00
av Icecap
Och pull-down motståndets värde?

Re: Hitta stegmotors nollpunkt med en switch

Postat: 28 november 2012, 19:32:53
av Karlsson25
10 k

Re: Hitta stegmotors nollpunkt med en switch

Postat: 29 november 2012, 10:45:25
av TobiasEinarsson
Du läser aldrig av knappen i setup(). Du kollar bara om variablerna lastButton och currentButton är LOW, vilket de alltid kommer att vara (de ändras först i loop()).

Se först och främst till att du kan läsa av knappens värde ordentligt innan du börjar med debounce-kod och liknande. Jag tror nog inte att debounce ska behövas alls i det här fallet när jag tänker efter, det är nog snarare en nackdel att köra med det (motorn kommer att köra minst 5 millisekunder "för långt").

Re: Hitta stegmotors nollpunkt med en switch

Postat: 29 november 2012, 15:30:40
av Karlsson25
Det förklara en del, men som nybörjare inom programmering så är de fortfarande lite oklart, du skulle inte kunna skriva ett enkelt exempel på hur du menar?