Paso 11: Código de Arduino
#include
Servo armServo; Servo baseServo;
declarar variables para los pins motor int motorPin1 = 8; EN 1 int motorPin2 = 9; EN 2 int motorPin3 = 10; En motorPin4 int 3 = 11; EN EL 4
motorSpeed int = 6000; variable para ajustar la velocidad del paso a paso / / experimentar con esto; demasiado pequeño no va a funcionar. int cuenta = 0; conteo de pasos hecha int countsperrev = 68; número de pasos por revolución para este motor
búsqueda de int [8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
int motorPos = 0; Utilizado para mantener el motor
declarar variables para los codificadores rotatorios int encPins [] = {2, 3, 7, 4, 12, 13};
volátiles int lastEncoded [] = {0, 0, 0}; encoderValue largo volátiles [] = {90, 180, 0};
void setup() {baseServo.attach(6); armServo.attach(5); //declare el motor pines como salida pinMode (motorPin1, salida); pinMode (motorPin2, salida); pinMode (motorPin3, salida); pinMode (motorPin4, salida); Serial.Begin(9600);
declarar pines de codificador rotatorio para (int i = 0; i < 6; i ++) {pinMode (encPins [i], entrada); digitalWrite (encPins [i], HIGH); //turn resistencia de pullup en};
llamada updateEncoder() cuando cualquier alto-bajo cambia visto //on interrupción 0 (pin 3), interrumpir 1 (pin 2) o interrumpa 4 (pin 7) attachInterrupt (1, update1, cambio); attachInterrupt (0, update2, cambio); attachInterrupt (4, update3, cambio);
}
void loop() {primer codificador rotatorio //check y actualización base servo. Si encoderValue (encoderValue [0] < 0) [0] = 0; si (encoderValue [0] > 180) encoderValue [0] = 180; baseServo.write(encoderValue[0]);
codificador rotatorio segunda comprobación y actualización brazo servo. Si encoderValue (encoderValue [1] < 90) [1] = 90; Si encoderValue (encoderValue [1] > 270) [1] = 270; armServo.write(int(encoderValue[1]/2));
comprobar último codificador rotatorio y ajuste la posición del motor si su más baja que la posición de codificador rotatorio. Así que sólo moverá uno paso cada lazo. Si (motorPos < int(encoderValue[2]/4)) {motorPos ++; clockwise();} else if (motorPos > int(encoderValue[2]/4)) {motorPos-; anticlockwise();} //Delay si no se utiliza el retardo de la steppermotor. Else {delay(15);}
}
//Set clavijas ULN2003 alta en secuencia de 1 a 4 //delay "motorSpeed" entre cada pin configuración (para determinar la velocidad) / / void anticlockwise() {para (int i = 0; i < 8; i ++) {setOutput(i); delayMicroseconds(motorSpeed);}}
void clockwise() {para (int i = 7; i > = 0; i--) {setOutput(i); delayMicroseconds(motorSpeed);}}
void setOutput(int out) {digitalWrite (motorPin1, bitRead (búsqueda [out], 0)); digitalWrite (motorPin2, bitRead (búsqueda de [salida], 1)); digitalWrite (motorPin3, bitRead (búsqueda [out], 2)); digitalWrite (motorPin4, bitRead (búsqueda [out], 3));}
//Rotary encoder interrumpir funciones / / /
void update1() {updateEncoder(0);}
void update2() {updateEncoder(1);}
void update3() {updateEncoder(2);}
void updateEncoder (int p) {int MSB = digitalRead(encPins[p]); //MSB = int bit más significativo LSB = digitalRead(encPins[p+3]); //LSB = bit menos significativo
if(MSB == LSB) {encoderValue [p] ++;} else {encoderValue [p]--;}
}