Go Down

Topic: ARDUINO E VOCE (Read 2118 times) previous topic - next topic

magpa

Sep 22, 2018, 01:17 pm Last Edit: Sep 25, 2018, 10:20 am by magpa
Buongiorno a tutti. Mi sto cimentando a gestire la voce con arduino o suoi derivati (ESP8266), ma ho riscontrato che ne Arduino UNO ne esp8266 ce la fanno a eseguire un loop in meno di 125 micro sec che mi servirebbero per avere 8000 campioni al secondo.
Cosa strana è che i primi cicli li compie in 15 microsec(ottimo) e poi dal 33-34esimo in poi salta a 434; tutto con solo 3 istruzioni così riportato sotto:
Code: [Select]

void loop() {

   time1 = micros();
   Serial.println(time1-lastRead);
   lastRead = time1;
   

}

Cosa entra in gioco al 33-34 ciclo? mi potreste dare una mano a risolvere oppure a aggiungere magari qualche hardware specializzato per rimediare a quest lentezza?
Grazie a tutti.

gpb01

#1
Sep 22, 2018, 01:35 pm Last Edit: Sep 22, 2018, 01:36 pm by gpb01
Buongiorno,
essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del regolamento di detta sezione (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie. :)

Guglielmo
Search is Your friend ... or I am Your enemy !

uwefed

Dopo che Ti sei presentato facci vedere il Tuo sketch.
Ciao UWe

magpa

Buongiorno a tutti. Poiché avevo trovato il login esistente pensavo avessi già fatto il post di benvenuto forse come dite bene l'avrò fatto in inglese. Mi scuso e mi presento.
Sono un ing pensionato che si diletta da qualche anno con arduino e in special modo con gli ESP8266 e mi sono arredato casa di questi oggettini.

Poiché ci si spinge sempre più avanti nei progetti, ed essendo qui in buona compagnia, credo che frequenterò il forum in maniera assidua diversamente che nel passato visto anche la semplicità di quello che facevo.

magpa

#4
Sep 23, 2018, 08:04 am Last Edit: Sep 25, 2018, 10:20 am by magpa
Quello che sto facendo relativamente alla mie esperienze di telecomunicazioni è il campionamento della voce di un mic a 8000volte al sec quindi un campione ogni 125usec.
Solo che il buon esp8266 il loop lo esegue in maniera un po' particolare per non dire strana. Infatti se eseguite lo sketch qui di seguito ve ne renderete conto. I primi cicli sono di 15usec i successivi di 430. Che significa questo? dove sbaglio?

Sketch:
Code: [Select]

unsigned long lastRead = micros();
unsigned long time1;

void setup() {
Serial.begin(115200);
delay(10);
lastRead = micros();
}


void loop() {

  time1 = micros();
  Serial.println(time1-lastRead);
  lastRead = time1;
 

}

gpb01

#5
Sep 23, 2018, 08:27 am Last Edit: Sep 23, 2018, 08:27 am by gpb01
>magpa:   ti ricordo che in conformità al regolamento, punto 7, devi editare i tui post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie. :)

Guglielmo
Search is Your friend ... or I am Your enemy !

gpb01

#6
Sep 23, 2018, 08:33 am Last Edit: Sep 23, 2018, 08:33 am by gpb01
... dopo di che ... NON puoi inserire una Serial.print() nel loop() in cui misuri il tempo ... Serial.print() ti altera tutti i tempi a causa dei buffers e del suo funzionamento.

Acquisisci il tempo iniziale, fai un'operazione, acquisisci l tempo finale e DOPO stampi la differenza tra fine ed inizio, NON con in mezzo una Serial.print() !!!

Non solo, se devi raggiungere certe velocità, ho idea che dovrai scordarti il "framework wiring" (ovvero le funzioni che ti mette a disposizione l'ambiente Arduino) e dovrai programmare accedendo direttamente hai registri.

Guglielmo
Search is Your friend ... or I am Your enemy !

magpa

#7
Sep 23, 2018, 09:24 am Last Edit: Sep 23, 2018, 10:51 am by magpa
Grazie gpb01 togliendo la print e mettendola dopo aver fatto un centinaio di loop il tempo per ciclo scende drasticamente a 5-6 usec e tutti uguali.

L'ultima tua considerazione mi turba. Ossia mi stai dicendo che invece di utilizzare le istruzioni dell'IDE di arduino potrei intervenire direttamente sui registri come se si stesse programmando in Assembler o linguaggio macchina? Questo si che mi mette di buon umore. Dove posso trovare doc ed esempi di questa programmazione?

Grazie infinite per il tuo impagabile aiuto; l'avevo detto di essere in buona compagnia, anzi ottima.
Ciao



Non so se sto facendo la mossa giusta. Spero di eseguire quello che suggerisci ossia modificare l'ultimo mio post e quindi poi Save. Giusto? Così è OK per te?

gpb01

#8
Sep 23, 2018, 09:32 am Last Edit: Sep 23, 2018, 09:32 am by gpb01
... le indicazioni te le do, ma tu fai cortesemente quanto ti ho chiesto al post #5 ;)
Grazie,

Guglielmo
Search is Your friend ... or I am Your enemy !

gpb01

#9
Sep 23, 2018, 09:34 am Last Edit: Sep 23, 2018, 09:38 am by gpb01
Esempio di come manipolare direttamente i registri delle "PORT" della MCU di Arduino ... QUI ... dovrebbe chiarirti le idee di come si usano direttamente porte e registri attraverso l'IDE.

Per altri approfondimenti ... QUESTO è il posto giusto dove cercare (... non è legato all'ambiente Arduino, ma più alle MCU Atmel), mentre QUI ... cose interessati in ambiente Arduino ;)


Guglielmo
Search is Your friend ... or I am Your enemy !

SukkoPera

Sì ma lui sta lavorando su un ESP8266 se non ho capito male...
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

gpb01

#11
Sep 23, 2018, 05:25 pm Last Edit: Sep 23, 2018, 05:25 pm by gpb01
Sì ma lui sta lavorando su un ESP8266 se non ho capito male...
Mah, lui dice ...

... Mi sto cimentando a gestire la voce con arduino o suoi derivati (ESP8266), ma ho riscontrato che ne Arduino UNO ne esp8266 ce la fanno a eseguire un loop in meno di 125 micro sec che mi servirebbero per avere 8000 campioni al secondo....
... quindi credo che ESP8266 fosse un ripiego sperando in una maggiore velocità ... ::)

Guglielmo
Search is Your friend ... or I am Your enemy !

Etemenanki

Io invece ho un dubbio di tipo diverso ... da "ex" tecnico audio part-time (molto "ex", parliamo dell'alba dei campionatori, quasi :P), eravamo abituati a campionare le frequenze ad almeno 5 volte la massima frequenza utile ... dato che la voce in media va da 300Hz a 3KHz (salvo casi particolari), al minimo si campionava a 15KHz, di solito, e solo per applicazioni "non-hifi" (per l'HI-FI o applicazioni estreme si arrivava anche a campionare a 50KHz) ... con 8KHz di campionamento, se lo devi usare in ambito audio, al massimo ci campioni in modo decente 1600Hz, e potresti avere qualche disturbo di tipo "chopping" dato dal fatto che anche gli 8KHz a cui campioni rientrano nella frequenza udibile ... sicuro che ti bastano ?
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

magpa

Diciamo che le prove le sto facendo campionando al livello telefonico quindi con una frequenza di max 4Khz e quindi un campionamento almeno il doppio quindi 8000 campioni al sec. Un campione catturato ogni 125usec.
Ed è questo intervallo che vorrei ottenere dall'ESP8266 e penso che con gli accorgimenti di gpb01 credo ci si arrivi. Sto ancora provando.
Grazie dell'interessamento.

Spero a breve di darvi notizie positive.
Ciao a tutti

gpb01

#14
Sep 23, 2018, 07:57 pm Last Edit: Sep 23, 2018, 08:00 pm by gpb01
... penso che con gli accorgimenti di gpb01 credo ci si arrivi. Sto ancora provando.
Occhio perché le guide che ti ho dato sono per ATmega328P NON per ESP8266 ... che ha nomi di PORT e registri completamenti diversi ed anche le modalità di accesso diretto.

Perché non usare una Arduino MKRxxxx che monta un CORTEX-M0 la cui documentazione, per la programmazione "bare-metal" è ampiamente disponibile ?

Guglielmo

P.S.: Sto ancora aspettando che sistemi il codice come ti ho già chiesto più volte ...
Search is Your friend ... or I am Your enemy !

Go Up