Problemen met aansturen stappenmotor


Dat alles klinkt wel een beetje vreemd, zeker dat je voeding eruit klapt. Nu is een originele DM856 van Leadshine en jij hebt een goedkopere van ACT motors.
Mischien is die driver gewoon niet goed.
probeer ook eens die driver op 8x microstappen te zetten dus
sw 5-8 op off-off-on-on.

Ik kan de motor wel laten draaien.. Maar dan op lagere snelheid. In principe is dat goed voor mijn toepassing, aangezien deze maar 45rpm hoeft te draaien. Dat werkt wel. Alleen hogere snelheden, dan gaat hij de fout in. Maar ik wil voor mezelf ook de mogelijkheid bieden om sneller te kunnen draaien. Vandaar deze test en vragen.

Op 11 november 2020 12:24:24 schreef floppy:
Dat alles klinkt wel een beetje vreemd, zeker dat je voeding eruit klapt. Nu is een originele DM856 van Leadshine en jij hebt een goedkopere van ACT motors.
Mischien is die driver gewoon niet goed.
probeer ook eens die driver op 8x microstappen te zetten dus
sw 5-8 op off-off-on-on.

Ik heb de driver via Reichelt besteld. Geen idee of er veel verschillen zitten in de door jou genoemde.
Ik zal eens testen met 8x micorsteps

Lambiek

Special Member

Op 11 november 2020 12:28:28 schreef Ricotjuh:
Ik kan de motor wel laten draaien.. Maar dan op lagere snelheid. In principe is dat goed voor mijn toepassing, aangezien deze maar 45rpm hoeft te draaien. Dat werkt wel.

Waar heb je de stroom op staan?

Alleen hogere snelheden, dan gaat hij de fout in. Maar ik wil voor mezelf ook de mogelijkheid bieden om sneller te kunnen draaien. Vandaar deze test en vragen.

Voor een hogere snelheid moet de spanning ook omhoog, dan is die 24VDC niet genoeg denk.

Je voeding moet in ieder geval zwaar genoeg zijn, dus ik snap niet waarom je voeding uitschakelt in het filmpje. Je driver zou eerder een fout moeten geven dan je voeding. Nu is het wel zo dat een geschakelde voeding een hekel heeft aan inductieve belastingen.

Heb je nog extra weerstanden tussen je Arduino en driver?

Als je haar maar goed zit, GROETEN LAMBIEK.

Op 11 november 2020 12:24:24 schreef floppy:
Dat alles klinkt wel een beetje vreemd, zeker dat je voeding eruit klapt. Nu is een originele DM856 van Leadshine en jij hebt een goedkopere van ACT motors.
Mischien is die driver gewoon niet goed.
probeer ook eens die driver op 8x microstappen te zetten dus
sw 5-8 op off-off-on-on.

Ik heb de driver ingesteld op 8x microstappen zoals je hebt aangegeven. Dan werkt hij wel.
Ik heb ook getest met 4x microstappen. Dus on-off-on-on. Dit gaat ook goed.
Maar zodra ik de volgende stap maak, dus vanaf 400 pulse/rev dan gaat het fout. Dan draait de motor niet of niet goed rond.
Bij 200 stappen schakelt de voeding uit zoals al eerder is gezien.

Op 11 november 2020 13:17:49 schreef Lambiek:
[...]
Waar heb je de stroom op staan?

[...]
Voor een hogere snelheid moet de spanning ook omhoog, dan is die 24VDC niet genoeg denk.

Je voeding moet in ieder geval zwaar genoeg zijn, dus ik snap niet waarom je voeding uitschakelt in het filmpje. Je driver zou eerder een fout moeten geven dan je voeding. Nu is het wel zo dat een geschakelde voeding een hekel heeft aan inductieve belastingen.

Heb je nog extra weerstanden tussen je Arduino en driver?

Wat bedoel je precies met, waar heb je de stroom op staan? Bedoel je van de driver? Deze staat op 5.6A. De hoogste stap.

Verder zitten er geen weerstanden tussen de driver en de uitgangen van de arduino.

Lambiek

Special Member

Op 11 november 2020 16:31:59 schreef Ricotjuh:
Wat bedoel je precies met, waar heb je de stroom op staan? Bedoel je van de driver? Deze staat op 5.6A. De hoogste stap.

Zet die eerst maar eens een stukje terug, die hoeft niet op de hoogste stand te staan.

Zet hem voorlopig maar eens op 3.8A.
SW1 = OF
SW2 = OF
SW3 = ON

Als je haar maar goed zit, GROETEN LAMBIEK.

Op 11 november 2020 16:39:02 schreef Lambiek:
[...]
Zet die eerst maar eens een stukje terug, die hoeft niet op de hoogste stand te staan.

Hoe weet ik normaliter dan hoog ik dit moet instellen als de datasheet van de motor dit aangeeft:

Lambiek

Special Member

Op 11 november 2020 16:46:22 schreef Ricotjuh:
Hoe weet ik normaliter dan hoog ik dit moet instellen als de datasheet van de motor dit aangeeft:

Dat is de max stroom die de motor trekt, maar dat heb je waarschijnlijk niet nodig. Als je echt het hele koppel wil benutten moet je ook met de spanning omhoog, ook voor een hoger toerental.

Je driver is eigenlijk ook aan de lichte kant voor deze motor.

Ik had nog iets toe gevoegd in mijn vorige post, daar staat hoe je de dip switch in moet stellen voor de stroom.

Wat ga je eigenlijk doen met je motor en driver?

Als je haar maar goed zit, GROETEN LAMBIEK.

Op 11 november 2020 16:29:00 schreef Ricotjuh:
Ik heb de driver ingesteld op 8x microstappen zoals je hebt aangegeven. Dan werkt hij wel.
Ik heb ook getest met 4x microstappen. Dus on-off-on-on. Dit gaat ook goed.
Maar zodra ik de volgende stap maak, dus vanaf 400 pulse/rev dan gaat het fout. Dan draait de motor niet of niet goed rond.
Bij 200 stappen schakelt de voeding uit zoals al eerder is gezien.

Fijn, dan werkt het in principe wel. Dat hij het op 200 steps niet doet komt waarschijnlijk omdat dan de snelheid van 5000 steps/s te hoog is.
Waarom dan de voeding uitvalt is me een raadsel. Ik heb 3 stappenmotoren van ieder 4A op een 48V/360Watt Meanwell voeding staan dat gaat probleemloos.
Maar laat hem lekker op 1600 steps staan dat loopt ook nog rustiger.
Heb je trouwens nog een autotune gedaan van de driver en motor?
dat kan door sw4 binnen een seconde 2x aan en uit te zetten.

Ik zal van de week eens een andere voeding proberen van het werk. Volgens mij hebben we ook wel 48v 300w voedingen liggen. Zal die ook eens proberen.
Ik snap er ook niks van, want op het digitaal panel metertje wat los op de tafel ligt, kun je zien dat stroom ook niet extreem oploopt voordat de voeding uitschakelt. Even uitsluiten dat de voeding niet stuk is.

Sowieso zijn de stappen en snelheid in jou programma te hoog. Maar ik ben wel positief verrast over jou acceleratie en deccelaratie stukje. Dus wellicht moet ik dit zo aanpassen zodat dit op 45rpm draait.
Autotune heb ik nog niet uitgevoerd. Ga ik morgen ook gelijk doen.

Op 11 november 2020 16:52:06 schreef Lambiek:
[...]
Dat is de max stroom die de motor trekt, maar dat heb je waarschijnlijk niet nodig. Als je echt het hele koppel wil benutten moet je ook met de spanning omhoog, ook voor een hoger toerental.

Je driver is eigenlijk ook aan de lichte kant voor deze motor.

Ik had nog iets toe gevoegd in mijn vorige post, daar staat hoe je de dip switch in moet stellen voor de stroom.

Wat ga je eigenlijk doen met je motor en driver?

Ah die toevoeging had ik nog niet gezien. Ga ik morgen gelijk proberen.

De toepassing is dat boven in een stal komt een rail te hangen waar zich de stappen motor bevind en een camera. Deze moet van voor naar achteren bewegen in de stal. En dus op het einde van de stal weer terug komen naar voren. Vandaar eigenlijk die interrupt voor het wijzigen van de draairichting

Als het alleen maar is om een camera over een rails te bewegen is dan deze motor niet wat zwaar.
Ik denk dat een 2 Nm nema23 motor dat met gemak moet kunnen.

Lambiek

Special Member

Op 11 november 2020 20:18:08 schreef floppy:
Als het alleen maar is om een camera over een rails te bewegen is dan deze motor niet wat zwaar.
Ik denk dat een 2 Nm nema23 motor dat met gemak moet kunnen.

Ja, precies.

Als je haar maar goed zit, GROETEN LAMBIEK.

Theoretisch is dat het idee. Wat er mechanisch nog meer bij of op komt heb ik werkelijk geen idee. Mechanische engineers hebben de berekeningen gedaan en kwamen bij mij of ik een aansturing kon maken voor deze stappenmotor met de bijbehorende snelheid.
Dus dat is ook het geen waar we ook even vanuit moeten gaan.
2e uitdaging is om een goede voeding, lees batterij of accu, te voorzien. Maar dat is probleemstelling 2. Want dit moet zo compact mogelijk blijven

Als het compact moet zijn en op een accu moet werken is een nema34 stappenmotor toch wel het laatste wat je moet pakken.
Een gelijkstroommotortje met een paar eindschakelaars of eventueel een paar tussenpositie schakelaars is zoveel simpeler en zuiniger.
Als het wat luxer moet neem je een gelijkstroommotor met een encoder,
dan kun je ook op elke positie stoppen.

Lambiek

Special Member

Ik snap sowieso niet waarom de motor mee moet bewegen, laat alleen het wagentje met de camera over de rail lopen.

Als je dat met een tandriem aandrijft, hoeft de motor niet mee te bewegen. Er zijn tandriemen van 100 meter te koop, of dat moet té kort zijn.

Als je haar maar goed zit, GROETEN LAMBIEK.
buckfast_beekeeper

Golden Member

Een stal is ook niet de meest vriendelijke omgeving voor elektronica. Ammoniak is er altijd aanwezig. Je zou dan denken maximaal voor RVS 316 te kiezen. Waar een stepper sowieso niet aan voldoet.

@lambiek: galvaniseren en galvaniseren is 2. Als ik hier zaken zie staan, enkele jaren oud en hoe ze er dan al voor komen, dan hebben ze er weinig kaas van gegeten of ze zijn veel te graag snel klaar. Zie ik daarentegen de gegalvaniseerde liftpalen staan in de skigebieden, dan zijn die na 20 jaar nog steeds als nieuw. Ook niet vergeten dat die voederhekken dagelijks een dosis vet krijgen aangesmeerd. Zelfs waar de zink weg is gaan ze niet roesten. Bij onze buurman zie ik toch meer en meer RVS verschijnen.

[Bericht gewijzigd door buckfast_beekeeper op 12 november 2020 16:12:50 (57%)]

Van Lambiek wordt goede geuze gemaakt.
Lambiek

Special Member

Op 12 november 2020 06:18:50 schreef buckfast_beekeeper:
Een stal is ook niet de meest vriendelijke omgeving voor elektronica.

Dat is zo, maar dat kan prima als het in een goede behuizing zit.

Ammoniak is er altijd aanwezig. Je zou dan denken maximaal voor RVS 316 te kiezen.

RVS is niet nodig, alle voerhekken zijn van gegalvaniseerde buis gemaakt. En dat gaat tientallen jaren goed.

Waar een stepper sowieso niet aan voldoet.

Daar kun je ook iets tegen doen.

Als je haar maar goed zit, GROETEN LAMBIEK.

Dank alles voor het meedenken.
Eerste prototype (met stappenmotor) is gemaakt en draait. Uiteraard gaan we dit nog verfijnen en wellicht in de toekomst uitvoeren met een gelijkstroommotor. Maar voor nu willen we nog even doorpakken met de stappen motor.
Waar ik onder andere tegenaan loop met het "simpel" aansturen van een stappenmotor, is het werken met delays. Hierdoor kun je even niets meer doen in je programma. En ik wil graag meer taken kunnen uitvoeren tijdens het draaien van de motor.
In de hoop dat, dat zou kunnen en het hoofdprogramma iets te versimpelen, heb ik gebruik gemaakt van de AccelStepper library.
Ik wil namelijk tijdens het rijden met een inductieve sensor gaten laten tellen. Deze liggen bijvoorbeeld 15cm uit elkaar. En deze informatie wil ik later gebruiken voor verschillen de doeleinden. Een doeleind zou kunnen zijn om een indicatie te kunnen geven van de afgelegde afstand. En ander ding zou kunnen zijn dat ik een trigger afgeef dat de camera op dat moment een foto moet maken.
Nu is het zo dat het me lukt om tijdens het rijden (zonder afwijken gedrag van mijn pulsen) de sensor uit te lezen en een output hoog te maken.
Maar nu wil ik ook een counter bij gaan houden die ik kan vermenigvuldigen met de afstand tussen de gaten (bijvoorbeeld 15cm) zodat ik de afgelegde afstand weet.
Dit zou ik graag in de serial monitor zichtbaar willen maken. Of ooit nog op een display.
Echter wanneer ik dit doe, dan verlies ik denk ik te veel tijd in mijn programma, waardoor mijn pulsen en dus mijn stappen niet meer kloppen.
Ik had deze uitlezing in de loop gezet. Dus daar had ik het zichtbaar maken van mijn buttonPushCounter staan. Maar dit gaat dus niet goed.
Dus mijn vraag, hoe kan ik informatie zichtbaar toveren op mijn serial monitor zonder dat dit ten koste gaat van het stappenprogramma?
Hieronder mijn code zover. En ja ik weet dat de buttonPushCounter blijft ophogen wanneer deze sensor actief is.
Maar het gaat nu alleen even over dat ik deze waarde zichtbaar kan maken op mijn monitor.

c code:

#include <AccelStepper.h> //accelstepper library
#include <ezButton.h>

#define LOOP_STATE_STOPPED 0
#define LOOP_STATE_STARTED 1
#define Photo_PIN 7  

ezButton button(12);  // create ezButton object that attach to pin 12;
int loopState = LOOP_STATE_STOPPED;

int buttonPushCounter = 0;   // counter for the number of button presses

const byte limitSwitch_1 = 2; //pin for the microswitch
const byte limitSwitch_2 = 3; //pin for the microswitch
const byte Sensor_PIN = 5; //pin for the Sensor
const byte Start_PIN = 6; //pin for the Start knob

bool switchFlipped = false; //stores the status for flipping
bool previousFlip = true; //stores the previous state for flipping - needed for the direction change

//------------------------------------------------------------------------------------

// direction Digital 9 (CCW), pulses Digital 8 (CLK)
AccelStepper stepper(1, 8, 9);

void setup()
{
  //Limit Switches
  pinMode(limitSwitch_1, INPUT_PULLUP); // internal pullup resistor (debouncing)
  pinMode(limitSwitch_2, INPUT_PULLUP); // internal pullup resistor (debouncing) 
  //---------------------------------------------------------------------------

  //Serial communication
  Serial.begin(9600); //defining some baud rate
  Serial.println("Testing Accelstepper"); //print a message
  
  //---------------------------------------------------------------------------

  //Stepper parameters
  //setting up some default values for maximum speed and maximum acceleration
  stepper.setMaxSpeed(5000); //SPEED = Steps / second  
  stepper.setAcceleration(75); //ACCELERATION = Steps /(second)^2    
  stepper.setSpeed(150); // 150Hz == 45RPM at 200 steps/reolution
  delay(500);
  //---------------------------------------------------------------------------
  pinMode(Photo_PIN, OUTPUT); 
  pinMode(Sensor_PIN, INPUT); 
  pinMode(Start_PIN, INPUT); 
  //---------------------------------------------------------------------------
  button.setDebounceTime(50); // set debounce time to 50 milliseconds
  stepper.disableOutputs();
}

void loop()
{  
    button.loop(); // MUST call the loop() function first

  startButton();   //checking the start button at each loop
  if (loopState == LOOP_STATE_STARTED) {
  
    stepper.runSpeed(); //step the motor (this will step the motor by 1 step at each loop indefinitely)
    flipCheck();   //checking the flip at each loop
    readSensor();   //checking the senor at each loop
  }
}

void startButton()  // Read Start Button
{ 
  if (button.isPressed()) {
    if (loopState == LOOP_STATE_STOPPED)
      loopState = LOOP_STATE_STARTED;
    else // if(loopState == LOOP_STATE_STARTED)
      loopState = LOOP_STATE_STOPPED;
  }
}

void flipCheck() //this function constantly polls the pins.
{
  if(digitalRead(limitSwitch_1) == LOW)
  { 
    stepper.disableOutputs();
    delay (2000); 
    stepper.setSpeed(-150);      
  }

  if(digitalRead(limitSwitch_2) == LOW)
  {     
    stepper.disableOutputs();
    delay (2000); 
    stepper.setSpeed(150); 
  }      
}

void readSensor() //this function constantly read the inductive sensor
{  
  if (digitalRead(Sensor_PIN) == HIGH) {
     digitalWrite(Photo_PIN, HIGH);
     //Test voor afstand te detecteren
     buttonPushCounter++;
     
  }
  else {
    digitalWrite(Photo_PIN, LOW);
  }
}
buckfast_beekeeper

Golden Member

Mooi dat je al hebt gevonden dat een delay niet de juiste manier van werken is. Kan je niet beter een boolean gebruiken en een timer starten? Als deze timer afloopt, deze terug stoppen en setspeed afhankelijk van je boolean?

Van Lambiek wordt goede geuze gemaakt.

En wat moet die timer dan triggeren? Die sensor?
Ik zou toch gewoon een display of serial monitor moeten kunnen aansturen terwijl ik een stappenmotor aan stuur? Want dit is juist waar het fout gaat..

Zoals ik nu voor me ziet heb je een programma gemaakt waarmee je in 1 keer tot het einde van afstand gaat totdat je een eindschakelaar (linitSwitch-1) tegen komt.

Echter wanneer ik dit doe, dan verlies ik denk ik te veel tijd in mijn programma, waardoor mijn pulsen en dus mijn stappen niet meer kloppen.

IN het programma komen de pulsen van de stepper nergens voor je legt enkel een afstand af totdat er een eindschakelaar in beeld komt.

Een stappenmotor is zoals het er al staat een motor die letterlijk de stappen volgt. Als je met 8x microstepping werkt heb je 8 pulsen nodig voor 1 stap van de motor. Op elke stap van de motor ( ook op de microstepping) kan je de motor stil zetten. De stepper driver zorgt er dan voor de motor op exact deze plaats blijft staan, totdat je de driver uitschakelt.
Met het geven dat de motor altijd op zijn plaats blijft kan je in de tussentijd van alles doen in je microcontroller. Dit gaat dan enkel ten koste van de snelheid maar niet van de positie. Door slim te programmeren kan de snelheid wel gelijk blijven maar ik ga er van uit dat je dit niet kan.
Je kan ook per 1 enkel stap er ook bv 1000 naar de stepper driver sturen of in 1 keer 15 cm.

Klopt wat je zegt. Na het indrukken van de startbutton gaat de motor lopen tot aan limitswitch-1. Dan moet de motor 2 seconden wachten. Vervolgens draait de draairichting om en gaat deze weer de andere kant op lopen totdat deze limitswicht-2 tegen komt. Weer 2 seconden wachten en weer terug de andere kant op. Dit blijft hij herhalen totdat er weer op de startbutton wordt gedrukt.

De puls van iedere periode is ongeveer 18uS hoog. De rest van die periode is hij laag. Ik weet niet of je bedoeld dat ik dat in deze periode iets kan betekenen voor mij display uitlezing of andere taken.
Verder begrijp ik het ook nog dat tussen iedere stap ik wel een andere functie uit kan voeren zonder dat ik stappen mis, echter willen we wel een constante snelheid behouden zonder dat de snelheid veranderd wanneer er andere taken uitgevoerd moeten worden.

Op 10 december 2020 23:01:47 schreef benleentje:
Door slim te programmeren kan de snelheid wel gelijk blijven maar ik ga er van uit dat je dit niet kan.

En nee, ik ben helemaal niet ver met het programmeren, maar wil graag leren. Indien dit nog binnen mijn kunnen ligt O-)