Manual
do
Maker
.
com
No artigo anterior vimos como fazer streaming de áudio com ESP32. Agora vamos ver como fazer streaming de áudio com EP8266.
O processo é bem mais simples, gerando áudio próximo a 8000Hz. A qualidade não é "supimpa" mas é o suficiente para fazer uma comunicação bidirecional audível e compreensível. As possibilidades são muitas e vou agregar ainda mais recursos em artigos já planejados para breve.
Dessa vez a comunicação é entre um computador normal e o ESP8266. Com a ajuda da AF Eletrônica fizemos os testes modificando um sketch para tentar atingir a melhor qualidade de áudio com ESP8266, eu modificando o código e AFE testando o código, até chegarmos nesse resultado (porque meu módulo MAX9814 ainda não chegou).
No desktop, utilize esse código:
import pyaudio
import socket
#troque o ip abaixo e defina a porta desejada, acima de 1024
UDP_IP = "192.168.6.24"
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=8000, output=True)
try:
while True:
data, addr = sock.recvfrom(1024)
stream.write(data)
except KeyboardInterrupt:
print("Finalizado com Ctrl+C")
stream.stop_stream()
stream.close()
p.terminate()
No Windows eu nem sei como instalar o pacote, mas no Linux será necessário instalar o pacote python-pyaudio ou python3-pyaudio dependendo da sua versão de Python.
sudo apt-get install python-pyaudio
Esse programa se encarregará de receber o áudio. No Linux podemos também fazer como descrito no artigo anterior.
No ESP8266 podemos utilizar o seguinte sketch na IDE do Arduino.
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
const char* ssid = "SSID da rede";
const char* password = "senha da rede";
int contconexion = 0;
WiFiUDP Udp;
void setup()
{
Serial.begin(115200);
Serial.println();
pinMode(5, OUTPUT);
digitalWrite(15, LOW);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED and contconexion <50) {
Serial.println("WiFi conectado");
Serial.println(WiFi.localIP());
digitalWrite(5, HIGH);
}
else {
Serial.println("");
Serial.println("Connection failed");
digitalWrite(15, LOW);
}
}
void loop()
{
//acerte a porta e IP do receptor - no caso, Windows ou Linux
Udp.beginPacket("192.168.6.24", 1234);
for(int i=0; i<1024;i++){
int old=micros();
//porta analogica do ESP8266
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<122);
}
Udp.endPacket();
delay(5);
}
O ADC do ESP8266 só recebe 1v de entrada. Se alimentar o módulo microfone com 3v3, dá até pra passar sem divisor de tensão. Se for alimentado adequadamente (com 5v) será necessário um divisor de tensão. Como não utilizo resistores de precisão, achei mais seguro deixar um pouco abaixo de 1v utilizando os resistores padrão (não dava para aproximar mais). No caso, siga o exemplo abaixo:
O jumper verde vai ao ESP8266, preto ao GND e vermelho ao VCC.
Rode o script Python no Windows ou no Linux, então suba o sketch no ESP8266 e comece a falar para testar seu áudio com ESP8266. Simples e rápido.
Estou planejando mais um artigo interessante para agregar recursos, vamos ver se um dos parceiros se interessa.
Inscreva-se no nosso canal Manual do Maker no YouTube.
Também estamos no Instagram.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.