Go Down

Topic: Problema Comunicación I2C entre MKR1400 y MEGA (Read 235 times) previous topic - next topic

tgaumer

Aug 09, 2018, 05:55 pm Last Edit: Aug 10, 2018, 09:21 pm by surbyte
Hola,

Estoy trabajando en un proyecto para mandar mensajes de aviso utilizando el MKR1400, hasta ahora lo he hecho funcionar "bien" (el arduino MEGA manda cada 5seg un texto por I2C el MKR lo lee y manda un SMS) solamente que tengo un problema que después de muchas vueltas no se si es problema de código, de conexión o algo que debe ser de esa manera.


El problema es que primero necesito conectar el MKR y luego el MEGA, no puedo alimentar ambos al mismo tiempo, porque si los alimento al mismo tiempo el MKR nunca consigue conectarse a la red celular.

Resumiendo, para que todo funcione bien tengo que hacer los siguiente pasos
1)Conectar la alimentación pero solamente puede estar conectado el MKR (el cable que alimenta el mega desconectado)
2)espero unos 5 segundos (no importa que el MKR aun no se haya conectado a la red, para sabe ello le tengo puesto al código que encienda el led del MKR una vez que se conecto)
3) alimento el MEGA
4) empiezo a recibir mensaje de texto cada 5 segundos

Si alimento ambos al mismo tiempo el MKR se queda algo asi como trabado, ya que no conecta a la Red

anexo diagrama de conexión.


para los códigos.
Para el MKR que es el receptor estoy usando el ejemplo que viene por default para enviar SMS modificado para que lea desde la conexion I2C. Originalmente este código lo que hacia era que desde el monitor serial uno iba metiendo el numero de teléfono y el mensaje que deseabas enviar.

Code: [Select]
// Include the GSM library
#include <MKRGSM.h>

#include "arduino_secrets.h"
// Please enter your sensitive data in the Secret tab or arduino_secrets.h
// PIN Number
const char PINNUMBER[] = SECRET_PINNUMBER;

#include <Wire.h>
#define Direccion 4
byte nDato = 0;
char Cadena[32];
char Encender[] = "ABC1";      //palabra para encender
char Apagar[]   = "ABC2";        //palabra para apagar
bool flag = false;
int estado;


// initialize the library instance
GSM gsmAccess;
GSM_SMS sms;

void setup() {
  // initialize serial communications and wait for port to open:
  Wire.begin(Direccion );                // Une el bus I2C con la dirección #4
  Wire.onReceive(evento);       // Registra el evento
  Serial.begin(9600);
  estado =0;
  pinMode(6,OUTPUT);
  
  //while (!Serial) {
  //  ; // wait for serial port to connect. Needed for native USB port only
  //}
  Serial.println("SMS Messages Sender");

  // connection state
  boolean connected = false;

  // Start GSM shield
  // If your SIM has PIN, pass it as a parameter of begin() in quotes
  while (!connected) {
    if (gsmAccess.begin(PINNUMBER) == GSM_READY) {
      connected = true;
      Serial.println("GSM initialized");
      digitalWrite(6,HIGH);
    } else {
      Serial.println("Not connected");
      delay(1000);
      digitalWrite(6,LOW);
    }
  }
  Serial.println("GSM initialized");
}

void loop() {

  if (estado==1){
      Serial.print("Enter a mobile number: ");
      char remoteNum[20]="xxxxxxxxxx";  // telephone number to send sms
      //readSerial(remoteNum);
      Serial.println(remoteNum);
    
      // sms text
      Serial.print("Now, enter SMS content: ");
      //char txtMsg[200];
      //readSerial(txtMsg);
      Serial.println("SENDING");
      Serial.println();
      Serial.println("Message:");
      Serial.println(Cadena);
    
      // send the message
      sms.beginSMS(remoteNum);
      sms.print(Cadena);
      sms.endSMS();
      Serial.println("\nCOMPLETE!\n");
      estado =0;
  }
}

/*
  Read input serial
 
int readSerial(char result[]) {
  int i = 0;
  while (1) {
    while (Serial.available() > 0) {
      char inChar = Serial.read();
      if (inChar == '\n') {
        result[i] = '\0';
        Serial.flush();
        return 0;
      }
      if (inChar != '\r') {
        result[i] = inChar;
        i++;
      }
    }
  }
}
*/

void evento(int cantidad) {  // Esta función se ejecuta cuando se recibe información del maestro}
  nDato = 0;
  strcpy(Cadena,"");
  while(Wire.available())   {
    char dato = Wire.read(); // Recibe la palabra del i2c tx
    if (dato != '\0')   {
        Cadena[nDato] = dato;
        //Serial.print(dato);
        //Serial.print(" ");
        nDato++;
        //Serial.print(nDato);
        //Serial.print(" ");
    }
    else
        break;
  }
  Cadena[nDato] = '\0' ;
  //Serial.println(Cadena);
  flag = true;
  estado = 1;
}
 


Para el emisor estoy usando el código que surbyte coloco en el siguiente post (de antemano muchas gracias a surbyte por ese código, batalle mucho para conseguir enviar text por I2C) https://forum.arduino.cc/index.php?topic=468421.0.

Code: [Select]
#include <Wire.h>
#define Direccion 4

void setup() {
  Wire.begin(); // Se une con el bus I2C
  delay(200);
  Serial.begin(9600);
  Serial.println("Emisor arrancado.");
}

void loop() {
  
    Serial.println("Proceder a enviar mensaje");
    Wire.beginTransmission(Direccion );  //Dirección del Dispositivo esclavo
    Wire.write("Sensor 1 Activado");        // Envía 4 bytes    
    Wire.endTransmission();    // Detiene la transmisión  
    
    delay(5000);

}


Entonces no se si esto es un comportamiento normal, o si tengo algo mal en el código, o si me falta alguna linea de código o algo errado en la conexión. Les agradecería mucho alguna orientation con el tema, ya que quiero implementarlo al sistema que tengo para monitoreo y control que tengo en casa pero el hecho de tener que estar conectando primero el MKR le da al traste.

Muchas gracias




surbyte

Pero eso es algo que puedes resolver por código!!

Podrías por ejemplo poner como en pausa al MEGA (luego analizamos porque ocurre) esperando que el MKR se conecte y cuando lo haga, le envie un código via I2C (curiosa comunicación) y entonces que accione el MEGA.
Eso no es complicado de hacer.
Debes agregar un un timout o sea un tiempo limite para que se conecte y si no logra entonces avise que no pudo.
De ese modo podras arrancar ambos sin problemas.
Bien, esto que te he sugerido es un parche.

Ahora el MEGA requiere 5V y el MKR 3.3V o alimentado por una LIPO como alimentas ambos?

tgaumer

Gracias por responder,

Actualizo como voy con esto,

Ahora el MEGA requiere 5V y el MKR 3.3V o alimentado por una LIPO como alimentas ambos?
Sobre esto, estaba alimentando con una fuente de 5v a 2amp, la misma fuente alimenta tanto el mega como el MKR, el MKR lo conecto al pin Vin, que según las especificaciones soporta hasta 5v. Haciendo unas pruebas hoy en la mañana se me ocurrió alimentar el MKR por USB al ordenador, después de unos segundo el MKR pudo conectarse a la Red, sin tener que desconectar el MEGA primero. El problema ahora es que el mega se cuelga después de mandar el primer mensaje de texto cosa que se soluciona si hago un reset del mega.


En resumen conectando el MKR por USB (y del MKR se alimenta al mega):
-Alimento el MKR via USB, encienden los dos al mismo tiempo y el MKR consigue conectarse a la Red y mandar únicamente el primer mensaje.
-Hago un reset al mega y después de eso funciona normal, mandando mensajes cada 5segundos



Saludos
Podrías por ejemplo poner como en pausa al MEGA (luego analizamos porque ocurre) esperando que el MKR se conecte y cuando lo haga, le envie un código via I2C (curiosa comunicación) y entonces que accione el MEGA.
hay algún ejemplo del que pueda basarme para hacer esto?, honestamente soy principiante, te agradeciera si me das un ejemplo de código.

Saludos

surbyte

Vuelo a poner énfasis en porqué usas I2C para comunicarlos? Si no estas hábil con su manejo se te pueden escapar cosas. No he revisado esa  parte pero pareciera ser la responponable.

Has una prueba solo para complacerme. Copia ambos códigos con nombre diferente, elimina las partes de emisor y receptor I2C en ambos códigos y reemplazalas por cosas semejantes via serial.

Sabes como?

Luego nos dices si se cuelga o no.

tgaumer

Hola,

OK, voy a probar lo que dices y te comento como me fue. Si tengo una idea de como hacerlo vía Serial, de hecho así había empezado pero no conseguí tener en el receptor un mensaje de texto, por eso termine con I2C, pero supongo se debe poder.

Bueno pruebo y te platico que resultado da. Gracias

surbyte


tgaumer

Hola,

Estaba por empezar a trabajar en lo que sugerías, pero antes se me ocurrió volver a leer tu primer comentarios acerca de la pausa en el MEGA. No se si estuvo del todo bien pero agregue un delay en el setup del MEGA (transmisor) justo antes de Wire.Begin

Code: [Select]

void setup() {  
  delay(3000);
  Wire.begin(); // Se une con el bus I2C


y con este cambio y alimentando el Arduino MKR desde el puerto USB esta funcionando todo OK, justo así como describía en el segundo esquema de conexión (el MKR alimentado por USB y del pin 5v del MKR alimento el MEGA).

Desconecto la alimentación, luego vuelvo a conectar, ambos arduinos encienden, y el MKR después de unos segundos se conecta a la red sin problemas, y sin necesidad de reiniciar ninguno de los dos.

Lo único que sigue dando problemas es si cambio la alimentación del MKR a el Pin Vin, ahí si no consigue el MKR conectarse a la red celular. (usando la misma fuente de alimentación, lo único que cambio es la termina de la fuente, 5v 2amp)

Independientemente de la prueba con el serial en lugar del I2C, creo uno de los problemas es la alimentación de los equipos.

alguna idea respecto a este comportamiento? les ha ocurrido algo semejante?

Saludos

surbyte

Bueno, la sugerencia ayudó.. me da gusto.

Respecto de porqué, ahora funciona con un pequeÑo delay(), pues la sugerencia vino a que se colgaba, y mepareció dalrle tiempo a que el micro receptor complete su arranque o adecuarlos cuando abos estan realmente activos. Porqué pasa ? Habria que ponerse a analizar que ocurre al comienzo entre los dos micros. Sinceramente no sé como hacerlo y antes que decirte algo que no tiene asidero... no lo digo.

Go Up