X10 / Can Bus en españa

En breve CAN Bus!!! Estoy haciendo pequenyos retoques a la libreria....
Estara "chupao" !!

Igor.R eres un crack.

Mirar si es facil... ni declarar variables es necesario para empezar!!!

#include <CAN.h>


void setup()
{
  Serial.begin(115200);
  Serial.println("Empezamos...");
  CAN.begin(1);  // 1 Mbps
}

void loop()
{
  //Preparo el mensaje a enviar
  CAN_TxMsg.id=0x100;
  CAN_TxMsg.header.rtr=0;
  CAN_TxMsg.header.length=8;
  CAN_TxMsg.data[0]=0x01;
  CAN_TxMsg.data[1]=0x02;
  CAN_TxMsg.data[2]=0x03;
  CAN_TxMsg.data[3]=0x04;
  CAN_TxMsg.data[4]=0x05;
  CAN_TxMsg.data[5]=0x06;
  CAN_TxMsg.data[6]=0x07;
  CAN_TxMsg.data[7]=0x08;
  
  //Envio mensaje
  if( CAN.send(&CAN_TxMsg) )
  {
  }
  
  // Hay mensaje nuevo?
  if ( CAN.CheckNew() )
  {
    
    // Leo el mensaje almacenado en el buffer del controlador CAN externo
    if ( CAN.ReadFromDevice(&CAN_RxMsg) )
    {
      //Saco por puerto serie la trama leida
      Serial.print("ID: ");
      Serial.println(CAN_RxMsg.id,HEX);
      Serial.print("RTR: ");
      Serial.println(CAN_RxMsg.header.rtr,DEC);
      Serial.print("Length: ");
      Serial.println(CAN_RxMsg.header.length,DEC);
      Serial.print("DATA: ");
      Serial.print(CAN_RxMsg.data[0],HEX);
      Serial.print(",");
      Serial.print(CAN_RxMsg.data[1],HEX);
      Serial.print(",");
      Serial.print(CAN_RxMsg.data[2],HEX);
      Serial.print(",");
      Serial.print(CAN_RxMsg.data[3],HEX);
      Serial.print(",");
      Serial.print(CAN_RxMsg.data[4],HEX);
      Serial.print(",");
      Serial.print(CAN_RxMsg.data[5],HEX);
      Serial.print(",");
      Serial.print(CAN_RxMsg.data[6],HEX);
      Serial.print(",");
      Serial.println(CAN_RxMsg.data[7],HEX);
      Serial.println("-------------------");
    }
    
  }
  
}

Acabo de probarlo despues los ultimos retoques, y funciona a las mil maravillas!!!
Cuanto aguantare sin desarmar mi coche en busca del bus de traccion?? ]:slight_smile: ]:slight_smile:

:wink:

X10 es un protocolo anticuadillo.

Creo que por donde van los tiros de PLC (Power Line Communication) es por protocolos sobre OFDM que llevan una tecnología parecida a los routers de ADSL. Según me comentaba una persona de Maxim, las espadas entaban en alto porque había varios fabricantes y tal que ofrecían diferentes tecnologías, y España había optado por una, los frances por la solución de maxim,.... Estos protocolos tienen la ventaja que son capaces de saltar subestaciones electricas y demás.

En fin, creo que si te apetece conocer algo más de asunto, mirate estos dos chips:

Uno es el modem y el otro el Analog Front End, pero para ser sinceros está chungo ni siquiera conseguir muestras, porque son proyectos que aún no se han puesto a disposición del gran público, porque andan copn licitaciones y con historias para llevarse proyectos internacionales, y no les interesa nada más que ofrecerlo a grandes empresas.

Este otro, es la evolución de los dos anteriores

Un saludo!

P.D. hay más soluciones tipo la de MAX, pero no las conozco.....pero andan por ahi

Aun en construccion, pero esto es lo que se esta "cocinando" => http://secuduino.blogspot.com/

]:smiley:

Ostrasss!!! el Standard ECU no es el del los F-1??? :astonished:

Land Rover igual lo lleva!!!!

Ey!! veo algun "quemao" de F1 por el foro.....ja,ja,ja
Si, SECU viene de Standard ECU que es como se llama a la centralita unica en F1.... (algo mas potente que un atmega168 de 8 bits... :D)

No me esperaba que la gente lo supiera lo de SECU.... XD Eso esta muy bien!!!

Habia que ponerle un nombre!!!

:wink:

Igor R. , eres mi idolo, jejejej. Tengo una placa para bus CAN llamada arcan que funciona bien pero tengo que decir que la libreria es un poco mas dificil de digerir que la tuya.
Me puedes pasar eza pedazo de libreria?

Salu2

Hola flico,

Arcan usa un clock de 8Mhz, por lo que los bit timing son diferentes para el controlador CAN (MCP2515). Hay que hacer modificaciones en el codigo porque la libreria esta preparada para el MCP2515 a 16 MHz.... =(
Por otro lado, de momento va hard+libreria todo en un paquete.... :fearful:
La libreria usa C/C++ en vez de comandos Arduino, para ser compatible con cualquier micro Atmel (y mas rapido que digitalWrite).
Esta basada en el trabajo de kreatives-chaos.com » Ansteuerung des MCP2515 (Tutorial), pero encapsulado en una clase; anyadido buffer en Arduino (como el de Serial), autodeclaracion de 2 mensajes de tipo CAN (Tx y Rx) y la propia variable de la clase para que sea mas facil para el usuario; modificado el tema de leer cada vez un buffer del dispostivo (MCP2515 dispone de 2 buffer de recepcion) y en ese codigo de la pagina siempre tiene prioridad el buffer 0. Esto ultimo es algo que arrastran casi todas las librerias que se encuentrar por la red, porque todas usan dicho codigo como base.

A parte se puede utilizar con cualquier placa Arduino (por una parte el soft lo permite, y el hard al ser tipo "brick" en vez de shield).

Saludos

Igor R.

Ok.

Lo que si es interesante es leerse el FAQ:

Intentare ir anyadiendo info para quitarle el miedo al bus CAN .... :wink:
Con ejemplos de como cablear el bus, que es la resistencia terminadora, que es el formato intel/motorola normalmente usado en automocion, mascaras, .....

//Send trace
 CAN_TxMsg.id=0x100;
 CAN_TxMsg.header.rtr=0;
 CAN_TxMsg.header.length=8;
 CAN_TxMsg.data[0]=0x01;
 CAN_TxMsg.data[1]=0x02;
 CAN_TxMsg.data[2]=0x03;
 CAN_TxMsg.data[3]=0x04;
 CAN_TxMsg.data[4]=0x05;
 CAN_TxMsg.data[5]=0x06;
 CAN_TxMsg.data[6]=0x07;
 CAN_TxMsg.data[7]=0x08;

Igor R. no entiendo que uso se le puede dar al ID y al RTR en el mensaje que envias. Exactamente para que sirven.

Salu2

Hola flico,

Pasate por SECUduino: FAQ (Ejemplo, pregunta 9)
Tambien esta explicado el RTR en el faq.

Si despues de leerlo no entiendes, me dices.

Saludos

:wink:

9.- ¿Qué es el ID en un mensaje CAN ?
El protocolo CAN esta orientado a mensaje. Es decir, cuando se envía un mensaje no se especifica a quien va destinado.
Es el identificador lo que es usado para saber el contenido de dicho mensaje.

Gracias Igor R., si la pagina FAQ ya la habia leido pero me deja con la duda. Corrigeme si me equivoco.
Cada nodo tiene que tener un ID diferente para saber el resto de nodos quien es el remitente del mensaje.

Lo que sigo si entender que es el RTR, en el manual de can bus dice que cuanto menor sea el valor, mayor prioridad tiene el mensaje para el resto de nodos. ¿Es asi? o me he colado.

Salu2

Una ID no va lincada a un nodo. Simplemente indica que informacion hay en el mensaje. Aunque suele ser un dispositivo concreto quien la envia, no se ha de pensar en una red CAN como las redes convencionales de maestro-esclavo. Pero si que es cierto que suele ser el mismo dispositivo quien la usa.

Por ejemplo, un coche tiene:

  • Centralita motor
  • Centralita ABS (frenos)
  • Display

La centralita ABS manda el mensaje, pongamos 0x100 con las velocidades de las 4 ruedas. Como disenyo, has elegido que el ID=0x100 es el cual va a contener dicha informacion.
Todas las demas centralitas escuchan todos los mensajes de la red, y eligen si quieren usar dicha informacion o no. Estan monitorizando el bus, y cuando llega un mensaje que tiene ID=0x100, saben que dentro va a estar las 4 velocidades de rueda.
Por ejemplo, el Display la usa para mostrarte la Velocidad del coche.
Y la centralita motor lo usa para el control de velocidad, o para control de traccion,.....

Por otro lado, el ID tambien sirve para indicar prioridades. Si dos dispositivos intentan enviar a la vez informacion, aquel que envia un mensaje con ID mas baja, sera el que "gana" y el otro esperara a que el bus este libre para reenviar el otro mensaje (ID mayor).

Es decir, usas las ID mas bajas, para aquella informacion que quieres que se procese la primera. Imagina que tienes un accidente, que se detecta por la centralita del Airbag (con un acelerometro).
Pues esta envia un mensaje de alta prioridad (ID baja) para que otros dispositivos actuen (como por ejemplo parar el motor, desenchufar las bombas de gasolina,....)

Saludos

Igor R.

Para el RTR, leete => 7.- ¿Qué información hay en un mensaje CAN?
Trama del tipo Remote.

Y si no, vuelvo a contestar (asi me sirves para saber si me he explicado bien o no en el FAQ y lo voy modificando con tus feedback).

:wink:

Igor R. en cuanto al ID no me ha quedado ni la menor duda pero chico del RTR me quedo igual despues de leerlo.

Gracias por la paciencia,.

El RTR es un tipo especial de mensaje que existe en el protocolo CAN.

Sirve para casos especiales que un dispositivo desea cierta informacion. Este tipo de mensaje no es el mas utilizado, pero esencialmente lo que haces es mandar un mensaje diciendo que informacion quieres (ID) y el RTR=1 (los 8 bytes de datos no se necesitan, ya que no estas mandando nada, solo solicitando).
Aquel dispositivo que se encarga de transmitir dicha ID, cuando lee que este tipo de trama, responde con un mensaje normal y los datos, claro.

Podria tener un nodo, que de normal no esta mandado mensajes por el bus, y solo cuando alguien se lo solicita, entonces manda el mensaje.

Es decir uno dispostivo pide informacion a la red can a traves de dicho mensaje especial (RTR=1).
Normalmente, en las redes CAN, se mandan datos de forma periodica, en vez de usar dicho metodo. Aunque en sistemas criticos, o para cuando deseas chequear errores,... puedes utilizar dicho mensaje "especial".

Mas claro ahora??

:wink:

Ya he cambiado en el FAQ lo de la ID de la pregunta 9 :slight_smile:

:wink:

Clarisimo Igor R.

Gracias por la info.