Conceptos básicos de convertir su vehículo de control remoto en un sistema autónomo (abejón) utilizando un Arduino (2 / 7 paso)

Paso 2: Código parte 1

El código utilizado para este sistema se centra alrededor de la biblioteca "RCArduinoFastLib"; creado por "Can_I_Trade" del blog "RCArduino". Se trata de una excelente biblioteca que no sólo resuelve los problemas con la lectura de las señales del servo, pero también incorpora el código necesario para enviar señales a lo servos así.
Usted puede leer más acerca de la biblioteca aquí.
El archivo de encabezado y el CPP se unen a esta página simplemente cree un archivo denominado RCArduinoFastLib en la carpeta de las bibliotecas de arduino IDE y soltar estos 2 archivos en él.

Nota: no tengo el "PinChangeInt" biblioteca instalado ya sea que tal vez necesite descargar y que poner en la carpeta de bibliotecas así como para poder realizar con éxito el código de Arduino.

Este ejemplo de código siguiente es el mismo ejemplo ya viene con la biblioteca, como simplemente no puedo hacer mejor, aunque más tarde en el instructable verás las modificaciones que he hecho con el fin de influir en posiciones de servo basados en las condiciones externas y para hacerlo más aplicable a mi uso. Este código de ejemplo es sólo un simple paso a través de scrip que va a cambiar las señales del receptor de ninguna manera, lo que nos permite comprobar la integridad del circuito que crear y resolver problemas más fácilmente. Está configurada actualmente para el control de 3 líneas de señal (en este llamado: acelerador, volante y AUX) así que si necesita más a añadir en el código con el mismo formato como se utiliza en las líneas para las señales actuales.

Disculpas por el formato de texto pero no sé cómo crear un cuadro de código aquí: P lo copie en el IDE de Arduino para facilitar la lectura (si alguien comenta sobre cómo hacer esto entonces se editarlo:-P).

Por favor recuerden leer los comentarios para que sea claro en cuanto a lo que el código hace

#include < RCArduinoFastLib.h >

MultiChannels
//
rcarduino.blogspot.com
//
Un enfoque simple para la lectura de tres canales RC con pasador de cambio interrupciones
//
Ver entradas relacionadas-
http://rcarduino.blogspot.co.uk/2012/01/How-to-read-RC-Receiver-with.html
http://rcarduino.blogspot.co.uk/2012/03/Need-More-Interrupts-to-read-more.html
http://rcarduino.blogspot.co.uk/2012/01/Can-i-control-more-than-x-servos-with.html
//
rcarduino.blogspot.com
//

incluir la biblioteca de pinchangeint - vea los enlaces en la sección temas relacionados para obtener más información
#include < PinChangeInt.h >

Asignar el canal en pins
#define THROTTLE_IN_PIN 5
#define STEERING_IN_PIN 6
#define AUX_IN_PIN 7

Asignar el canal a pernos
#define THROTTLE_OUT_PIN 8
#define STEERING_OUT_PIN 9
#define AUX_OUT_PIN 10

Asignar índices de servo
#define SERVO_THROTTLE 0
#define SERVO_STEERING 1
#define 2
#define SERVO_FRAME_SPACE 3

Estos indicadores de bit se encuentran en bUpdateFlagsShared para indicar que
los canales tienen nuevas señales
#define THROTTLE_FLAG 1
#define STEERING_FLAG 2
#define AUX_FLAG 4

sostiene las banderas de actualización definidas anteriormente
bUpdateFlagsShared de uint8_t volátiles;

variables compartidas son actualizadas por el ISR y leídas por lazo.
En bucle inmediatamente tome las copias locales para que la ISR puede mantener la propiedad de la
los compartidos. Para acceder a estas en bucle primero apagamos interrupciones con noInterrupts
tomamos una copia para utilizar en bucle y la vuelta interrupciones en cuanto antes
Esto asegura que siempre somos capaces de recibir nuevas señales
unThrottleInShared de uint16_t volátil;
unSteeringInShared de uint16_t volátil;
unAuxInShared de uint16_t volátil;

Estos se utilizan para registrar el flanco ascendente de pulso en las funciones calcInput
No deben ser volátiles como sólo se utilizan en el ISR Si quisiéramos
para hacer referencia a éstos en el lazo y el ISR entonces tendrían que ser declarados volátiles
unThrottleInStart de uint16_t;
unSteeringInStart de uint16_t;
unAuxInStart de uint16_t;

uint16_t unLastAuxIn = 0;
ulVariance de uint32_t = 0;
ulGetNextSampleMillis de uint32_t = 0;
uint16_t unMaxDifference = 0;

void setup()
{
Serial.Begin(115200);
Serial.println("multiChannels");

adjuntar objetos de servo, se generan el correcto
pulsos para la conducción de controladores de velocidad electrónicos, servos y otros dispositivos
diseñado para interactuar directamente con receptores RC
CRCArduinoFastServos::attach(SERVO_THROTTLE,THROTTLE_OUT_PIN);
CRCArduinoFastServos::attach(SERVO_STEERING,STEERING_OUT_PIN);
CRCArduinoFastServos::attach(SERVO_AUX,AUX_OUT_PIN);

permite establecer una tasa estándar de 50 Hz mediante el establecimiento de un espacio del marco de 10 * 2000 = 3 Servos + 2000 7 veces
CRCArduinoFastServos::setFrameSpaceA(SERVO_FRAME_SPACE,7*2000);
CRCArduinoFastServos::begin();

usando la biblioteca PinChangeInt, coloque las interrupciones para leer los canales
PCintPort::attachInterrupt (THROTTLE_IN_PIN, calcThrottle, cambio);
PCintPort::attachInterrupt (STEERING_IN_PIN, calcSteering, cambio);
PCintPort::attachInterrupt (AUX_IN_PIN, calcAux, cambio);
}

void loop()
{
crear variables locales para sostener una copias locales de las entradas de canal
Estas se declaran estáticas que se conservarán sus valores entre llamadas a lazo.
unThrottleIn de uint16_t estáticos;
unSteeringIn de uint16_t estáticos;
unAuxIn de uint16_t estáticos;
copia local de indicadores de actualización
bUpdateFlags de uint8_t estática;

Ver banderas de actualización compartida para ver si los canales tienen una nueva señal
if(bUpdateFlagsShared)
{
noInterrupts(); desactivar interrupciones rápidamente mientras tomamos copias locales de las variables compartidas

tomar una copia local de que los canales fueron actualizados en caso de necesitar utilizar este en el resto del bucle
bUpdateFlags = bUpdateFlagsShared;

en el código actual, los valores compartidos están siempre poblados
así podríamos copiarlos sin pruebas las banderas
sin embargo en el futuro esto podría cambiar, así que vamos a
copiar sólo cuando los indicadores nos dicen que podemos.
if(bUpdateFlags & THROTTLE_FLAG)
{
unThrottleIn = unThrottleInShared;
}
if(bUpdateFlags & STEERING_FLAG)
{
unSteeringIn = unSteeringInShared;
}
if(bUpdateFlags & AUX_FLAG)
{
unAuxIn = unAuxInShared;
}

claro la copia compartida de indicadores actualizados como ya hemos tomado las actualizaciones
todavía tenemos una copia local si necesitamos usarlo en bUpdateFlags
bUpdateFlagsShared = 0;

Interrupts(); tenemos copias locales de las entradas, así que ahora podemos convertir interrumpe en
tan pronto como las interrupciones son nuevo, ya no podemos usar las copias compartidas, la interrupción
rutinas de servicio propias de estos y pueden actualizar en cualquier momento. Durante la actualización, la
copias compartidas pueden contener basura. Por suerte tenemos nuestras copias locales para trabajar con :-)
}

hacer cualquier procesamiento de aquí en adelante
Utilice únicamente lo valores locales unAuxIn, unThrottleIn y unSteeringIn, la compartida
variables unAuxInShared, unThrottleInShared, unSteeringInShared son siempre propiedad de
las rutinas de interrupción y no debe ser utilizado en bucle

el código siguiente proporciona simple pasar es una buena prueba inicial
el Arduino pasará a través de entrada del receptor como si el Arduino no existe.
Esto debe utilizarse para confirmar el circuito y la potencia
antes de realizar cualquier procesamiento personalizado en un proyecto.

Estamos comprobando para ver si ha cambiado el valor del canal, esto se indica
por las banderas. Por el simple paso por realmente no necesita comprobar esto,
pero para un proyecto más complejo donde una nueva señal requiere significativa de procesamiento
Esto nos permite sólo calcular nuevos valores cuando tengamos nuevas entradas, en lugar de
en cada ciclo.
if(bUpdateFlags & THROTTLE_FLAG)
{
CRCArduinoFastServos::writeMicroseconds(SERVO_THROTTLE,unThrottleIn);
}

if(bUpdateFlags & STEERING_FLAG)
{
CRCArduinoFastServos::writeMicroseconds(SERVO_STEERING,unSteeringIn);
}

if(bUpdateFlags & AUX_FLAG)
{
CRCArduinoFastServos::writeMicroseconds(SERVO_AUX,unAuxIn);
}

bUpdateFlags = 0;
}

rutina de servicio de interrupción simple
void calcThrottle()
{
if(PCintPort::pinState)
{
unThrottleInStart = TCNT1;
}
otra cosa
{
unThrottleInShared = (TCNT1 - unThrottleInStart) >> 1;
bUpdateFlagsShared | = THROTTLE_FLAG;
}
}

void calcSteering()
{
if(PCintPort::pinState)
{
unSteeringInStart = TCNT1;
}
otra cosa
{
unSteeringInShared = (TCNT1 - unSteeringInStart) >> 1;

bUpdateFlagsShared | = STEERING_FLAG;
}
}

void calcAux()
{
if(PCintPort::pinState)
{
unAuxInStart = TCNT1;
}
otra cosa
{
unAuxInShared = (TCNT1 - unAuxInStart) >> 1;
bUpdateFlagsShared | = AUX_FLAG;  }
}

Artículos Relacionados

Diagnóstico de vehículo RC roto: Cómo arreglar un vehículo RC

Diagnóstico de vehículo RC roto: Cómo arreglar un vehículo RC

Hola chicos! Todos sabemos tiempo cuando está jugando con su vehículo de control remoto y se rompe. ¿Desgarradora, derecho? (Ver mi juego de palabras?) Bueno, este es el Instructable para usted. Es simplemente un universal básico solución de problema
Primera persona WiFi conducción de Roombas y otros vehículos RC infrarrojo

Primera persona WiFi conducción de Roombas y otros vehículos RC infrarrojo

Pegarse un smartphone un vehículo de control remoto y tener flujo de cámara video sobre WiFi permite tiene un montón de diversión de conducción del vehículo con su control remoto viendo imágenes de él en otro dispositivo y usando el mando a distancia
LEGO Power funciones de vehículo (con Video)

LEGO Power funciones de vehículo (con Video)

este es el segundo vehículo de control remoto funciones de energía de Lego que he subido a Instructables. Si no has visto mi primer one(a tank), aquí está el enlace. Puesto que éste utiliza neumáticos de goma grande en vez de pistas, es mucho más ráp
Seis ruedas RC vehículo

Seis ruedas RC vehículo

Hola, Bienvenidos a mi Instructable sobre cómo hacer su propio vehículo de RC Six-Wheeled.Este Instructable le ayudará en el camino a la grandeza de Arduino RC! En el momento en que termines trabajando, usted tendrá su propio totalmente funcional, Ar
Arduino Powered vehículo autónomo

Arduino Powered vehículo autónomo

Unos meses atrás empecé jugando con reguladores micro Arduino como un ejercicio de aprendizaje (y diversión); Este proyecto es la culminación de. El objetivo del proyecto era crear un vehículo que puede desplazarse autónomamente a través de una serie
Vehículos de Braitenberg 1-4: vehículos que 3mot3

Vehículos de Braitenberg 1-4: vehículos que 3mot3

uno de los aspectos más interesantes de la robótica es que a veces se pueden ver hermosamente intrincadas conductas emergentes de mecanismos relativamente simples. No hacerme mal, me encanta complicadas mis diseños tanto como el ingeniero siguiente,
Seguridad de los vehículos con GSM

Seguridad de los vehículos con GSM

El objetivo principal de hacer base de vehículo robo alerta sistema GSM es aplicar la electrónica las teorías, métodos modernos de la seguridad, sistemas integrados y edad de módem de ciencia y tecnología para muchas clases de máquina de transporte.
Cómo dibujar un Simple vehículo en perspectiva

Cómo dibujar un Simple vehículo en perspectiva

¿Eres capaz de conectar dos puntos con una línea recta?Es una tarea bastante simple, pero si eres capaz de completarlo, también son capaces de dibujar cualquier cosa en el mundo de su imaginación - si tienes las herramientas adecuadas.Con la direcció
Vehículo eléctrico - una simple plataforma ligera de EV

Vehículo eléctrico - una simple plataforma ligera de EV

yo he estado esperando la llegada de la tecnología de coches eléctricos. No sólo para la suave energía tranquila, torsión amplia, baratos costes de funcionamiento y un mantenimiento mínimo, pero para diseñar y construir coches para tomar ventaja de l
Un chasis de vehículo de 3 ruedas de ingeniería

Un chasis de vehículo de 3 ruedas de ingeniería

Mi proyecto Universidad era extremadamente ambicioso. En el transcurso de un año (2011), yo y otros tres estudiantes de ingeniería mecánica había diseñado y fabrican un chasis de automóvil de carrera solar completa incluyendo el marco, suspensión, ej
Conceptos básicos de Photoshop

Conceptos básicos de Photoshop

Hola. En este tutorial mostrará usted los conceptos básicos de Photoshop. Este tutorial es para quienes son nuevos en Photoshop y quieran saber los fundamentos de la misma.Iré:Crear un nuevo proyectoHerramientas básicasCapas, grupos y guíasFiltros y
¿DIY pesado clase R/c vehículo-(electrónica)

¿DIY pesado clase R/c vehículo-(electrónica)

alguna vez construido o jugado con un pequeña r/c coche y conseguido nada sino una superficie muy plana? esos coches pequeños no pueden ir de cualquier lugar y no se llevan mucho de nada, lo que necesita ahora es un vehículo de servicio pesado. Ahora
Construcción de un vehículo Multi modo (MMV)

Construcción de un vehículo Multi modo (MMV)

*---UPDATE---*Han pasado unos meses desde instalarse en el nuevo espacio y por fin pude dedicar más tiempo a mi pequeño proyecto.  Ha crecido bastante y me refiero a bastante.  Lo que empezó como un simple precursor de media pista ahora es algo mucho
Los conceptos básicos sobre salud

Los conceptos básicos sobre salud

aquí es mi guía para evitar mitos comunes de la salud y ayudar a aquellos que quieran vivir más saludable para tamizar a través de toda la información. He oído muchas ideas falsas de una forma u otra sobre cómo vivir una vida sana. Estos días se nos