Paso 9: Depósito dirección Servos de rotación continua/W
Asegúrese de que dar las gracias a mi maravilloso modelo Sid (por encima de la imagen) por ser un deporte tan buena mientras que he estado usando lo para refinar el programa.
/ * Esto esboce voluntad los valores vía serial de entrada y leer los 8 canales de un receptor RC
monitor. Programar el Arduino Uno y Adafuit Servo controlador Board(pins A5-SCL and A4-SDA).
Mi transmisor también se encuentra en modo 3 para que el stick derecho es el siguiente:
Eje vertical = canal 3
Eje horixontal = canal 4
===========================================================================================*/
Bibliotecas incluidas
#include
#include
Activar el modo de depuración para el ingreso de datos vía serie
/ * 0 = OFF, 1 = ingeniería de datos en, 2 = crudos datos sobre, 3 = valor de Servo salida,
4 = Eng crudo y salida de datos del Servo, 5 = salida de datos de la dirección de tanque, * /
const int debug = 0;
Matrices para canal pin ubicaciones y datos de un canal
const int canales = 8;
const int chPin [] = {2,3,4,5,6,7,8,9}; Ubicaciones de los pin
int chEng [8]; Almacenar datos de masajes
int chSer [8]; Almacenamiento de valor de servo
Señal de RX masaje valores
const int RXLo = 920;
const int RXHi = 1640;
const int RXDeadLo = 1265;
const int RXDeadHi = 1295;
const int RXMid = 1280;
Gamas de servo
const int serLo = 130;
const int serMid = 330;
const int serHi = 530;
const int tankLo = 250;
const int tankHi = 410;
Servos
Servo=Adafruit_PWMServoDriver(0x40) de Adafruit_PWMServoDriver;
const int freq = 50;
const int serNum = 8;
int ch3; Variable de buey de tanque
int ch4; Variable de buey de tanque
Configuración de ubicaciones de los pin, iniciar serie o comenzar I2C
void setup() {}
Si (debug > 0) {}
Serial.Begin(115200); Vamos a cuadros!
}
Pines de entrada:
para (int i = 0; i pinMode(chPin[i],INPUT);
}
servo.Begin();
servo.setPWMFreq(freq);
} //End de configuración
Principal del programa
void loop() {}
Hacia valores de chy chz, chx a chy y leer nuevos valores
para (int i = 0; i chEng[i]=pulseIn(chPin[i],HIGH);
Masaje de señal
chEng [i] = limitar (chEng [i], RXLo, RXHi); Moldura inferior y extremo superior
Si (chEng [i] < = RXDeadHi & & chEng [i] > = RXDeadLo) {//Create banda muerta
chEng [i] = RXMid;
}
Asignar valores de Eng para servos
Si (chEng [i] > = RXLo & & chEng [i] < = RXDeadLo) {//Map gama más baja de los valores
chSer [i] = mapa (chEng [i], RXLo, RXDeadLo, serLo, serMid);
}
else if (chEng [i] == RXMid) {//Map de valor medio
chSer [i] = serMid;
}
else if (chEng [i] > = RXDeadHi & & chEng [i] < = RXHi) {//Map mayor rango de valores
chSer [i] = mapa (chEng [i], RXDeadHi, RXHi, serMid, serHi);
}
} //End de bucle
Buey del tanque usando el stick derecho, outputing dos servos de rotación continua
/ * Utilizando el sistema de cuadrante cartesiano y cualquier valor dado del motor derecho se invierte a
asegurar la correcta operación * /
Primer cuadrante.
/ * Rango del tirón el servo derecho con respecto a la posición del eje vertical. Esto evitará que el
servo sistema de izquierda a la posición vertical y reducir la speed.* derecha servos /
Si (chSer [2] > = serMid & & chSer [3] > = serMid) {}
CH3 = chSer [2];
CH4=Map(chSer[3],serMid,serHi,chSer[2],serMid);
}
Segundo cuadrante
/ * Rango del tirón el servo izquierdo con respecto a la posición del eje vertical. Este no es como
Estrecho de adelante como 1 cuadrante pero el código de ejemplo siguiente que estaba usando antes debe
aspecto similar.
CH3=Map(chSer[3],serLo,serMid,serMid,serHi);
servo.setPWM(2,0,map(ch3,serHi,serMid,chSer[2],serMid));
Cómo llegué a la siguiente es por simplificación y Ahorre tiempo.* /
else if (chSer [2] > serMid & & ch3=map(chSer[3],serLo,serMid,serMid,chSer[2]) de chSer [3];
CH4 = chSer [2];
}
Tercer cuadrante
/ * La gama del tirón el servo derecho con respecto a la posición del eje vertical. El servo izquierdo
continuará viajando hacia atrás mientras que el servo derecho es slowed.* /
else if (chSer [2] < = serMid & & chSer [3] < = serMid) {}
CH3 = chSer [2];
CH4=Map(chSer[3],serMid,serLo,chSer[2],serMid);
}
Cuarto cuadrante
/ * La gama del tirón el servo izquierdo con respecto a la posición del eje vertivle, el servo derecho
será continut viajando hacia atrás mientras que el servo izquierdo es slowed.* /
else {} if(chSer[2]serMid)
CH4 = chSer [2];
CH3=Map(chSer[3],serMid,serLo,chSer[2],serMid);
}
/ * Habilitar CCW rotación invirtiendo derecha servo y servo izquierdo desvío con respecto a
el axis.* horizontal /
Si (chSer [2] == serMid & & chSer [3] > = serMid) {}
CH3 = chSer [3];
CH4=Map(chSer[3],serMid,serHi,serMid,serLo);
}
/ * Activar rotación CW por servo derecho de expedición y el servo izquierdo marcha atrás con respecto a
el axis.* horizontal /
Si (chSer [2] == serMid & & chSer [3] < = serMid) {}
CH3 = chSer [3];
CH4=Map(chSer[3],serMid,serLo,serMid,serHi);
}
Reasignación de las variables para dar mayor sensibilidad y todo el rango no es necesario para lograr la máxima velocidad.
CH3=Map(CH3,serLo,serHi,tankLo,tankHi);
CH4=Map(CH4,serLo,serHi,tankLo,tankHi);
Cambiando la señal de servo de lado derecho, señal de canal 4.
Si (ch4 > = serMid) {}
CH4=Map(CH4,serMid,serHi,serMid,serLo);
}
else if (ch4 ch4=map(ch4,serMid,serLo,serMid,serHi);
}
Salida a conductor servo
servo.setPWM(2,0,ch3);
servo.setPWM(3,0,ch4);
Salida de depuración
Si (eliminar errores == 1 || depuración == 4) //Engineering datos
{
Serial.Print ("EngData| CH1: ");
Serial.Print (chEng[0]);
Serial.Print ("| CH2: ");
Serial.Print (chEng[1]);
Serial.Print ("| CH3: ");
Serial.Print (chEng[2]);
Serial.Print ("| CH4: ");
Serial.Print (chEng[3]);
Serial.Print ("| Ch5: ");
Serial.Print (chEng[4]);
Serial.Print ("| Capítulo 6: ");
Serial.Print (chEng[5]);
Serial.Print ("| Ch7: ");
Serial.Print (chEng[6]);
Serial.Print ("| CH8: ");
Serial.Print (chEng[7]);
Serial.println ("|");
}
Si (eliminar errores == 3 || depuración == 4)
{
Serial.Print ("SerData| CH1: ");
Serial.Print (chSer[0]);
Serial.Print ("| CH2: ");
Serial.Print (chSer[1]);
Serial.Print ("| CH3: ");
Serial.Print (chSer[2]);
Serial.Print ("| CH4: ");
Serial.Print (chSer[3]);
Serial.Print ("| Ch5: ");
Serial.Print (chSer[4]);
Serial.Print ("| Capítulo 6: ");
Serial.Print (chSer[5]);
Serial.Print ("| Ch7: ");
Serial.Print (chSer[6]);
Serial.Print ("| CH8: ");
Serial.Print (chSer[7]);
Serial.println ("|");
}
Si (eliminar errores == 5) {}
Serial.Print(CH3);
Serial.Print("|");
Serial.println(CH4);
}
} //End de programa principal
Sé cómo hice el depósito dirección dista de ser óptima pero es cómo me di cuenta. No funciona el cuarto cuadrante y todavía tengo que conseguir trabajo. No era que un gran problema ya que esta es una prueba del robot de concepto de trabajo con control de RC y Arduino antes que mover toda la escala.
Me avisas si tienes alguna pregunta y haré mi mejor esfuerzo para responder y actualizar en consecuencia. Por favor incluya el paso y algún detalle explicando tu problema para ayudarme a conseguir en la misma página con usted.