1.2.10. fejezet, Motor Control Shield

Waveshare és az 5 csatlakozós léptető motor

Hardver eszközök:

Kit beszerezhető az rPibolt.hu-nál. A vezérlőhöz adott arduino minta kód 4 DC motor vezérléséhez készült.

int motor1_dir1 = 12;
int motor1_dir2 = 13;
int motor1_pwm  = 11;
 
int motor2_dir1 = 8;
int motor2_dir2 = 7;
int motor2_pwm  = 10;
 
int motor3_dir1 = 5;
int motor3_dir2 = 4;
int motor3_pwm  = 9;
 
int motor4_dir1 = 3;
int motor4_dir2 = 2;
int motor4_pwm  = 6;
 
 
void setup()
{
    pinMode(motor1_dir1,OUTPUT);
    pinMode(motor1_dir2,OUTPUT);
    pinMode(motor1_pwm,OUTPUT);
 
    pinMode(motor2_dir1,OUTPUT);
    pinMode(motor2_dir2,OUTPUT);
    pinMode(motor2_pwm,OUTPUT);
 
    pinMode(motor3_dir1,OUTPUT);
    pinMode(motor3_dir2,OUTPUT);
    pinMode(motor3_pwm,OUTPUT);
 
    pinMode(motor4_dir1,OUTPUT);
    pinMode(motor4_dir2,OUTPUT);
    pinMode(motor4_pwm,OUTPUT);
 
    digitalWrite(motor1_dir1,0);
    digitalWrite(motor1_dir2,1);
    digitalWrite(motor1_pwm,1);
 
    digitalWrite(motor2_dir1,0);
    digitalWrite(motor2_dir2,1);
    digitalWrite(motor2_pwm,1);
 
    digitalWrite(motor3_dir1,0);
    digitalWrite(motor3_dir2,1);
    digitalWrite(motor3_pwm,1);
 
    digitalWrite(motor4_dir1,0);
    digitalWrite(motor4_dir2,1);
    digitalWrite(motor4_pwm,1);
}
void loop()
{
    analogWrite(motor1_pwm, 128);
    analogWrite(motor2_pwm, 128);
    analogWrite(motor3_pwm, 128);
    analogWrite(motor4_pwm, 128);
    delay(500);
}

A két léptető motor vezérlése (csak példa, ezzel az eszközzel nem működik!):

#include <Stepper.h>
 
Stepper stepper1 = Stepper(512, 2, 3, 4, 5);
Stepper stepper2 = Stepper(512, 7, 8, 12, 13);
void setup() {
  stepper1.setSpeed(250);
  stepper2.setSpeed(250);
}
 
void loop() {
  stepper1.step(5);
  stepper2.step(5);
  delay(1);
}

A 2. motor manuális vezérlésre egy minta. Ezeket a digitális kimeneteket használja az eszköz, de még nem teljesen jó. Lassan forog, és a várakozási idő csökkentésével sem lett sokkal gyorsabb. Elvileg ez a sorrend nagyobb nyomatékot biztosít, de a 0,2,4,6 lépés sorrend alkalmazásával meg sem mozdult a motor.

int bluePin = 10;
int pinkPin = 11;
int yellowPin = 12;
int orangePin = 13;
int currentStep = 0;
 
boolean dir = true;
int stepperSpeed = 5;
 
void setup() {
  // put your setup code here, to run once:
pinMode(bluePin,OUTPUT);
pinMode(pinkPin,OUTPUT);
pinMode(yellowPin,OUTPUT);
pinMode(orangePin,OUTPUT);
 
digitalWrite(bluePin,LOW);
digitalWrite(pinkPin,LOW);
digitalWrite(yellowPin,LOW);
digitalWrite(orangePin,LOW);
}
 
void loop() {
  switch(currentStep){
    case 0:
      digitalWrite(bluePin,HIGH);
      digitalWrite(pinkPin,LOW);
      digitalWrite(yellowPin,LOW);
      digitalWrite(orangePin,LOW);
      break;
    case 1:
      digitalWrite(bluePin,HIGH);
      digitalWrite(pinkPin,HIGH);
      digitalWrite(yellowPin,LOW);
      digitalWrite(orangePin,LOW);
      break;
    case 2:
      digitalWrite(bluePin,LOW);
      digitalWrite(pinkPin,HIGH);
      digitalWrite(yellowPin,LOW);
      digitalWrite(orangePin,LOW);
      break;
    case 3:
      digitalWrite(bluePin,LOW);
      digitalWrite(pinkPin,HIGH);
      digitalWrite(yellowPin,HIGH);
      digitalWrite(orangePin,LOW);
      break;
    case 4:
      digitalWrite(bluePin, LOW);
      digitalWrite(pinkPin, LOW);
      digitalWrite(yellowPin, HIGH);
      digitalWrite(orangePin, LOW);
    case 5:
      digitalWrite(bluePin, LOW);
      digitalWrite(pinkPin, LOW);
      digitalWrite(yellowPin, HIGH);
      digitalWrite(orangePin, HIGH);
    case 6:
      digitalWrite(bluePin, LOW);
      digitalWrite(pinkPin, LOW);
      digitalWrite(yellowPin, LOW);
      digitalWrite(orangePin, HIGH);
    case 7:
      digitalWrite(bluePin, HIGH);
      digitalWrite(pinkPin, LOW);
      digitalWrite(yellowPin, LOW);
      digitalWrite(orangePin, HIGH);
    default:
      digitalWrite(bluePin, LOW);
      digitalWrite(pinkPin, LOW);
      digitalWrite(yellowPin, LOW);
      digitalWrite(orangePin, LOW);
    break;
  }
  currentStep = (++currentStep > 7) ? 0 : currentStep;
  delay(stepperSpeed);
}

A 1. motor manuális vezérléshez a lábkiosztás:

int bluePin = 6;
int pinkPin = 7;
int yellowPin = 9;
int orangePin = 8;

2017.12.20.-án kiadott a gyártó egy vezérlő programot a léptetőmotorokhoz. A mellékelt mintakóddal a 360 fokos forgást teszteltem, de 362-vel volt mindig pontosan a fordulat egy kör.

A példa programban fordított irányú forgást az alábbi kóddal lehet eszközölni a Motor.cpp-ben:

void Motor_Trun(BYTE Motor_dev, signed long Angle)
{
...
if (Angle > 0) {
  Serial.println("* positive angle *\r\n");
  unsigned long beats = (Angle * 4098) / 360 ; //Need to turn the beat 4076
  for(beats = beats; beats > 0; beats--){
	Motor_Setbit(sMotor, BeatCode[Index]);
	Index++;
	if(Index % 8 == 0){
		Index = Index & 0x07; //Greater than 8 clear 0		
	}
  }
} else {
  Serial.println("* negative angle *\r\n");
  unsigned long beats = (abs(Angle) * 3586) / 360 ;
  Index = 7;
  for(beats = beats; beats > 0; beats--){
	Motor_Setbit(sMotor, BeatCode[Index]);
	Index--;
	if(Index == 0){
		Index = 7;
	}     
  }
}
...
}

Motor csatlakozó kiosztás (DC motor)

Hasznos linkek

Összeszerelve

A motor működése

CNC Plotter Arduino project