Red COM serie + Arduino

Soy nuevo en este sitio, pero tengo un problema y es posible que pueda ayudarme. Tengo un clúster de automóvil que habla y escucha una línea serial de 0V/+12V. Mi objetivo es enviar algunos comandos adicionales al grupo de instrumentos. Estoy usando Serial2 de MEGA para esto y Serial para monitorear toda la red.

El problema es que tengo que esperar que la línea quede inactiva/silencio para que mi mensaje no interrumpa ninguna otra línea enviada por otros dispositivos en la red.

Tengo esto hasta ahora:

#define Kbus Serial2
#define get_Kbus_data serialEvent2
#define Kbus_rx 17  
#define Kbus_tx 16
byte Kdata; 
uint8_t left_blinker[10]={0xD0, 0x08, 0xBF, 0x5B, 0x20, 0x00, 0x04, 0x00, 0x00, 0x18};
int time_Kbus;
void setup()
{
  pinMode(Kbus_rx,INPUT_PULLUP); 
  pinMode(Kbus_tx,OUTPUT);
  Serial.begin(9600, SERIAL_8E1); 
  Kbus.begin(9600, SERIAL_8E1);

}
void loop()
{

if(millis()- time_Kbus > 1 ) Kbus.write(left_blinker, sizeof(left_blinker));     

}
void get_Kbus_data()
{
  Kdata = Kbus.read(); 
  Serial.println(Kdata,HEX); 
//  Serial.write(Kdata); 
  time_Kbus = millis();  
}

Estoy usando dos optoaisladores para obtener las señales adecuadas de 0V/+12V.

esquemático

simular este circuito : esquema creado con CircuitLab

Estoy usando optos 4N35 y un 2N3904 como Q1

He notado una cosa mientras trabajaba con esto. El Arduino no envía los ceros iniciales, como 0x08 sale como> 8, ¿entonces tal vez el extremo receptor no lo reconozca?

Puedo leer la línea usando este circuito y otro código, pero no he probado el lado del "remitente".

Creo que esto es todo lo que tengo.

ACTUALIZACIÓN # 1 = Falta el cruce entre los dos optos y la línea GND arreglada.

¿Comprobaste la velocidad de los opto? tanto el ascenso como la caída.
El protocolo de bus de su clúster es UART 8E1 9600. Tenga en cuenta que 8 Even es poco probable donde 8N1, 7E1 o 7O1. No sigo la declaración "0x08 sale como> 8 s"
Quise decir que estoy tratando de enviar esto: D0 08 BF 5B 20 00 04 00 00 18 Arduino lo convierte en esto: D08BF5B20040018 "La capa física del bus es una configuración de colector abierto elevada (+12v) por el bus, y bajada por el hablante. Esto significa que el voltaje normal en el cable es +12v (el voltaje de la batería, o Vbatt). Se transmite un bit bajando o cortocircuitando el bus con tierra momentáneamente. Esto es lo contrario de muchas señales digitales donde el voltaje normal es 0v y se eleva alto para enviar un bit. Las comunicaciones en serie en el bus son 9600 bps, 8 bits de datos, paridad uniforme, 1 bit de parada".
Excepto al principio (D0 08 se convierte en D0 8B) todas las demás corrupciones son pérdidas de "00". ¿Es esto una pista? Ignórame si estoy siendo estúpido.
Es como D0 es la ID de la unidad emisora ​​08 es la longitud BF es el objetivo y los comandos reales 5B son para el estado de la lámpara y los bytes de control. 18 al final es la suma de comprobación. D0 08 BF 5B 20 00 04 00 00 18 Significa lo siguiente: De LCM (Módulo de control de luz) a Global: Lámpara Satus: Indicador_Izquierdo Indicador_sincronización Todo_ok Entonces, si el Arduino decide que no necesitamos esos 0, será un completo desastre. Al igual que si no esperamos la autorización de comunicación.

Respuestas (3)

No estoy seguro de la forma en que tiene conectado el diodo de opto1; creo que debería tener su unión con el emisor de opto2 conectado a tierra.

Si rastrea el circuito, tiene bus-> R5-> diodo-> transistor-> bus; esto no puede hacer nada sensato; no puede pasar corriente a través de ese circuito porque no hay una tercera conexión a tierra o energía.

Tal vez lo hayas dibujado mal, pero tal como está, es probable que nadie te ayude a menos que esté arreglado porque nadie puede saber realmente lo que estás tratando de lograr. ¿Puede ser que esté equivocado?

ingrese la descripción de la imagen aquí

probablemente el emisor de opto2 y el cátodo de opto1 estén destinados a conectarse a tierra.
@mpflaga eso es lo que dije amigo, pero gracias por la confirmación.
¡Sí, lo hice mal! :D Está conectado a tierra. La velocidad del 4N35 es tr = 7 μs, tf = 7 μs según la hoja de datos, esto es "Conmutación de alta velocidad"

Creo que su código y circuito están enviando la cadena correcta. Donde está su código de recepción está eliminando los ceros acolchados iniciales (como lo indica el comentario de Andy)

Como estás enviando

D0 08 BF 5B 20 00 04 00 00 18

y declara que está recibiendo D08BF5B20040018, donde si organiza los mismos datos de la siguiente manera, parece ser correcto.

D0  8 BF 5B 20  0  4  0  0 18

Veo tu código usando:

Serial.println(Kdata,HEX); 

y pensaría que esto sería obvio en la salida, el salto de línea destacando cada carácter recibido.

Tenga en cuenta que el byte recibido sigue siendo un número entero independientemente de que se elimine la visualización de la impresión del cero inicial. Para ver ambos nibbles, incluidos los ceros iniciales, puede usar la función printf.

#include <stdio.h>
...
sprintf(charVal, "%02X", Kdata);
Serial.println(charVal);
Gracias :) Ahora tengo la información de depuración correcta. Pero no puedo ver el mensaje en la red. (Estoy usando otro dispositivo en otra computadora para monitorear la comunicación). Tal vez sea el circuito, revisaré todo una vez más para asegurarme de que funciona como debería.

Recogí otras piezas del sistema k-bus (ibus), por lo que parece que me faltaba algo en una línea interna. Estoy usando ~el mismo código (ha sido portado a un duemilanove) y ahora funciona de maravilla. Si alguien necesita ayuda con proyectos relacionados con k-bus (ibus), comuníquese conmigo.ingrese la descripción de la imagen aquí