CRANE spelet (4 / 34 steg)
Steg 4: Andra omgången i koden för alternativa stegmotor och driver
Jag använde EasyDriver från SparkFun tillsammans med en NEME17 stegmotor under min första provning.
Jag har en större motor och föraren ombord från min gamla RepStrap, (NEM23 stepper med RepRap stepper motor driver v1.2 av Zach Hoeken). Använda detta kräver två mindre adujstemnts i koden.
1-aktivera stift är motsatt.
EasyDriver: Låg = Enable
Steper Driver v1.2: hög = Enable
2 - jag verkar inte kunna köra i NEM23 så fort som NEM17. Båda stiger ombord kan du växla mellan hel och halv steg. Jag är förmodligen hälften kliva på NEM23 och full kliva i NEM17. Istället för att räkna ut skillnaden, har jag bara justerat fördröjningen mellan stegen i koden.
Här är koden. Jag har lagt till anteckningar till koden för att Visa där jag har gjort ändringar.
//////////////////// ARDUINO CODE /////////////////////////////////////
joystickj med 2 krukor att styra en stepper och DC motor hastighet och riktning *** / /
Obs: modifierad för att köra NEM23 stepper med Stepper Motor Driver v1.2 från RepRap
deklarera pins för Stepper
int potPin_X = 1;
int Step_X = 13.
int Dir_X = 12;
int Enable_X = 8;
deklarera värden för stepper
int Speed_X = 0; steg hastighet (fördröjning mellan stegen)
int val_X = 0;
int h = 0;
deklarera stift för DC-motor A
int potPin_A = 2; Välj input PIN-koden för potentiometer
int val_A = 0; variabel för att lagra värdet kommer från sensorn
Deklarera variabler för DC A
int j = 0;
int Dir_A = 4;
int Speed_A = 5;
void setup() {
setup upp stepper pins
pinMode (Step_X, OUTPUT);
pinMode (Dir_X, OUTPUT);
pinMode (Enable_X, OUTPUT);
setup DC motor A stift
pinMode (Dir_A, OUTPUT);
pinMode (Speed_A, OUTPUT);
Serial.BEGIN(9600); Observera att seriell comm kan användas för att felsöka
men det kommer att sakta ner koden och bromsa stegmotor mycket (och vara förvirrande för mig)
}
void loop() {
STEPPER LÄS OCH KONTROLL / / /
Läs placeringen av joystick och beräkna värden för stegmotor
val_X = analogRead(potPin_X); läsa värdet från sensorn
h = val_X - 517; 517 är center positioner - hur långt från centrum?
h = abs(h); absolut värde
Speed_X = 70000/h; Denna matematik inverterar värdet och skalor som behövs (värde hittats genom trial and error)
Fördröjningen mellan steg bestämmer hastigheten på motorn
Så, dröjsmål upp = hastighet ner
Obs: Speed_X = 70000/h fungerade bra för denna kombination: EasyDriver -> NEM17 stepper
Speed_X = 160000/h; Obs: Hastighet beräkning för Stepper Motor Driver V1-2 (RepRap) -> NEM23 stepper
styra stepper motor / /
OBS:
för EasyDriver: hög = inaktivera
för RepReap Stepper driver v1.2: låg = avaktivera
om (val_X > = 530) {
digitalWrite(Enable_X,HIGH); aktiverar
digitalWrite (Dir_X, hög); Ange riktning
digitalWrite(Step_X,HIGH);
delayMicroseconds(2);
digitalWrite(Step_X,LOW);
delayMicroseconds(Speed_X);
}
om (val_X < = 500) {
digitalWrite(Enable_X,HIGH); / / aktivera
digitalWrite (Dir_X, låg); Andra hållet
digitalWrite(Step_X,HIGH);
delayMicroseconds(2);
digitalWrite(Step_X,LOW);
delayMicroseconds(Speed_X);
}
om (val_X < = 530 & & val_X > = 500) {
digitalWrite(Enable_X,LOW); Inaktivera stepper motor om joystic är i centrum
för EasyStepper: hög = inaktivera
för RepReap Stepper driver v1.2: låg = avaktivera
}
DC MOTOR A - LÄS OCH KONTROLL / / /
Läs placeringen av joystick och beräkna avstånd och från center
val_A = analogRead(potPin_A); läsa värdet från sensorn
j = val_A - 517; 517 är center positioner - hur långt från centrum
j = abs(j); absolut värde
sätta några gränser för j att hålla PWM värden användbara
under 100 motorn kommer inte att flytta och PWM max är 255
om (j > = 510) {
j = 510; det mesta PWM stift kan göra är 255
}
om (j < = 200 & & j > = 10) {
j = 200. under 100 PWM motorn gör en hög pich låter och rör sig inte
}
om (j < = 10) {
j = 0; under 10 är joysticken mycket nära till centrum
}
Kör DC-motor A baserat på analog insignal från joystick
om (val_A > = 530) {
digitalWrite (Dir_A, hög); andra hållet
analogWrite (Speed_A, j/2); PWM ut (delar med 2 eftersom max är 255)
}
om (val_A < = 500) {
digitalWrite (Dir_A, låg); //
analogWrite (Speed_A, j/2); //
}
om (val_A < = 530 & & val_A > = 500) {
analogWrite (Speed_A, 0); Stäng av om joysticken är i centrum
}
skriva ut värden för felsökning
Serial.Print(val_A); Skicka nummer till PC så du kan se vad det händer
Serial.Print(",");
Serial.println(j);
}