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.
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
Andrea Paolini