Proiectul meu este o orga , mai exact o extensie pentru calculator. Acesta se va putea conecta prin portul serial la PC si va transmite informatii legate de notele apasate. Pe calculator exista un soft care preia datele si genereaza sunetele.
Cred ca acest prototip este util deoarece o orga profesionala poate sa coste mai mult de 20 de milione. Partea de hardware se poate realiza cu foarte putini bani , iar odata ce am trimis notele catre PC putem genera toate efectele de pe o orga profesionala.
Proiectul meu este realizat din 3 module:
Lista de piese pentru orga:
Am scos partea electrica din orga si am modificat-o in asa fel incat sa am un fir de input de la fiecare clapa.
Mai jos am pus imagini cu etapele realizarii:
Orga in stare initiala
In imaginea 1 se poate observa stare initiala in care a fost orga. Dupa eliminarea partii electronice orga arata ca in imaginea 2.
Cum actioneaza intrerupatoarele
Exista un suport de plastic [3] pe care este asezata o bara conductoare cu mai multe intrerupatoare [4].
In momentul in care se apasa o clapa, aceasta va apasa pe intrerupator. Asfel se va face contact cu firele rezistentelor. Vezi imaginile [4] si [5].
Ca observatie , rezistentele au fost eliminate si inlocuite cu firele mele.
Cum am modificat intrerupatoarele
Suportul de plastic era prea mic si a trebuit sa il extind, pe spate am mai lipit o tabla acoperita cu o bucata de carton (vezi [6]).
Pe aceasta am lipit firele mele de input. Am folosit deasemnea 8 bucati mai mici de tabla care sa sustina mai bine firele vezi [8] si [9].
Orga finala
In total am 9 fire : 8 de input, 1 pentru GND
Imaginea 13 arata starea finala :).
SoundGenerator
Este o aplicatie scrisa in C# , pentru a putea genera mai multe sunete in
acelas timp am folosit OpenAL. Mai multe detalii gasit la pagina http://en.wikipedia.org/wiki/OpenAL .
SDK-ul se poate gasi la pagina http://www.opentk.com/
Mai multe detalii despre OpenAL la adresa http://en.wikipedia.org/wiki/OpenAL .
Folosesc ca input PORTA si PORTC , momentan orga foloseste un singur port deoarece am facut doar 8 input-uri.
Astfel o sa am 1 octet de date de la fiecare port. Trimit pe seriala 4 octeti '[' , date_PORTA , date_PORTC , ']'.
Datele au fost puse intre paranteze ca sa imi fie mai usor pentru debugging.
Am adaugat o delay la transmiterea datelor deoarece am observat ca se transmit foarte rapid datele si terminalul se blocheaza.
Cod:
#define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> #include <inttypes.h> //This function is used to initialize the USART //at a given UBRR value void USARTWriteChar(char data) { //Wait untill the transmitter is ready while(!(UCSRA & (1<<UDRE))) { } //Now write the data to USART buffer UDR=data; } void USARTInit(uint16_t ubrr_value) { //Set Baud rate UBRRL = ubrr_value; UBRRH = (ubrr_value>>8); /*Set Frame Format >> Asynchronous mode >> No Parity >> 1 StopBit >> char size 8 */ UCSRC=(1<<URSEL)|(3<<UCSZ0); //Enable The receiver and transmitter UCSRB=(1<<RXEN)|(1<<TXEN); } void ButtonsInit() { // set all pins on PORTB for input DDRA = 0x00; PORTA = 0xFF; //enable all pull-ups // set all pins on PORTC for input DDRC = 0x00; PORTC = 0xFF; //enable all pull-ups } int main(void) { char data; /*First Initialize the USART with baud rate = 19200bps UBRR value = 51 */ USARTInit(51); //UBRR = 51 ButtonsInit(); _delay_ms(1000); char keys_portA, keys_portC; while (1) { _delay_ms(500); keys_portA = PINA; keys_portC = PINC; USARTWriteChar('['); USARTWriteChar(keys_portA); USARTWriteChar(keys_portC); USARTWriteChar(']'); } return 0; }
Partea de hardware functioneaza corect , cand am apasat o clapa PC-ul primeste corect datele.
Am implementat SoundGenerator.
Am un prototip, dezvoltat in C#, pentru citirea datelor de pe portul serial. Din pacate nu stiu daca functioneaza corect , deoarece nu am avut cablu sa il conectez la lapotop.
Codul sursa pentru microcontroler , Sound Generator si Comunicatia seriala pot fi descarcate de aici arhiva_soft.zip