Registratore vocale digitale con ARDUINO UNO – Aggiornamento

Breve articolo che richiama il precedente. IL progetto è stato semplificato.

Il precedente progetto, pubblicato al seguente

link

è stato semplificato.

Lo schema comprende soltanto la scheda ARDUINO UNO e un microfono, collegato all’ingresso analogico A0.

Progetto semplificato. ARDUINO UNO e un MICROFONO.

Lo sketch, caricato in ARDUINO, è ridotto ai “minimi termini”:

volatile int voce;

void setup() {
  analogReference(EXTERNAL);
  Serial.begin(2000000);
             }


void loop() {
 
voce = analogRead(A0); 
Serial.println(voce);

            }

L’unico compito di questo sketch è raccogliere i campioni della voce e trasmetterli alla USB COM3.

Sul PC, in ambiente WINDOWS 10, gira un programma, scritto in C. Questo programma raccoglie i campioni ( numeri compresi tra 0 e 1023 ) e li salva in memoria. Al termine della registrazione il programma calcola il tempo di registrazione, il numero di campioni prelevati e la frequenza di campionamento; poi genera un file di testo con tutti i dati. Ecco il sorgente:

#include <windows.h>
#include <stdio.h>

#define MYfilenumbytes 250104

// usage: > leggicom3ter > registrazione.txt  ( ridirigere output da standard output a file di testo )

int main()
{
unsigned int i;
DWORD numerobyteletti,inizio,fine,durata,freqcamp,campioni;
char datiletti[MYfilenumbytes];
char *pcCommPort = "COM3";
DCB dcb={0};

campioni = 0; // inizializzo il numero di campioni prelevati a zero

HANDLE hbis = CreateFile(
        pcCommPort,
        GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        NULL);

    if (hbis == INVALID_HANDLE_VALUE) {
        DWORD err = GetLastError();
        printf("err %d\n", err);
        return 1;
    };

   dcb.BaudRate = 2000000;     // set the baud rate
   dcb.ByteSize = 8;             // data size, xmit, and rcv
   dcb.Parity = EVENPARITY;        // no parity bit
   dcb.StopBits = ONESTOPBIT;    // one stop bit
   SetCommState(hbis, &dcb);

inizio = GetTickCount();  // memorizzo inizio registrazione

ReadFile(hbis,&datiletti,MYfilenumbytes,&numerobyteletti,NULL); // registro

CloseHandle(hbis); // chiudo la porta USB COM3 e termina la registrazione

fine = GetTickCount();  // memorizzo fine registrazione

durata = fine - inizio;  // calcolo durata in millisecondi
durata = durata/1000;     // calcolo durata in secondi (mi serve in secondi)                                                         
for (i=0;i<numerobyteletti;i++) {if (datiletti[i] == 13) {campioni++;}; putchar(datiletti[i]);};  // conto i campioni e invio i dati letti sul monitor standard output
freqcamp = campioni/durata; // calcolo frequenza campionamento in campioni al secondo
printf("\nNumero campioni %d\nTempo di registrazione %d\nFrequenza campionamento (campioni/secondo) %d\n",campioni,durata,freqcamp); // stampo su monitor standard output...

return 0;

}

L’utente apre il file di testo con il Blocco Note, corregge eventuali errori o dati sporchi che raramente possono venire registrati e aggiunge il campione fittizio 5000 alla fine dell’elenco dei campioni.

In seguito, il file di testo viene convertito in audio grezzo, dal programma convraw.exe scritto in C, e poi in formato wav dal programma ffmpeg.exe. Questi dettagli li trovate nel vecchio articolo sopra linkato.

Alla Prossima.

P.S.

Ancora più semplice. L’audio grezzo viene generato direttamente da ARDUINO. Non c’è più bisogno del programma convraw.exe Per informazioni guarda il seguente video

In questo video l’ultima novità. L’audio grezzo viene generato direttamente da ARDUINO. Infatti c’è Serial.print al posto di Serial.println. Non c’è più bisogno del programma convraw.exe, che serviva a convertire i campioni in audio grezzo

Andrea Paolini