UART, SPI, I2C. en un mismo proyecto y sus interacciones.

Hola,
mis principales dudas recaen en como se puede implementar en un mismo proyecto los tres métodos de comunicación?

El planteamiento es el siguiente:

En un arduino mega van a convivir los siguientes sensores, módulos, dispositivos, etc:

1)Modulo GPS que usa UART
2)Modulo SD usa SPI
3)otros 10 sensores diferentes que utilizan I2C
4)Teclado matricial 4x4
5)1 puerto de entrada analógico
6)8 entradas digitales libres.

como se podrán dar cuenta utilizo los 3 protocolos de comunicación en el mismo proyecto. Esto me deja la duda de que si se pueden utilizar sin que se interfieran entre si, no se si el arduino mega tenga separados los buses de comunicación.

Entiendo las diferencias entre cada protocolo, sin embargo no se si se puedan implementar en un mismo proyecto o tenga que utilizar un combo de dos arduinos (mega+uno) para eliminar la incompatibilidad de comunicación entre (SPI+I2C) vs (UART).

Ojala puedan apoyarme y resolver mi duda.

Estaré al pendiente saludos!

Los tres sistemas de comunicación estan implementados por hardware de modo que no van a interferir entre si de ningún modo. TIenen asignados pines diferentes porque estan asi diseñados.

Supongamos que tienes un proyecto en el que usas sensores SPI, I2C y que toda la información la terminas pasando por UART a un PC u otro dispositivos. Es posible? Claro que lo es.

Toma cada sensor con su hardware específico. Lo pruebas individualmente. Cuando resuelvas el sensor SPI y el sensor I2C y ya funcionen ambos por su cuenta, creas un nuevo código en el que tengas en cuenta los dos.

Finalmente armas la parte Serial o sea de la UART y tienes las 3 cosas en marcha.

EDITO:
Pasé por alto la descripción de sensores que has dado
1)Modulo GPS que usa UART
2)Modulo SD usa SPI
3)otros 10 sensores diferentes que utilizan I2C

  1. GPS
  2. guardar datos por SPI
  3. 10 sensores por i2C

Es lo mismo que ya te había dicho con la única salvedad que no se que Arduino usarás.
Te recomiendo un MEGA para la tarea porque podrás usar alguno de sus 3 Seriales extra para comunicarte con el GPS
De lo contrario en un UNO/NANO requieres de usar SoftwareSerial para comunicarte con el GPS.

En resumen no tendrás problemas pero algo importante NO USES DELAY y lee como se usa millis() y maquina de estados para cumplir con el cometido o tu código no va a funcionar bien o al menos con velocidad.

Ve a Documentación => Indice de temas tutoriales => millis() y máquina de estados.

@surbyte
Muchas gracias por la ayuda, como es mi primera vez implementando los tres protocolos en un mismo proyecto creía que seria mas difícil implementarlos para que coexistieran en un mismo micro controlador.

En cuento a "SoftwareSerial" no lo tenia contemplado para usarlo con un arduino uno/nano gracias por mencionarlo, pero estoy seguro que aun como es la versión 1 del código prefiero tener espacio de sobra en un arduino MEGA. Así también agradezco mucho tu recomendación para no utilizar DELAY y sugerir la alternativa millis.

Saludos! :smiley:

Moderador:
Cuando respondes no repitas lo que se lee arriba.
Tu respuesta debe prescindir de lo que ya se lee en el hilo, así que solo refiérete a la persona con su nick y continúas o bien, usa quote o cita pero para resaltar el párrafo que respondes, no todo el comentario.

Hi,
Dices que tienes 10 sensores que son I2C. Entonces tienes que tener en consideracion de que no tenga las mismos direcciones. Algunos sensores vienen con una sola direccion y no se les puede cambiar. Otros vienen que si se les pueden cambiar. Si no se les pueden cambiar entonces tienes que hacerlo en forma de multifexes para seleccionarlo individuales.

No solo millis() sino mira con especial cuidado como armar una o varias máquinas de estados.

Basicamente podrías ir alternando entre sensores sin perder mas tiempo que el que se requiere para accesarlos.
Te voy a dar un consejo extra: Existen buenas y malas librerías. Algunas librerías consumen tiempo porque usan delay() no demasiado grandes pero en proyectos como el tuyo la acumulación puede generar problemas. Asi que tomate el tiempo de ver los comportamientos de cada sensor y cuanto tarda la actualización de sus datos.

Tomas un sensor y creas un sketch simple tal como el que use su librería, luego mides el tiempo en el loop que le lleve mostrar datos sucesivos. Ese tiempo es el que te interesa. Tomas nota y luego verás que ocurre.
Si alguno demora varios cientos de mseg es de preocupar pero.. puedes ordenarlos de modo que sea actualizado cada X segundos y entonces su incidencia no será relevante.
No siempre se requiere tomar datos de 10 sensores cada 1 segundo a menos que hables de un Formula 1 o un Kart entonces, se debe ser criterioso a la hora de actualizar datos.

Como no nos dices de que sensores hablas, no puedo mas que ser genérico y solo te darte pautas a tener en cuenta.

Una máquina de estados hará algo como esto:

Defines una variable que va de 0 a N estados lógicos posibles.
Supongamos una máquina para actualizar los 10 sensores I2C.

llamo a la variable actualiza y la defino como byte

byte actualiza = 0;

ahora en tu loop consultas asi

  switch (actualiza)  {
        case 0:  // sensor 0
                    leo_sensor0();
                    actualiza = 1;
                    break;
         case 1: // idem




         case 9: // sensor 9
                    leo_sensor9();
                    actualiza = 0;
                    break;
   }

bueno como verás esto es un switch y tu vas pasando desde el sensor 0 al 9 en pasos simples. Cada sensorX() llama al código que corresponde a dicho sensor tal como se espera. Si tienes varios del mismo tipo tu decidiras que hacer.
Esto puede hacerse a intervalos datos por milis() de modo que digamos cada 500 mseg por dar un valor tu consultas uno de estos sensores, o puede ser mas rápido o mas lento, pero al hacerlo de este modo tu fijas el control de la situación.
Cuando alcances el ultimo sensor incluido los datos del GPS podrás hacer una volcada de datos en la SD.

Es importante que tu loop() luzca ordenado y se pueda entender con claridad lo que esta haciendo el código. Usa procedimientos o funciones para cada cosa. No metas todo en la misma bolsa del loop como hace la gran mayoría. No importa si eres nuevo o viejo programador se puede trabajar bien desde hoy mismo.

@tauro0221
Sí lo tengo en consideración, de hecho nungun sensor se le repite la dirección de esclavo por que cada uno me deja 3 pines para configurar su dirección. No se necesitara multiplexarlos.

@surbyte
no había tomado en cuenta el impacto de diferentes librerías, es hora de comparar a ver cual librería tiene mejor resultado, optimizando los tiempos de ejecución. Agradezco mucho el ejemplo para poder medir los tiempos y los consejos para realizar un código limpio. De hecho, cada sensor tendrá su propia función, y estas a su vez tendrán las funciones para configurar lo y controlarlo.

La finalidad e mi proyecto es hacer una estación meteorológica completa.
Estoy considerando utilizar el termómetro DS18B20 en ves de los termómetros lm75 debido a que estos no funcionaran muy bien con humedad. el resto de componentes tendrá una carcasa impermeable y las PCB estarán cubiertas de barniz transparente para mayor protección a la humedad.

En cuanto a los sensores por i2c o bueno los módulos que tienen ese protocolo serian:
*display lcd 16x2 por i2c (por ahora en lo que compro una pantalla de menor consumo de energía)
*bmp180--------------------------------presión, temperatura altitud.
*bme280--------------------------------presión, humedad temperatura y altitud.
*lm75 x3--------------------------------Temperatura 3 posesiones
*rtc ds3231-----------------------------Referencia temporal, alarma como interrupción e iniciador de medición
*hmc5883-------------------------------brújula digital
*eeprom 24c32l-------------------------método de guardado de hora y de código de error
*mpu6050------------------------------giroscopio

Y se estaría haciendo el ciclo de medición cada hora para guardar sus datos en la SD asi como también guardar los datos de el ADC1 seria la dirección del viento, la velocidad del viento dada por un contador externo al arduino, la lluvia igualmente con un contador externo, el ADC2 mediría el voltaje de la batería y el ADC3 mediría el voltaje proveniente de un arreglo de celdas solares que cargan la batería.

Para mas información de los sensores de veleta, anemómetro y pluviómetro serian estos:

Actualmente estoy desarrollando el diagrama de flujo general del dispositivo y fragmentandolo en diferentes maquinas de estados.

Lo que me deja con dos preguntas:

1)El sensor DS18B20 utiliza el método de comunicación por "1 wire" este jamas lo he utilizado y realmente no se si pueda ser compatible con los demás métodos de comunicación y la cantidad de pines utilizada en el arduino MEGA.

2)El remplazo de la pantalla LCD16X2 seria en el mejor de los casos un E-paper display que utiliza comunicación SPI como el del siguiente link.

https://www.waveshare.com/wiki/4.2inch_e-Paper_Module?spm=a2g0o.detail.1000023.1.21f32b063B2Ako&file=4.2inch_e-Paper_Module

La pregunta con este diplay es si realmente vale la pena en comparación con un display oled 128x64 con interfaz de comunicación i2c.
Cual seria mas fácil de implementar?

Gracias, los mantendré al tanto de el desarrollo del proyecto y ya terminado estará publico en mi GitHub.

Por favor lee las Normas del foro y edita los enlaces que has puesto entre comillas usando la etiqueta que corresponde (eslabón).

Qué mezcla que estas haciendo!!!

*bmp180--------------------------------presión, temperatura altitud.
*bme280--------------------------------presión, humedad temperatura y altitud.

Elimina el 180 y quédate con el 280 que lo supera ampliamente en precisión y prestaciones.

*lm75 x3--------------------------------Temperatura 3 posesiones

Para que usar un LM75 si ya el BME280 te da la temperatura del lugar?

*hmc5883-------------------------------brújula digital

Supongo que tendrás una veleta para indicar la dirección del viento, sino una brújula no tiene sentido.

*eeprom 24c32l-------------------------método de guardado de hora y de código de error

Raro.. se suele usar una SD para guardar datos o se suben a un sitio IOT como ThingSpeak.

*mpu6050------------------------------giroscopio

No entiendo para que usas un giroscopio?

@surbyte

Eliminar el BMP180 lo he considerado sin embargo en la practica ha resultado poco fiable el BME280 y por eso implemento los dos al mismo tiempo para corroborar la información de calibración.

Los LM75 son 3 dispuestos en diferentes altitudes y ayuda a determinar las variaciones de micro climas dependiendo de la sombra, altura del suelo, y velocidad del viento.

En al paquete de sensores de sparkfun que adquirí contiene un anemómetro, una veleta y un pluviómetro, la brújula es necesaria para calibrar la correcta alineación de la veleta con respecto al norte geográfico.

La eeprom es como la caja negra de información mínima para saber que paso con la estación meteorológica. Debido a que la estación se quedara en un sitio sin electricidad, Internet y vigilancia. La caja eeprom me dará una idea de a que hora paso el siniestro y que sensores afecto.

El giroscopio se utilizara justo para comprobar que la estación meteorológica no se cayera, moviera golpeara etc... comparando la información de inclinación de los 3 ejes con la de inicio donde se alineo con el norte geográfico y el correcto nivel para evitar una mala lectura de la veleta debido a la gravedad. lo mismo pasaría con la lectura del pluviómetro pues si este no esta perpendicular al suelo, los cucharones tendrán una medida incorrecta del centro de masa teniendo una desviación del agua recolectada.

Tanto la brújula como el giroscopio son para comprobar que la estación no se movió y no soltar la alarma apagando los sistemas que no tengan respuesta confiable.

Ya había trabajado en un sistema similar con la plataforma PSoC 4 BLE de Cypress sin embargo esta plataforma resulto tener muchas limitaciones con respecto a lo que ya habían desarrollado, así si mismo por motivos que aun desconozco los sensores no trabajaron bien en conjunto dentro de esa plataforma de desatollo, Siendo arduino la plataforma mas amigable para desarrollar proyectos decidí implementarlo en esta en ves del PSoC.

En cuento al sistema de alimentación de todo el proyecto debo tener desarrollado por completo el ciclo de censado y sus máximos consumos de sensores y procesamiento haciéndolo lo mas eficiente para sacarla mayor provecho a las baterías y a las celdas solares claro sin llegar a un nivel muy especializado de depuración de código y de implementar materiales muy costosos.