Simulatore di volo


link al simulatore java

Video del primo test

Teoria

Il driver a4988 riceve due segnali
  • direzione: selezionabile con HIGH o LOW e
  • step: un impulso formato da un HIGH e un LOW. Più è alta la frequenza delgli impulsi maggiore sarà la velocità del motore.
    La velocità in RPM (rotazioni al minuto) è direttamente proporzionale alla frequenza degli impulsi inviati al driver.
Ad esempio:
Se volessimo calcolare la velocità dell'impulso da inviare al driver per fa raggiungere la velocità massima al motore con motoriduttore 26.85:1 basta conoscere:
Step Angle 0.067°
Maximum Speed (w/1063 Motor Controller) 21 RPM

Step al giro = 360° / 0.067° Step Angle = 5373 step al giro
Tempo si rotazione = 60" / 21 RPM = 2.86" (secondi per un giro alla velocità massima di 21 RPM)
Quindi in 2.86"sec dobbiamo dare 5373 impulsi sul pin step
2.86" / 5373 = .000532 sec = 532 usec

semplificando
500000 / 3 * Step Angle / RPM = durata ciclo HIGH/LOW in microsecondi
500000 / 3 * Step Angle / durata ciclo HIGH/LOW in microsecondi = RPM

Codice Arduino per drive A4988

Semplice

Sono stati effettuati dei test con un codice semplificato che invia semplicemente una frequenza costante al driver.
Esempio


int f=4000; //durata dell'impulso in microsecondi
void setup() {
  pinMode(3, OUTPUT); //step AsseY
  pinMode(6, OUTPUT); //direzione AsseY
  pinMode(8, OUTPUT); //enable LOW
  digitalWrite(6, LOW);
  digitalWrite(8, LOW);
}

void loop() {
  digitalWrite(3, LOW);
  delayMicroseconds(f);
  digitalWrite(3, HIGH);
  delayMicroseconds(f);
}

Velocità impostata in RPM muove SOLO ASSE X

In questo altro esempio avendo lo StepAngle (che è una costante del motore), possiamo impostare la velocità desiderata in rpm.

const float StepAngle = 0.067; //0.067° è l'angolo compiuto da ciascuno step
float rpm = 21; //21 è la velocità massima di rotazioni al minuto del motore a vuoto
float f = 500000 / 3 * StepAngle / rpm; //durata del ciclo in microsecondi

void setup() {
  pinMode(3, OUTPUT); //step AsseY
  pinMode(6, OUTPUT); //direzione AsseY
  pinMode(8, OUTPUT); //enable LOW
  digitalWrite(6, LOW);
  digitalWrite(8, LOW);
}

void loop() {
  digitalWrite(3, LOW);
  delayMicroseconds(f / 2); // f/2 perché il ciclo è composto da una fase LOW
  digitalWrite(3, HIGH);
  delayMicroseconds(f / 2); // ed una fase HIGH
}

Velocità impostata in RPM muove TUTTI GLI ASSI

ATTENZIONE uno dei tre motori è demoltiplicato diversamente quindi dovrebbe muoversi molto più velocemente

const float StepAngle = 0.067; //0.067° è l'angolo compiuto da ciascuno step
float rpm = 2; //21 è la velocità massima di rotazioni al minuto del motore a vuoto
float f = 500000 / 3 * StepAngle / rpm; //durata del ciclo in microsecondi

void setup() {
  pinMode(2, OUTPUT); //step AsseX
  pinMode(3, OUTPUT); //step AsseY
  pinMode(4, OUTPUT); //step AsseY
  pinMode(5, OUTPUT); //direzione AsseY
  pinMode(6, OUTPUT); //direzione AsseY
  pinMode(7, OUTPUT); //direzione AsseY
  pinMode(8, OUTPUT); //enable LOW
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
}

void loop() {
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  delayMicroseconds(f / 2); // f/2 perché il ciclo è composto da una fase LOW
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  delayMicroseconds(f / 2); // ed una fase HIGH
}

Libreria AccellStepper

La libreria AccelStepper è molto utile controllare completamente i motori (la libreria aggiornata è scaricabile da qui)

Esempio

#include <AccelStepper.h>

// Define a stepper and the pins it will use
AccelStepper stepperX(1, 2, 5); // pin 2 = step, pin 5 = direction ROLL
AccelStepper stepperY(1, 3, 6); // pin 3 = step, pin 6 = direction YAW
AccelStepper stepperZ(1, 4, 7); // pin 4 = step, pin 7 = direction PITCH
void setup()
{
  pinMode(8, OUTPUT); //enable LOW
  digitalWrite(8, LOW);
}

void loop()
{
  if (stepperZ.distanceToGo() == 0)
  {
    // Random change to speed, position and acceleration
    // Make sure we dont get 0 speed or accelerations
    stepperX.moveTo(53730);
    stepperX.setMaxSpeed(1000);
    stepperX.setAcceleration(200);

    stepperY.moveTo(53730);
    stepperY.setMaxSpeed(1000);
    stepperY.setAcceleration(200);

    stepperZ.moveTo(53730);
    stepperZ.setMaxSpeed(1000);
    stepperZ.setAcceleration(200);
  }
  stepperX.run();
  stepperY.run();
  stepperZ.run();
}

Motori


Per motorizzare i diversi assi vengono usati motori stepper 42STH38 NEMA-17 per

Motore stepper 42STH38 NEMA-17 con motoriduttore 14:1

42STH38 NEMA-17 Bipolar Stepper with 14:1 Gearbox altre info qui

Motore stepper 42STH38 NEMA-17 con motoriduttore 26.85:1

42STH38 NEMA-17 Bipolar Stepper with 26.85:1 Gearbox altre info qui

Risorse

datasheet meccanica
3D stp file

Proprietà dei motori

14:1 26.85:1
Motor Type Bipolar Stepper Bipolar Stepper
Manufacturer Part Number 42STH38-1684B / 36JXS60K14 42STH38-1684B / 36JXS60K26
Step Angle 0.13° 0.067°
Al giro(360°) 2769.23 step 5373.13 step
Step Accuracy ±5 % ±5 %
Holding Torque 30 kg·cm 30 kg·cm
Rated Torque 30 kg·cm 30 kg·cm
Maximum Speed (w/1067 Motor Controller) 295 RPM 174 RPM
Acceleration at Max Speed (w/1067 Motor Controller) 1E+06 1/16 steps/sec² 600000 1/16 steps/sec²

Proprietà elettriche

Recommended Voltage 12 V
DC Rated Current 1.7 A
Coil Resistance 1.7 Ω

Proprietà fisiche

Shaft Diameter 8 mm
Rear Shaft Diameter 3.8 mm
Mounting Plate Size NEMA - 17 Weight 502 g
Number of Leads 4 Wire Length 300 mm

Proprietà motoriduttore

14:1 26.85:1
Gearbox Type Planetary Gear Ratio 13 212⁄289 : 1 26 103⁄121 : 1
Backlash Error 1 1⁄2° 1 1⁄2°
Maximum Strength of Gears 30 kg·cm 30 kg·cm
Shaft Maximum Axial Load 49.1 N 49.1 N
Shaft Maximum Radial Load 98.1 N 98.1 N

Driver a4988 e/o DRV8825?


Abbiamo impostato i driver in modalità full step quindi nessun jumpre su MS1, MS2, MS3.

Dopo gli ultimi test i DRV8825, gentilmente prestati da Benigno, si sono rivelati nettamente migliori. Fiumi di bit sull'argomento.

Entrambe le schedine sono pin-compatibili, ma si basano su un tipo diverso di chip.
IMPORTANTE la posizione del trimmer non deve trarre in inganno pena distruzione del driver.

Regolazione della corrente al motore

Per garantire un efficiente alimentazione dei motori è necessario regolare il trimmer presente sul driver A4988 mentre si monitora con un tester la tensione passante tra il giravite e la massa. Questa procedura va effettuata a motori disconnessi con la scheda alimentata Enable LOW ma senza nessun segnale step-direction.

La formula per il calcolo della VREF 1.68A / 2.5 = 0.672V

Anche se sembrano esserci delle differenze tra i diversi tipi di scheda.
Qui nella wiki reprap c'è una bella guida sulla regolazione e qui dei test due orrime guide

risorse

guida come pilotare motori passo passo

CNC shield

Pinout Arduino UNO

specifiche_motore.png - specifiche NEMA-17 (166 KB) Michele Vece, 06/26/2015 04:21 PM