Odtwarzacz muzyki

Jesli jesteś początkującym elektronikiem, to tu z pewnością znajdziesz pomoc. Miejsce dobre do dyskusji nad podstawami elektroniki w zakresie teorii i praktyki.
ODPOWIEDZ
mariuszz
-
Posty: 13
Rejestracja: 28 lis 2012, 14:21
Lokalizacja: Zewszad

Odtwarzacz muzyki

Post autor: mariuszz » 27 paź 2014, 16:45

Cześć.

Mikrokontrolerami nie bawiłem się już wieki a czasu mam niewiele (trochę się zgapiłem).

Robię antyramę i wymyśliłem, że po dotknięciu na zdjęcie będzie odtwarzana konkretna muzyka (każde zdjęcie to inny utwór). Wydaje się proste, chce tył zdjęcia obkleić jakąś pianką, żeby "odbijało" i na środku dać trochę przewodnika, taki prosty przycisk. Sygnał wyzwalający na uC i odtworzenie muzyki z karty SD. Zanim przypomnę sobie jak to wszystko się robi, zanim zakupie elementy, skombinuje programator to minie mi czas. Dlatego szukam gotowego projektu. Wydaje mi się, że znalazłem, pytam Was natomiast o zdanie, czy wszystko jest takie, jakie mi się wydaje, że jest.
Projekt: http://elm-chan.org/works/sd8p/report.html
Dźwięk w wersji mono: http://elm-chan.org/works/sd8p/rc/sd8p_mo.png (do stereo potrzebujemy lepszego programatora)
Source: http://elm-chan.org/works/sd8p/rc/sd8psrc.zip

Idę do sklepu, kupuje ATiny, głośniczek, czytnik i kartę mam. Wgrywam muzykę na kartę i zmieniam minimalnie main.c, aby po naciśnięciu danego przycisku funkcja main wchodziła w danego case'a i odtwarzała konkretny plik.
Przyciski podłączyć do PB5, jedynego wolnego portu w uC, przez ADC (wg dokumentacji 10bit, czyli starczy na 6 przycisków).

Tak / nie?

Dzięki wielkie!

Modyfikacja układu o uwzględnienie 6 przycisków na ADC (wg http://www.reuk.co.uk/wordpress/multipl ... adc-input/)
: http://i.imgur.com/2VNokF1.png

Awatar użytkownika
Ertew
Użytkownik
Posty: 1414
Rejestracja: 03 lip 2005, 10:36
Lokalizacja: Leszno
Kontakt:

Post autor: Ertew » 28 paź 2014, 22:18

Więc tak. Jeśli koniecznie chcesz zastosować klawisze mechaniczne, Twoja idea jest słuszna. Jeśli natomiast masz nieco odwagi, proponuję zastosować pojemnościowe czujniki dotykowe.
Pod każdym zdjęciem podklejasz folię przewodzącą (aluminiową lub miedzianą) którą łączysz z pinem uC. Jedno pole = jeden pin, opcjonalnie można dać dodatkowy pin sterujący wszystkimi polami (ułatwiający programowania i/lub zwiększający czułość).
Przykładowy układ i kod: http://elm-chan.org/works/capsens/report_e.html


A niezależnie od wybranego rozwiązania mam pytanie, czy zależy Ci na miniaturowym rozwiązaniu (karta uSD i uC 8-pinowy)?
Poza miniaturyzacją, procesory z serii tiny maja tą wadę, że do programowania musisz wyjąć kartę SD albo wyjąć uC z podstawki (braki wolnych pinów, ograniczony bootloader).

Jeśli nie szukasz oszczędności miejsca, zainwestuj w klasyczny uC typu AtMega8, 8A albo 88. W razie większego zapotrzebowania na pamięć RAM/Flash są do wyboru wyższe modele.
Taki uC ma więcej lini i/o co pozwala na użycie innych rozwiązań odczytu klawiszy, nie potrzebujesz programatora wysokonapięciowego by wykorzystać linię RST jako pin i/o, a na deser masz możliwość wyposażenia urządzenia w bootlader (patrz UsbAspLoader) co dodaje uroku urządzeniu.

mariuszz
-
Posty: 13
Rejestracja: 28 lis 2012, 14:21
Lokalizacja: Zewszad

Post autor: mariuszz » 29 paź 2014, 0:15

Układ ma być bardzo prosty a pierwsze na co wpadłem to właśnie takie mechaniczne rozwiązanie. I skoro faktycznie zamysł jest prawidłowy, to jest to wystarczające.
Co do sugestii. Masz rację i zdaję sobie z tego sprawę, lecz wszystko ma być ukryte pod antyramą, która z tyłu ma bardzo mało miejsca, także im mniej tym lepiej. I też cały układ będzie raz zaprogramowany i koniec, połączony i ma działać. Ograniczają mnie choćby takie banały jak mocno ograniczony dostęp do programatora.
Do dźwięku w wersji mono też nie potrzebuje programatora wysokonapięciowego.
Jak nie dam rady zrobić tego w przeciągu kilku dni na zasadzie, że po zaprogramowaniu na 100% będzie działać, to odłożę pomysł na później i będę mógł na spokojnie sam się tym zająć, ponieważ nie jest to nazbyt skomplikowane (choć mam nadzieję, że do takiej sytuacji nie dojdzie).
Poniżej wklejam zmodyfikowany przeze mnie fragment kodu z pliku main.c, samą funkcję main().
Wydaje mi się, że poprawnie to rozwiązałem i w zależności od stanu napięcia na pinie ADC wywoła się odpowiedni if i odpali się dźwięk z folderu o danej nazwie (w teorii wszystkie dźwięki z tego folderu, w praktyce będzie tam tylko jeden).

Kod: Zaznacz cały

int main (void)
{
	FRESULT res;
	char *dir;
	BYTE org_osc = OSCCAL;
 
 
	MCUSR = 0;
	WDTCR = _BV(WDE) | 0b110;	/* Enable WDT reset in timeout of 1s */
 
	PORTB = 0b101001;		/* Initialize port: - - H L H L L P */
	DDRB  = 0b111110;
 
	sei();
 
	initADC();
 
	if (ADCH > 200)
    	{
      	if (pf_mount(&Fs) == FR_OK) 
		{	/* Initialize FS */
			wdt_reset();
			Buff[0] = 0;
			if (!pf_open("osccal")) pf_read(Buff, 1, &rb);	/* Adjust frequency */
			OSCCAL = org_osc + Buff[0];
 
			res = pf_opendir(&Dir, dir = "jeden");	/* Open jeden folder directory */
 
			while (res == FR_OK) 
				{
				res = pf_readdir(&Dir, 0);			/* Rewind dir */
				while (res == FR_OK) 
					{				/* Play all wav files in the dir */
					wdt_reset();
					res = pf_readdir(&Dir, &Fno);		/* Get a dir entry */
					if (res || !Fno.fname[0]) break;	/* Break on error or end of dir */
					if (!(Fno.fattrib & (AM_DIR|AM_HID)) && strstr(Fno.fname, ".WAV"))
						res = play(dir, Fno.fname);		/* Play file */
					}
				}
		}
		delay500();			/* Delay 500ms in low power sleep mode */
    	} 
	else if((ADCH < 200)&&(ADCH >= 160))
	{
	if (pf_mount(&Fs) == FR_OK) 
		{	/* Initialize FS */
			wdt_reset();
			Buff[0] = 0;
			if (!pf_open("osccal")) pf_read(Buff, 1, &rb);	/* Adjust frequency */
			OSCCAL = org_osc + Buff[0];
 
			res = pf_opendir(&Dir, dir = "dwa");	/* Open dwa folder directory */
 
			while (res == FR_OK) 
				{
				res = pf_readdir(&Dir, 0);			/* Rewind dir */
				while (res == FR_OK) 
					{				/* Play all wav files in the dir */
					wdt_reset();
					res = pf_readdir(&Dir, &Fno);		/* Get a dir entry */
					if (res || !Fno.fname[0]) break;	/* Break on error or end of dir */
					if (!(Fno.fattrib & (AM_DIR|AM_HID)) && strstr(Fno.fname, ".WAV"))
						res = play(dir, Fno.fname);		/* Play file */
					}
				}
		}
		delay500();			/* Delay 500ms in low power sleep mode */
 
    	}
	else if((ADCH < 160 )&&(ADCH >= 120))
	{
	if (pf_mount(&Fs) == FR_OK) 
		{	/* Initialize FS */
			wdt_reset();
			Buff[0] = 0;
			if (!pf_open("osccal")) pf_read(Buff, 1, &rb);	/* Adjust frequency */
			OSCCAL = org_osc + Buff[0];
 
			res = pf_opendir(&Dir, dir = "trzy");	/* Open trzy folder directory */
 
			while (res == FR_OK) 
				{
				res = pf_readdir(&Dir, 0);			/* Rewind dir */
				while (res == FR_OK) 
					{				/* Play all wav files in the dir */
					wdt_reset();
					res = pf_readdir(&Dir, &Fno);		/* Get a dir entry */
					if (res || !Fno.fname[0]) break;	/* Break on error or end of dir */
					if (!(Fno.fattrib & (AM_DIR|AM_HID)) && strstr(Fno.fname, ".WAV"))
						res = play(dir, Fno.fname);		/* Play file */
					}
				}
		}
		delay500();			/* Delay 500ms in low power sleep mode */
 
    	}
	else if((ADCH < 120)&&(ADCH >= 80))
	{
	if (pf_mount(&Fs) == FR_OK) 
		{	/* Initialize FS */
			wdt_reset();
			Buff[0] = 0;
			if (!pf_open("osccal")) pf_read(Buff, 1, &rb);	/* Adjust frequency */
			OSCCAL = org_osc + Buff[0];
 
			res = pf_opendir(&Dir, dir = "cztery");	/* Open cztery folder directory */
 
			while (res == FR_OK) 
				{
				res = pf_readdir(&Dir, 0);			/* Rewind dir */
				while (res == FR_OK) 
					{				/* Play all wav files in the dir */
					wdt_reset();
					res = pf_readdir(&Dir, &Fno);		/* Get a dir entry */
					if (res || !Fno.fname[0]) break;	/* Break on error or end of dir */
					if (!(Fno.fattrib & (AM_DIR|AM_HID)) && strstr(Fno.fname, ".WAV"))
						res = play(dir, Fno.fname);		/* Play file */
					}
				}
		}
		delay500();			/* Delay 500ms in low power sleep mode */
 
    	}
	else if((ADCH < 80)&&(ADCH >= 40))
	{
	if (pf_mount(&Fs) == FR_OK) 
		{	/* Initialize FS */
			wdt_reset();
			Buff[0] = 0;
			if (!pf_open("osccal")) pf_read(Buff, 1, &rb);	/* Adjust frequency */
			OSCCAL = org_osc + Buff[0];
 
			res = pf_opendir(&Dir, dir = "piec");	/* Open piec folder directory */
 
			while (res == FR_OK) 
				{
				res = pf_readdir(&Dir, 0);			/* Rewind dir */
				while (res == FR_OK) 
					{				/* Play all wav files in the dir */
					wdt_reset();
					res = pf_readdir(&Dir, &Fno);		/* Get a dir entry */
					if (res || !Fno.fname[0]) break;	/* Break on error or end of dir */
					if (!(Fno.fattrib & (AM_DIR|AM_HID)) && strstr(Fno.fname, ".WAV"))
						res = play(dir, Fno.fname);		/* Play file */
					}
				}
		}
		delay500();			/* Delay 500ms in low power sleep mode */
 
    	}
	else if((ADCH < 40)&&(ADCH > 0))
	{
	if (pf_mount(&Fs) == FR_OK) 
		{	/* Initialize FS */
			wdt_reset();
			Buff[0] = 0;
			if (!pf_open("osccal")) pf_read(Buff, 1, &rb);	/* Adjust frequency */
			OSCCAL = org_osc + Buff[0];
 
			res = pf_opendir(&Dir, dir = "szesc");	/* Open szesc folder directory */
 
			while (res == FR_OK) 
				{
				res = pf_readdir(&Dir, 0);			/* Rewind dir */
				while (res == FR_OK) 
					{				/* Play all wav files in the dir */
					wdt_reset();
					res = pf_readdir(&Dir, &Fno);		/* Get a dir entry */
					if (res || !Fno.fname[0]) break;	/* Break on error or end of dir */
					if (!(Fno.fattrib & (AM_DIR|AM_HID)) && strstr(Fno.fname, ".WAV"))
						res = play(dir, Fno.fname);		/* Play file */
					}
				}
		}
		delay500();			/* Delay 500ms in low power sleep mode */
 
    	}
}
 
 

ODPOWIEDZ