Paso 6: Segundo programa: servos
Ahora comienza la diversión! Utilizando el programa que he esbozado anteriormente, permite añadir algunos servos usando la biblioteca de servo por defecto. También he decidido usar un array para los datos de entrada en lugar de ocho variables independientes. Si usted tiene un Uno, que se utilizará este último, todo lo que tienes que hacer es cambiar las variables de ubicación del pin.
Esto esboce voluntad leer los 8 canales de un receptor RC y los valores via serial monitor de entrada.
Programado para el Arduino MEGA 2560
Bibliotecas incluidas
#include < Servo.h >
Definir las Variables:
const int chA = 22; Constantes variables relativos a localizaciones de pin
const int chB = 27;
const int chC = 30;
const int chD = 35;
const int chE = 38;
const int chF = 43;
const int chG = 46;
const int chH = 51;
Límites de acondicionamiento de señales
const int lo = 920;
const int Hola = 1640;
const int deadlo = 1270;
const int deadhi = 1290;
const int centro = 1280;
ch int [8]; Array para almacenar y mostrar los valores de cada canal
int ch4; Variable de salida del servo
Dirección servo; Servo dirección
la rutina de instalación se ejecuta una vez al presionar reset:
void setup()
{
inicializar la comunicación serial a 9600 bits por segundo:
Serial.Begin(9600);
Pines de entrada:
pinMode(chA,INPUT);
pinMode(chB,INPUT);
pinMode(chC,INPUT);
pinMode(chD,INPUT);
pinMode(chE,INPUT);
pinMode(chF,INPUT);
pinMode(chG,INPUT);
pinMode(chH,INPUT);
Salidas de servo:
Steer.Attach(2); Conecte el Servo de dirección al Pin PWM 2
}
Principal del programa
void loop()
{
leer los canales de entrada
CH [0] = pulseIn (chA, HIGH); Leer y guardar canal 1
CH [1] = pulseIn (chB, HIGH);
CH [2] = pulseIn (chC, HIGH);
CH [3] = pulseIn (chD, HIGH);
CH [4] = pulseIn (chE, alto);
CH [5] = pulseIn (chF, HIGH);
CH [6] = pulseIn (chG, HIGH);
CH [7] = pulseIn (chH, HIGH);
Acondicionamiento de señales de entrada
para (int i = 0; i < = 8; i ++) //Signal acondicionado lazo
{
Si (ch [i] < = lo) //Trim ruido de fondo
{
CH [i] = lo;
}
Si (ch [i] < = deadhi & & ch [i] > = deadlo) //Create banda muerta
{
CH [i] = Centro;
}
Si (ch [i] > = Hola) //Trim ruido del extremo superior
{
CH [i] = hola;
}
}
Dirección de Control de salida en el canal 4
CH4 = ch [3];
Si (ch4 > = lo & & ch4 < = deadlo)
{
CH4 = mapa (ch4, lo, deadlo, 0, 90);
}
else if (ch4 == centro)
{
CH4 = 90;
}
else if (ch4 > = deadhi & & ch4 < = Hola)
{
CH4 = mapa (ch4, deadhi, Hola, 90, 180);
}
Steer.Write(CH4);
Salidas serie
Serial.Print ("Ch1:"); Mostrar la cadena de texto en el Serial Monitor para distinguir las variables
Serial.Print (ch[0]); Imprimir el valor del canal 1
Serial.Print ("|");
Serial.Print ("Ch2:");
Serial.Print (ch[1]);
Serial.Print ("|");
Serial.Print ("Ch3:");
Serial.Print (ch[2]);
Serial.Print ("|");
Serial.Print ("Ch4:");
Serial.Print (ch[3]);
Serial.Print ("|");
Serial.Print ("Ch5:");
Serial.Print (ch[4]);
Serial.Print ("|");
Serial.Print ("capítulo 6:");
Serial.Print (ch[5]);
Serial.Print (& p. uot; | ");
Serial.Print ("Ch7:");
Serial.Print (ch[6]);
Serial.Print ("|");
Serial.Print ("Ch8:");
Serial.println (ch[7]);
Serial.Print ("dirección de la salida:");
Serial.println (ch4);
}
¿Voy a suponer que el servo tuvo una crisis nerviosa y desarrolló una marca leve? La ventana de terminal confirma que las ruedas simplemente cayeron apagado de su proyecto, ahora ¿qué? Antes de comprometerse el servo o Arduino a la casa de la tuerca es algo que se puede trabajar alrededor. El problema es cómo la biblioteca de servo Arduino genera la señal de salida requerida. Se interrumpe el programa principal para mantener el pulso de 50Hz y se entre en conflicto con la función pulsein corromper valuesbeing leer. ¿Tanto la biblioteca de servo y pulsein son interrupción basado pero que miramos a la sustitución de? Decidí eliminar la librería servo después de un montón de google-fu.