Robotarm med bipolär stepper (6 / 6 steg)
Steg 6: Full master kontrollera koden
Fullständiga koden för robotarm ingår nedan.
Vi hade några problem med koden som vi använde, men eftersom vi hade också lite problem med spänning kraften, som förklaras i steg 5, vi hade svårt att sortering genom större delen av det hela. Det bör noteras att denna del av koden inte innehåller koden för sensorn.
< pre >< pre > #ifndef _stepLib_h_ < br > #define _stepLib_h_
#include "Arduino.h"
definiera vår stepper klass
klass stepMotor {
offentlig:
stepMotor (byte stepPin, byte dirPin); vår stepper objekt med variabler stepPin och dirPin
void steg (unsigned int stepFreq); vår stegmotor funktion som tar som en ingång vår stegmotor frekvens
privat:
osignerade långa _time; aktuell tid
osignerade långa _lastStepTime; tid som vi äntligen klev
osignerade långa _stepPeriod; tid mellan en halv period - det är samma som våra delay(X) del 1
byte _stepPin;
byte _dirPin;
booleska _stepCycle; definierar om vi är på hög eller låg sidan av vår steg cykel
};
#endif
#include "Arduino.h"
#include "stepLib.h"
används för att förklara vår motor och initierar det
stepMotor::stepMotor (byte stepPin, byte dirPin) {
_stepPin = stepPin;
_dirPin = dirPin;
definiera våra digitala pins som utdata
pinMode (_stepPin, produktionen);
pinMode (_dirPin, produktionen);
initiera våra digitala pins till låg
digitalWrite (_stepPin, låg);
digitalWrite (_dirPin, låg);
_stepCycle = false; Detta håller reda på vilka slutet av steg cykeln finns vi på: hög eller låg
}
funktionen ansvarig för att driva våra digitala pins hög/låg på rätt frekvens
input är kliva frekvensen
void stepMotor::step (unsigned int stepFreq) {
_time = micros(); få aktuell tid
_stepPeriod = 1000000 / stepFreq; få våra steg period (i micro-sekunder) från användaren tanke steg ofta; Vi förlorar lite av noggrannhet här eftersom vi har definierat _stepPeriod som en osignerad länge i stället för en flottör, men det är ok...
om rätt mängd tid har passerat, låt oss gå vidare och gå vidare till nästa hälften av våra steg cykel
om (_time > = _lastStepTime + _stepPeriod) {
digitalWrite (_stepPin, _stepCycle == true); en kompakt sätt att skriva antingen hög/låg till våra steg stift baserat på vart vi är på vår steg cykel
_stepCycle =! _stepCycle; då vänds helt enkelt våra Boolean
_lastStepTime = _time; Uppdatera tiden vi senast klev
}
}
#include "stepLib.h"
Ange ett konstant värde benämn stepPin och tilldela värde 8 - detta värde ändras inte under vår kod
Detta förutsätter digital stift 8 av din Arduino är ansluten till steg-ingången på din drivrutin
#define stepPin 9
Ange ett konstant värde benämn dirPin och tilldela värde 8 - detta värde ändras inte under vår kod
Detta förutsätter digital stift 9 av din Arduino är ansluten till steg-ingången på din drivrutin
#define dirPin 8
initiera ett nytt objekt i vårt stepMotor bibliotek heter reglaget
Vi är i huvudsak att förklara att vi vill lägga till en stegmotor som heter reglaget som har våra definierade stepPin och dirPin
stepMotor reglaget (stepPin, dirPin);
Setup() loop, den Arduino enda går genom detta en gång
void setup() {
}
loop() loop, Arduino kontinuerligt går igenom detta så snabbt som möjligt
void loop() {
Slider.Step(50); steg vår motor på en viss frekvens (Hz)
}
#include "stepLib.h"
definiera våra steg pins
# definiera sliderStep 9
# definiera panStep 11
# definiera tiltStep 7
definiera vår riktning pins
# definiera sliderDir 8
# definiera panDir 10
# definiera tiltDir 6
initiera ett nytt objekt i vårt stepMotor bibliotek heter reglaget
Vi är i huvudsak att förklara att vi vill lägga till en stegmotor som heter reglaget som har våra definierade stepPin och dirPin
stepMotor reglaget (sliderStep, sliderDir);
stepMotor pan (panStep, panDir);
stepMotor tilt (tiltStep, tiltDir);
Setup() loop, den Arduino enda går genom detta en gång
void setup() {
}
loop() loop, Arduino kontinuerligt går igenom detta så snabbt som möjligt
void loop() {
Slider.Step(50); steg vår motor på en viss frekvens (Hz)
Pan.Step(10); steg vår motor på en viss frekvens (Hz)
Tilt.Step(100); steg vår motor på en viss frekvens (Hz)
}
#ifndef _stepLib_h_
#define _stepLib_h_
#include "Arduino.h"
definiera vår stepper klass
klass stepMotor {
offentlig:
stepMotor (byte stepPin, byte dirPin); vår stepper objekt med variabler stepPin och dirPin
void steg (unsigned int stepFreq); vår stegmotor funktion som tar som en ingång vår stegmotor frekvens
void setDir(boolean dir); funktion som tillåter oss att sätta våra rotationsriktning
privat:
osignerade långa _time; aktuell tid
osignerade långa _lastStepTime; tid som vi äntligen klev
osignerade långa _stepPeriod; tid mellan en halv period - det är samma som våra delay(X) del 1
byte _stepPin;
byte _dirPin;
booleska _stepCycle; definierar om vi är på hög eller låg sidan av vår steg cykel
};
#endif
#include "Arduino.h"
#include "stepLib.h"
används för att förklara vår motor och initierar det
stepMotor::stepMotor (byte stepPin, byte dirPin) {
_stepPin = stepPin;
_dirPin = dirPin;
definiera våra digitala pins som utdata
pinMode (_stepPin, produktionen);
pinMode (_dirPin, produktionen);
initiera våra digitala pins till låg
digitalWrite (_stepPin, låg);
digitalWrite (_dirPin, låg);
_stepCycle = false; Detta håller reda på vilka slutet av steg cykeln finns vi på: hög eller låg
}
funktionen ansvarig för att driva våra digitala pins hög/låg på rätt frekvens
input är kliva frekvensen
void stepMotor::step (unsigned int stepFreq) {
_time = micros(); få aktuell tid
_stepPeriod = 1000000 / stepFreq; få våra steg period (i micro-sekunder) från användaren tanke steg ofta; Vi förlorar lite av noggrannhet här eftersom vi har definierat _stepPeriod som en osignerad länge i stället för en flottör, men det är ok...
om rätt mängd tid har passerat, låt oss gå vidare och gå vidare till nästa hälften av våra steg cykel
om (_time > = _lastStepTime + _stepPeriod) {
digitalWrite (_stepPin, _stepCycle == true); en kompakt sätt att skriva antingen hög/låg till våra steg stift baserat på vart vi är på vår steg cykel
_stepCycle =! _stepCycle; då vänds helt enkelt våra Boolean
_lastStepTime = _time; Uppdatera tiden vi senast klev
}
}
ges en boolesk användarindata, Ställ in vår färdriktning på den ingången
void stepMotor::setDir(boolean dir) {
digitalWrite (_dirPin, dir);
}
#include "stepLib.h"
definiera våra steg pins
# definiera sliderStep 9
# definiera panStep 11
# definiera tiltStep 7
definiera vår riktning pins
# definiera sliderDir 8
# definiera panDir 10
# definiera tiltDir 6
definiera de stift som vi har lagt våra N.O. knappar
#define Knapp1 2
#define button2 3
vår motor steg frekvenser
int sliderFreq = 300;
int panFreq = 10;
int tiltFreq = 100;
initiera ett nytt objekt i vårt stepMotor bibliotek heter reglaget
Vi är i huvudsak att förklara att vi vill lägga till en stegmotor som heter reglaget som har våra definierade stepPin och dirPin
stepMotor reglaget (sliderStep, sliderDir);
stepMotor pan (panStep, panDir);
stepMotor tilt (tiltStep, tiltDir);
Setup() loop, den Arduino enda går genom detta en gång
void setup() {
definiera våra knappen pins som input pullup typ - se http://arduino.cc/en/Tutorial/DigitalPins#.Uyphr4WN7q4
pinMode (Knapp1, INPUT_PULLUP);
pinMode (button2, INPUT_PULLUP);
}
loop() loop, Arduino kontinuerligt går igenom detta så snabbt som möjligt
void loop() {
om (digitalRead(button1) == låg & & digitalRead(button2) == hög) {/ / om Knapp1 trycks och button2 är inte intryckt
slider.setDir(true);
pan.setDir(true);
tilt.setDir(true);
} else om (digitalRead(button1) == hög & & digitalRead(button2) == låg) {/ / om btton1 inte är intryckt och button2 trycks
slider.setDir(false);
pan.setDir(false);
tilt.setDir(false);
}
om (digitalRead(button1) == låg || digitalRead(button2) == låg) {/ / om antingen knappen trycks
Slider.Step(sliderFreq); steg vår motor på en viss frekvens (Hz)
Pan.Step(panFreq); steg vår motor på en viss frekvens (Hz)
Tilt.Step(tiltFreq); steg vår motor på en viss frekvens (Hz)
}
om (digitalRead(button1) == låg & & digitalRead(button2) == låg) {/ / om båda knapparna trycks ihop
sliderFreq += 10.
panFreq += 10.
tiltFreq += 10.
Delay(10); fördröja en kort medan annars knappen dubbla pressar orsaker vår frekvens att öka alltför snabbt (vi måste göra det möjligt för användaren att släpp knapparna)
}
}
#include "stepLib.h"
definiera våra steg pins
# definiera sliderStep 9
# definiera panStep 11
# definiera tiltStep 7
definiera vår riktning pins
# definiera sliderDir 8
# definiera panDir 10
# definiera tiltDir 6
definiera de stift som vi har lagt våra N.O. knappar
#define Knapp1 2
#define button2 3
definiera våra joystick stift; Observera vi använder analog pins, inte digital
#define LRjoystickPin 27 / / vänster-höger styrspak
#define UDjoystickPin 28 / / upp-/ joystick
vår motor steg frekvenser
int sliderFreq = 50;
int panFreq = 300;
int tiltFreq = 100;
andra variabler
byte Dödband = 50; storleken på Dödband, från joystick neutral position, där vi antar vi läser 0
unsigned int LRjoyValue = 0;
unsigned int UDjoyValue = 0;
initiera ett nytt objekt i vårt stepMotor bibliotek heter reglaget
Vi är i huvudsak att förklara att vi vill lägga till en stegmotor som heter reglaget som har våra definierade stepPin och dirPin
stepMotor reglaget (sliderStep, sliderDir);
stepMotor pan (panStep, panDir);
stepMotor tilt (tiltStep, tiltDir);
Setup() loop, den Arduino enda går genom detta en gång
void setup() {
definiera våra knappen pins som input pullup typ - se http://arduino.cc/en/Tutorial/DigitalPins#.Uyphr4WN7q4
pinMode (Knapp1, INPUT_PULLUP);
pinMode (button2, INPUT_PULLUP);
pinMode (LRjoystickPin, indata);
pinMode (UDjoystickPin, indata);
}
loop() loop, Arduino kontinuerligt går igenom detta så snabbt som möjligt
void loop() {
Läs våra joystick värderingar och lagra dem
LRjoyValue = analogRead(LRjoystickPin); fungerar precis som digitalRead, men för analoga pins
UDjoyValue = analogRead(UDjoystickPin); fungerar precis som digitalRead, men för analoga pins
styra våra pan med LR joystick
om (LRjoyValue > 512 + Dödband) {/ / joystick är utanför Dödband, flytta höger
pan.setDir(true);
Pan.Step(panFreq);
} else om (LRjoyValue < 512 - Dödband) {/ / joystick är utanför Dödband, flytta vänster
pan.setDir(false);
Pan.Step(panFreq);
}
styra våra tilt med UD joystick
om (UDjoyValue > 512 + Dödband) {/ / joystick är utanför Dödband, flytta upp
tilt.setDir(true);
Tilt.Step(panFreq);
} else om (UDjoyValue < 512 - Dödband) {/ / joystick är utanför Dödband, flytta ner
tilt.setDir(false);
Tilt.Step(panFreq);
}
styra våra reglaget stepper med två knappar, precis som vi gjorde tidigare
om (digitalRead(button1) == låg & & digitalRead(button2) == hög) {/ / om Knapp1 trycks och button2 är inte intryckt
slider.setDir(true);
} else om (digitalRead(button1) == hög & & digitalRead(button2) == låg) {/ / om btton1 inte är intryckt och button2 trycks
slider.setDir(false);
}
om (digitalRead(button1) == låg || digitalRead(button2) == låg) {/ / om antingen knappen trycks
Slider.Step(sliderFreq); steg vår motor på en viss frekvens (Hz)
}
}