Operácie

MEMS mikrofón ADMP401: Rozdiel medzi revíziami

Zo stránky SensorWiki

Balogh (diskusia | príspevky)
Bez shrnutí editace
StudentDVPS (diskusia | príspevky)
 
(40 medziľahlých úprav od rovnakého používateľa nie je zobrazených.)
Riadok 1: Riadok 1:
{|
{|
|Autori:      || '''Ján Mrkvička, Jozef Kuleha'''  
|Autori:      || '''Jakub Bohuš'''
|-           
|            || '''Ivona Gašparová'''  
|-
|-
|Študijný odbor:  || Aplikovaná mechatronika || 2. Ing. ('''2013''')  
|            || '''Radovan Vargic'''
|-                       
|Študijný odbor:  || '''Aplikovaná mechatronika'''
|-
|Ročník:      || '''2. Ing. ''' (2014)  
|}
|}


== Zadanie ==
== Zadanie ==


Treba popísať ako senzor funguje, čo všetko sa ním merať, pripojiť ho k procesoru a vymyslieť
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''' :
ukážkovú aplikáciu. Indikácia sily signálu na bar-graph type displeji.
* 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://homepage.hispeed.ch/peterfleury/group__pfleury__ic2master.html i2c library]
* [http://www.arcelect.com/rs232.htm RS232 sériová linka]




Riadok 24: Riadok 46:
== Analýza ==
== Analýza ==


V tejto časti popíšete ako idete daný problém riešiť. Uvediete sem aj všetky potrebné technické údaje,  
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.  
ktoré sú potrebné na úspešné vyriešenie projektu. Napríklad:
 
 
'''Schéma zapojenia snímača'''
[[Obrázok:ZapojenieADMP.jpeg]]
 


* popis komunikačnej zbernice (i2c, 1-wire, RS-232 a pod.)
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.
* obrázok zapojenia vývodov použitej súčiastky
* odkaz na katalógový list
* priebehy dôležitých signálov


'''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 ==


Sem opíšete ako konkrétne ste problém vyriešili. Začnite popisom pripojenia k procesoru
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.  
(nezabudnite na schému zapojenia!) a zdôraznite ktoré jeho periférie ste pritom využili.  


'''Schéma zapojenia snímača'''
zvuková stopa dvojitého tlesknutia zaznamenaná na serialchart pomocou ADMP401:
[[Súbor:Zapojenie.png]]


[[Súbor:Example.jpg]]
[[Obrázok:Tlesknutie.png]]


Pozn.: Názov obrázku musí byť jedinečný, uvedomte si, že Obr1.jpg už pred vami skúsilo
Foto zapojenia:
nahrať už aspoň 10 študentov.




[[Súbor:ADMPFOTO.jpg|600px]]


=== Algoritmus a program ===
=== Algoritmus a program ===


Uveďte stručný popis algoritmu, v akom jazyku a verzii vývojového prostredia ste ho vytvorili.  
Algoritmus bol navrhnutý v jazyku c, v programe AVR studio 4.  
Je vhodné nakresliť aspoň hrubú štruktúru programu napríklad vo forme vývojového diagramu.
Jednoduchý popis programu:
Rozsiahly program pre lepšiu prehľadnosť rozdeľte do viacerých súborov.
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.  


Vyberte podstatné časti zdrojového kódu, použite na to prostredie ''source'':
zdrojový kód:  


<source lang="c">
<source lang="c">
/* A nezabudnite zdroják hojne komentovať */
#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--;
}


int main(void) {
   
    printf("Hello, World!\n"); 
    return(0); 
}
}
//--------------------------------------------------------------------------------------------------------------------
//------------------------------------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>


Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!
Kompletné zdrojové kódy vášho programu:


Zdrojový kód: [[Médiá:Serial.h|serial.h]] a [[Médiá:Pip.c|main.c]]
Zdrojový kód: [[Médiá:Serial.h|serial.h]] a [[Médiá:DVPS_Zadanie_ADMP.c|DVPS_Zadanie_ADMP.c]]


[[Médiá:MojProgram.c|program.c]]
=== Overenie ===


=== 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.


Nezabudnite napísať čosi ako užívateľský návod. Z neho by malo byť jasné čo program robí,
ako sa prejavuje a aké má užívateľské rozhranie (čo treba stlačiť, čo sa kde zobrazuje).
Ak ste namerali nejaké signály, sem s nimi. Ak je výsledkom nejaký údaj na displeji,
odfotografujte ho.


Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.
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:


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:


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