MidiSenzor

Introducere

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.

Descriere generala

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

Hardware Design

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

Software Design

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

Rezultate Obţinute

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.

Concluzii

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.

Download

Cod petreanu_adelin_andrei_331ca.rar ( compilare am folosit avr-gcc )

Bibliografie/Resurse

pm/prj2011/dloghin/midisenzor.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