Vraag en antwoord > Elektronica en analoog

Arduino hulp gezocht

(1/3) > >>

Hans Mol:
Beste spoorliefhebbers,

Momenteel ben ik me aan het verdiepen in het programmeren van een Stepper middels Arduino aansturing.
Ik heb nu een sketch gemaakt waarbij de stepper door 1 druk op de knop 45 graden vooruit draait en na een 2e druk op de knop 45 graden terug draait.
Op zich werkt dit wel zij het niet dat de stepper, na opnieuw opstarten, vreemd gedrag vertoond.
In plaats van dat hij 45 graden draait bij zijn eerste loop draait hij m.i. maar de helft hiervan. Pas hierna draait hij de aangegeven 45 graden.

Kent iemand de reden van dit gedrag en zo ja hoe kan ik dit voorkomen.
De sketch is bedoeld voor het aansturen van een draaischijf. Door die halve verplaatsing zal de draaischijf nooit goed werken.

Hieronder heb ik de sketch even geplakt.
Ik hoop dat hier op het forum iemand is die mij hierin kan helpen.

Alvast bedankt,

Hans Mol


--- Code: ---// TEST steppermotor met 1 button voor- en achteruit
//****************************************************************************************

#include <AccelStepper.h>                         // Gebruikt AccelStepper bibliotheek

//constanten
#define motorPin1  6                              // IN1 pin op de ULN2003A driver
#define motorPin2  7                              // IN2 pin op de ULN2003A driver
#define motorPin3  8                              // IN3 pin op de ULN2003A driver
#define motorPin4  9                              // IN4 pin op de ULN2003A driver

const int buttonPin = 10;                         // drukknop1 pin 10
                           
//variabelen
int buttonState = LOW;                            // waarde van de drukknop1

int stepsPerRevolution = 64;                      // stappen per omwenteling
float degreePerRevolution = 5.625;                // graden per stap

int teller = 0;

/*
* We maken gebruik van een 28BYJ-48 motor. Dit is een halfwire stepper met 4 pins.
* Hierbij dient de volgorde van de pins gewijzigd te worden in 1,3,2,4.
*/
AccelStepper stepper(AccelStepper::HALF4WIRE, motorPin1, motorPin3, motorPin2, motorPin4);

//****************************************************************************************

void setup() {
 
  stepper.setMaxSpeed(800.0);                     // stel de maximale motorsnelheid in
  stepper.setAcceleration(100.0);                 // stel de acceleratie in
  stepper.setSpeed(150);                          // stel de huidige snelheid in
 
  pinMode(buttonPin, INPUT);                      // stel de switch pin1 in als invoer 
}

//****************************************************************************************

void loop() {
 buttonState = digitalRead(buttonPin);
 if (buttonState == HIGH)
 {
   teller++;
//   delay(500);
 }
     if (teller == 1)
       stepper.moveTo(degToSteps(45));
       stepper.run(); 
//       delay(10000);
        if (teller == 2) {
       stepper.moveTo(degToSteps(-45));
       stepper.run();
//       delay(10000);
        } else {
       if (teller > 2)
       teller = 0;
   }
 }

//****************************************************************************************

/*
* Rekent het aantal graden om naar het aantal stappen
* 28BYJ-48 motor heeft 5,625 graden per stap
* 360 graden / 5,625 = 64 stappen per omwenteling
* Voorbeeld van degToSteps(45):
* (64 / 5,625) * 45 = 512 stappen
*/

float degToSteps(float deg) {
  return (stepsPerRevolution / degreePerRevolution) * deg;
}
--- Einde van code ---

coldforged:
Hoi,

waarschijnlijk dat deze link je verder helpt er mee:
http://42bots.com/tutorials/28byj-48-stepper-motor-with-uln2003-driver-and-arduino-uno/

grtz
Martin

meino:

ik heb een aantal opmerkingen.
Ten eerste houd je geen rekening met de bounce die kan optreden bij een schakelaar. Dat houdt in, dat op het moment van sluiten (of openen) van een schakelaar er vaak een korte periode is dat er door de schakelaar een serie open- en sluitmomenten zijn. Ik gebruik altijd een timer en pas als de situatie gedurende zeg 10-15ms constant is, besluit ik om daar op te reageren. De Arduino is snel genoeg om op de korte pulsen van de bounce te reageren, dus het kan goed zijn dat hij meerder button pushes ziet.

Een tweede punt is, dat je in de loop functie continue de staat van de button uitleest, dat kan goed gaan als je zo snel bent dat tijdens de volgende iteratie je de buttion al hebt losgelaten. Die kans is uiterst klein. Dus de schets zal continue de stepper laten schakelen tussen 45 en -45 graden. Dus je zult pas naar de andere richting kunnen gaan als de button ook een tijdje af is geweest.

Laatste punt is, je gebruikte stepper kent niet een geheel aantal stapjes per omwenteling. Je lost dat op door met floats te werken, maar wat ik mij herinner van de Accelstepper is dat die met gehele getallen werkt, dus je gaat afrondings verschillen krijgen. In dit voorbeeld heeft dat nog geen grote invloed omdat de afrondingsverschillen naar beide kanten hetzelfde zijn, dus elkaar opheffen. Maar dat zal niet het geval zijn als je met verschillende hoeken gaat werken en de afrondingsverschillen op verschillende manieren kunnen worden opgeteld. Beter is het om een tabel met positities te gebruiken en zorgen dat je nooit deze stepper meer dan 360graden te laten draaien, maar altijd terug te gaan.

Groet Meino

ikbenerevenniet:
Wil je je code even tussen code-tags zetten? (de knop met het hekje, #) Nu wordt de layout van de hele pagina uit elkaar gedrukt... En: ik denk dat "degreePerRevolution" eigenlijk "degreePerStep" zou moeten heten.

Hans Mol:
Beste Meino en Erik,

Alvast bedankt voor jullie tips. Hier ga ik mee aan de slag.
Ik heb de code nu tussen ## staan. Dat is inderdaad beter. (wist niet dat dit zo werkte)

Hans

Navigatie

[0] Berichtenindex

[#] Volgende pagina

Naar de volledige versie