KeyBoard Piano IBRAM DILET 334CA

Introducere

Tema proiectului isi propune sa gaseasca utilitati multiple pentru tastatura. Una dintre aceste utilitati ar putea fi, de ce nu, simularea unui instrument musical si anume, pianul. Ideal, trebuie sa se redea 8 sunete diferite (facand parte dintr-o octava).

Descriere Generala

Ideea de rezolvare este theoretic simpla, insa practica dovedeste oarecum contrariul . Pentru a evita gasirea prin “dibuire” a frecventelor potrivite pentru generarea sunetului (implicit pentru a renunta la implementarea amplificatorului) am cumparat o pianina de jucarie din care m-am folosit de:

  • Cipul care nu face decat sa scoata la iesire 8 frecvente diferite in functie de cele 8 butoane cu care e prevazut (o chinezarie!)
  • Boxa de sunet
  • Alimentarea din baterii

Urmeaza ca prin conectarea la calculator sa preia comenzi de la tastatura:

  • Apasarea tastelor ‘1’→’8’ au ca effect producerea de sunete;
  • Apasarea tastei ‘r’: are ca effect inceperea inregistrarii secventei de taste care urmeaza a fi introduce
  • Apasarea tastei ‘s’: opreste acest process de inregistrare
  • Apasarea tastei ‘p’: are ca effect redarea melodiei generate de secventa inregistrata

Asadar, in schema bloc din figura, este reprezentat cum prin intermediul unui terminal, folosind tastatura, utilizatorul trimite date pe o interfata seriala catre placuta standard ce contine microcontrollerul. Acesta primeste un caracter si trebuie sa vada ce fel de comanda este. Comenzile pe care le primeste sunt de la tastele ‘1’ –> ‘8’ (emiterea unei note musicale) sau ‘r’ (record), ‘p’ (play), ‘s’ (stop record) . Aceste comenzi se rezuma practic la codul ASCII al tastelor respective.

Hardware Design

Interfatarea hardware pe care o folosesc trebuie sa ia locul acestui contactelor mecanice prin care functiona initial cipul pianinei de jucarie. Pentru aceasta am nevoie de un releu si de un control asupra lui folosind microcontrollerul. Atunci cand primeste o comanda microcontroller-ul trimite un impuls catre releu, impuls ce este controlat printr-un tranzistor. Folosesc si un led intermediar pentru a vedea ca microcontrollerul a trimis comanda cu succes. Releul este conectat la cele doua puncte ale contactului din telecomanda, si el actioneaza practic precum un intrerupator.

Software Design

IMPORTANT: Setam porturile C si D ca porturi de iesire: DDRC = 0xFF; DDRD = 0xFF; while(1) { PORTC = 0; PORTD = 0; scanf(”%c”,&step); verific ce fel de comanda dau

switch((int)step)
{
	case ((int)nota_do1):
		printf("DO1\n");
		PORTD = 128;
		break;
	case ((int)nota_re):
		printf("RE\n");
		PORTC= 1;
		break;
	case ((int)nota_mi):
		printf("MI\n");
		PORTC = 2;
		break;
	case ((int)nota_fa):
		printf("FA\n");
		PORTC = 4;
		break;
	case ((int)nota_sol):
		printf("SOL\n");
		PORTC = 8;
		break;
	case ((int)nota_la):
		printf("LA\n");
		PORTC = 16;
		break;
	case ((int)nota_si):
		printf("SI\n");
		PORTC = 32;
		break;
		case ((int)nota_do2):
		printf("DO2\n");
		PORTC = 64;
		break;
	case((int)record):
		printf("Yees Master! Incepem inregistrarea! Your wish is my command\n");
		saving_mode = 1;
		break;
	case((int)stop_record):
		printf("Stiu, si eu ziceam la fel. Sa ne oprim! Nu mai inregistram\n");
		saving_mode = 0;
		nr_steps = register_step;
		register_step = 0;
		break;
	case((int)play):
		printf("... Sa redam nebuniaaa inregistrata [numar note inregistrate -> %i] ...\n", nr_steps);
		for(i = 0; i < nr_steps; i++)
		{
			c = EEPROM_read(i);
			switch((int)c)
			{
				case ((int)nota_do1):
					printf("DO1\n");
					PORTD = 128;
					break;
				case ((int)nota_re):
					printf("RE\n");
					PORTC= 1;
					break;
				case ((int)nota_mi):
					printf("MI\n");
					PORTC = 2;
					break;
				case ((int)nota_fa):
					printf("FA\n");
					PORTC = 4;
					break;
				case ((int)nota_sol):
					printf("SOL\n");
					PORTC = 8;
					break;
				case ((int)nota_la):
					printf("LA\n");
					PORTC = 16;
					break;
				case ((int)nota_si):
					printf("SI\n");
					PORTC = 32;
					break;
				case ((int)nota_do2):
					printf("DO2\n");
					PORTC = 64;
					break;
			}
			for(j = 0; j < 4; j++)
				wait();
			PORTC = 0;
			PORTD = 0;
			for(j = 0; j < 4; j++)
				wait();
		}
		break;
}
if (saving_mode == 1)
{
	EEPROM_write(register_step, step);
	register_step++;
}
wait();

}

Am adaugat si o parte de memorie in care comunic cu EEPROM , pentru a salva miscarile masinutei. void EEPROM_write(unsigned int uiAddress, unsigned char ucData) {

/* Wait for completion of previous write */
while(EECR & (1<<EEWE));
/* Set up address and data registers */
EEAR = uiAddress;
EEDR = ucData;
/* Write logical one to EEMWE */
EECR |= (1<<EEMWE);
/* Start eeprom write by setting EEWE */
EECR |= (1<<EEWE);

}

unsigned char EEPROM_read(unsigned int uiAddress) {

/* Wait for completion of previous write */
while(EECR & (1<<EEWE));
/* Set up address register */
EEAR = uiAddress;
/* Start eeprom read by writing EERE */
EECR |= (1<<EERE);
/* Return data from data register */
return EEDR;

}

Rezultate Obtinute

In faza incipienta am reusit sa aprind ledurile in urma programarii placutei. Apoi am incercat sa testes releele, insa din cauza diodelor (leduri), semnalul care ajngea la ele era prea slab, asa ca am decis sa scurcircuitez ledurile. Releele comuta corect si sonor in urma acestei modificari. Am obtinut chiar si sunete, pana am reusit cu succes sa ard cipul pianinei de jucarie.

Poze cu placuta mai jos:

Concluzii

Intotdeauna este recomandat sa testezi inainte sa replici schema (oricare ar fi aceasta). Mereu apar lucruri neprevazute si schimba total “strategia” de realizare a placutei.

De asemenea, ar fi trebuit sa imi iau un stash mai mare de componente, intrucat, pe ultima suta de metri am ratacit un releu, ramanand astfel numai cu 7. In concluzie, proiectul poate reda numai 7 sunete si nu 8 (cum era prevazut initial cipul pianinei de jucarie).

Ce mi-ar fi placut sa reusesc: la un moment dat am achizitionat 2 difuzoare si le-am pus in functiune. Reusisem astfel sa redau efectul “stereo” !! :) Din pacate, in urma aplicarii tensiunii de 5V pe cipul pianinei de jucarie (care a rezultat, dupa cum am mentionat, cu arderea ei), am renuntat la una dintre boxe in procesul de debugging.

Download

Surse

Bibliografie

http://www.atmel.com/dyn/resources/prod_documents/doc2466.pdf

utilizare EEPROM: paginile 21 si 22 din datasheet ATMega16

pm/prj2011/rtataroiu/pianokeys.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0