Simulatore di volo¶
- Table of contents
- Simulatore di volo
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.
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
- PITCH motoriduttore 14:1 collegato all'asse Z della shield
- ROLL motoriduttore 14:1 collegato all'asse X della shield
- YAW motoriduttore 26.85:1 collegato all'asse Y della shield
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