stappenmotor

Hardware die niet past in bovenstaande onderwerpen
Gebruikers-avatar
Berichten: 699
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: stappenmotor

Berichtdoor pjh » 20 Jan 2013, 02:08

Heb al wat, maar niet af. In familie 'grote domper', even van de haak. Later...

Advertisement

Gebruikers-avatar
Berichten: 699
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: stappenmotor

Berichtdoor pjh » 20 Jan 2013, 23:52

Sorry. Ben helemaal in war geraakt. Te veel tegelijker tijd. Einde aan mijn multi-tasking ding.
Maar goed.
Ben inderdaad wel bezig geweest. Dacht even de tutorial snel te vertalen, maar dat was meer werk dan gedacht. En het kan ook zelf:

Ik lees me weer even in en kom erop terug.
----------------------------------------------
De EasyDriver is een, eenvoudig toe te passen, stepper motor driver. Hij is compatibel met alles wat een digitale output heeft van 0 tot 5V of 0 tot 3.3V als je de SJ2 pin door verbind. De EasyDriver wordt gevoed met 7V tot 30V voor de motor en kan motoren met elk voltage aan. Er zit een volt regulator op voor de digitale interface die op 5V of 3.3V kan worden ingesteld.


Wat je hieruit leert, is dat de IC's (de logica) een eigen stroom hebben, los van de stroom voor de motoren.
Dus 7-30 Volt gelijkstroom erin. Maakt het bordje zelf OF 0-5 Volt, of 0-3.3 Volt van. Dit kun je met een jumper instellen.
Dit is van belang, wanneer je met een 3.3 Volt Arduino (of andere microcontroller) die chip wil aansturen. Dan is de chip 5 volt, maar de input-signalen zijn dan 3.3 max, mat problemen kan geven.
==> maar je Arduino is 5 volt, dus geen jumper veranderingen nodig.

Wat er verder staat is dat je elke DC stepper kunt aansluiten. Te groot is alleen maar jammer, niet erg.
Maar ik denk dat als je je tafel een beetje netjes op ladegeleiders of zo zet, er weinig kracht nodig is.
-----
Maar laten we verder gaan....
Een sketch, deze werkt bij mij. Althans, hij compileert foutloos. Een goed uitgangspunt.
Code: Alles selecteren
//////////////////////////////////////////////////////////////////
//©2011 bildr
//Released under the MIT License - Please reuse change and share
//Using the easy stepper with your arduino
//use rotate and/or rotateDeg to controll stepper motor
//speed is any number from .01 -> 1 with 1 being fastest -
//Slower Speed == Stronger movement
/////////////////////////////////////////////////////////////////


#define DIR_PIN 2
#define STEP_PIN 3

void setup() {
  pinMode(DIR_PIN, OUTPUT);
  pinMode(STEP_PIN, OUTPUT);
}

void loop(){

  //rotate a specific number of degrees
  rotateDeg(360, 1);
  delay(1000);

  rotateDeg(-360, .1);  //reverse
  delay(1000);


  //rotate a specific number of microsteps (8 microsteps per step)
  //a 200 step stepper would take 1600 micro steps for one full revolution
  rotate(1600, .5);
  delay(1000);

  rotate(-1600, .25); //reverse
  delay(1000);
}

void rotate(int steps, float speed){
  //rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  int dir = (steps > 0)? HIGH:LOW;
  steps = abs(steps);

  digitalWrite(DIR_PIN,dir);

  float usDelay = (1/speed) * 70;

  for(int i=0; i < steps; i++){
    digitalWrite(STEP_PIN, HIGH);
    delayMicroseconds(usDelay);

    digitalWrite(STEP_PIN, LOW);
    delayMicroseconds(usDelay);
  }
}

void rotateDeg(float deg, float speed){
  //rotate a specific number of degrees (negitive for reverse movement)
  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  int dir = (deg > 0)? HIGH:LOW;
  digitalWrite(DIR_PIN,dir);

  int steps = abs(deg)*(1/0.225);
  float usDelay = (1/speed) * 70;

  for(int i=0; i < steps; i++){
    digitalWrite(STEP_PIN, HIGH);
    delayMicroseconds(usDelay);

    digitalWrite(STEP_PIN, LOW);
    delayMicroseconds(usDelay);
  }
}

----
Voor we ingaan op de code, wil ik eerst wat over stepper motors zeggen.
Ik heb er de b*ll*n verstand van, maar mogelijk genoeg om je verder te helpen.

De stepper motor die je kunt aansluiten op je EasyDriver, heeft 4-aansluitingen. Twee voor elke spoel.
Omdat deze per paar geleiden, kun je met een multimeter uitzoeken welke bij elkaar horen.
De een is de plus en de ander de min. Ik kom er altijd proefondervindelijk achter welke welke is. Veel kapot maken kun je niet. Immer:
Er is alleen contact tussen de centrale as (of hoe heet dat) en de mantel middels LUCHT (en electromagnetisme).
Met genoeg kracht krijg je dus altijd een stepper aan het draaien.

Nu wat onderdelen uit de sketch:

Code: Alles selecteren
...
  //rotate a specific number of degrees
  [b]rotateDeg[/b](360, 1);
  delay(1000);
...
  //rotate a specific number of microsteps (8 microsteps per step)
  //a 200 step stepper would take 1600 micro steps for one full revolution
  ...
  [b]rotate[/b](-1600, .5);
  delay(1000);
...


Wat je hieruit (en bij verdere bestudering van de sketch) kunt opmaken, is dat er eigenlijk maar twee dingen kunnen gebeuren.
- stap vooruit
- stap achteruit.
Er worden twee methoden geïmplementeerd om de motor een opdracht te geven:
1) rotate(stappen, snelheid) : draai X graden met Y snelheid in Z richting
2) rotateDeg(graden, snelheid) : draai Q stappen met Y snelheid in Z richting
Wat dus eigenlijk op hetzelfde neerkomt,
Maar van belang is, wanneer je een motor hebt gekocht.
De een gaat namelijk 200 stapjes om 360 graden rond te gaan, de ander weer met grotere of kleinere stappen.
Goedkope steppers hebben vaak 42 stapjes per rondje geloof ik. Kun je googles.

Maar goed.
De richting.
Die wordt in de sketch bepaald met deze regel:
int dir = (deg > 0)? HIGH:LOW;

Wat hetzelfde betekend al:
Maak een variabele aan met de naam dir die een integer getal beval. Maak dit getal HIGH (=1) indien de variabele deg > 0. Maak anders dir = LOW (=0)
Dus bij rotate(-1600,1); wordt dir = LOW, want -1600 is niet groter dan nul.
Deze waarde wordt met digitalWrite(DIR_PIN,dir); naar de chip op de EasyDriver gestuurd.

Volgens mij is daarmee de hele sketch uitgelegd.
Zou je zo mee aan de gang moeten kunnen.
Maar nu wordt het natuurlijk ook leuk.
Want dit hierboven is natuurlijk geen sketch die je controle geeft.
Je wilt -neem ik aan- meerdere scenarios en triggers instellen om het voor elkaar te krijgen.

Ik ben een groot voorstander van feed-back loops. ons hele menselijke lichaam bestaan bij de gratie van dit soort terugkoppel lussen.
Het is echter voor de beginneling (zoals ik nog juist was) lastig voor te stellen wat er op microseconden-sachaal, allemaal wel en niet gebeurt. Toen ik begin zette ik overal delays tussen, om gekke overlappen en fenomenen voor te zijn.

Maar nu verder met de sketch...

Ik heb natuurlijk wel een voorstellen van de hardware die aan de steppers komen te hangen, maar de maat van het geheel is mij nog volstrekt onduidelijk.
Zelf heb ik eens 2 stepper motors gekocht bij floris.cc. Prima dingen en krachtig zat voor een kilo ofzo. Maar wil je het weten, dan moet je testen. Pak bijvoorbeeld een weegschaal, en kijk bij hoeveel kracht het gevaarte in beweging komt. Indien maar een paar gram, dan kun je volstaan met kleine steppers, die je voor minder dan 3 euro kunt krijgen.
Nog een weetje: naast de totale grootte enzo, is het vooral de lengte van een steppermotor die de torque bepaalt.

Nu mijn idee: ease in en ease out. Zou toch moeten kunnen met de EasyDriver. Zo je zeggen.
Moet je wel de sketch voor aanpassen.
Het zit hem in de delays die hij tussen de verschillende stapjes maakt.
Deze wordt inzichtelijk met deze code uit bovenstaande sketch:
// speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
float usDelay = (1/speed) * 70;
...
delayMicroseconds(usDelay);

Hieruit kun je afleiden dat :
1) de delays tussen alle stapjes, per opdracht, hetzelfde zijn.
2) er een inverse relatie is tussen die 0.01-1 en de duur van de delay.

Dit laatste houdt in dat je wel de snelheid mooi kunt opgeven van 0,01 to 1, maar dan is dit hoe je delay is:
Afbeelding

Op de X-as staan honderd stapje van 0,01 tot 1,0 (rechts).
Het zou mooier zijn wanneer we meer controle over de snelheid zouden hebben.
Dit kun je bereiken door die 0,01-1 te 'maken' met een formule die
* als input: 100-0 heeft, met 100 = snel en 0 = langzaam
* en als output: 0,01 - 1 heeft
==> output = 10^-log(input)
dus bijvoorbeeld:
input = 100: output wordt 10 tot de macht -2 = 0,01
input = 10 : output wordt 10 tot de macht -1 = 0,1
input = 0 : output wordt 10 tot de macht 0 = 1

==> tada.

En in sketch-vorm wordt dat:
Code: Alles selecteren
  float nieuweSpeed = pow(10,-log(speed));


Om die leuke wiskundige dingen te doen als pow (power (= tot de macht) en log (= logaritme), moet je wel de 'wiskunde-library' mee-nemen. Dus:
Code: Alles selecteren
#include <math.h>

Maar zonder lijkt hij het ook te doen. Misschien al standaard ingebakken.
Heb alleen geen stepper aangesloten om het te testen.

Met 100=snel en 0 is langzaam, ben je beter bezig dan met 1 is snel en 0,01 is langzaam.
En hier de grafiek van de twee methodes.
Je ziet dat je veel betere controle op de snelheid (lees delay tussen de stappen) hebt.
Afbeelding

Hier de hele sketch, met aanpassingen (ook commentaar veranderd).
NB: niet getest.

Code: Alles selecteren
//////////////////////////////////////////////////////////////////
//©2011 bildr
//Released under the MIT License - Please reuse change and share
//Using the easy stepper with your arduino
//use rotate and/or rotateDeg to controll stepper motor
//speed is any number from .01 -> 1 with 1 being fastest -
//Slower Speed == Stronger movement
/////////////////////////////////////////////////////////////////


#define DIR_PIN 2
#define STEP_PIN 3

void setup() {
  pinMode(DIR_PIN, OUTPUT);
  pinMode(STEP_PIN, OUTPUT);
  Serial.begin(9600);
}

void loop(){
  //rotate a specific number of degrees
  rotateDeg(360, 50);
  delay(1000);

  rotateDeg(-360, 25);  //reverse
  delay(1000);

  //rotate a specific number of microsteps (8 microsteps per step)
  //a 200 step stepper would take 1600 micro steps for one full revolution
  rotate(1600, 10);
  delay(1000);

  rotate(-1600, 33); //reverse
  delay(1000);
}

void rotate(int steps, float speed){
  //rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
  //speed is any number from 100 -> 0 , with 100 being fastest = 0 being Slower is stronger
  int dir = (steps > 0)? HIGH:LOW;
  steps = abs(steps);

  digitalWrite(DIR_PIN,dir);

  float nieuweSpeed = pow(10,-log(speed));
  float usDelay = (1/(nieuweSpeed) * 70);

  for(int i=0; i < steps; i++){
    digitalWrite(STEP_PIN, HIGH);
    delayMicroseconds(usDelay);

    digitalWrite(STEP_PIN, LOW);
    delayMicroseconds(usDelay);
  }
}

void rotateDeg(float deg, float speed){
  //rotate a specific number of degrees (negitive for reverse movement)
  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  int dir = (deg > 0)? HIGH:LOW;
  digitalWrite(DIR_PIN,dir);

  int steps = abs(deg)*(1/0.225);

  float nieuweSpeed = pow(10,-log(speed));
  float usDelay = (1/nieuweSpeed) * 70;

  for(int i=0; i < steps; i++){
    digitalWrite(STEP_PIN, HIGH);
    delayMicroseconds(usDelay);

    digitalWrite(STEP_PIN, LOW);
    delayMicroseconds(usDelay);
  }
}


Klaar voor nu. slapen


...wordt vervolgd...

Gebruikers-avatar
Berichten: 699
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: stappenmotor

Berichtdoor pjh » 21 Jan 2013, 21:38

Hoi Wim,
Zowel 'evenementen' als 'forum regels' zijn niet de plekken voor deze inhoud, maar op beiden opereren wordt te gortig.
Daarom maar even een kopie-peest van je laatste bericht naar hier. Ben geen moderator, maar houd de discussie graag centraal. Ajbwib.

Hallo Paul
ik heb de arduino en de driver print
alles werkt wel maar ik zit te klooien met de code c programeren
ik heb wel een file die werkt maar het stappen motortje draait een paarslagen de ene kant op en dan de andere kant op
ik heb een rond platau voor mijn treinen zo dat ik kan versporen dus wil ik dat met mijn stappen motor
dat ding moet draaien een tiental stappen naar de ene kant en dan weereen paar stappen
dus hij moet naar vijf verschillende sporen kunnen
met een commando of een schakelaartje of zo zo van spoor 2 naar spoor 5 en of naar spoor 1,3,4
begrijp je het een beetje ik weet ook niet hoe je dat stopt ja de stekker er uit hi.
de waarde voor het aantal stappen kan ik zelf wel veranderen
maar hoe je een schakelaar in het program inbouwd ik zou het niet weten
als ik nou een voorbeeld heb zou ik onder begeleiding daar op door borduren
zo was het wel weer even genoeg om dat code c helemaal te leren ben ik een beetje te oud hoor 70 jaar
ik hoor het wel
mvgr wim


Je schakeling naar sporen begrijp ik en gaat geen probleem worden. Lijkt me erg leuk om iets moois van te maken.
Wat ik - voor mijn eigen beeldvorming - nog mis, is een foto van het geheel. Er is altijd een samenhang tussen de hardware en de software.
Dus hoe groot is het plateau? Hoeveel torque schat je nodig te hebben.

Ik ga even nadenken over een leuke interface. Want daar heb je het over. Welke knopjes en welke indicators.
Omdat het treinen zijn en ik vroeger ook met Märklin speelde. En omdat ik van kleine lampjes en displays houd, vraag ik me af of de interface voor de bediening ook geintegreerd kan worden in het zichtbare totaal.
Om maar eens wat te noemen: ben gisteren met een hele mooie kleine display bezig geweest van HP. Midden 80-er jaren. Het heeft 4 tekens, die elk uit een 5 bij 7 matrix van ledjes bestaat. Ze zijn 7 bij 18 milimeter. Volgens mij modelbouw-formaat. Kun je op zo'n klein ding je read-out doen. Heb er gisteren een ASCII-set in geprogrammeerd: http://huinink.info/hdsp2003/

Ach. Ik dwaal af.
Vraag is:
- wat is de schaal
- de torque (ongeveer)
- en kan/moet de bediening zichtbaar zijn in de model-wereld zelf?

groet
Paul

Vorige

Terug naar Overige hardware

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 1 gast