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/

4 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. Hermano muy chevre la nota. Felicitaciones y sigue adelante.

    ResponderEliminar