MEMS mikrofón ADMP401

Z SensorWiki
Prejsť na: navigácia, hľadanie
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
SparkFun Admp401.jpg

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:


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:

Súbor:Tlesknutie.png

Foto zapojenia:


ADMPFOTO.jpg

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.


https://www.youtube.com/embed/UNbrU0U9Y3M