MEMS mikrofón ADMP401: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
|||
(40 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
Riadok 1: | Riadok 1: | ||
{| | {| | ||
|Autori: || ''' | |Autori: || '''Jakub Bohuš''' | ||
|- | |||
| || '''Ivona Gašparová''' | |||
|- | |- | ||
|Študijný odbor: || Aplikovaná mechatronika || 2. Ing. | | || '''Radovan Vargic''' | ||
|- | |||
|Študijný odbor: || '''Aplikovaná mechatronika''' | |||
|- | |||
|Ročník: || '''2. Ing. ''' (2014) | |||
|} | |} | ||
== Zadanie == | == Zadanie == | ||
Naším zadaním bolo popísanie senzora '''ADMP401''', jeho funkcionalitu a čo všetko je možné s ním merať. Charakteristika senzora '''ADMP401''' : | |||
* malé rozmery 4.72 mm x 3.76 mm x 1.0 mm (SMD) | |||
* High SNR 62dB | |||
* citlivosť -42 dBV | |||
* frekvenčná odozva od 100 Hz po 15 kHz | |||
* nízka spotreba prúdu < 250 uA | |||
* analógový výstup | |||
* vysoká PSR 70 dB | |||
* kompatibilný s Sn / Pb a Pb spojkovacích procesov | |||
* 1.5 až 3.3 VDC napájacie napätie | |||
[[Obrázok:SparkFun_Admp401.jpg|300px|center]] | [[Obrázok:SparkFun_Admp401.jpg|300px|center]] | ||
'''V súčasnosti sa s obľubou využíva v nasledovných zariadeniach :''' | |||
* smartphony a iné telefóny | |||
* telekonferenčné systémy | |||
* digitálne video kamery | |||
* bluetooth náhlavne súpravy | |||
* tablety | |||
'''Literatúra:''' | '''Literatúra:''' | ||
* Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod. | * Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod. : | ||
* [https://www.sparkfun.com/products/9868 Product page] | * [https://www.sparkfun.com/products/9868 Product page] | ||
* [http://www.analog.com/static/imported-files/data_sheets/ADMP401.pdf Sensor datasheet] | * [http://www.analog.com/static/imported-files/data_sheets/ADMP401.pdf Sensor ADMP401 datasheet] | ||
* [http:// | * [http://www.arcelect.com/rs232.htm RS232 sériová linka] | ||
Riadok 24: | Riadok 46: | ||
== Analýza == | == Analýza == | ||
V | V rámci projektu sme riešili na vývojovej doske '''ACROB''' ([http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description#Documentation ACROB dokumentácia]), s osadeným mikroprocesorom '''ATmega328P'''. Na vývojovú dosku sme zapojili ADMP401 a jednu LED. Navrhnutá aplikácia demonštruje použitie mikrofónu na ovládanie osvetlenia. Na komunikáciu medzi vývojovou doskou a PC sme použili seriový port alebo '''RS232 linku'''. Cez sériovú linku posielame údaje do PC a zobrazujeme ich v programe serial chart. | ||
'''Schéma zapojenia snímača''' | |||
[[Obrázok:ZapojenieADMP.jpeg]] | |||
Popis komunikačnej linky '''RS232''' : Sériový port je určený na vzájomnú sériovú komunikáciu dvoch zariadení, čiže dáta sa prenášajú po jednotlivých bitoch postupne za sebou (v sérii) po jednom vodiči. | |||
'''Parametre charakterizujúce sériový port :''' | |||
* číslo portu (napr. COM1,COM2), obvykle je spojené s prerušením IRQ a a dresou viazanými na port. Nastavenia sú obvyklé, dajú sa však zmeniť. | |||
* rýchlosť prenosu baud (napr. 9600) | |||
* počet bitov (napr. 8) | |||
* parita - 'N' - žiadna parita,'O' - nepárna,'E' - párna parita,'M' - paritný bit má vždy hodnotu 1 a 'S' - paritný bit má vždy hodnotu 0 | |||
* stop bity - 0=1; 1=1,5; 2=2 | |||
* hardwarové riadenie toku - zapnuté / vypnuté | |||
* softwarové riadenie toku - zapnuté / vypnuté | |||
''' Prenos dát : ''' | |||
* '''Synchrónny prenos'''. Pri synchrónnom prenose sa na vodičoch nastaví úroveň a informácia sa potvrdí impulzom, alebo zmenou úrovne synchronizačného signálu. Synchronizačný signál je vysielaný aj keď sa neprenášajú žiadne dáta. Synchronizácia umožňuje rýchlejší prenos dát ako asynchrónny, keďže nevyžaduje vysielanie dodatočných znakov vyznačujúcich začiatok a koniec prenášaného rámca. Vysielacia a prijímacia strana musia mať časové základne (generátory taktovacích impulzov), ktoré musia byť synchronizované. Značky sú vysielané ako nepretržitý reťazec bitov, v medzerách sa automaticky vkladajú stavové bity. Začiatky a konce všetkých bitov musia korenšpondovať s časovou základňou. Nevýhodou je zložité synchronizovanie, veľkou výhodou však je efektívne využitie kanála a možnost zabezpečenia prenosu proti chybovosti. Dátové prvky majú rovnakú dlžku trvania, prenos sa používa pre veľké objemy dát a tam, kde je potrebné počas prenosu zabezpečiť šírku pásma. | |||
* '''Asynchrónny prenos'''. RS-232 používa asynchrónny prenos informácií. Pri asynchrónnom prenose sa dáta prenášajú v sekvenciách (rámcoch) danou rýchlosťou s úvodnou štartovacou sekvenciou vyslaním start bitu. Hneď ako bol start bit vyslaný, vysielač posiela dátové bity, ktorých môže byť 5, 6, 7, alebo 8, v závislosti od konfiguračnej voľby. Nasleduje paritný bit (nie je povinný). Prenášaný rámec je ukončený stop bitom. Dĺžky trvania jednotlivých bajtov sú rôzne, rôzne sú i medzery medzi dvoma blokmi. Prijímač nerozozná dva nasledujúce dátové bloky. Objem prenášaných dát sa pri tomto type prenosu rozdelí na menšie casti, každá časť sa posiela nezávisle na ostatných, časové intervaly medzi odosielaním jednotlivých bajtov sa môžu líšiť. | |||
== Popis riešenia == | == Popis riešenia == | ||
Po naštudovaní senzora '''ADMP401''' a zapojení na vývojovú dosku '''ACROB''' sme zaznamenávali dáta pomocou sériovej linky '''RS232''' do PC. Pomocou programu '''Serial Chart''' sme dané dáta vykreslovali. Určili sme si že signál na ovládanie LED bude dvojité tlesknutie rukami. Najprv sme zapojili na dosku len modul s ADMP401 a sledovali sme odozvu snímača na dvojité tlesknutie. Po analýze tejto zvukovej stopy sme navrhli algoritmus, ktorý takúto zvukovú stopu dokáže detekovať. Ak sa v zázname daná zvuková stopa vyskytne, program zapne/vypne LED. | |||
zvuková stopa dvojitého tlesknutia zaznamenaná na serialchart pomocou ADMP401: | |||
[[ | [[Obrázok:Tlesknutie.png]] | ||
Foto zapojenia: | |||
[[Súbor:ADMPFOTO.jpg|600px]] | |||
=== Algoritmus a program === | === Algoritmus a program === | ||
Algoritmus bol navrhnutý v jazyku c, v programe AVR studio 4. | |||
Jednoduchý popis programu: | |||
Výstup zo senzora je zapojený na vstup AD prevodníka, v programe preto inicializujeme AD prevodník, následne výsledok prevodu ukladáme do premennej buffer. Hodnoty v tejto premennej reprezentujú zvukový záznam v čase, preto sme použili serialchart na zobrazenie dát. Program potom podla požiadavky detekuje dvojité tlesknutie a ovláda LED. | |||
zdrojový kód: | |||
<source lang="c"> | <source lang="c"> | ||
/ | #include <avr\io.h> //include hlavickovych suborov | ||
#include <stdio.h> | |||
#include "serial.h" | |||
FILE mystdout = FDEV_SETUP_STREAM(sendchar, NULL, _FDEV_SETUP_WRITE); | |||
// Inicializacia seriovej linky | |||
#define LED_ON PORTB = 0x00; // definovanie makier pre LED | |||
#define LED_OFF PORTB = 0x01; | |||
void delay_ms(int ms); // funkcia delay | |||
void adc_init(void); // funkcia inicializacie AD prevodnika | |||
int main(void) | |||
{ | |||
unsigned int buffer_new; //definovanie premennej | |||
unsigned int buffer; //definovanie premennej | |||
int i; //definovanie premennej | |||
int a=0; | |||
int b=0; | |||
int LED=0; | |||
adc_init(); // Init A/D converter | |||
inituart(); // Inicializacia seriovej linky | |||
stdout = &mystdout; // Odteraz funguje printf(); | |||
DDRB = 0x01; // 1 = Output, 0 = Input | |||
LED_ON; // zapnutie led na 3 sec (kontrola) | |||
delay_ms(3000); | |||
LED_OFF; | |||
while (1) //loop | |||
{ | |||
ADCSRA |= (1<<ADSC); // Start A/D conversion | |||
while ( !(ADCSRA & (1<<ADIF))); // Wait until AD not finished | |||
buffer = ADC; // vysledok prevodu do buffer | |||
delay_ms(5); | |||
printf("%d\r",buffer); //posielanie po seriovej linke hodnotu buffer | |||
b=b+1; | |||
if (buffer < 512) //absolútna hodnota z buffer | |||
{ | |||
buffer_new = 512-buffer; | |||
} | |||
else | |||
{ | |||
buffer_new = buffer - 512; | |||
} | |||
if (buffer_new > 200) //detekcia zvkuku ked prekroci stanovenu hranicu | |||
{ | |||
a=a+1; | |||
if (a==1) | |||
{ | |||
b=0; | |||
} | |||
} | |||
if ((a>5) && (b<300)) //nastavenie ochrany proti nahodnym zvukom | |||
{ | |||
a=0; | |||
} | |||
if ((b>300) && (b<600)) //detekcia dvojiteho tlesknutia | |||
{ | |||
if ((a>=2) && (a<=5)) | |||
{ | |||
if (LED==1) //zapnutie/vypnutie led | |||
{ | |||
LED_OFF; | |||
LED=0; | |||
a=0; | |||
} | |||
else | |||
{ | |||
LED_ON; | |||
LED=1; | |||
a=0; | |||
} | |||
} | |||
else | |||
{ | |||
a=0; | |||
} | |||
} | |||
if(b>=600) | |||
{ | |||
a=0; | |||
} | |||
} | |||
} | |||
//-------------------------------------------------------------------------------------------------------------------- | |||
//--------------------------------------Vytvorenie delay funkcie------------------------------------------------------- | |||
//-------------------------------------------------------------------------------------------------------------------- | |||
void delay_ms(int ms) | |||
{ | |||
unsigned int index; | |||
while (ms) | |||
{ | |||
index = 4*799; | |||
while(index) | |||
{ | |||
asm volatile ("nop"); | |||
index --; | |||
} | |||
ms--; | |||
} | |||
} | } | ||
//-------------------------------------------------------------------------------------------------------------------- | |||
//------------------------------------Inicializacia ADC0 vstupu------------------------------------------------------- | |||
//-------------------------------------------------------------------------------------------------------------------- | |||
void adc_init(void) // A/D converter initialization | |||
{ | |||
ADMUX = 0b01000000; // Ref: AREF, Internal Vref turned off, Channel 0 (ADC0) - NTC | |||
ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // =0b10000111, A/D ON, prescaler = 128 | |||
} | |||
</source> | </source> | ||
Kompletné zdrojové kódy vášho programu: | |||
Zdrojový kód: [[Médiá:Serial.h|serial.h]] a [[Médiá: | Zdrojový kód: [[Médiá:Serial.h|serial.h]] a [[Médiá:DVPS_Zadanie_ADMP.c|DVPS_Zadanie_ADMP.c]] | ||
=== Overenie === | |||
Program sme otestovali a výsledok je demonštrovaný videom. Program reaguje na dvojité tlesknutie a následne ovláda LED. Takáto aplikácia by mohla byt základom pre pokročilejšie zariadenia, napríklad v domácnosti, kde by mohli byt nahradené bežné vypínače. Dokonalejšie aplikácie sa ale už dnes využívajú na hlasové ovládanie rôznych zariadení, napríklad SMART TV. | |||
https://www.youtube.com/embed/UNbrU0U9Y3M | |||
[[Category:AVR]] [[Category:DVPS]] | [[Category:AVR]] [[Category:DVPS]] |
Aktuálna revízia z 09:34, 13. február 2015
Autori: | Jakub Bohuš |
Ivona Gašparová | |
Radovan Vargic | |
Študijný odbor: | Aplikovaná mechatronika |
Ročník: | 2. Ing. (2014) |
Zadanie
Naším zadaním bolo popísanie senzora ADMP401, jeho funkcionalitu a čo všetko je možné s ním merať. Charakteristika senzora ADMP401 :
- malé rozmery 4.72 mm x 3.76 mm x 1.0 mm (SMD)
- High SNR 62dB
- citlivosť -42 dBV
- frekvenčná odozva od 100 Hz po 15 kHz
- nízka spotreba prúdu < 250 uA
- analógový výstup
- vysoká PSR 70 dB
- kompatibilný s Sn / Pb a Pb spojkovacích procesov
- 1.5 až 3.3 VDC napájacie napätie
V súčasnosti sa s obľubou využíva v nasledovných zariadeniach :
- smartphony a iné telefóny
- telekonferenčné systémy
- digitálne video kamery
- bluetooth náhlavne súpravy
- tablety
Literatúra:
- Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod. :
- Product page
- Sensor ADMP401 datasheet
- RS232 sériová linka
Analýza
V rámci projektu sme riešili na vývojovej doske ACROB (ACROB dokumentácia), s osadeným mikroprocesorom ATmega328P. Na vývojovú dosku sme zapojili ADMP401 a jednu LED. Navrhnutá aplikácia demonštruje použitie mikrofónu na ovládanie osvetlenia. Na komunikáciu medzi vývojovou doskou a PC sme použili seriový port alebo RS232 linku. Cez sériovú linku posielame údaje do PC a zobrazujeme ich v programe serial chart.
Schéma zapojenia snímača
Súbor:ZapojenieADMP.jpeg
Popis komunikačnej linky RS232 : Sériový port je určený na vzájomnú sériovú komunikáciu dvoch zariadení, čiže dáta sa prenášajú po jednotlivých bitoch postupne za sebou (v sérii) po jednom vodiči.
Parametre charakterizujúce sériový port :
- číslo portu (napr. COM1,COM2), obvykle je spojené s prerušením IRQ a a dresou viazanými na port. Nastavenia sú obvyklé, dajú sa však zmeniť.
- rýchlosť prenosu baud (napr. 9600)
- počet bitov (napr. 8)
- parita - 'N' - žiadna parita,'O' - nepárna,'E' - párna parita,'M' - paritný bit má vždy hodnotu 1 a 'S' - paritný bit má vždy hodnotu 0
- stop bity - 0=1; 1=1,5; 2=2
- hardwarové riadenie toku - zapnuté / vypnuté
- softwarové riadenie toku - zapnuté / vypnuté
Prenos dát :
- Synchrónny prenos. Pri synchrónnom prenose sa na vodičoch nastaví úroveň a informácia sa potvrdí impulzom, alebo zmenou úrovne synchronizačného signálu. Synchronizačný signál je vysielaný aj keď sa neprenášajú žiadne dáta. Synchronizácia umožňuje rýchlejší prenos dát ako asynchrónny, keďže nevyžaduje vysielanie dodatočných znakov vyznačujúcich začiatok a koniec prenášaného rámca. Vysielacia a prijímacia strana musia mať časové základne (generátory taktovacích impulzov), ktoré musia byť synchronizované. Značky sú vysielané ako nepretržitý reťazec bitov, v medzerách sa automaticky vkladajú stavové bity. Začiatky a konce všetkých bitov musia korenšpondovať s časovou základňou. Nevýhodou je zložité synchronizovanie, veľkou výhodou však je efektívne využitie kanála a možnost zabezpečenia prenosu proti chybovosti. Dátové prvky majú rovnakú dlžku trvania, prenos sa používa pre veľké objemy dát a tam, kde je potrebné počas prenosu zabezpečiť šírku pásma.
- Asynchrónny prenos. RS-232 používa asynchrónny prenos informácií. Pri asynchrónnom prenose sa dáta prenášajú v sekvenciách (rámcoch) danou rýchlosťou s úvodnou štartovacou sekvenciou vyslaním start bitu. Hneď ako bol start bit vyslaný, vysielač posiela dátové bity, ktorých môže byť 5, 6, 7, alebo 8, v závislosti od konfiguračnej voľby. Nasleduje paritný bit (nie je povinný). Prenášaný rámec je ukončený stop bitom. Dĺžky trvania jednotlivých bajtov sú rôzne, rôzne sú i medzery medzi dvoma blokmi. Prijímač nerozozná dva nasledujúce dátové bloky. Objem prenášaných dát sa pri tomto type prenosu rozdelí na menšie casti, každá časť sa posiela nezávisle na ostatných, časové intervaly medzi odosielaním jednotlivých bajtov sa môžu líšiť.
Popis riešenia
Po naštudovaní senzora ADMP401 a zapojení na vývojovú dosku ACROB sme zaznamenávali dáta pomocou sériovej linky RS232 do PC. Pomocou programu Serial Chart sme dané dáta vykreslovali. Určili sme si že signál na ovládanie LED bude dvojité tlesknutie rukami. Najprv sme zapojili na dosku len modul s ADMP401 a sledovali sme odozvu snímača na dvojité tlesknutie. Po analýze tejto zvukovej stopy sme navrhli algoritmus, ktorý takúto zvukovú stopu dokáže detekovať. Ak sa v zázname daná zvuková stopa vyskytne, program zapne/vypne LED.
zvuková stopa dvojitého tlesknutia zaznamenaná na serialchart pomocou ADMP401:
Foto zapojenia:
Algoritmus a program
Algoritmus bol navrhnutý v jazyku c, v programe AVR studio 4. Jednoduchý popis programu: Výstup zo senzora je zapojený na vstup AD prevodníka, v programe preto inicializujeme AD prevodník, následne výsledok prevodu ukladáme do premennej buffer. Hodnoty v tejto premennej reprezentujú zvukový záznam v čase, preto sme použili serialchart na zobrazenie dát. Program potom podla požiadavky detekuje dvojité tlesknutie a ovláda LED.
zdrojový kód:
#include <avr\io.h> //include hlavickovych suborov
#include <stdio.h>
#include "serial.h"
FILE mystdout = FDEV_SETUP_STREAM(sendchar, NULL, _FDEV_SETUP_WRITE);
// Inicializacia seriovej linky
#define LED_ON PORTB = 0x00; // definovanie makier pre LED
#define LED_OFF PORTB = 0x01;
void delay_ms(int ms); // funkcia delay
void adc_init(void); // funkcia inicializacie AD prevodnika
int main(void)
{
unsigned int buffer_new; //definovanie premennej
unsigned int buffer; //definovanie premennej
int i; //definovanie premennej
int a=0;
int b=0;
int LED=0;
adc_init(); // Init A/D converter
inituart(); // Inicializacia seriovej linky
stdout = &mystdout; // Odteraz funguje printf();
DDRB = 0x01; // 1 = Output, 0 = Input
LED_ON; // zapnutie led na 3 sec (kontrola)
delay_ms(3000);
LED_OFF;
while (1) //loop
{
ADCSRA |= (1<<ADSC); // Start A/D conversion
while ( !(ADCSRA & (1<<ADIF))); // Wait until AD not finished
buffer = ADC; // vysledok prevodu do buffer
delay_ms(5);
printf("%d\r",buffer); //posielanie po seriovej linke hodnotu buffer
b=b+1;
if (buffer < 512) //absolútna hodnota z buffer
{
buffer_new = 512-buffer;
}
else
{
buffer_new = buffer - 512;
}
if (buffer_new > 200) //detekcia zvkuku ked prekroci stanovenu hranicu
{
a=a+1;
if (a==1)
{
b=0;
}
}
if ((a>5) && (b<300)) //nastavenie ochrany proti nahodnym zvukom
{
a=0;
}
if ((b>300) && (b<600)) //detekcia dvojiteho tlesknutia
{
if ((a>=2) && (a<=5))
{
if (LED==1) //zapnutie/vypnutie led
{
LED_OFF;
LED=0;
a=0;
}
else
{
LED_ON;
LED=1;
a=0;
}
}
else
{
a=0;
}
}
if(b>=600)
{
a=0;
}
}
}
//--------------------------------------------------------------------------------------------------------------------
//--------------------------------------Vytvorenie delay funkcie-------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------
void delay_ms(int ms)
{
unsigned int index;
while (ms)
{
index = 4*799;
while(index)
{
asm volatile ("nop");
index --;
}
ms--;
}
}
//--------------------------------------------------------------------------------------------------------------------
//------------------------------------Inicializacia ADC0 vstupu-------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------
void adc_init(void) // A/D converter initialization
{
ADMUX = 0b01000000; // Ref: AREF, Internal Vref turned off, Channel 0 (ADC0) - NTC
ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // =0b10000111, A/D ON, prescaler = 128
}
Kompletné zdrojové kódy vášho programu:
Zdrojový kód: serial.h a DVPS_Zadanie_ADMP.c
Overenie
Program sme otestovali a výsledok je demonštrovaný videom. Program reaguje na dvojité tlesknutie a následne ovláda LED. Takáto aplikácia by mohla byt základom pre pokročilejšie zariadenia, napríklad v domácnosti, kde by mohli byt nahradené bežné vypínače. Dokonalejšie aplikácie sa ale už dnes využívajú na hlasové ovládanie rôznych zariadení, napríklad SMART TV.