comunicación entre 2 fallos de arduino cuando la fuente de alimentación externa está enchufada

1

Tengo un mega arduino que se comunica con un arduino leonardo.

el leonardo controla algunos motores (en otras palabras, le dice al leonardo cuántos pasos hay que hacer ... leonardo es un coprocesador del motor).

para las pruebas, intento enviar el número 20 desde el mega al leonardo. Envié el número como una secuencia de char, con 2 char de obtentor, así que en este caso estoy enviando 'M > 0020' como 6 char (6 bytes). leonardo envía el estado (listo / ocupado) de vuelta al maestro a través del pin4 (esto es para evitar los interrputs en Wire.h que pueden agregar demora en el código del motor si el maestro requiere datos al esclavo).

La comunicación

parece estar bien, pero si conecto la fuente de alimentación (12V), la comunicación se bloquea. si reinicio el mega, el leonardo lee 11049 (no tengo el tablero allí, podría ser un número diferente, pero siempre es el mismo), los recibidos son 5/6 veces el número correcto 20, luego la comunicación se bloquea y mega accidente.

Traté de desconectar todas las cosas relacionadas con el motor de leonardo, así que solo tengo 4 hilos:

  1. terreno común
  2. sda
  3. slc
  4. el cable para el estado (listo / ocupado) del esclavo.

los problemas ocurren cada vez que enchufé la fuente de alimentación. a veces sucede que el problema se produce incluso sin alimentación externa de 12 V (por lo tanto, un cable USB que alimenta a Leonard) después de algún tiempo (media hora)

las 2 placas arduino están conectadas con un cable de 8 m (he usado el comprobador y el cable parece estar bien, era un cable para una red LAN).

alguna sugerencia?

    
pregunta nkint

1 respuesta

1

Nota: esta respuesta se basa en los comentarios anteriores.

Posiblemente la causa del problema es: * Largo cable I2C, combinado con * Diferentes fuentes de alimentación que causan que la corriente fluya en el cable de tierra del cable, causando ruido en las líneas I2C.

La solución que funcionó fue reducir la velocidad del bus I2C. Por lo general, es de 100 kHz, pero se puede reducir a 10 kHz haciendo los siguientes cambios de código (tomados de enlace )

Modificar hardware / bibliotecas / Wire / utility / twi.h:

Antiguo:

#ifndef TWI_FREQ
#define TWI_FREQ 100000L
#endif

Nuevo:

#ifndef TWI_FREQ
#define TWI_FREQ 10000L  /* 10kHz */
#define PRESCALER_10KHZ 4
#endif

Modificar hardware / bibliotecas / Wire / utility / twi.c

Antiguo:

cbi(TWSR, TWPS0);
cbi(TWSR, TWPS1);

TWBR = ((CPU_FREQ / TWI_FREQ) - 16) / 2;

Nuevo:

/* Select 4 as the prescaler value - see page 239 of the data sheet */
cbi(TWSR, TWPS1);
sbi(TWSR, TWPS0);

TWBR = ((CPU_FREQ / TWI_FREQ) - 16) / 2 / PRESCALER_10KHZ;
/*
  The documentation in twi.c is assuming a prescaler value of 1.  
  The actual equation (data sheet page 218) is 
  SCL Frequency = CPU Clock Frequency / (16 + (2 * TWBR * prescaler))
  For a rate of 10kHz with a clock speed of 16MHz, TWBR is 198.
*/

Esta publicación (http://arduino.cc/forum/index.php/topic,16793.0.html) también informa que ".. también debe eliminar los archivos:

  • hardware / bibliotecas / Wire / Wire.o
  • hardware /raries / Wire / utility / twi.o "

para asegurarte de que los cambios se vuelvan a compilar.

    
respondido por el geometrikal

Lea otras preguntas en las etiquetas