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:
- 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)
- 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.

