PROIECTE 2011
Proiectele realizate in cadrul Laboratorului de SMP, 2011, le gasiti mai jos, Fiecare echipa are de completat in pagina WIKI corespunzatoare proiectului sau capitolele existente.
Punctaj Proiect
-
2p Pagina Wiki in format HTML cu capitolele create - poze(diferite stadii ale proiectului) + schema hardware + listing software (microcontroller + OpenWatcom la Z3)
-
5p Functionalitate proiect - punctaj in functie de cerintele cerute/realizate
-
1p Calitatea proiectului - cat de organizati ati fost in realizarea acestuia, cod format frumos, optimizari etc...
-
2p Nota individuala - participarea voastra in proiect, raspunsul vostru la intrebarile laborantului la presentarea proiectului
Cerinte general valabile:
- Toate proiectele se vor integra software si/sau hardware cu placa EV/Z3. Pentru integrarea hardware se va folosi portul serial al placii EV/Z3
- Logica software de baza se va regasi pe placa EV/Z3 si va fi realizata în C + inline assembly folosind template-ul OpenWatcom de la laborator
- Pagina de wiki trebuie sa contina o descriere a ce a realizat fiecare student in cadrul proiectului
- Daca nu puneti pe site alta schema de proiectare hardware se va folosi cea cu PIC16F628A pusa la dispozitie
- Wiki-ul trebuie updat ca sa vad stadii intermediare ale proiectului
Elemente de electronica
-
Pentru a vedea/comanda un pret estimativ a componentelor va propun www.conexelectronic.ro . Mi-a fost recomandat si mie de ceilalti laboranti.
-
Pentru conectarea la porturile de I/O trebuie sa izolati galvanic folosind optocuploare, ex LTV817 - puteti sa cautati pe site, si rezistente sa limiteze curentul maxim la 5mA U=R*I si trebuie avut in vedere ca rezistentele sa reziste la puterea la care e proiectat circuitul P=U*I...
-
Pentru alte elemente elecronice puteti folosi diode 1N4007, tranzistori BD139/140 de putere mare. Binenteles ca nu sunteti limitati la folosirea acestora, e doar o propunere.
-
Letconul ar trebui sa aiba cam 40W , nu mai mult de 60 oricum , iar fludorul la 1mm-1.5mm. Sa aveti si un voltmetru cu voi.
-
Va recomand inainte sa alegeti proiectul sa cititi cateva elemente de electronica de AICI.
2011_P4
(Restore this version)
Modified: 7 April 2010, 6:06 PM User: Mircea Moscalu → MM
PROJECT NAME
Project Description
Proiectul de față realizează un instrument muzical extern (external device) care sa redea notele selectare intr-un player pe un calculator (Personal Computer).
Project Requirements
Pe post de instrument muzical se foloseste placuta EV-Z3 disponibila in platforma de laborator.
De la tastatura acestei placuțe utilizatorul iși construiește melodia care mai apoi va fi redată pe PC folosind conexiunea seriala.
La placa EV/Z3 utilizatorul va alege unul din cele 2 intrumente puse la dispozitie.
In pasul urmator utilizatorul va alege o gama (3 game pentru fiecare instrument - se pot folosi 3 butoane).
Pentru a canta utilizatorul va apasa tastele placii, fiecare tasta reprezentand o nota.
User Flow
Instrumentele alese de noi sunt chitară respectiv pian.
Modul de constructie a unei melodii este urmatorul:
- Initial pe afisajul placutei va aparea un mesaj pentru alegerea instrumentului.
- Utilizatorul va apasa o tasta pentru alegerea instrumentului respectiv:
- 0- chitara
- 1- pian
Observatie!
Exista posibilitatea extinderii numarului de instrumente.
- Mai departe, pe afisajul LCD al placii va aparea un mesaj in care se mentioneaza posibilitatea alegerii gamei.
- Utilizatorul va apasa o tasta pentru alegerea gamei:
- 0 – gama 1
- 1 – gama 3
- 2 – gama 5
Observatie!
Exista posibilitatea cresterii numarului gamelor. S-au ales aceste game si acest numar pentru simplitate si in scop demonstrativ.
- In urmatorul pas, utilizatorul poate canta apasand tastele corespunzatoare fiecarei note:
- 0 - C = Do
- 1 - D = Re
- 2 - E = Mi
- 3 - F = Fa
- 4 - G = Sol
- 5 - A = La
- 6 - B = Si
Observatie!
- Tasta 7 - reprezinta incheierea sesiunii de cantat
- Tasta 8 - reprezinta alegerea schimbarii instrumentului
- Tasta 9 - reprezinta alegerea schimbarii gamei in cazul in care se doreste ca nota urmatoare sa fie cantata in alta gama decat cea curenta
Transmiterea si redarea notelor:
- De la placa EV/Z3 se transmit mesajele MIDI prin portul serial COM1 catre calculator.
- Mesajele MIDI codifica instrumentul, gama si nota aleasa in 3 bytes de mesaj.
- Sunt folosite 3 tipuri de mesaje: un mesaj pentru instrument si alte doua pentru nota si gama
- In tabel veti gasi reprezentarile binare ale mesajelor MIDI si semnficatia octetilor.
- Mesajele MIDI (datele binare) sunt preluate de MIDI Serial Converter de la portul COM1 si sunt trimise mai departe catre portul de iesire MIDI-OUT.
- La portul MIDI-OUT al convertorului vom conecta portul MIDI-IN al playerului MIDI Power Sequencer Plus ( mai multe detalii la sectiunea Required Components).
- Power Sequencer Plus citeste datele binare de la portul MIDI-IN si interpreteaza instructiunile codificate in bitii primiti redand notele in gama si instrumentul ales folosind Microsoft GS Wavetable SW Synth (cu rolul de a crea respectivele sunete).
Nota:
Formatul MIDI reprezinta un standard folosit in inter-comunicarea cu precadere dintre dispozitivele muzicale (software si/sau hardware).Acesta consta in instructiuni codificate sub forma de mesaje, astfel incat ele sa ajute la redarea melodiilor sau a fisierelor media fara a fi nevoie de transferul acestor fisiere. Practic software-ul care primeste mesajul MIDI isi construieste singur sunetele pe baza instructiunilor primite.
(Pentru mai multe informatii despre MIDI: www.midi.org)
Mesajele MIDI folosite:
- pentru alegerea instrumentului:
Program Change Message (1100xxxx) este mesajul trimis calculatorului de instrumentul muzical
(in general) respectiv de placa EV/Z3 in cazul nostru, avand urmatoarele formate standard pentru chitara si pian
Status Byte |
Data Byte (1) |
Data Byte (2) |
11000000(Canal 1) |
00000001 (Pian) |
00000000 |
11000000 (Canal 1) |
00011001 (Chitara) |
00000000 |
2. pentru transmiterea unei note:
Note-on message (1001xxxx - mesaj transmis cand o nota este apasata = inceputul notei)
Status Byte |
Data Byte (1) |
Data Byte (2) |
10010000(Canal 1) |
0kkkkkkk |
01000000(velocitatea) |
|
|
|
Note-off message (1000xxxx - mesaj transmis cand o nota este eliberata = sfarsitul notei)
Status Byte |
Data Byte (1) |
Data Byte (2) |
10000000(Canal 1) |
0kkkkkkk |
01000000(velocitatea) |
|
|
|
Observatie!
- Transmiterea unei note care sa fie redata de un player este echivalenta cu transmiterea unei perechi de mesaje Note-on – Note-off, adica a 6 bytes.
- k k k k k k k = key (nota) - se regasesc in tabelul de mai jos in decimal.
- Velocitatea = forta sau puterea sunetului (aleasa constanta).
- xxxx0000 = LS Byte (ultimii 4 biti) reprezinta canalul 1 pe care se realizeaza conexiunea (in standardul MIDI se pot folosi 16 canale de transmisie simultan).
Gama |
Nota |
Decimal |
Cod Binar (k k k k k k k) |
1. |
C = Do |
36 |
0100100 |
D = Re |
38 |
0100110 |
|
E = Mi |
40 |
0101000 |
|
F = Fa |
41 |
0101001 |
|
G = Sol |
43 |
0101011 |
|
A = La |
45 |
0101101 |
|
B = Si |
47 |
0101111 |
|
3. |
C = Do |
60 |
0111100 |
D = Re |
62 |
0111110 |
|
E = Mi |
64 |
1000000 |
|
F = Fa |
65 |
1000001 |
|
G = Sol |
67 |
1000011 |
|
A = La |
69 |
1000101 |
|
B = Si |
71 |
1000111 |
|
5. |
C = Do |
84 |
1010100 |
D = Re |
86 |
1010110 |
|
E = Mi |
88 |
1011000 |
|
F = Fa |
89 |
1011001 |
|
G = Sol |
91 |
1011011 |
|
A = La |
93 |
1011101 |
|
B = Si |
95 |
1011111 |
.
Required components
Hardware:
- Placuta EV/Z3
- Personal Computer
Software:
- Serial Midi Converter
- Midi Player : Power Sequencer Plus
Software Design
Aplicatia contine 4 sectiuni importante.
Prima reprezinta partea de defintii si initializare:
#include "platform_io.h"
//sectiunea defineste diferite mesaje care vor fi afisate pe LED-ul placi Z3/EV pentru interactiunea cu utilizatorul
const char *alege="Alege instrumentul";
static SerialConfig serialConf;
unsigned char buffer[3]; //aici se pun cei trei bytes necesari playerului midi
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int main()
{
//declararea de variabile locale
// x = retine tasta apasata de utilizator
// choice = selectia gamei. Valorile vor fi 1,2 sau 3. In functie de choice din vectorul Gama se vor construi notele
// instrument = valoarea intrumentului selectat: 1 sau 31
char x, choice = 0, Instrument = 0;
int note; // valoarea intreaga a notei plaja conform tabelului de mai jos.
int bCorrectSelection = 0; // indicativ boolean daca selectia a fost corecta sau nu
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Constants
// constantele sunt definite conform protocolului descris mai sus.
int StatusByteProgramChange = 192; //11000000
..................................................................../* Serial Initialization */
serialConf.baudRate = b9600;
.................................................
kIo.SerialInit(&serialConf);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Partea a doua este selectia instrumentului. Pentru selectarea unui instrument se va intra intr-un ciclu in care se va iesi doar daca utilizatorul introduce o valoare corecta: 0 sau 1 – bCorrectSelection = 1.
choose_instrument:
do
{
bCorrectSelection = 0;
kIo.DisplayString(alege);
// readkey
x=kIo.ReadKey();
// check selection
switch (x)
{
case 0: // chitara
{ Instrument = Guitar; bCorrectSelection = 1; break; }
.... // asemanator si pentru celelalte instrumente
{ kIo.DisplayString(alege_altul); kIo.Wait(1000); break; }
}while (bCorrectSelection == 0);
bCorrectSelection = 0;
//se va trimite pe portul serial mesaj de schimbare a instrumentului(program Change)
//send to serial port
if (x == 0 || x == 0x0A)
{
buffer[0] = StatusByteProgramChange;
buffer[1] = Instrument;
buffer[2] = 0;
}
//trimitere efectiva pe serial catre PC
kIo.SerialWrite(COM1, buffer, 3);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Partea a treia reprezinta selectia gamei. Acelasi principiu ca in ciclul de mai sus, doar ca selectia se retine in variabila choice.
choose_scale:
do {
bCorrectSelection = 0;
kIo.DisplayString(gama);
x = kIo.ReadKey();
switch (x)
{
// gama 1
case 0:
{ bCorrectSelection = 1; choice = 1; break; }
{ kIo.DisplayString(alta_gama); kIo.Wait(1000); break; }
}
}while (bCorrectSelection == 0);
.........................................
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In ultima parte a codului se canta propriu zis.
Se intra intr-un ciclu do-while cu conditia bCorrectSelection=1.
In functie de tasta apasata se construieste nota care este valoarea de inceput a gamei plus valoarea notei.
Valorile notelor sunt de la 0 la 11. Prezentam fragmente din ciclul do-while.
bCorrectSelection = 0;
x = kIo.ReadKey();
switch (x)
{
// Nota DO
case 0:
{ note = Gama[choice - 1] + 0; Nota ="DO "; bCorrectSelection = 1; break; }
............................ // celelalte note
}// daca este corecta selectia, atunci se va afisa nota si se vor trimite pe portul serial cei trei bytes. De notat este faptul ca trebuie trimise 2 perechi de bytes: o pereche este note on si cea de-a doua note off. Delayul standard intre transmiterea celor doua mesaje este 50 milisecunde
if (bCorrectSelection)
{
buffer[0] = StatusByteNoteOn;
buffer[1] = note;
buffer[2] = Velocity;
kIo.SerialWrite(COM1, buffer, 3);
kIo.Wait(50);
buffer[0] = StatusByteNoteOff;
................................................}
}while(...)
//daca selectia nu este o nota (tasta de la 0 la 6), atunci se testeaza ce tasta s-a apasat. Daca s-a apasat tasta 8, programul va sari la selectia gamei, daca s-a apasat tasta 8, se va selecta un nou intrument, altfel se iese din program.
if (x == 4){
goto choose_scale;
else if (x == 0x0E)
goto choose_instrument;
else
{ kIo.DisplayString("Aplicatia s-a terminat"); kIo.Wait(5000); }
return 0;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Results
O imagine de ansamblu a cum functioneaza proiectul, screenshoturi, filmulete cu proiectul functionand. Alte detalii care le credeti importante.
Download
Arhiva cu schema hardware + cod microcontroller + tot proiectul OpenWatcom.
Arhiva va contine 2 directoare (1 singur pentru proiecte doar software)
Hardware design - schema uC + codul folosit pentru a genera fisierul .HEX
Software design - template-ul Open Watcom folosit
Status
O pagina in care sa updatati saptamanal cum stati cu proiectul. Sa spuneti ziua in care ati realizat diferite componente
Eg
1 Mai - board finaly done
15 Mai - board working - starting to write EV/Z3 software part