Yo estaba trabajando en un proyecto recientemente y fue el primero que estuvo involucrado lo suficiente como para hacer que el sensor de redes complicado. En fin, creo que la comunicación era el cuello de botella en términos de rendimiento general y me pregunto cómo las personas más experimentadas habría resuelto este problema. Esta es una lectura larga, pero creo que es bastante interesante, así que por favor, palo con ella. El problema fue el diseño de un autónomas dirigible, capaz de navegar un curso de obstáculos y soltar pelotas de ping pong en marrón cuadro de objetivos. Aquí va:
Los sensores
- 4D Sistemas de la uCAM-TTL de la cámara de módulo UART interface
- HMC6352 Brújula Digital - de la interfaz I2C
- Maxbotix Sonar ez4 - 1 pin interfaz analógica
Actuadores
- 2x L293D motor controladores (conectado a simple hobby motores) - Estos fueron utilizados para la unidad 6 motores de forma bidireccional. Se requiere PWM entradas para variar la velocidad. Ahora 3 de nuestros motores siempre estaban haciendo la misma cosa (los que controlaban el movimiento arriba/abajo) para que sólo se requiere de 2 salidas PWM de nuestros controladores para el control de todos los 3 motores. Los otros 3 motores que controlan el movimiento lateral de todos los necesarios de control individual (omni-direccional de movimiento) por lo que fue otro de 6 salidas PWM requiere de nuestros controladores.
- Motor Servo - PWM interfaz
Los controladores
Por razones que serán evidentes después, terminamos utilizando 2x ATmega328Ps. Hemos usado un Arduino Uno para el programa de ellos (que no tienen acceso a un ISP), pero nos fab había un encargo del PWB, así que no tiene el uso de placas arduino, ya que acaba de añadir peso innecesario a nuestro dirigible. En cuanto a por qué se eligió el ATmega328P, yo estaba muy familiarizado con el entorno de arduino y creo que eso hizo que el desarrollo de código mucho más rápido y más fácil.
Comunicación Y Procesamiento De La
- 2x Xbee Básicos
- 2x ATmega328P
- Equipo de escritorio que ejecutan C++ w/ openCV
Así como usted puede decir a partir del módulo de la cámara, la mayor parte de nuestro proyecto se basó en la visión por ordenador. Los patrioteros sólo podía llevar tanto peso y no nos sentimos cómodos aplicación de visión por computador de un microcontrolador. Así que lo que terminé haciendo fue mediante XBee para retransmitir los datos de imagen a una computadora de escritorio. Así que en el lado del servidor que hemos recibido los datos de la imagen y utilizar openCV para procesar la imagen y figura de las cosas de ella. Ahora el lado del servidor también se necesita saber la altura de información (de la sonda) y la información de la brújula.
La primera arruga fue que no eran capaces de tener la cámara controlada por un microcontrolador para un par de razones. El principal problema era la memoria interna en la que no podía lidiar con el almacenamiento de toda la estructura. Puede haber maneras de evitar esto a través de una astuta de codificación, pero para el propósito de esta pregunta, vamos a suponer que era imposible. Así que para resolver este problema, hemos tenido el lado del servidor enviar los comandos de la cámara a través de la XBee transceptor y el XBee receptor (a bordo del dirigible) tuvo su salida de cable a la cámara de entrada.
El próximo arruga fue que no hay suficientes PWM en una sola ATmega328P para el control de todos los motores DEBIDO a que la interfaz I2C utiliza uno de los pines PWM (maldito ellos...). Es por eso que hemos decidido utilizar un 2do. El código que realmente se prestaba perfectamente para el procesamiento en paralelo de todos modos debido a que el control de altura de la era completamente independiente del movimiento lateral de control (para 2 micros fue probablemente mejor que uno conectado a un controlador PWM). Por lo tanto, U1 fue el responsable de 2 salidas PWM (arriba/abajo) y la lectura de la sonda. U2 fue el responsable de la lectura de la brújula, el control de 6 salidas PWM (los motores laterales), y también la lectura de la Sonda. U2 también era responsable de recibir comandos desde el servidor a través del XBee.
Que llevó a nuestro primer problema de comunicación. El XBee DOUT línea estaba conectado al microcontrolador y la cámara. Ahora, por supuesto, hemos diseñado un protocolo para que el micro de comandos sería omitir los comandos de la cámara y los comandos de la cámara sería ignorar micro comandos, de modo que estaba bien. Sin embargo, la cámara, cuando se ignoran el micro de comandos, enviaría NAK datos en su línea de salida. Ya que la orden era para la micro necesitábamos alguna manera, para desactivar la salida de la cámara para el XBee. Para solucionar esto, tomamos el micro de control 2 Fet que estaban entre la cámara y el XBee (que es la primera FET) y también entre U2 y el XBee (que es la segunda FET). Por lo tanto, cuando la cámara estaba tratando de enviar información al servidor la primera FET fue 'on' y el segundo FET fue 'off'. Por desgracia, no parecía ser algún tipo de cruz hablar con este método y, a veces, cuando el servidor estaba tratando de recibir los datos de altura de, por ejemplo, se podría leer un NAK del XBee.
Para darles una idea de cómo funcionaba aquí un par de ejemplos:
- Las solicitudes del servidor de una imagen - PIC_REQUEST pasa a través de XBee y llega a U2 y a la cámara. U2 la ignora y la cámara envía los datos de la imagen.
- Servidor acaba de terminar el procesamiento de una imagen y es el envío de datos del motor de decirle dirigible a girar a la derecha - MOTOR_ANGLE(70) gies a través de XBee y llega a U2 y a la cámara. U2 reconoce como un micro comando y por lo tanto se apague la Cámara FET (pero tal vez la cámara ya respondió con un NAK?? quién sabe...). U2, a continuación, responde al mandato por el cambio de motor de salidas PWM. Se recurre entonces de la Cámara de la FET (esta fue la configuración por defecto ya que los datos de la imagen era lo más importante).
- El servidor se da cuenta de que hemos llegado a un punto en la carrera de obstáculos donde nuestro defecto hover altura ahora debe ser de 90 pulgadas en lugar de 50 pulgadas. SET_HEIGHT pasa a través de XBee y ocurre lo mismo que en el ejemplo 2. U2 reconoce la SET_HEIGHT comando y activa una interrupción en U1. U1 ahora sale de su altura lazo de control y espera a recibir datos en serie a partir de U2. Eso es correcto, más datos en serie. En este punto, el de U2, el FET es (y de la cámara de la FET está apagado), por lo que el servidor recibe la altura que U2 es también el envío a U1. Que era para fines de verificación. Ahora U1 restablece la variable interna para height2HoverAt. U2 ahora apaga es la FET y la cámara se vuelve FET de nuevo.
Definitivamente me dejó una buena cantidad de información, pero creo que es suficiente para entender algunas de las complicaciones. Al final, nuestros problemas eran sólo la sincronización de todo. A veces hay que ser datos en los buffers, pero only3 bytes (todos nuestros comandos de 6 secuencias de bytes). A veces queremos perder la conexión con nuestra cámara y tener que volver a sincronizar.
Así que mi pregunta es: ¿Qué técnicas ustedes sugieren que han hecho que la comunicación entre todos los componentes más fiables/robusto/simple/mejor?
Por ejemplo, sé de uno que hubiera sido para agregar un circuito de retardo entre la placa XBee y la cámara de modo que el micro que tenía una oportunidad para apagar la cámara a hablar de la línea antes de que se responda a las micro comandos con NAKs. Otras ideas como que?
Gracias y estoy seguro de que esto va a requerir muchas modificaciones, así que estad atentos.
Edit1: Empalme de la cámara de la UART de datos a través de uno de los micros no parece que sea posible para nosotros. Hay dos opciones para los datos de la cámara, primas de mapa de bits o JPEG. Para una materia de mapa de bits, la cámara sólo envía datos a usted tan rápido como puede. El ATmega328P solo tiene 128 bytes para un buffer de serie (técnicamente esto es configurable, pero no estoy seguro de cómo) y no pensamos que nos gustaría ser capaces de salir de la búfer y a través de los XBee lo suficientemente rápido. Que la izquierda JPEG método en el que se envía cada paquete y espera a que el controlador de ACK (poco apretón de manos protocl). El más rápido que esto podría ir a 115200 baudios. Ahora, por alguna razón, el más rápido de nosotros era capaz de transmitir grandes cantidades de datos a través de XBee fue 57600 baudios (esto es, incluso después de que hicimos el nodo/red de vinculación para permitir la auto-reenvío de capacidad). La adición de la parada adicional en nuestra red (cámara micro para XBee como lo opuesto a la cámara para XBee) para la micro, simplemente, ralentizado el tiempo que se tomó para transferir una imagen demasiado. Necesitábamos una cierta frecuencia de actualización de imágenes en orden para que nuestro motor de algoritmo de control para el trabajo.