support vma401

Een stepper motor wordt aangedreven door de vier spoelen rondom de kern beurtelings te activeren. De tussenliggende tijd bepaalt de snelheid.

De 1-of-2-fase methode geeft de kleinste stap met gemiddelde kracht.
De 2-fase methode geeft de grootste kracht.

In dit voorbeeld kiezen we voor de grootste precisie, de 1-2 fase methode.
De arduino pinnen worden beurtelings hoog of laag gezet om de gekoppelde spoelen activeren. Dat kan natuurlijk in een loop, dat werkt op ieder model Arduino maar geeft een minder vloeiende beweging.
Door gebruik te maken van port manipulatie, worden de pinnen in 1 handeling hoog of laag gezet. Omdat port manipulatie per model verschillend wordt geactiveerd, is deze methode modelafhankelijk, onderstaande sketch is voor de Arduino Uno.

Verbind:

  • De stuurpinnen van de controller met digitale pinnen 2,3,4 en 5 van de Arduino.
  • De + en pinnen met de Arduino 5v poort en ground, of een andere voeding tot 12v. Vergeet dan niet de ground van die voeding te verbinden met de ground van de Arduino!

download zip-file

////////////////////////////////////////////////
// steppenmotor: 28BYJ-48, 4-phase, 8-beat motor, geared down by factor of 68.
// step angle 5.625/64, operating Frequency 100pps, current draw 92mA, ULN2003 interface board.
// Motor will run alternately left and right at random intervals.
////////////////////////////////////////////////

// binary 360 degree patterns of active pins
byte coils[8] = { B00000110, B00001110, B00001010, B00011010, B00010010, B00110010, B00100010, B00100110 };
int coil_dir = 1;
int coil_cur = 0;
byte coil_num = 8;

int run_step = 800;
int run_target = 4096;
int run_pos = 0;

unsigned long run_start = 0;  // use time - not delay() - to free the loop foor other processes
unsigned long run_now = 0;

//////////////////////////////////////////////////////////////////////////////
void setup() {
  DDRD = DDRD | B00111100; //declare the coil pins in section D as outputs
}

//////////////////////////////////////////////////////////////////////////////
void loop(){
  run_now = micros();
  if( run_now - run_start > run_step ){
    run_start = run_now;
    bounce();
    run_coils();
  }
}

//////////////////////////////////////////////////////////////////////////////
boolean run_circle(){
  switch( coil_dir ){
    case -1:
    return( run_pos > run_target );
    break;
    case 1:
    return( run_pos < run_target );
    break;
  }
}

void bounce(){
  if( !run_circle() ){
    run_pos = 0;
    coil_dir = -coil_dir;
    run_target = random( 8 ) * 512 * coil_dir;
  }
  run_pos += coil_dir;
}

void run_coils (){
  PORTD = coils[ coil_cur ];
  coil_cur += coil_dir;
  if( coil_cur<0 || coil_cur > coil_num ){
    if( coil_cur < 0 ) coil_cur = coil_num;
    else coil_cur = 0;
  }
}