Comunicación de múltiples PIC con una PC

Tengo una tarea en la que necesito conectar 5 o más ucontrollers a una PC con el fin de enviar datos que se almacenarán en la PC. Las condiciones son las siguientes:

  • Los ucs en cuestión son PIC 16F877As; cada uno de ellos es parte de un sistema que realiza un seguimiento de la cantidad de tornillos utilizados (a partir de ahora), alimentado por DCV constante de los enchufes, por lo que la alimentación no es un problema.
  • los datos que se envían son solo números; el número actual de tornillos utilizados
  • el ambiente es el de una cadena de montaje de fábrica; los contadores de tornillos se utilizan en la línea y el ambiente es generalmente ruidoso
  • los datos recibidos por la PC se almacenarán en una tabla; Pensé que podría ocuparme de esta parte más tarde.
  • la distancia entre cada PIC es de unos 2-3 metros; la PC está al final de la línea, a unos 10 metros, el enlace entre el PIC y la PC puede ser físico o inalámbrico, aunque prefiero inalámbrico ya que es más libre de problemas (creo...), aunque la solidez de los datos enviado es prioridad
  • como de costumbre, el sistema debe hacerse para ser lo más barato posible sin sacrificar la fiabilidad

Conecté con éxito un PIC a la PC usando RS-232, así que sé lo suficiente como para que no pueda conectar fácilmente los 5 PIC directamente a una PC usando RS; Problemas demasiado problemáticos y de distancia. Lo que estoy pensando es algo así como un centro; los 5 PIC se conectan a un PIC maestro que, a cambio, obtiene los datos de los 5 PIC y los envía a la PC. He leído algunas cosas sobre I2C y creo que eso es lo suficientemente factible. También busqué soluciones inalámbricas como XBee; Obtuve SKKCA de Cytron, pero no sé cómo hacer que maneje comunicaciones de datos de muchos a uno.

¿Alguien tiene mejores ideas sobre cómo puedo lograr esto de la manera menos dolorosa y económica posible? Todo este proyecto es un espectáculo de un solo hombre, así que prefiero mantener las cosas simples y económicas.

¿Has probado el RS485 ? Tiene mejor inmunidad al ruido que RS232 y es multipunto.
¿Quizás solo desea un adaptador de puerto serie múltiple? moxa.com/product/UPort_1610-16.htm
No creo que la conexión RS-232 se pueda mantener a distancias de 5 metros o más, pero el dispositivo en sí es bueno. Además, estoy atascado en la mitad del mundo, así que, aunque puedo pedirlo, me llevará demasiado tiempo y será demasiado caro.
RS232 puede comunicarse a esas distancias, especialmente si no utiliza una velocidad de transmisión alta. Dado lo que creo que está discutiendo, no parece una gran cantidad de datos, por lo que una velocidad de transmisión lenta (por ejemplo, 2400) puede ser muy útil. lammertbies.nl/comm/info/RS-232_specs.html
@kenny: para 10 m, no debería ser necesaria una velocidad de transmisión lenta. De acuerdo con su página vinculada, 2400 baudios deberían poder correr 3,000 pies.

Respuestas (5)

No sé qué tan atascado estás en el 16F877A, pero esa es una mala elección para algo como esto. Piense en la serie 16 como solo para situaciones especiales, como un gran volumen donde importa un precio un poco más bajo, potencia extra baja o tamaño físico pequeño. No tiene ninguno de estos problemas, y el 16F877A es una pieza antigua de propósito general de todos modos.

Yo usaría algo como un 18F4580, que tiene un transceptor CAN incorporado. Su aplicación solo está pidiendo a gritos CAN. Es un bus diferencial, por lo que tiene buena inmunidad al ruido. Sus distancias se pueden manejar fácilmente incluso a la velocidad máxima de 1 Mbit/s. RS-485, como otros han mencionado, también es diferencial, pero se detiene en las especificaciones eléctricas. Tiene que diseñar su propio protocolo además de eso, teniendo en cuenta las colisiones, los reintentos, el arbitraje, los errores de bits, etc. Esto, por supuesto, es factible, pero hay muchos más pequeños errores que probablemente no sean evidentes a primera vista. Hay muchas maneras de equivocarse, y la mayoría de la gente lo hace, al menos la primera vez.

Con CAN, todo eso está definido en el estándar e implementado en el hardware. Envías un mensaje y simplemente aparece en los otros nodos. Múltiples nodos que intentan transmitir al mismo tiempo se manejan automáticamente. hay un esquema de arbitraje definido que implementan los periféricos CAN de hardware, con reintento automático hasta que el mensaje llega. Cada mensaje también contiene un CRC de 16 bits, que nuevamente se genera y verifica en el hardware.

Tomará un poco de esfuerzo aprender CAN y el periférico CAN, pero esto será menos que hacer su propio protocolo en RS-485, al menos si lo hace bien. Además, es bueno aprender CAN, mientras que RS-485 es un legado de una era pasada.

Si no puede usar un PIC con CAN integrado (aunque hay algunos con el mismo tamaño que el arcaico 16F877A), puede usar el chip CAN externo que se comunica con el PIC a través de SPI. Nuestro lanzamiento gratuito de herramientas de desarrollo de PIC en http://www.embedinc.com/pic/dload.htm incluye el código fuente para controlar el chip CAN externo y el periférico CAN interno de un 18F4580.

Necesitará algo que permita que la PC se comunique con el bus CAN, pero tales cosas están disponibles en el mercado. Tenemos nuestro propio adaptador USB a CAN que aún no se convirtió en un producto, pero estaría dispuesto a publicar el diseño y el código fuente. Si no recuerdo mal, National Instruments es una de las empresas que fabrica adaptadores CAN estándar para PC.

Obtiene mi voto: estoy de acuerdo en que esto parecería un trabajo fácil para un PIC y CAN medio decentes.
+1 para CAN, lo que deja espacio más que suficiente para futuras extensiones.
Primera vez que oigo hablar de CAN. ¿Es posible para mí hacer el CAN de forma inalámbrica o tiene que ser estrictamente físico? En cuanto al 16F877A, ese es el PIC con el que estoy más familiarizado y los que tengo ahora. Por supuesto, preferiría usarlos, pero si la situación requiere un mejor hardware, tendré que usar el PIC correcto. ¿Cuánto tiempo tomará implementar el sistema CAN en promedio?
Un adaptador USB a CAN parece caro... al menos los que encontré en una búsqueda rápida en Google, como este CANUSB ... ¿hay alguna forma en que pueda implementar un método de concentrador, con los esclavos para dominar a través de CAN, y el maestro? a la PC usando RS-232?
@Sodrohu: Claro, puede hacer su propio convertidor RS-232 a CAN. El 18F4580 tiene un periférico CAN y un UART, por lo que puede realizar la función de convertidor en un solo microcontrolador.
@Sodrohu: CAN es en realidad una especificación de protocolo que asume un bus eléctrico que pasa pasivamente a un estado y pasa al otro estado cuando es impulsado activamente por uno o más nodos. Esto casi siempre se implementa como un par diferencial terminado con 120 ohmios en cada extremo. En cualquier caso, esto no se presta bien a la radio. El uso de la radio es un tema aparte y agregará una complejidad considerable a su sistema.
@Olin Lathrop: Hiciste un buen caso con CAN. Francamente, estoy intrigado, pero creo que primero comenzaré con RS-485 para ver si es lo suficientemente bueno para la tarea actual. Además, soy bastante nuevo en la comunicación uc en general (fuera de RS232), así que estoy ansioso por probar todo solo para experimentar cómo es. Si puedo hacer funcionar el RS485, intentaré comenzar con el método CAN.
Sodrohu: Su todo, por supuesto, pero aprender a usar el hardware CAN será más fácil que diseñar, implementar y probar un protocolo RS-485 robusto por su cuenta.

RS485 es, de hecho, la solución habitual para este entorno. CAN también es una buena solución, pero puede ser demasiado para su aplicación. Realmente está diseñado para configuraciones de múltiples maestros. Sin embargo, no lo necesita ya que tiene una PC que controla el bus.

Hay una versión simplificada de CAN llamada LIN Bus que asume un solo maestro conectado a múltiples esclavos. Por lo general, se une a un bus CAN para redes más complejas. Hay chips transceptores disponibles que conectan LIN a un UART TTL estándar y algunos pines PIO. Microchip vende tres y proporciona código de soporte.

¿Hay alguna forma de hacer que el RS-485 sea inalámbrico, o es estrictamente físico?
RS-485 es un estándar de capa física para conexión por cable. Wireless será más complejo de implementar que 485 o CAN.
A partir de su descripción de su entorno, la conexión inalámbrica será mucho más compleja, porque su situación de EMI requerirá receptores sofisticados para sacar su señal de la basura y aún requerirá energía en cada punto donde necesite un sensor. Es hacer una montaña de un grano de arena.

Suponiendo que no le gusta la solución RS485 propuesta, ¿qué le parece usar RS232 en una cadena de margarita? Cada esclavo de conteo de tornillos repite todos los métodos sin configuración.

Otra opción es RFID, hacer que cada conteo de tornillos envíe una identificación/mensaje de RFID con el conteo de tornillos como parte de su identificador.

Conexión en cadena RS232: Cuando se apaga uno, se apagan todos. Bueno, no todo, pero te haces una idea. Además, todos los microcontroladores tienen que pasar por todo el ancho de banda además del trabajo que se supone que deben hacer. RFID requeriría un escáner cerca de cada unidad para asegurarse de que permanezca encendido.

Coloque un transceptor RS-485 en cada placa e implemente una red maestro-esclavo simple. Usaría un chip más moderno que el 16F877A, como el PIC16F887 o un PIC18.

¿Hay alguna ventaja obvia en usar algo más moderno que un 16F877A en esto?

Aquí la energía no es un problema, simplemente puede optar por una solución inalámbrica.

Debido a que necesita una solución de bajo costo, prefiero lo siguiente....

Primero, puede crear una red USART cableada en la que todos los pines RX estén conectados al lado TTL de un MAX único y los pines TX conectados al mismo MAX. Asigne una dirección a cada uno de los esclavos. Los esclavos permanecen inactivos en la línea de comunicación mientras continúa con todas sus demás actividades. Envíe las entradas (número de tornillos utilizados) a una cola, en este caso, simplemente una matriz.

Ahora el lado maestro,

Que es la PC y está conectado al lado RS232 del MAX. Simplemente puede hacer su propio protocolo para comunicarse con cada uno de los esclavos. La mejor manera es usar comunicación de 9 bits con detección de dirección. Puede hacer un conjunto de comandos simple de la siguiente manera,

COMANDO: ECHO_ADDRESS

VALOR HEXAGONAL: 0XAA

SIGNIFICADO: Si se recibe ECHO_ADDRESS, el esclavo direccionado devolverá su dirección.


MANDO: SEND_COUNT

VALOR HEXAGONAL: 0XA1

SIGNIFICADO: Si se recibe SEND_COUNT, el esclavo direccionado envía la cantidad de datos presentes en su búfer.


Creo que esta solución es económica y no es necesario optar por un procesador avanzado. El procesador que seleccionó tiene suficiente RAM y ROM.

Ahora, si actualiza el sistema a conectividad inalámbrica, el método más económico es obtener transceptores de RF comunes. retire el cable conectado a sus pines RX y TX e inserte el transceptor allí. Conecte el mismo transceptor de RF a su MAX. Aquí la frecuencia del transmisor en el lado MAX y la frecuencia del receptor en los esclavos deben ser iguales y viceversa.

Al seleccionar la frecuencia de RF, es mejor considerar las distorsiones del entorno.

Hola,
el inalámbrico que mencioné no es un transceptor inalámbrico moderno como Zigbee, Wi-Fi... Sugerí un transceptor de RF simple de bajo costo. En este caso no necesita una tasa de datos alta. Utilizo el módulo inalámbrico de alrededor de $2 para comunicaciones de menor velocidad de datos y ofrece un rendimiento satisfactorio. Ahora, acerca de por qué sugerí inalámbrico, la respuesta es que creo que el cliente estará más contento si no hay cables o si no se necesita cableado adicional, y el producto se ve bien.

Podemos conectar muchos pines TX juntos. Debido a que nuestro maestro controla el autobús, las posibilidades de colisión son demasiado bajas. Pero tienes razón ahí puede haber colisiones por error de comunicación. Tenemos que proteger el dispositivo de esta colisión, se puede hacer con algún aislador eléctrico.

Puede que esta no sea una solución perfecta, pero funciona para la situación actual.

La conexión inalámbrica no es simple ni barata, y es una solución deficiente para dispositivos que no se mueven y existen en un entorno eléctricamente ruidoso.
Tampoco es necesario que escribas "Gracias de antemano" y "Gracias por escuchar" debajo de todas tus publicaciones. Sus lectores le agradecerán con votos a favor, respuestas y comentarios si vale la pena leer su publicación. Por favor, detén esta práctica.
La conexión inalámbrica no es económica ni simple en comparación con los buses cableados como RS-485 o CAN. Tampoco puede conectar los pines TX de múltiples UART juntos, y ha ignorado por completo las colisiones.