Sunteți pe pagina 1din 10

Cap. 6 Accesarea dispozitivelor hardware n MATLAB.

6.1.1. Accesarea portului serial Se folosete mai nti comanda instrhwinfo pentru a afla resursele hardware pe care le poate accesa mediul MATLAB, prin intermediul toolbox-ului Instrument Control Toolbox: instrhwinfo ans = MATLABVersion: '7.1 (R14SP3)' SupportedInterfaces: {'gpib' 'serial' 'tcpip' 'udp' 'visa'} SupportedDrivers: {'matlab' 'ivi' 'vxipnp'} ToolboxName: 'Instrument Control Toolbox' ToolboxVersion: '2.3 (R14SP3)' Din rspunsul primit rezult c exist suport pentru portul serial. Apoi, folosind comanda precedent cu argumentul serial, rezult c n calculatorul testat exist un port serial numit COM1. instrhwinfo serial ans = AvailableSerialPorts: JarFileVersion: ObjectConstructorName: SerialPorts: {'COM1'} 'Version 2.3' {'serial('COM1');'} {'COM1'}

n continuare se creaz obiectul port serial: s=serial('COM1') Rspunsul conine cteva proprieti ale obiectului creat, care se prezint n continuare Serial Port Object : Serial-COM1 Communication Settings Port: COM1 BaudRate: 9600 Terminator: 'LF' Communication State Status: RecordStatus: Read/Write State TransferStatus: BytesAvailable:

closed off

idle 0

ValuesReceived: 0 ValuesSent: 0 Obiectele sunt asemntoare cu structurile, avnd mai multe cmpuri. Conectarea obiectului s creat anterior la portul serial (deschiderea) se face prin: fopen(s) Dac apoi se acceseaz cmpul Status al obiectului s, rezult c obiectul este deschis (open): s.Status ans = open Comenzile get i set permit obinerea tuturor proprietilor portului serial (se prezint o parte n continuare), respectiv modificarea lor get(s) ByteOrder = littleEndian BytesAvailable = 0 BytesAvailableFcnCount = 48 BytesAvailableFcnMode = terminator InputBufferSize = 512 Name = Serial-COM1 SERIAL specific properties: BaudRate = 9600 DataBits = 8 DataTerminalReady = on FlowControl = none Parity = none Port = COM1 RequestToSend = on StopBits = 1 Terminator = LF Comanda set(s,'InputBufferSize',5000); permite stabilirea mrimii bufferului de recepie a datelor la valoarea de 5000 (caracterebytes); iniial avea mrimea 512. Parametrul BytesAvailable ( 0 n cazul de mai sus) permite determinarea numrului de octei disponibili pentru a fi citii. Trimiterea de date n portul serial (n acest exemplu irul *IDN?) se face prin: fprintf(s,'*IDN?') Recepia (citirea) de date din portul serial se face ca n continuare: out = fscanf(s) Transmiterea i respectiv recepia se pot face i la nivel de octet prin funciile fwrite(), respective, fread( ).

Dup utilizare, obiectul trebuie nchis i ters: fclose(s) clear s 6.1.2. Accesarea portului paralel Mai nti se folosete comanda daqhwinfo pentru a afla resursele hardware pe care le poate accesa mediul MATLAB, prin intermediul toolbox-ului Data Acquisition Toolbox: out = daqhwinfo out = ToolboxName: ToolboxVersion: MATLABVersion: InstalledAdaptors: 'Data Acquisition Toolbox' '2.7 (R14SP3)' '7.1 (R14SP3)' {3x1 cell}

Din rspunsul primit rezult c exist suport pentru 3 adaptoare. Accesnd cmpul InstalledAdaptors al obiectului out, rezult c printre cele 3 adaptoare este i porul paralel. out.InstalledAdaptors ans = 'nidaq' 'parallel' 'winsound' Apoi, folosind prima comand cu argumentul parallel, rezult c n calculatorul testat exist un port paralel numit LPT1. daqhwinfo('parallel') ans = AdaptorDllName: 'C:\Program Files\MATLAB71\toolbox\daq\daq\private\mwparallel.dll' AdaptorDllVersion: '2.7 (R14SP3)' AdaptorName: 'parallel' BoardNames: {'PC Parallel Port Hardware'} InstalledBoardIds: {'LPT1'} ObjectConstructorName: {'' '' 'digitalio('parallel','LPT1')'}

Crearea unui obiect DIO pentru portul paralel se face ca n continuare: parport = digitalio('parallel','LPT1'); % portul paralel face parte din categoria dispozitivelor cu intrri-ieiri digitale Ataarea de linii de intrare-ieire (n cazul acesta ieire) la obiectul creat: lines=addline(parport,0:7,out); Scrierea de valori: putvalue(parport,255);

6.1.3. Accesarea portului USB Accesarea unui port USB este posibil prin realizarea unui obiect VISA-USB. Fiecare astfel de obiect este asociat cu un instrument conectat la portul USB. De exemplu, la conectarea instrumentului Agilent 33220A la portul USB, sistemul de operare Windows i aloc un nume (Visa Resource Name), care va fi al doilea argument al funciei visa, folosit pentru crearea obiectului de tip VISA: vv=visa('agilent','USB0::2391::1031::MY44030773::0::INSTR') Rspunsul primit este prezentat n continuare: VISA-USB Object Using AGILENT Adaptor : VISA-USB-0-23911031-MY44030773-0 Communication Address ManufacturerID: ModelCode: SerialNumber: Communication State Status: RecordStatus:

2391 1031 MY44030773

closed off

Read/Write State TransferStatus: idle BytesAvailable: 0 ValuesReceived: 0 ValuesSent: 0 Deschiderea obiectului: fopen(vv) Transmiterea (scrierea) unui mesaj instrumentului: fprintf(vv,'Frequency 2500'); Dac apoi se scrie numele obiectului n linia de comand, se obin caracteristicile acestuia, dintre care se prezint n continuare 2 dintre cele mai sugestive vv Communication State Status: Read/Write State

open

ValuesSent: 14 Dac instrumentului i se transmite un mesaj care necesir un rspuns, acesta poate fi citit: fprintf(vv,'Function?'); rez=fscanf(vv) %citire mesaj de rspuns rez = SIN nchiderea pbiectului i tergerea lui: fclose(vv) clear vv 6.1.4. Accesarea unei plci de achiziii de date (placa de sunet a calculatorului) n paragraful rezervat prezentrii portului paralel, s-a putut observa c toolboxul Data Acquisition Toolbox ofer suport pentru placa de sunet a calculatorului, winsound. Aceasta face parte din categoria plcilor de achiziie cu intrri i ieiri analogice. Funcia analoginput realizeaz un obiect corespunztor dispozitivului hardware reprezentat de driver-ul existent ca argument. Exemplu de realizare a unui obiect pentru placa de sunet: ai = analoginput('winsound'); Obiectul astfel creat are mai multe proprieti (cmpuri sau parametri) care pot fi modificate folosind comanda set (exemplu: set(ai,'Parametru', valoare_dorit)), respectiv vizualitate prin comanda get (exemplu: get(ai,' Parametru ') ). De asemenea, se poate folosi sintaxa ai.Parametru = valoare_dorit, pentru modificare sau valoare = ai.Parametru, pentru vizualizare. n continuare se prezint cteva din aceste proprieti: SampleRate. Permite stabilirea ratei de eantionare. Pentru placa de sunet sunt posibile valorile standard: 8000, 11025, 22050, 44100, n Hz. SamplesPerTrigger. Permite stabilirea nunrului de eantioane care se achiziioneaz. Dac valoarea acestui parametru este inf, obiectul achiziioneaz eantioane continuu, pn va primi o comand de tip stop. SamplesAcquired. Reprezint numrul de eantioane achiziionate. Acesta prezint interes doar cnd parametrul SamplesPerTrigger are valoarea inf, n caz contrar cei doi parametri coincid. SamplesAvailable. Reprezint numrul de eantioane disponibile pentru a fi citite. Acest parametru coincide cu precedentul dac citirea datelor se face cu funcia peekdata. Dac citirea se face cu getdata, eantioanele citite nu mai sunt disponibile, adic valoarea SamplesAvailable este mai mic dect

SamplesAcquired. (a se vedea explicaiile despre funciile getdata i peekdata care urmeaz) Running. Acest parametru are starea on dac obiectul ruleaz, respectiv off n caz contrar. Alte funcii utilizate n procesul de achiziie: addchannel(ai,vector). Permite adugarea de canale de intrare obiectului ai creat iniial. Dac vector=1, se adug canalul 1 (mono). Dac vector=1:2, se adaug canalele 1 i 2 (stereo). Varianta vector=2 nu este acceptat. start(ai). Permite startul achiziiei de semnal prin intermediul obiectului ai, conform configurrilor iniiale. stop(ai). Permite ncheierea procesului de achiziie. Are sens n cazul n care parametrul SamplesPerTrigger are valoarea inf. getdata(ai). Furnizeaz datele (eantioanele) achiziionate, conform parametrului SamplesPerTrigger. Poate avea un al doilea argument, mai mic dect SamplesPerTrigger, care specific numrul de eantioane care vor fi achiziionate. n ambele variante, aceast funcie permite preluarea controlului de ctre spaiul de lucru (Workspace) al MATLAB-ului doar dup extragerea tuturor eantioanelor achiziionate. peekdata(ai,N). Furnizeaz cele mai recente N date (eantioane) achiziionate. Spre deosebire de getdata, aceasta red imediat controlul ctre spaiul de lucru (Workspace) al MATLAB-ului. Dac numrul de eantioane cerut nu este nc disponibil, se returneaz numrul disponibil n momentul respectiv i se trimite un mesaj de avertizare (n fereastra de comand). Datele furnizate de aceast funcie, n timp ce procesul de achiziie se execut (Running = on), nu sunt terse din cadrul obiectului; toate datele achiziionate pot fi citite din nou cu getdata de ndat ce procesul de achiziie s-a ncheiat. Dac au fost programate dou canale (prin funcia addchannel), variabila returnat de funciile getdata sau peekdata este o matrice cu 2 coloane, prima pentru canalul 1, a 2-a pentru canalul 2. Urmtorii doi parametri (faciliti) sunt caracteristici pentru obiectele de tip analoginput, dar i pentru altele, cum ar fi serial, prezentat la nceputul acestui capitol. TimerPeriod. Reprezint perioada de timp (n secunde) ntre dou evenimente succesive ; la trecerea acestui interval de timp se va apela automat funcia TimerFcn. Valoarea minim a acestui parametru este 0,01 sec. TimerFcn. Reprezint funcia MATLAB (eventual numele fiierului .m de tip funcie-function) care va fi executat n momentul trecerii intervalului de timp precizat prin TimerPeriod.

n continuare se prezint o secven de program care permite accesul la placa de sunet pentru achiziia a 16000 de eantioane:

% se configureaz obiectul ai pentru a achiziiona date pe 2 canale, cu frecvena de 8000 Hz i durata de 2s ai = analoginput('winsound'); addchannel(ai, 1:2); % 2 canale Fs = 8000; duration = 2; set(ai, 'SampleRate', Fs); set(ai, 'SamplesPerTrigger', duration*Fs); start(ai); %startul achiziiei data = getdata(ai); %variabila data (matrice) conine datele corespunztoare celor 2 canale (coloana 1-canalul 1, coloana a 2-a-canalul 2). Exist posibilitatea generrii de semnale analogice la ieirea corespunztoare unei plci (de exemplu pentru placa de sunet), ca n continuare: ao = analogoutput('winsound'); addchannel(ao, 1); putdata(ao,data) start(ao). 6.2 Funcii pentru manipularea fiierelor audio n MATLAB Funciile prezentate n continuare (1,..,4) permit achiiia i redarea semnalelor audio, fiind ntr-un fel similare ca efect cu analoginput i analogoutput. Acestea dou din urm sunt mai generale, fiind valabile pentru orice plac de achiziie-redare. 1. r = audiorecorder(Fs, Nbits, Nchannels) -creeaz obiectul de tip audiorecorder r, avnd frecvena de eantionare Fs, n Hz, numrul de bii pentru fiecare eantion Nbits i numrul de canale Nchannels; n acest caz nu mai exist restriciile referitoare la frecvena de eantionare, putndu-se pune practic orice valoare rezonabil. 2. recordblocking (r, timp) -realizeaz nregistrarea semnalului vocal (audio) rostit la un microfon n obiectul r; lungimea secvenei de semnal vocal va fi de timp secunde Obiectul r are mai multe elemente (se d dublu click n Workspace pentru a fi vizualizate): BitsPerSample: 16 BufferLength: 1 CurrentSample: 1 DeviceID: -1 NumberOfBuffers: 4 NumberOfChannels: 1 Running: 'off' SampleRate: 8000 StartFcn: [] StopFcn: []

Tag: '' TimerFcn: [] TimerPeriod: 0.0500 TotalSamples: 32000 Type: 'audiorecorder' UserData: [] Aceste elemente se acceseaz n felul urmtor: >> r. SampleRate ans = 8000 >> r. BitsPerSample ans = 16 3. p=play(r) -realizeaz redarea la dispozitivul audio (boxe, casc) a semnalului audio corespunztor obiectului r nregistrat anterior i creeaz obiectul audioplayer p. n acest caz, informaia corespunztoare variabilei redate nu exist n spaiul de lucru (workspace) al MATLAB-ului. Aceasta se obine doar dup rularea urmtoarei funcii: 4. mySpeech = getaudiodata(r,tip) -realizeaz conversia datelor nregistrate n obiectul audiorecorder r ntr-o variabil avnd formatul precizat prin tip; tip poate fi double, int 16, etc. 5. sound(mySpeech,fe) -realizeaz comanda dispozitivului audio (boxe, casc) cu semnalul audio corespunztor variabilei mySpeech i frecvena de redare fe; elementele variabilei mySpeech trebuie s fie n gama [-1 1]; dac variabila mySpeech conine o coloan (o linie) se cor comanda ambele canale audio cu semnalul corespunztor variabilei; dac variabila mySpeech conine 2 coloane, atunci semnalul corespunztor primei coloane va comanda canalul 1, iar cel corespunztor coloanei a 2-a va comanda canalul 2; versiunea soundsc a funciei scaleaz semnalul argument n gama [-1 1] pentru o audiie la maximum. 6. [mySpeech, fe, Nb] = wavread(si486) -realizeaz citirea fiierului si486.wav i returneaz eantioanele corespunztoare n variabila mySpeech, a frecvenei de eantionare (n Hz) n variabila fe, respectiv a numrului de bii pe eantion n variabila Nb. Dac fiierul este stereo, variabila mySpeech va avea 2 coloane. 7. wavwrite(var, fe, Nb, si100 ) -realizeaz salvarea variabilei var n fiierul si100.wav; variabila var poate avea 1 sau 2 coloane. n final se prezint o aplicaie care realizeaz urmtoarele: -permite declanarea achiziiei continue a semnalului vocal captat de microfonul conectat la canalul 1 al unei plci de sunet; -afieaz cele mai recente 1600 eantioane

-afieaz densitatea spectral de amplitudini pentru eantioanele considerate -permite ncheierea achiziiei; pentru aceasta se scrie stop(ai) n linia de comand; -permite reluarea sau oprirea achiziiei de oricte ori, folosind comenzile start(ai) sau stop(ai) n linia de comand. n continuare se prezint programul principal i, respectiv, funcia apelat la trecerea intervalului de timp (TimerFcn).
clear global i global l l=1; i=1; fe=8000; ai = analoginput('winsound'); % se creeaza obiectul de intrare % se adauga un canal addchannel(ai,1); set(ai,'TimerPeriod',0.2); evenimentul set(ai,'SampleRate',fe); %perioada de repetitie cu care apare

set(ai,'SamplesPerTrigger',inf); % Configurare pentru a rula infinit set(ai,'TimerFcn','func_ai_last(ai,1600,fe)'); % la fiecare eveniment se va apela functia func_ai_last start(ai)

function func_ai_last(ai,N,fe) global i global l i=i+1; subplot(211) data=peekdata(ai,N); %se citesc cele mai recente N esantioane

N=length(data);
plot((l:l+N-1),data);grid %afisare cele mai recente N esantioane l=l+N; xlabel('esantioane') subplot(212) %densitate spectrala X=abs(fft(data)); plot((1:N/2)*fe/N,X(1:N/2));grid xlabel('frecventa, Hz');

De remarcat c dup ncheierea secvenei de instruciuni corespunztoare programului principal (rularea are loc practic instantaneu), cursorul revine n linia de comand a MATLAB-ului. Funcia al crui efect final este afiarea graficului ruleaz n fundal. Variabilele i i l (ce reprezint acestea?) pot fi vzute cum se modific n timp real, n workspace. Exist i o variant mai performant de a realiza aciunile de mai sus, i anume generarea unei figuri pe care exist un buton care iniial afieaz stop. Acionarea succesiv cu mouse-ul a butonului are ca efect schimbarea valorii afiat ntre start i stop. Fiecare apsare a butonului are ca efect executarea funciei start(ai), respectiv stop(ai).

n continuare se prezint o captur de imagine obinut prin rularea acestui program.

Fig. 1

n ncheierea acestui paragraf se prezint o secven de program care realizeaz achiziia de imagini folosind o camer web.
vidobj=videoinput('winvideo',1); % se creeaza obiectul de tip video vidobj preview(vidobj) % se afiseaza in timp real imaginea capatata snapshot=getsnapshot(vidobj); % se achizitioneaza un cadru de imagine o matrice cu dimensiunea 480 x 640 x 3 (3 matrice 480 x 640) imagesc(snapshot) %se afiseaza cadrul de imagine captat

S-ar putea să vă placă și