Publicado el 3 comentarios

Comunicación por modulo CAN MCP2515

MCP2515 es un controlador de red de área de controlador (Controller Area Network o CAN) que se utiliza comúnmente en sistemas embebidos para facilitar la comunicación entre dispositivos a través del protocolo CAN.

Años atrás, los coches tenían cientos y cientos de metros de cable, conectando cada interruptor directamente con, por ejemplo, las luces o la bocina. A medida que los automóviles se volvieran más complejos, esta simple lógica ya no funcionaría.

En 1986, Bosch introdujo el sistema de bus CAN, que resolvió este problema y abarató y facilitó la fabricación de automóviles. CAN es ahora el estándar de la industria y se utiliza en todo, desde automóviles y camiones hasta autobuses y tractores, e incluso aviones y barcos.

Saber cómo leer y analizar mensajes CAN en con un microcontrolador, permite obtener datos de un automóvil, como la temperatura del refrigerante, la posición del acelerador, la velocidad del vehículo y las rpm del motor, y utilizarlos en sus proyectos en el tablero.

El módulo de interfaz de bus CAN MCP2515 es la mejor solución para agregar conectividad CAN a un Microcontrolador con interfaz SPI. Este tutorial le mostrará cómo conectar el módulo MCP2515 a un Microcontrolador , pero primero, una introducción rápida al protocolo CAN.
Conceptos básicos del sistema de bus CAN

Una red de área de controlador (bus CAN) es un estándar de comunicaciones diseñado para permitir que los dispositivos del vehículo se comuniquen entre sí sin una computadora host.

Para comprender mejor el bus CAN, piense en su automóvil como un cuerpo humano. En este contexto, el bus CAN es el sistema nervioso.

Topología del bus CAN

La comunicación física se produce a través del mazo de cables del bus CAN, que consta de dos cables, CAN bajo y CAN alto. Ambos cables están trenzados firmemente para que la interferencia electromagnética afecte la señal en ambos cables de manera uniforme, minimizando así los errores.
puede par trenzado.

Los extremos más alejados del cable están terminados con resistencias de 120 ohmios. Debido a que el bus CAN es un bus de datos de alta velocidad, si el bus no está terminado, la señal se reflejará e interferirá con la siguiente señal de datos que baja por la línea, lo que podría interrumpir las comunicaciones.

La red CAN (Controller Area Network) típicamente utiliza dos cables para la transmisión de datos bidireccional: el cable CAN alto (CAN-High) y el cable CAN bajo (CAN-Low). Estos cables forman un par diferencial que permite la comunicación robusta y resistente a interferencias electromagnéticas.

La velocidad de comunicación en una red CAN puede variar. Los estándares CAN admiten velocidades de transmisión que van desde 50 Kbps (kilobits por segundo) hasta 1 Mbps (megabit por segundo). La elección de la velocidad dependerá de los requisitos específicos de la aplicación.

También es importante tener en cuenta que la distancia de la comunicación en una red CAN puede variar según la velocidad de transmisión. A velocidades más altas, la distancia efectiva de la comunicación puede ser más corta debido a la atenuación de la señal. Por ejemplo, como mencionaste, a 1 Mbps, la distancia típica puede ser de hasta 40 metros, mientras que a 50 Kbps, podría extenderse hasta 1000 metros.

Esquema del módulo de bus CAN MCP2515

Antes de ver el esquema del módulo, debe comprender un par de cosas sobre los circuitos integrados, es decir, MCP2515 y TJA1050.

MCP2515 IC es el controlador principal que internamente consta de tres subcomponentes principales: el módulo CAN, la lógica de control y el bloque SPI.

El módulo CAN es responsable de transmitir y recibir mensajes en el bus CAN. Control Logic maneja la configuración y operación del MCP2515 interconectando todos los bloques. El bloque SPI es responsable de la interfaz de comunicación SPI.

En cuanto al IC TJA1050, dado que actúa como interfaz entre el controlador CAN MCP2515 y el bus CAN físico, este IC es responsable de tomar los datos del controlador y transmitirlos al bus.

La siguiente imagen muestra el esquema del módulo CAN MCP2515 y muestra cómo MCP2515 IC y TJA1050 IC están conectados en el módulo.

Estructura del mensaje CAN:

  1. Campo de Encabezado (Header):
    • Inicio del Trama (SOF – Start of Frame): Es un bit dominante (0) que indica el inicio de la trama.
    • Campo de Arbitraje: Contiene la Identificación del Mensaje (ID) que determina la prioridad del mensaje. Los bits de menor valor tienen mayor prioridad.
    • Bit de Control: Indica si el mensaje es estándar o extendido.
    • Bit RTR (Remote Transmission Request): Indica si el mensaje es una solicitud de transmisión remota.
  2. Campo de Control: Contiene información sobre la longitud de los datos y otros bits de control.
  3. Campo de Datos (Data Field): Contiene los datos que se están transmitiendo. La longitud de este campo puede ser de 0 a 8 bytes.
  4. Campo de CRC (Cyclic Redundancy Check): Contiene bits de verificación de redundancia cíclica para garantizar la integridad de la trama.
  5. Campo de Confirmación (ACK): Después de la transmisión de la trama, los nodos receptores envían un ACK para confirmar que recibieron correctamente la trama.
  6. Campo de Separación entre Tramas (Interframe Space): Espacio entre tramas para distinguir entre tramas sucesivas.
  7. Campo de Fin de Trama (EOF – End of Frame): Indica el final de la trama.

Ahora bien: ¿Hace falta saber toda la estructura?

Podemos quedarnos con esto:

Formato del mensaje CAN:

En la comunicación CAN, los datos se transmiten en la red como un formato de mensaje particular. Este formato de mensaje contiene muchos segmentos, pero dos segmentos principales son los identificador y datos que ayuda a enviar y responder mensajes en el bus CAN.

Identificador o CAN ID:

El Identificador CAN (también conocido como CAN ID o PGN – Parameter Group Number) es crucial en la red CAN para identificar los mensajes y asignar prioridades. Aquí hay más detalles:

  1. Longitud del Identificador:
    • Puede tener una longitud de 11 bits (CAN estándar) o 29 bits (CAN extendido).
    • En CAN estándar, el identificador es de 11 bits y en CAN extendido, el identificador es de 29 bits.
  2. Prioridad:
    • En una red CAN, los mensajes con identificadores más bajos tienen mayor prioridad.
    • Los bits de menor valor en el campo de arbitraje del encabezado determinan la prioridad del mensaje.
  3. Tipos de Identificadores:
    • Estándar (11 bits): Utilizado para redes CAN estándar.
    • Extendido (29 bits): Se utiliza en redes CAN extendidas para manejar un mayor número de nodos y mensajes.
  4. Parameter Group Number (PGN):
    • En el contexto de J1939, un protocolo basado en CAN utilizado comúnmente en vehículos comerciales, el identificador se conoce como PGN.
    • El PGN se encuentra en los bits de mayor valor del identificador y agrupa mensajes relacionados.

Ejemplo de Identificador CAN estándar (11 bits): | ID10 | ID9 | ID8 | ID7 | ID6 | ID5 | ID4 | ID3 | ID2 | ID1 | ID0 |

Ejemplo de Identificador CAN extendido (29 bits): | ID28 | ID27 | ... | ID2 | ID1 | ID0 |

La combinación de identificador y bits de control en el campo de arbitraje ayuda a determinar qué mensaje tiene prioridad en el bus CAN, permitiendo una comunicación eficiente y organizada en entornos con múltiples nodos.

Datos:

los datos en un mensaje CAN representan la información real que se está transmitiendo desde un dispositivo a otro. Aquí están los detalles adicionales sobre los datos en un mensaje CAN:

  1. Campo de Datos:
    • Contiene los datos reales del sensor o control que se están transmitiendo.
    • La longitud de este campo puede variar de 0 a 8 bytes, dependiendo de la cantidad de datos que se estén enviando.
  2. Código de Longitud de Datos (DLC):
    • Indica la longitud de los datos en el campo de datos.
    • Puede tener un valor entre 0 y 8, lo que significa que el campo de datos puede contener entre 0 y 8 bytes de información.

Cables:

En sistemas CAN, se utilizan cables específicos para garantizar una transmisión de datos confiable y resistente a interferencias electromagnéticas. Aquí hay algunas características clave de los cables utilizados en redes CAN:

  1. Apantallamiento:
    • Los cables CAN suelen tener una capa de apantallamiento para proteger la señal de posibles interferencias electromagnéticas (EMI).
    • El apantallamiento ayuda a prevenir la entrada o salida de ruido electromagnético que podría afectar la integridad de las señales CAN.
  2. Pares Trenzados:
    • Los cables CAN suelen ser de par trenzado, lo que significa que hay dos conductores entrelazados a lo largo del cable.
    • La torsión de los pares ayuda a reducir la interferencia electromagnética entre los cables, mejorando la calidad de la señal.
  3. Impedancia Característica:
    • Los cables CAN están diseñados para tener una impedancia característica específica (generalmente 120 ohmios) para minimizar las reflexiones de la señal y garantizar una transmisión de datos adecuada.
    • La impedancia característica se mantiene constante a lo largo del cable para evitar distorsiones en la señal.
  4. Conectores:
    • Los conectores utilizados son generalmente del tipo macho-hembra y cumplen con estándares específicos.
    • Los conectores comunes incluyen conectores de 9 pines en aplicaciones automotrices y conectores de tipo D-sub en aplicaciones industriales.
  5. Longitud del Cable:
    • La longitud del cable CAN está limitada por la velocidad de transmisión y la calidad de la señal que se desea mantener.
    • En redes CAN estándar, la longitud máxima típica es de 40 metros, pero en aplicaciones específicas, como en vehículos, se pueden usar repetidores para extender la longitud total del bus CAN.
  6. Resistencia de Terminación:
    • Al final del bus CAN, se suelen colocar resistencias de terminación de 120 ohmios para evitar reflexiones de la señal y mejorar la integridad de la transmisión.

Es importante seleccionar cables adecuados y seguir las especificaciones recomendadas para garantizar un rendimiento confiable en las redes CAN. Las características específicas pueden variar según el entorno de aplicación, como automoción, industrial o sistemas embebidos.

Conexión con Placa de Desarrollo tipo Uno (Atmega328P)

Código para compilar con IDE:

Si bien ya vamos por la versión 2.veintipico, soy fan de la 1.8.19 ¿Por qué será?

Código para Transmitir

#include <SPI.h>
#include <mcp2515.h>

struct can_frame canMsg;
MCP2515 mcp2515(10);


void setup() {
  Serial.begin(115200);
  
  mcp2515.reset();
  mcp2515.setBitrate(CAN_125KBPS);
  mcp2515.setNormalMode();
  
  Serial.println("------- Escribir tecnología CAN ----------");
  Serial.println("ID  DLC   DATA");
}

void loop() {
  if (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK) {
    Serial.print("El ID es: "); // print ID
    Serial.print(canMsg.can_id, HEX); // print ID
    Serial.print(", dlc:  "); 
    Serial.print(canMsg.can_dlc, HEX); // print DLC
    Serial.print(", mensaje: ");
    
    for (int i = 0; i<canMsg.can_dlc; i++)  {  // print the data
      Serial.print(canMsg.data[i],HEX);
      Serial.print(" | ");
    }

    Serial.println();      
  }
}

ver en github

Código para recibir:

#include <SPI.h>
#include <mcp2515.h>

struct can_frame canMsg1;
struct can_frame canMsg2;
MCP2515 mcp2515(10);


void setup() {
  canMsg1.can_id  = 0x0F6;
  canMsg1.can_dlc = 8;
  canMsg1.data[0] = 0x8E;
  canMsg1.data[1] = 0x87;
  canMsg1.data[2] = 0x32;
  canMsg1.data[3] = 0xFA;
  canMsg1.data[4] = 0x26;
  canMsg1.data[5] = 0x8E;
  canMsg1.data[6] = 0xBE;
  canMsg1.data[7] = 0x86;

  canMsg2.can_id  = 0x036;
  canMsg2.can_dlc = 8;
  canMsg2.data[0] = 0x0E;
  canMsg2.data[1] = 0x00;
  canMsg2.data[2] = 0x00;
  canMsg2.data[3] = 0x08;
  canMsg2.data[4] = 0x01;
  canMsg2.data[5] = 0x00;
  canMsg2.data[6] = 0x00;
  canMsg2.data[7] = 0xA0;
  
  while (!Serial);
  Serial.begin(115200);
  
  mcp2515.reset();
  mcp2515.setBitrate(CAN_125KBPS);
  mcp2515.setNormalMode();
  
  Serial.println("Ejemplo: Leer tecnología CAN");
}

void loop() {
  mcp2515.sendMessage(&canMsg1);
  mcp2515.sendMessage(&canMsg2);

  Serial.println("Messages sent");
  
  delay(1000);
}

ver en github

Publicado el 1 comentario

Utilización de Estructuras struct{};

Así como las matrices permiten definir el tipo de variables que pueden contener varios elementos de datos del mismo tipo, ee manera similar, las Estructuras son otro tipo de datos definido por el usuario que permite combinar elementos de datos de diferentes tipos.

En C, las estructuras son una colección de variables agrupadas por conveniencia.

En C++ son lo mismo que una clase excepto que los miembros de la estructura son públicos por defecto.

struct pcb
{
  String model ; // Nombre del modelo
  int npd ;       // Numero de pines digitales
  int npa ;       // Numero de pines analogicos
  float volt ;    // Tension de funcionamiento
} ;

void setup() {

  Serial.begin(115200);
  pcb PLACA_UNO_R3;

  // Asignación de valores
  PLACA_UNO_R3.model = "uno" ;
  PLACA_UNO_R3.npd = 13 ;
  PLACA_UNO_R3.npa = 5 ;
  PLACA_UNO_R3.volt = 5.0F ;

  // Lectura de valores
  int numpd = PLACA_UNO_R3.npd ;
  float voltage = PLACA_UNO_R3.volt ;

  Serial.print("\nVoltaje: ");
  Serial.println(voltage);
  
  Serial.print("Numero de pines digitales: ");
  Serial.println(numpd);
  
  Serial.print("Numero de pines analogicos: ");
  Serial.println(PLACA_UNO_R3.npa);  
    
  Serial.print("Modelo de PCB: ");
  Serial.println(PLACA_UNO_R3.model);

}

void loop() {

}
Publicado el Deja un comentario

Diseño

En la Mecatrónica, como en la Arquitectura y en la Ingeniería Aeroespacial,

Lo que conecta los sistemas y estructuras aisladas para conformar un todo de manera armoniosa es el Diseño.

 

Así es, como por Diseño los coches dejaron de tener una Carrocería Estructural + Una cubierta, y pasaron a sostenerse por un Chasis que cumplía ambas funciones con el agregado de la plasticidad necesaria para absorber impactos.

 

En la realización de dispositivos con Programación y la Electrónica pasa algo similar.

 

 

Publicado el

Driver LED: BARRA con tecnología INDEXABLE

Este prototipo diseñado en Barcelona cuenta con sensoor de movimiento y control por ENCODER/DIAL retroiluminado

Ofrece respuesta interactiva y conexión con las de su tipo.

Deja una pregunta abierta ¿Por qué no?

No todo lo que es oro brilla. Y es que las lámparas en general parecieran brillar más que la calidad de su luz.

CHEBA fue diseñada para brillar por lo que tiene adentro.

Publicado el 2 comentarios

Programación estructurada

La programación estructurada es un paradigma de programación orientado a mejorar la claridad, calidad y tiempo de desarrollo de un programa de computadora recurriendo únicamente a subrutinas y a tres estructuras de control básicas: secuencia, selección (if y switch) e iteración (bucles for y while); asimismo, se considera innecesario y contraproducente el uso de la transferencia incondicional (GOTO); esta instrucción suele acabar generando el llamado código espagueti, mucho más difícil de seguir y de mantener, además de originar numerosos errores de programación.

 

Algunos ejemplos de la sintaxis utilizada para delimitar bloques en diferentes lenguajes de programación son:

  1. ALGOL 68: Utiliza palabras clave como if y fi para delimitar bloques, por ejemplo:

    bash
  • if condition then statement1; statement2; fi
  • PL/I y Pascal: Utilizan palabras clave como BEGIN y END para delimitar bloques, por ejemplo:

    sql
  • BEGIN statement1; statement2; END
  • Python: Utiliza sangría de espacio en blanco para delimitar bloques, por ejemplo:

    python
  • if condition: statement1 statement2
  • C y muchos lenguajes posteriores: Utilizan llaves {} para delimitar bloques, por ejemplo:

    c
  1. if (condition) { statement1; statement2; }

La consistencia en la delimitación y estructura de los bloques es crucial para la legibilidad y mantenibilidad del código. Los bloques también juegan un papel importante en la determinación del ámbito de las variables y en el control del flujo de ejecución del programa.

 

Elementos


Estructuras de control

Siguiendo el teorema del programa estructurado, todos los programas se ven como compuestos de estructuras de control:

<pre class="wp-block-syntaxhighlighter-code"><strong>Sequence</strong>: declaraciones ordenadas o subrutinas ejecutadas en secuencia.
<strong>Selection</strong>: una o varias instrucciones se ejecutan dependiendo del estado del programa. Esto generalmente se expresa con la palabra clave como if..then..else..endif. La declaración condicional debe tener al menos una condición verdadera y cada condición debe tener un punto de salida como máximo.
<strong>Iteration</strong>: una instrucción o bloque se ejecuta hasta que el programa alcanza un cierto estado, o se han aplicado operaciones a cada elemento de una colección. Esto generalmente se expresa con palabras clave como while, repeat, for o do..until. A menudo, se recomienda que cada bucle solo tenga un punto de entrada (y en la programación estructural original, también solo un punto de salida, y algunos lenguajes lo imponen).
<strong>Recursion</strong>: una declaración se ejecuta llamándose repetidamente a sí misma hasta que se cumplen las condiciones de terminación. Si bien en la práctica son similares a los bucles iterativos, los bucles recursivos pueden ser más eficientes desde el punto de vista computacional y se implementan de manera diferente como una pila en cascada.</pre>

Representación gráfica de los tres patrones básicos (secuencia, selección y repetición) utilizando diagramas NS (azul) y diagramas de flujo (verde).
Subrutinas

Subrutinas son las unidades a las que se puede llamar, como procedimientos, funciones, métodos o subprogramas. Se utilizan para permitir que una sola declaración haga referencia a una secuencia.
BloquesOrígenes de la programación estructurada

A finales de los años 1970 surgió una nueva forma de programar que no solamente permitía desarrollar programas fiables y eficientes, sino que además estos estaban escritos de manera que se facilitaba su comprensión en fases de mejora posteriores.

El teorema del programa estructurado, propuesto por Böhm-Jacopini, demuestra que todo programa puede escribirse utilizando únicamente las tres instrucciones de control siguientes:

Secuencia.
Instrucción condicional.
Iteración (bucle de instrucciones) con condición inicial.

Solamente con estas tres estructuras se pueden escribir todos los programas y aplicaciones posibles. Si bien los lenguajes de programación tienen un mayor repertorio de estructuras de control, estas pueden ser construidas mediante las tres básicas citadas.

Historia
Fundamentación teórica

El teorema del programa estructurado proporciona la base teórica de la programación estructurada. Señala que la combinación de las tres estructuras básicas, secuencia, selección e iteración, son suficientes para expresar cualquier función computable. Esta observación no se originó con el movimiento de la programación estructurada. Estas estructuras son suficientes para describir el ciclo de instrucción de una unidad central de procesamiento, así como el funcionamiento de una máquina de Turing. Por lo tanto, un procesador siempre está ejecutando un «programa estructurado» en este sentido, incluso si las instrucciones que lee de la memoria no son parte de un programa estructurado. Sin embargo, los autores usualmente acreditan el resultado a un documento escrito en 1966 por Böhm y Jacopini, posiblemente porque Dijkstra había citado este escrito.4​ El teorema del programa estructurado no responde a cómo escribir y analizar un programa estructurado de manera útil. Estos temas fueron abordados durante la década de 1960 y principio de los años 1970, con importantes contribuciones de Dijkstra, Robert W. Floyd, Tony Hoarey y David Gries.
Debate

P. J. Plauger, uno de los primeros en adoptar la programación estructurada, describió su reacción con el teorema del programa estructurado:

Nosotros los conversos ondeamos esta interesante pizca de noticias bajo las narices de los recalcitrantes programadores de lenguaje ensamblador que mantuvieron trotando adelante retorcidos bits de lógica y diciendo, ‘Te apuesto que no puedes estructurar esto’. Ni la prueba por Böhm y Jacopini, ni nuestros repetidos éxitos en escribir código estructurado, los llevaron un día antes de lo que estaban listos para convencerse.5​

Donald Knuth aceptó el principio de que los programas deben adaptarse con asertividad, pero no estaba de acuerdo (y aún está en desacuerdo)[cita requerida] con la supresión de la sentencia GOTO. En su escrito de 1974 «Programación estructurada con sentencias Goto», dio ejemplos donde creía que un salto directo conduce a código más claro y más eficiente sin sacrificar demostratividad. Knuth propuso una restricción estructural más flexible: debe ser posible establecer un diagrama de flujo del programa con todas las bifurcaciones hacia adelante a la izquierda, todas las bifurcaciones hacia atrás a la derecha, y sin bifurcaciones que se crucen entre sí. Muchos de los expertos en teoría de grafos y compiladores han abogado por permitir solo grafos de flujo reducible[¿quién?][¿cuándo?].

Los teóricos de la programación estructurada se ganaron un aliado importante en la década de 1970 después de que el investigador de IBM Harlan Mills aplicara su interpretación de la teoría de la programación estructurada para el desarrollo de un sistema de indexación para el archivo de investigación del New York Times. El proyecto fue un gran éxito de la ingeniería, y los directivos de otras empresas lo citaron en apoyo de la adopción de la programación estructurada, aunque Dijkstra criticó las maneras en que la interpretación de Mills difería de la obra publicada.

Habría que esperar a 1987 para que la cuestión de la programación estructurada llamara la atención de una revista de ciencia de la computación. Frank Rubin lo hizo en ese año, con el escrito: «¿“La sentencia GOTO considerada dañina” se considera dañina?». A este le siguieron numerosas objeciones, como una respuesta del propio Dijkstra que criticaba duramente a Rubin y las concesiones que otros autores hicieron cuando le respondieron.
Resultado

A finales del siglo XX, casi todos los científicos están convencidos de que es útil aprender y aplicar los conceptos de programación estructurada. Los lenguajes de programación de alto nivel que originalmente carecían de estructuras de programación, como FORTRAN, COBOL y BASIC, ahora las tienen.
Ventajas de la programación estructurada

Entre las ventajas de la programación estructurada sobre el modelo anterior (hoy llamado despectivamente código espagueti), cabe citar las siguientes:

* Los programas son más fáciles de entender, pueden ser leídos de forma secuencial y no hay necesidad de tener que rastrear saltos de líneas (GOTO) dentro de los bloques de código para intentar entender la lógica interna.
* La estructura de los programas es clara, puesto que las instrucciones están más ligadas o relacionadas entre sí.
* Se optimiza el esfuerzo en las fases de pruebas y depuración. El seguimiento de los fallos o errores del programa (debugging), y con él su detección y corrección, se facilita enormemente.
* Se reducen los costos de mantenimiento. Análogamente a la depuración, durante la fase de mantenimiento, modificar o extender los programas resulta más fácil.
* Los programas son más sencillos y más rápidos de confeccionar.
* Se incrementa el rendimiento de los programadores.