Introducere

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.

Descriere generală

Proiectul meu este realizat din 3 module:

  • Orga - hardware
  • Placa de test - interfata intre PC si orga
  • Sound Generator - soft care ruleaza pe PC

Hardware Design

Lista de piese pentru orga:

  • O orga nefunctionala cumparata din piata cu 10 RON
  • 9 fire de cablu UTP
  • patratele mici de folie de cupru

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 :).

Software Design

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 .

Firmware

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;
}

Rezultate Obţinute

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

pm/prj2011/rtataroiu/orga.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