Proiectul initial avea ca scop realizarea unui MIDI Controller , bazat pe un senzor de proximitate , care urma sa transmita mesaje CC unui software DAW specializat. Am considerat importanta si mai relevanta realizarea entitatii software pentru controlul senzorului , partea de comunicare midi fiind lasata pentru un later edit.
In 2009 am castigat un proiect in cadrul “Olimpiadelor Stiintei si Comunicarii” UPB care se numea “Music Through Everything”.Prezentarea continea o demonstratie practica a unui joypad transformat in instrument muzical MIDI.
In cadrul evenimentului am propus ideea unui instrument “Massively Interactive”, bazat pe senzori.In februarie 2010 un grup de developeri de la Ableton au prezentat conceptul unui astfel de instrument folosind senzorii unui XBox Kinekt Link catre demonstratie practica
Utilitatea unui astfel de proiect este evidenta si chiar spectaculoasa daca ne imaginam o scena plina de senzori pe care corpul uman este propriul instrument.
Dispozitivul se foloseste de un senzor de proximitate bazat pe ultrasunete pentru a determina distanta.(emitere semnal , asteptare ecou). Transmitatorul si receptorul se vor gasi intr-un modul SRF05.Un semnal specific declanseaza masurarea iar durata semnalului de raspuns depinde de distanta pana la obiect.
Distanta se calculeaza cu formula: Distanta[µs*cm] = Timp[µs] / Viteza sunetului[µs/cm]
Schema bloc:
Un ghid bun pentru MIDI - AVR se gaseste aici:
http://www.avrfreaks.net/modules/FreaksArticles/files/19/Midi%20and%20the%20AVR.pdf
MIDI How To's :
http://en.wikiaudio.org/Category:MIDI
MIDI connector pinout :
http://pinouts.ru/Inputs/GameportPCMidi_pinout.shtml
Proiect asemanator MIDI - AVR
http://www.josephn.net/avr/atmel_avr_midi_keyboard_using_stk500
Modulul SRF05 functioneaza cu pini separati pentru comanda si raspuns.
SRF05 functioneaza in 2 moduri posibile :
Cipul, impreuna cu LCD-ul vor fi conectate la controller dupa urmatoarea schema:
Sursa : http://www.robot-electronics.co.uk/htm/srf05tech.htm
Softul este scris in limbajul C ( compilatorul AVR-GCC sub Windows ).
Dispozitivul masoara continuu distanta ( nu am implementat software apasarea unui buton pentru activarea masurarii ).
LCD ( lab 3 ). Voi scrie un handler pentru semnalele SIG_INPUT_CAPTURE1 si SIG_OVERFLOW1. Pentru primul voi verifica daca frontul a fost crescator sau descrescator si in functie de acesta fie voi salva valoarea din ICR1 (care a fost preluata din TCNT1 la intrerupere) si voi opri timerul fie voi porni timerul cu setarile corespunzatoare (trigger la front descrescator, TCNT1 pus la 0, overflow setat). Pentru al doilea voi opri masuratoarea.
SRF : Setez pinul pe 1.Semnalul apare din 10 in 10 us.Cand ajunge ecoul se activeaza ICP-ul cu front crescator ⇒ pornesc timerul si setez ICP! pentru front descrescator.La sfarsitul ecoului se seteaza iar ICP front descrescator ⇒ preiau valoarea din ICR1 si opresc timer.
Codul pentru handlere:
//////////////////////////////// // HANDLER intrerupere //////////////////////////////// SIGNAL(SIG_INPUT_CAPTURE1) { // front descrescator if (front == 1) { // opreste masurarea action = 0; // front crescator front = 0; // preia valoarea val1 = ICR1; // opreste ovfl TIMSK &= ~(1<<TOIE1); } // front crescator else if (front == 0) { // enable ovfl TIMSK |= (1<<TOIE1); // prescale 64 pentru 400cm // prescale la 1 pentru maxim 70cm TCCR1B |= (1<<CS10); TCCR1B |= (1<<CS11); // clear tcnt unsigned int i = 0; TCNT1 = i; // intrerupere pe front descrescator TCCR1B &= ~(1<<ICES1); front = 1; // descrescator } } //////////////////////////////// // HANDLER overflow /////////////////////////////// SIGNAL(SIG_OVERFLOW1) { action = 0; // opreste masurarea front = 0; // front crescator unsigned int i=0; TCNT1 = i; cli(); }
Distanta in cm se obtine impartind rezultatul in us (de aceea impart la 16) la 58 (valoare data in datasheet).
#define CM 58 #define TIMERCOUNT 0.0625f // calculeaza distanta int sonic_calc() { int rez; rez = val1 * TIMERCOUNT; rez = rez / CM; return rez; }
Dispozitivul masoara incontinuu distanta fata de obiectul catre care este indreptat. Latenta simtita este foarte mica , datorita numarului mare de masuratori / secunda ( aprox.100 ; una la 10us ). Pentru a modifica numarul de masuratori pe secunda se poate modifica functia “wait” care stabileste timpul intre masuratori.
Dispozitivul poate masura corect pana la 4m.Dupa 5m el se va bloca la ultimul rezultat aflat in limita datorita faptului ca modulul sonic va cauza mereu overflow neraspunzand in timp util. In acest caz este de ajuns apropierea de un oiect pentru a reintra in limita admisa pentru a relua functionarea.
Pentru a mari distanta si a folosi la capacitate maxima modulul am introdus o prescala de 64 si atunci valoarea din TCNT1 nu mai este impartita la 16 ci inmultita cu 4 permitand astfel atingerea valorii 29000 (500cm *58).
Se poate atasa o bateria pentru a il face portabil si mai usor de utilizat.
Dispozitivul de masurare a distantei functioneaza in simulare.Placuta hardware a ramas aproximativ neschimbata fata de cea de baza de la etapa 1 , in parte datorita pretului destul de mare al senzorului si datorita dificultatilor intalnite la documentarea MIDI CC.
Implementarea protoculului midi , a comunicatiei USB cu un calculator si a realizarii hardware finale urmeaza intr-un later edit.
Cod petreanu_adelin_andrei_331ca.rar ( compilare am folosit avr-gcc )
AVR:
http://www.atmel.com/products/avr/
AVR-libs: http://www.linuxfocus.org/common/src/article231/avr-libc-reference.html
SRF05:
http://www.robot-electronics.co.uk/htm/srf05tech.htm
MIDI:
http://www.avrfreaks.net/modules/FreaksArticles/files/19/Midi%20and%20the%20AVR.pdf
http://en.wikiaudio.org/Category:MIDI
http://pinouts.ru/Inputs/GameportPCMidi_pinout.shtml
http://www.josephn.net/avr/atmel_avr_midi_keyboard_using_stk500
PM LABS: