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: 6 April 2010, 11:27 AM 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.
Prinicipiul dupa care se construieste o melodie este urmatorul:
- Initial pe afisajul placutei va aparea un mesaj pentru alegerea instrumentului.
- Utilizatorul va apasa o tasta pentru alegerea instrumentului:
- 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 cantare a notelor
Tasta 8 - reprezinta alegerea schimbarii instrumentului
Tasta 9 - reprezina alegerea schimbarii gamei in caz ca se doreste ca nota urmatoare ce va fi cantata sa fie in alta gama decat cea curenta.
Modalitatea de redare se face prin transmitera de bytes ca mesaje MIDI prin conexiunea seriala dintre placa EV/Z3 si calculator si redarea acestora pe un player care suporta format MIDI.
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
In continuare vom folosi urmatoarele mesaje pentru transmiterea notelor:
-
- Alegere Instrument:
- Program Change Message (1100xxxx - mesaj trimis cand se schimba instrumentul (Pian/Chitara)).
- Numai un singur byte de date, celalalt este automat 0 (zero).
- Alegere Instrument:
Status Byte |
Data Byte (1) |
Data Byte (2) |
11000000(Canal 1) |
00000001 (Pian) |
00000000 |
11000000 (Canal 1) |
00011001 (Chitara) |
00000000 |
- Transmitere nota :
- 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";
const char *alege_altul="Instrument invalid";
const char *nota="Alege nota: ";
const char *gama="Alege gama: ";
const char *nota_incorecta="Nota incorecta ";
const char *canta= "Canta ";
const char *alta_gama="Gama invalida: ";
char *ShowChoice="I= ;G= ;Nota= "; //element suplimentar pentru vizualizarea alegerilor
char *Visualization=" "; //element suplimentar pt reprezentarea notelor sub diverse forme
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
int StatusByteNoteOn = 144; //10010000
int StatusByteNoteOff = 128; //10000000
int Velocity = 64;//01000000
int Pian = 1;
int Guitar = 31;
int Gama[3] = { 36, 60, 84};
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* Serial Initialization */
serialConf.baudRate = b9600;
serialConf.parity = none;
serialConf.stopBits = one;
serialConf.wordLength = eight;
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;
}
case 0x0A: // pian
{
Instrument = Pian;
bCorrectSelection = 1;
break;
}
case 1: // keyboard
{
Instrument = 0;
bCorrectSelection = 1;
break;
}
default: // daca se alege o tasta gresita, se afiseaza mesaj de eroare si se verifica o noua introducere de la tastatura
{
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:
// choose major scale - same thing as above
do
{
bCorrectSelection = 0;
kIo.DisplayString(gama);
// readkey
x = kIo.ReadKey();
//check selection
switch (x)
{
case 0: //scale 1
{
bCorrectSelection = 1;
choice = 1;
break;
}
case 0x0A: //scale 2
{
bCorrectSelection = 1;
choice = 2;
break;
}
case 1: //scale3
{
bCorrectSelection = 1;
choice = 3;
break;
}
default:
{
kIo.DisplayString(alta_gama);
kIo.Wait(1000);
break;
}
}
}while (bCorrectSelection == 0);
kIo.DisplayString(canta); // mesaj de inceput al cantecului
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In ultima parte a codului se canta propriu zis. Se intra intr-un ciclu cat timp bCorrectSelection este 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.
do
{
bCorrectSelection = 0;
// readkey
x = kIo.ReadKey();
// check selection
switch (x)
{
case 0: // Nota Do
{
note = Gama[choice - 1] + 0;
Nota ="DO ";
Visualization="_ ";
bCorrectSelection = 1;
break;
}
case 0x0A: // Nota Re
{
note = Gama[choice - 1] + 2;
Nota ="RE ";
Visualization="_| ";
bCorrectSelection = 1;
break;
}
case 1: // Nota Mi
{
note = Gama[choice - 1] + 4;
bCorrectSelection = 1;
Nota ="MI ";
Visualization="_|_ ";
break;
}
case 0x0B: // Nota Fa
{
note = Gama[choice - 1] + 5;
bCorrectSelection = 1;
Visualization="_|_| ";
Nota ="FA ";
break;
}
case 2: // Nota Sol
{
note = Gama[choice - 1] + 7;
bCorrectSelection = 1;
Visualization="_|_|_ ";
Nota = "SOL";
break;
}
case 0x0C: // Nota La
{
note = Gama[choice - 1] + 9;
bCorrectSelection = 1;
Nota = "LA ";
Visualization="_|_|_| ";
break;
}
case 3: // Nota Si
{
note = gama[choice - 1] + 11;
bCorrectSelection = 1;
Visualization="_|_|_|_ ";
Nota = "SI ";
break;
}
}
// 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)
{
// show on LCD information about selection
// "I= ;G= ;Nota= ";
if (Instrument == 0)
kIo.DisplayString(Visualization);
else
{
if (Instrument == 31)
ShowChoice[3] = 'C';
else ShowChoice[3] = 'P';
if (choice == 1)
ShowChoice[6] = '1';
else if (choice == 2)
ShowChoice[6] = '3';
else
ShowChoice[6] = '5';
ShowChoice[13] = Nota[0];
ShowChoice[14] = Nota[1];
ShowChoice[15] = Nota[2];
kIo.DisplayString(ShowChoice);
buffer[0] = StatusByteNoteOn;
buffer[1] = note;
buffer[2] = Velocity;
kIo.SerialWrite(COM1, buffer, 3);
kIo.Wait(50);
buffer[0] = StatusByteNoteOff;
buffer[1] = note;
buffer[2] = Velocity;
kIo.SerialWrite(COM1, buffer, 3);
}
}
}while (bCorrectSelection != 0);
//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