domingo, 10 de septiembre de 2017

Proyecto #1 ESP8266 – Micrófono Espía Versión 1

Este es un proyecto de IOT (internet de las cosas), que consiste en hacer un pequeño dispositivo VOIP (voz sobre ip) usando un NodeMCU (ESP8266). El circuito está compuesto por un preamplificador de micrófono electret, que alimenta la entrada analógica de un NodeMCU (ESP8266). El ESP8266 convierte ese audio en paquetes UDP que luego son enviados por la red, por último, un scritp de Python se encarga de tomar esos datagramas UDP y reproducir el sonido.



Lista de Materiales:

1) NodeMCU (ESP8266)
1) Micrófono electret
1) Transistor BC377
2) Resistencias de 10K
1) Resistencia de 680K
1) Resistencia de 330
1) Preset de 100K
1) Led
2) Capacitores de 0,1uf (104)
1) Capacitor electrolítico de 470uF 16V



microfonoNivel:

void setup()
{
  Serial.begin(115200);
  Serial.println();
}

void loop()
{
  int analog = analogRead(17);
  Serial.print("0, 512, 1024, ");
  Serial.println(analog);
}

microfonoUDP:

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

const char* ssid = "______";
const char* password = "______";
int contconexion = 0;

WiFiUDP Udp;

void setup()
{
  Serial.begin(115200);
  Serial.println();

  pinMode(5, OUTPUT);  //D1 Led de estado
  digitalWrite(15, LOW);

  WiFi.mode(WIFI_STA); //para que no inicie el SoftAP en el modo normal
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED and contconexion <50) { //Cuenta hasta 50 si no se puede conectar lo cancela
    ++contconexion;
    delay(250);
    Serial.print(".");
    digitalWrite(5, HIGH);
    delay(250);
    digitalWrite(5, LOW);
  }
  if (contconexion <50) {
      //para usar con ip fija
      IPAddress Ip(192,168,1,180); 
      IPAddress Gateway(192,168,1,1); 
      IPAddress Subnet(255,255,255,0); 
      WiFi.config(Ip, Gateway, Subnet); 
      
      Serial.println("");
      Serial.println("WiFi conectado");
      Serial.println(WiFi.localIP());
      digitalWrite(5, HIGH);  
  }
  else { 
      Serial.println("");
      Serial.println("Error de conexion");
      digitalWrite(15, LOW);
  }
}

void loop()
{
  Udp.beginPacket("192.168.1.101", 1234);

  for(int i=0; i<1024;i++){
    int old=micros();

    float analog = analogRead(17);

    analog = ((analog / 1) - 385);
    if (analog > 255){
      analog = 255;
    }
    else if (analog < 0){
      analog = 0;
    }
    
    Udp.write(int(analog));
    while(micros()-old<87); // 90uSec = 1Sec/11111Hz - 3uSec para los otros procesos
  }
  Udp.endPacket();
  delay(5);
}


reproductor.py:

import pyaudio
import socket

UDP_IP = "192.168.1.101"
UDP_PORT = 1234

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))

p = pyaudio.PyAudio()

stream = p.open(format=32, channels=1, rate=11111, output=True)

try:
    while True:
        data, addr = sock.recvfrom(1024) # buffer de 1024 bytes
        stream.write(data)
        
except KeyboardInterrupt:  #precionar Crtl + C para salir
    print("Cerrando...")
    stream.stop_stream()
    stream.close()
    p.terminate()

http://people.csail.mit.edu/hubert/pyaudio/

22 comentarios:

  1. Hola, muy bueno, se me ocurre para hacer un sistema de audio remoto, aunque con otro mcu, hay alguna info de como recibir este audio desde otro micro y asi usarlo en un amplificador o un retorno. Que delay tendra?, el micro soportara doble emisión para hacer audio estereo. Saludos

    ResponderEliminar
    Respuestas
    1. La idea de este tutorial es hacer algo muy básico y educativo, olvídate de mucha mejor calidad de sonido y aún menos de estéreo. Si vos estás pensando en algo que tenga cierta calidad de sonido, te recomiendo que investigues sobre I2S. Si en algún momento compro un módulo I2S, voy a hacer un tutorial al respeto.

      Eliminar
    2. Estoy intentando replicarlo con I2S pero tengo problemas, a ver si te animas! un saludo y gran trabajo!!!

      Eliminar
  2. Hermano muy chevre la nota. Felicitaciones y sigue adelante.

    ResponderEliminar
  3. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  4. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  5. Excelente. Muy buen aporte. Gracias

    ResponderEliminar
  6. Hello. Thank you for the topic. I have one problem.. The stream goes with lot of cuts, the signal is not stable and the pitch is a bit high as well. Can you tell what may be the problem? Thank you

    ResponderEliminar
    Respuestas
    1. maybe... you are streaming with wifi.. on that case, you will have a lot of inestability problems.. and it is because the wifi timer is the same that the analogRead!

      Eliminar
  7. I explain that is the video. It is a very simple and didactic example, from the practical point of view it has several problems. Greetings.

    ResponderEliminar
  8. Hello. Is it possible to use a cloud server (digitalocean) to receive the audio stream? If I just change this UDP_IP = "192.168.1.101" to my server's IP would it work? Thank you.

    ResponderEliminar
  9. Hello. Is it possible to use a cloud server (digitalocean) to receive the audio stream? If I just change this UDP_IP = "192.168.1.101" to my server's IP would it work? Thank you.

    ResponderEliminar
    Respuestas
    1. Tengo la misma duda, se puede enviar el audio a través de internet usando un gateway en la nube?

      Eliminar
    2. La respuesta corta es, se puede. Pero siendo UDP o bien estás escuchando en ese puerto y haces algo con esa información o bien lo almacenas en un fichero wav, que también es factible.

      Eliminar
  10. Gracias, lo he probado conectando directamente el microfono electrec, solo tube que modificar el rango y aumentar la ganancia y funciona. Gracias por el proyecto me parecio super practico y educativo.

    ResponderEliminar
    Respuestas
    1. me podria dar una mano ya que no eh logrado realizar la transmision

      Eliminar
  11. Hey, gran explicaci+on y excelente video, me preguntaba si es posible hacerlo con un ESP 32?

    ResponderEliminar
  12. podria ayudarme con este proyecto, ya que no eh logrado transmitir audio

    ResponderEliminar
  13. Para el desarrollo del proyecto se puede utilizar un ESP32?

    ResponderEliminar