Problema con la comunicación entre ESP32 y sonómetro

Hola a todos,

Estoy trabajando en un proyecto en el que necesito comunicar un sonómetro CESVA SC102 con una ESP32 y transmitir los datos a través de WiFi. Sin embargo, estoy teniendo problemas para enviar comandos desde la ESP32 al sonómetro.

El sonómetro se comunica a través de un puerto USB (CN1US, de mini USB a USB) utilizando un protocolo específico que incluye una velocidad de transmisión de 57600 bits/s, 8 bits de datos, 1 bit de parada, sin paridad y sin control de flujo. El comando para darle PLAY debe ser ('1') [49 en ASCII] y ('0') [48 en ASCII]. Los comandos del ESP32 al sonómetro deben terminar siempre con un retorno de carro [13 en ASCII]. Se alimenta con dos pilas alcalinas de 1,5 V o a través del puerto USB. Si se utilizan ambos sistemas a la vez (pilas + puerto USB), el SC102 escoge el que ofrece más tensión.

Intenté dos métodos para comunicarlos:

  1. Cortar el USB del sonómetro para obtener los 4 cables que conforman la salida (GND, alimentacion, D+ y D-), y conectarlos directamente a los pines correspondientes en la ESP32 (GND, 3.3V, TX2, RX2)
  2. Utilizar un convertidor USB a TTL (CP2102) para convertir la comunicación USB del sonómetro a una comunicación UART que la ESP32 pueda entender.

En ambos casos, no he tenido éxito. Cuando utilizo el convertidor USB a TTL, la ESP32 envía el pulso correctamente (según lo verificado con un osciloscopio), pero no parece llegar al sonómetro. Cuando utilizo el método del cable pelado, la respuesta del sonómetro es NULL. Acto seguido, se frizea y se reinicia al desconectarlo de la ESP.

Les dejo el código que estoy utilizando para enviar comandos desde la ESP32 al sonómetro:

#include <Arduino.h>
#include <WiFi.h>
#include <HardwareSerial.h>

#define WIFI_SSID "Red"
#define WIFI_PASSWORD "Contraseña"
#define RX2 16
#define TX2 17

HardwareSerial Serial2(2);

void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);

  Serial2.begin(57600, SERIAL_8N1, RX2, TX2); 

  Serial.println("Inicializando");

  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Conectandose...");
  }

  Serial.println("Connectado");
}

void loop() {
  // Envío del comando PLAY.
  Serial2.write('1\r');

  delay(15000); // Son 15 segundos de medicion.

  // Envío del comando STOP.
  Serial2.write('0\r');

  delay(3000); // Tiempo de espera para obtener la informacion total.
}

Cabe aclarar que la primera etapa del proyecto fue realizar una comunicacion serial via PC a traves de Python y el envio de comandos y mediciones funcionaba perfectamente.
Si alguien tiene alguna sugerencia o ha tenido una experiencia similar, agradecería mucho su ayuda.

Gracias de antemano.

Y has puesto adaptadores de nivel?
El ESP32 trabaja a 3.3V y lo demas suele hacerlo a 5V. Ahi tienes un problema.

Gracias por tu respuesta.

Intenté utilizar [con el método 1] un conversor de nivel lógico con un rango de 1.65V<=Vb<=5.5V a 1.2V<=Va<=3.6V (XS0108E bidireccional). Sin embargo, me encontré con el problema de que el sonómetro no es reconocido cuando el conversor se encuentra en el circuito. Con los otros dos métodos que probé, esto no era así. Cuando el USB reconoce otro dispositivo que tiene más tensión, deja de cargarse a través de las pilas y procede a marcar "USB" en donde debería estar la carga.

Lo más probable es que esté haciendo alguna conexión mal. Aquí te dejo el esquemático de mi configuración actual:

Agradecería cualquier sugerencia o consejo.

El esquema está mal, no se lo real.

Debería ser así

Agrego:

No puedes conectar directamente las señales USB (D+ y D-) y esperar leer datos seriales.
Debes usar un adaptador USB a TTL.

https://learn.sparkfun.com/tutorials/level-shifter---8-channel-txs0108e-hookup-guide/all

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.