He construido este sensor ID para una pista de slot de Scalextric, basado en un PIC12F629. El sensor de identificación envía la identificación de un automóvil detectado como una señal RS232 en un pin (nivel TTL).
Mi pregunta es, ¿cómo puedo recibir datos de cuatro de estos microcontroladores en el USART de otro microcontrolador (PIC18F2550)?
Se me ocurrieron estas posibilidades:
Cada chip sensor de ID se codificará con un identificador que se envía como parte de los datos, para que puedan separarse en el extremo receptor.
Actualización: se agregó más información sobre el hardware del sensor.
Si configura su protocolo para que los autos solo respondan a las consultas del controlador, entonces puede vincular (al menos en el nivel lógico) a todos juntos.
El truco es si tiene RS-232 real (con 1 = -6 a -12 V y 0 = 6 a 12 V) o solo una línea lógica estándar (1 = VCC, 0 = GND). O la hoja de datos o un alcance deben responder a esto.
Si es lógica estándar, podría ser muy fácil. Si sus sensores pueden controlar sus controladores de salida, prográmelos para que no controlen la salida a menos que se envíe un mensaje. Si tiene que dejar el controlador de salida encendido todo el tiempo, haga que maneje uno o dos transistores para hacer una configuración de "colector abierto", conecte todos los colectores de los sensores juntos, levante la línea conectada a VCC y conéctela a el pin RX de su controlador principal. Esto funciona porque el protocolo RS-232 está inactivo en un estado lógico 1. Si se utilizan niveles de señal RS-232, entonces debe cambiar un poco la configuración del transistor, pero seguirá siendo de colector abierto en el fondo.
El controlador principal simplemente le pide a cada sensor sus datos en secuencia. Cada sensor responde cuando se le pregunta. De esa manera, no tendrá más de uno manejando la línea RX a la vez, que es el objetivo principal.
Ahora, si no puede hacer que sus sensores hablen solo cuando se les habla... entonces su problema se volvió mucho más difícil. Tanto que la respuesta simple es darle a cada sensor su propio puerto serie, tal vez usando controladores de 8 pines como administradores de sensores, que luego se pueden conectar en un bus serie cooperativo. Otras técnicas, como la detección de colisiones con retransmisión de mensajes (como lo hizo 10base-T Ethernet), son mucho más complejas.
Si su sensor puede acomodar una línea "lista" y diferir cualquier evento que llegue cuando no está confirmado, transmitiéndolos cuando lo esté, su mejor apuesta puede ser enviar un cable ocupado separado a cada sensor y usar una puerta "Y" para combinar las señales de todos los sensores. Sugeriría que si tiene cuatro sensores, debe alternar los cables "listos" en forma rotativa, con algún tiempo "muerto" entre ellos (cuando nadie está "listo"); si entra un byte durante el tiempo "muerto", asuma que fue enviado por el último sensor activo. Establezca el tiempo "listo" lo suficientemente largo para que un sensor pueda reaccionar, y el tiempo muerto lo suficientemente largo para que un sensor tenga tiempo de terminar de transmitir un evento que ocurre justo antes de que su línea "listo" sea desactivada.
Editar
Según descripciones adicionales, dado que aparentemente cada sensor tiene un número de identificación conocido distinto, creo que el mejor enfoque puede ser tener una sola línea en serie que esté conectada a una salida PWM a través de una resistencia y un diodo paralelos, para que se extraiga sube por 1,900 us cada 2 ms pero baja por 200 us (si uno pudiera tener un interruptor PWM entre activo-bajo y flotante, eso sería aún mejor). Tan pronto como se ve un automóvil, un sensor debe iniciar la siguiente máquina de estado, realizando un seguimiento de cuántas decenas de microsegundos han transcurrido desde que comenzó a ejecutarse.
Usando un UART, este enfoque debería permitir procesar los autos que llegan a cualquier sensor, en cualquier orden, y resolver sus tiempos dentro de 10 us, con la condición de que los autos se procesen secuencialmente a una velocidad de uno cada 2 ms, y los sensores serán "ciegos" entre el momento en que ven un automóvil y la CPU principal se pone a procesarlo. A menos que haya una gran cantidad de sensores, eso no debería representar un problema. Tenga en cuenta que la CPU principal no tiene que tener ningún tiempo preciso en nada más que su salida PWM. Todo lo demás se puede inferir del flujo de datos en serie (incluidas las "largas pausas" que resultan de los pulsos "bajos" de PWM).
Puede implementar un protocolo MODBUS en modo RTU con interfaz RS485 que funciona bien en PIC (no estoy tan seguro acerca de su PIC).
Puede tener una línea multipunto para descansar sus diferentes dispositivos de microcontrolador y tener una buena comunicación entre ellos en el UART serial.
Puede hacer que su PIC18F2550 sea un maestro que iniciará la transacción desde cualquier otro controlador 4.
Utilice la multiplexación por división de tiempo. El maestro envía un pulso de sincronización en una línea separada que los esclavos usan para restablecer un temporizador. Cuando un esclavo tiene datos para enviar, espera hasta que el temporizador iguala (número de esclavo * ancho de intervalo de tiempo) marcas antes de enviar. El intervalo de tiempo debe ser lo suficientemente largo para enviar el paquete y dar cuenta de la inexactitud del reloj entre los sensores.
Eléctricamente, es posible que desee extraer la línea TX compartida y alternar entre 0 y tri-estado para transmitir en lugar de generar corriente para afirmar un 1.
Encontré este sitio con una solución llamada BlackNet. Se basa en un protocolo bastante simple en el que la idea es que cada nodo de la red tenga su propio intervalo de tiempo. Es decir, es una especie de lógica de todos contra todos. La última imagen de la página muestra un esquema con la menor cantidad de componentes necesarios para que funcione.
Usé esta idea y simplemente conecté los dos sensores que construí directamente al pin RX en el PIC18F2550. Sin embargo, no implementé el protocolo round-robin, sino que solo puse los datos en la línea (y espero que solo uno transmita a la vez). Hasta ahora ha funcionado bastante bien...
Para futuros lectores: si es fundamental que sus datos siempre lleguen, la solución que he usado probablemente no sea una buena idea. Sin embargo, si rara vez envía datos y puede vivir con la posibilidad de que colisionen y quiere la solución más fácil posible, creo que esta es lo suficientemente buena.
Olin Lathrop
mike de simone
antu
antu