zoomx:
Il convertitore è a 10 bit per cui avrai valori tra zero e 1023. Poiché in un byte al massimo puoi avere 256 valori (0-255) il risultato del convertitore va messo in 2 byte, i primi 8 in uno e i restanti 2 nell'altro. L'altro quindi avrà solo 2 bit, valori da 0 a 3.
Ora quando trasmetti in UDP può capitare che qualche byte vada perso.
Dall'altro lato, quando ricevi un byte, non puoi sapere se questo contiene i primi 8 o i restanti 2. Diciamo che se contiene valori superiori a 3 allora si tratta dei primi 8 ma non ne puoi essere sicuro.
Puoi fare anche un'altra cosa in attesa del microfono: mandare dei dati artificiali e vedere come arrivano dall'altra parte.
Pr esempio puoi trasmettere ques'onda sinusoidale (a 8 bit!)
uint8_t sine_wave[256] = {
0x80, 0x83, 0x86, 0x89, 0x8C, 0x90, 0x93, 0x96,
0x99, 0x9C, 0x9F, 0xA2, 0xA5, 0xA8, 0xAB, 0xAE,
0xB1, 0xB3, 0xB6, 0xB9, 0xBC, 0xBF, 0xC1, 0xC4,
0xC7, 0xC9, 0xCC, 0xCE, 0xD1, 0xD3, 0xD5, 0xD8,
0xDA, 0xDC, 0xDE, 0xE0, 0xE2, 0xE4, 0xE6, 0xE8,
0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4,
0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFC,
0xFD, 0xFD, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD,
0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xF6,
0xF5, 0xF4, 0xF3, 0xF1, 0xF0, 0xEF, 0xED, 0xEB,
0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC,
0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9,
0xC7, 0xC4, 0xC1, 0xBF, 0xBC, 0xB9, 0xB6, 0xB3,
0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C,
0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83,
0x80, 0x7D, 0x7A, 0x77, 0x74, 0x70, 0x6D, 0x6A,
0x67, 0x64, 0x61, 0x5E, 0x5B, 0x58, 0x55, 0x52,
0x4F, 0x4D, 0x4A, 0x47, 0x44, 0x41, 0x3F, 0x3C,
0x39, 0x37, 0x34, 0x32, 0x2F, 0x2D, 0x2B, 0x28,
0x26, 0x24, 0x22, 0x20, 0x1E, 0x1C, 0x1A, 0x18,
0x16, 0x15, 0x13, 0x11, 0x10, 0x0F, 0x0D, 0x0C,
0x0B, 0x0A, 0x08, 0x07, 0x06, 0x06, 0x05, 0x04,
0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03,
0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A,
0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15,
0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20, 0x22, 0x24,
0x26, 0x28, 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37,
0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D,
0x4F, 0x52, 0x55, 0x58, 0x5B, 0x5E, 0x61, 0x64,
0x67, 0x6A, 0x6D, 0x70, 0x74, 0x77, 0x7A, 0x7D
};
usando qualcosa del genere
for (int i = 0; i <= 255; i++) {
UDP.write(sine_wave[i]);
}
Ho fatto quello che mi hai consigliato, ho creato il codice (lato client):
#include <ESP8266WiFi.h> // Libreria per inviare e ricevere dati in WiFi con ESP8266
#include <WiFiUdp.h> // Libreria per la gestione di Client-Server UDP in WiFi
const char* ssid = "nome_rete_wifi";
const char* password = "password_rete_wifi";
int contconexion = 0;
WiFiUDP Udp;
uint8_t sine_wave[256] = {
0x80, 0x83, 0x86, 0x89, 0x8C, 0x90, 0x93, 0x96,
0x99, 0x9C, 0x9F, 0xA2, 0xA5, 0xA8, 0xAB, 0xAE,
0xB1, 0xB3, 0xB6, 0xB9, 0xBC, 0xBF, 0xC1, 0xC4,
0xC7, 0xC9, 0xCC, 0xCE, 0xD1, 0xD3, 0xD5, 0xD8,
0xDA, 0xDC, 0xDE, 0xE0, 0xE2, 0xE4, 0xE6, 0xE8,
0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4,
0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFC,
0xFD, 0xFD, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD,
0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xF6,
0xF5, 0xF4, 0xF3, 0xF1, 0xF0, 0xEF, 0xED, 0xEB,
0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC,
0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9,
0xC7, 0xC4, 0xC1, 0xBF, 0xBC, 0xB9, 0xB6, 0xB3,
0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C,
0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83,
0x80, 0x7D, 0x7A, 0x77, 0x74, 0x70, 0x6D, 0x6A,
0x67, 0x64, 0x61, 0x5E, 0x5B, 0x58, 0x55, 0x52,
0x4F, 0x4D, 0x4A, 0x47, 0x44, 0x41, 0x3F, 0x3C,
0x39, 0x37, 0x34, 0x32, 0x2F, 0x2D, 0x2B, 0x28,
0x26, 0x24, 0x22, 0x20, 0x1E, 0x1C, 0x1A, 0x18,
0x16, 0x15, 0x13, 0x11, 0x10, 0x0F, 0x0D, 0x0C,
0x0B, 0x0A, 0x08, 0x07, 0x06, 0x06, 0x05, 0x04,
0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03,
0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A,
0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15,
0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20, 0x22, 0x24,
0x26, 0x28, 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37,
0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D,
0x4F, 0x52, 0x55, 0x58, 0x5B, 0x5E, 0x61, 0x64,
0x67, 0x6A, 0x6D, 0x70, 0x74, 0x77, 0x7A, 0x7D
};
void setup()
{
Serial.begin(115200);
Serial.println();
pinMode(5, OUTPUT); //D1 Led di stato
digitalWrite(15, LOW);
WiFi.mode(WIFI_STA); // avvio SoftAP (access point abilitato al software) in modalità normale
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED and contconexion <50) { // Conteggio fino a 50, se non riesce cancella la connessione
++contconexion;
delay(250);
Serial.print(".");
digitalWrite(5, HIGH);
delay(250);
digitalWrite(5, LOW);
} // fine while()
} // fine setup()
void loop()
{
Serial.println("sono nel loop \n"); // per capire se entro nel loop - solo di test
Udp.beginPacket("ip_rete_wifi", 1234);
Serial.println("\nsono dentro"); // per capire se entro nel loop - solo di test
for (int i = 0; i <= 255; i++) {
Udp.write(sine_wave[i]);
}
Udp.endPacket();
delay(2000); // secondi, 2 secondi
} // fine loop()
Ho creato il codice (lato server):
import pyaudio
import socket
UDP_IP = "ip_rete_wifi"
UDP_PORT = 1234
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))
print("IP e': ", UDP_IP)
print("Porta e': ", UDP_PORT)
p = pyaudio.PyAudio()
print("Pyaudio: ", p)
stream = p.open(format=32, channels=1, rate=111111, output=True)
print("Stream: ", stream)
try:
while True:
data, addr = sock.recvfrom(1024) # buffer de 1024 bytes
print ("--------------------------\n")
print ("data: ", data)
print ("\n")
print ("addr: ", addr)
print ("\n")
stream.write(data) # mi fa sentire l'audio negli altoparlanti
except KeyboardInterrupt: #precionar Crtl + C para salir
print("Cerrando...")
stream.stop_stream()
stream.close()
p.terminate()
Avvio il server dal terminale:
python nome_file_server.py
L'output è:
data: b'\x80\x83\x86\x89\x8c\x90\x93\x96\x99\x9c\x9f\xa2\xa5\xa8\xab\xae\xb1\xb3\xb6\xb9\xbc\xbf\xc1\xc4\xc7\xc9\xcc\xce\xd1\xd3\xd5\xd8\xda\xdc\xde\xe0\xe2\xe4\xe6\xe8\xea\xeb\xed\xef\xf0\xf1\xf3\xf4\xf5\xf6\xf8\xf9\xfa\xfa\xfb\xfc\xfd\xfd\xfe\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xfe\xfe\xfe\xfd\xfd\xfc\xfb\xfa\xfa\xf9\xf8\xf6\xf5\xf4\xf3\xf1\xf0\xef\xed\xeb\xea\xe8\xe6\xe4\xe2\xe0\xde\xdc\xda\xd8\xd5\xd3\xd1\xce\xcc\xc9\xc7\xc4\xc1\xbf\xbc\xb9\xb6\xb3\xb1\xae\xab\xa8\xa5\xa2\x9f\x9c\x99\x96\x93\x90\x8c\x89\x86\x83\x80}zwtpmjgda^[XUROMJGDA?<9742/-+(&$" \x1e\x1c\x1a\x18\x16\x15\x13\x11\x10\x0f\r\x0c\x0b\n\x08\x07\x06\x06\x05\x04\x03\x03\x02\x02\x02\x01\x01\x01\x01\x01\x01\x01\x02\x02\x02\x03\x03\x04\x05\x06\x06\x07\x08\n\x0b\x0c\r\x0f\x10\x11\x13\x15\x16\x18\x1a\x1c\x1e "$&(+-/2479<?ADGJMORUX[^adgjmptwz}'
Ad ogni iterazione l'output giustamente è uguale. Testato anche con altre reti internet (velocità diverse), l'output non cambia.