Autor Tema: APORTE - dos Bluetooth en un solo Puerto de Arduino  (Leído 215 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado humberto 02

  • PIC16
  • ***
  • Mensajes: 115
APORTE - dos Bluetooth en un solo Puerto de Arduino
« en: 29 de Enero de 2021, 18:47:46 »
Hola. Estoy trabajando sobre dos dispositivos seriales (SIM800L y Bluetooth HC05), al comprobar las comunicaciones con mi Placa Arduino. Descubro que al crear dos conexiones seriales (la cosa se complico). Mi bluetooth había dejado de responder.

Comencé a leer los apuntes de la librería SoftwareSerial.h y comprendí la limitación que tenía.

Probé la opción TWOSoftwareSerial.h la que NO me dejó conforme en lo absoluto.

Debía presionar muchas veces la TECLA de mi CELULAR y en modo errático JUSTO la captaba mi Sketch y ahí tomaba la orden enviada.

Pensaba; como resolver el problema de origen. De este modo me pregunté (Y si conecto dos dispositivos a un mismo puerto serie???).

¿Quemaré algo? y ¿Cómo sabré de quien recibo información (Dispositivo1 o Dispositivo2)?

PUSE MANOS A LA OBRA:
1. Configuré los dos dispositivos Bluetooth como Esclavos
2. Asigne un Nombre para cada uno
3. Vinculé a ambos en mi Celular para reconocerlos
4. Vinculé los Rx y Tx al mismo puerto de Arduino y No quemé nada
5. Lancé mi aplicación Android (que me había Programado) y ANDUVO PERFECTA y VELOZMENTE bien.

Ahora Arduino y mi Celular Recibían y Transmitían al Puerto Serie de mi Arduino Muy Bien. Con solo UNA CONEXIÓN.

Quedaba solo responder como sabré de quien recibo la Información y a cual le ENVÍO la Respuesta.

En el caso de los Bluetooth no tengo problema ya que al aparearse; solo transmitirá al que esté enlazado.
Pero en el caso de un SIM800L y un Bluetooth menos problema; ya que uno enviará de acuerdo al comando que yo quiera ejecutar.

Bth.println("leí tu mensaje"); para el caso de mi Bluetooth

Sim.write("ATD+3446999999\n\r"); para el caso de mi SIM800L

Creo haber resuelto todas mis dudas. Por eso quise compartirlo con Uds. Tal vez les sea de utilidad como lo ha sido en mi caso personal.

Pero esta práctica despertó una nueva pregunta: Qué pasaría si vinculo los Rx(s) al Pin2  y los Tx(s) por separado?
Ej. Bth.begin(2,3);  y  Sim(2,4); .

Al fin y al cabo; los componentes son solo eso. Componentes que solo piensan a través de los que su fabricante y los usuarios le decimos que hagan ¿NO?.

Complicando todo:
En algún momento pensé en agregar un par de diodos para canalizar el buffer de Rx. Y un PnP para el canal de Tx. Vere en el tiempo si lo pruebo y aplico.

Ahora me resta volver a mi Placa de Origen para probar; finalmente el Módulo Bluetooth con el SIM800L y ver que pasa ahora.

Un Cordial Saludo a Uds.


Aquí les dejo mis resultados de esta primera prueba.


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8030
Re:APORTE - dos Bluetooth en un solo Puerto de Arduino
« Respuesta #1 en: 30 de Enero de 2021, 12:54:28 »
Eso pasa por hacer dos UART por software.

Podrías haberlo hecho funcionar con una UART por hardware y una UART por software.

Al menos la parte de recepcion. De todas formas lo que hiciste no quita que en algun momento los dos transmitan. Y si estan unidos directamente, si alguno esta en alto y otro en bajo es un gran problema. No solo el de la perdida de la informacion sino tambien por el cortocircuito generado en ese momento.

Desconectado humberto 02

  • PIC16
  • ***
  • Mensajes: 115
Re:APORTE - dos Bluetooth en un solo Puerto de Arduino
« Respuesta #2 en: 30 de Enero de 2021, 14:05:17 »
Buenas Tardes.

Hola KillerJC te adelantaste a mis conclusiones finales. Pero si es cierto. Le resolví así.

Mis sospechas sobre este post terminaron por ser acertadas. Y no quería dejar de comentárselas. (Para el caso) que mi propuesta les fuera útil en algún momento.

Repasemos la situación:
Tengo una placa con Modulo Bluetooth HC05 y un Módulo SIM800L entonces escribí en mi Sketch:
#include <SoftwareSerial.h>
SofttwareSerial Msim(2,3); // Modulo SIM800L
SofttwareSerial Mbth(11,12); // Modulo Bluetooth

El problema fue que la librería en cuestión no está preparada para Recibir y Transmitir a varios dispositivos conectados. La alternativa era emplear TWOSfotwareSerial.h u otras que están dando vuelta en la Web. Pero no eran lo suficientemente veloces y confiables en la respuesta; como la SoftwareSerial.h

Fue así que luego de pensar en las alternativas que tenía. Me decidí por esta solución:

#include <SoftwareSerial.h>
SofttwareSerial Integrado(2,3); // Modulo SIM800L y Bluetooth

Las cadenas RECIBIDAS son clasificadas de acuerdo a que los mensajes enviados por Bluetooth terminan con este carácter ”~”. Y los recibidos del Modulo SIM800L no lo tienen. Resolviendo de este modo saber quién de los dos me está escribiendo.

Pero al Inicializarse mi Arduino; mi Celular recibía TODOS los comandos de Configuración de mi SIM800L entonces terminé por agregar 2 (dos) NpN 2N3904 los cuales activo con los pines 11 y 12 que me sobraban luego de estos cambios.

De este modo logré ENRUTAR mi transmisión. Con el Pin 11 ENRUTO hacia el Modulo Bluetooth y con el Pin 12 ENRUTO hacia mi Modulo SIM800L. Resolviendo este problema.

Queda como conclusión final:

Que este método debería permitirnos incorporar TODOS los dispositivos de comunicación serial que necesitemos. Teniendo en cuenta colocarles un “carácter especial” que identifique de quien RECIBO mi mensaje.
Por otra parte agregar tantos NpN como dispositivos tenga para TRANSMITIR órdenes desde mi Arduino. (En el caso que les faltase Pines; una propuesta ya probada y de buen resultado sería el PCF8574). Con este método logré reducir líneas de código y espacio de mi memoria FLASH, no debiendo agregar más librerías.   Un Cordial Saludo para todos.
« Última modificación: 30 de Enero de 2021, 14:25:12 por humberto 02 »

Desconectado humberto 02

  • PIC16
  • ***
  • Mensajes: 115
Re:APORTE - dos Bluetooth en un solo Puerto de Arduino
« Respuesta #3 en: 30 de Enero de 2021, 18:39:53 »
Al fin y al cabo; los componentes son solo eso. Componentes que solo piensan a través de los que su fabricante y los usuarios le decimos que hagan ¿NO?.

Complicando todo:
En algún momento pensé en agregar un par de diodos para canalizar el buffer de Rx. Y un PnP para el canal de Tx. Vere en el tiempo si lo pruebo y aplico.

También KillerJC hizo mención al respecto:

De todas formas lo que hiciste no quita que en algun momento los dos transmitan. Y si estan unidos directamente, si alguno esta en alto y otro en bajo es un gran problema. No solo el de la perdida de la informacion sino tambien por el cortocircuito generado en ese momento.

Por todo lo expresado en este APORTE quedo resuelto con los NpN para la Transmisión y los Diodos para la recepción respondiendo como esperaba. Las conclusiones mías luego de esta experiencia es que me sirvió y no quemé nada. Cordial Saludo

Adjunto las imágenes de la prueba de Recepción con los Diodos 1N4001.

Desconectado humberto 02

  • PIC16
  • ***
  • Mensajes: 115
Re:APORTE - dos Bluetooth en un solo Puerto de Arduino
« Respuesta #4 en: 30 de Enero de 2021, 18:43:20 »
Esta es la Prueba funcionando

Desconectado humberto 02

  • PIC16
  • ***
  • Mensajes: 115
Re:APORTE - dos Bluetooth en un solo Puerto de Arduino
« Respuesta #5 en: 13 de Febrero de 2021, 19:52:05 »
Hola. Nada de lo expresado en este hilo me terminaba de convencer.

Mis temores y los aspectos vertidos por KillerJC me dejaron pensando una semana y puse manos a obra (desde cero) y encontré en las Compuertas Lógicas una nueva respuesta que realmente; ahora me atrevo a decir que es “mi solución” y quería compartirla contigo.

Quiero contarte que podes conectar dos dispositivos Seriales con una la librería SoftwareSerial.h por medio de Compuertas Lógicas

Esta Interface está alimentada con un Cargador de Celular de 5Vcc  800mA


Te deseo lo mejor y espero que te sea de utilidad como lo ha sido en mi caso. Te mando un gran abrazo y cuidate mucho. COVID anda dando vueltas.

Código: [Seleccionar]
// 10/02/2021 Lectura/Escritura de 2 Bluetooth
// con PUERTAS LOGICAS (Inversor +/-, AND y OR)
// y una Interrupcion en el PIN D2

#include <SoftwareSerial.h>
SoftwareSerial Integrado(3,4);

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3f,20,4);

String mensaje="";
int y=0;

void setup() {
     Serial.begin(9600);
     mensaje.reserve(15);

     Integrado.begin(9600);

     pinMode(2,INPUT); digitalWrite(2,LOW);
     pinMode(3,INPUT);
     pinMode(4,OUTPUT);
     // Disparo del Dispositivo #2
     pinMode(12,OUTPUT); digitalWrite(12,LOW);

     // Pines 2y3 - LOW, HIGH , CHANGE, RISSING (->+) y FALINGH (+>-)
     attachInterrupt(digitalPinToInterrupt(2),Segundo,CHANGE);
     
     lcd.init();
     lcd.backlight();
     lcd.clear();
     lcd.home(),
     lcd.setCursor(00,0); lcd.print("BTH y GATEs");
     lcd.setCursor(00,1); lcd.print("L 2");
     lcd.setCursor(00,2); lcd.print("L 3");
     lcd.setCursor(00,3); lcd.print("L 4");
     Serial.println("Comenzar");
}

void loop(){
     if (Integrado.available()>0){
         String mensaje="";
         while(Integrado.available()){
               char c=Integrado.read(); delay(10);
               mensaje+=c;
         }
         Serial.println(mensaje);
         lcd.setCursor(00,y); lcd.print(mensaje);
         Integrado.println("Arduino: "+mensaje);
         delay(250);
     }
}

void Segundo(){
     int valor=digitalRead(2);
     if (!valor){digitalWrite(12,LOW); y=1;}else{digitalWrite(12,HIGH); y=2;}
}
« Última modificación: 13 de Febrero de 2021, 20:08:24 por humberto 02 »


 

anything