Sei sulla pagina 1di 13

TALLER 3: ADQUISICIN DE SEAL (TIEMPO REAL) POR MEDIO DEL PUERTO DE AUDIO

En general, Matlab puede realizar la adquisicin de seal externa empleando hardware de varias marcas:
los soportados son advantech, mcc, nidaq (figura 1). En el caso de un PC que incluye una tarjeta de
audio (figura 2a), los terminales se pueden ver en la (figura 2b). Como se puede ver, la tarjeta de audio
del PC consta de 2 o 3 conectores cilndricos que en conjunto se denominan puerto de audio y que
permiten realizar las siguientes tareas:
a) capturar la seal del micrfono (color rosado),
b) capturar audio procedente del exterior (color verde) y
c) enviar seal de audio hacia el exterior: 2 auriculares o 2 altavoces (color celeste). El conector
denominado Jack 3.5 (mm) cuenta con 3 contactos (figura 2c).

Figura 1. Adquisicin de seal externa por medio de hardware de marca National Instruments (NI) y measurement
computing (MCC)

(a)

(b)

(c)

Figura 2. (a) Adquisicin mediante tarjeta de audio, (b) Terminales de la tarjeta de audio en un PC, (c) Pines del
puerto de salida que tiene dos canales que van hacia los dos altavoces (contactos 1 y 2). El contacto 1 es tierra.
Para ver toda la ayuda referente a objetos, funciones, demos, etc sobre adquisicin:

>> daqhelp

Data Acquisition Toolbox


Version 2.16 (R2010a) 25-Jan-2010

Data acquisition object construction.


daq/analoginput - Construct analog input object.
daq/analogoutput - Construct analog output object.
daq/digitalio - Construct digital input/output object.

Getting and setting parameters.


daqdevice/get - Get value of data acquisition object property.
daqdevice/set - Set value of data acquisition object property.
daqdevice/inspect - Open property inspector and configure data acquisition
object properties.
setverify - Set and return value of data acquisition object
property.

Execution.
daqdevice/start - Start object running.
stop - Stop object running and logging/sending.
trigger - Manually initiate logging/sending for running object.
daqdevice/wait - Wait for the object to stop running.

Analog input functions.


addchannel - Add channels to analog input object.
addmuxchannel - Add mux'd channels to analog input object.
flushdata - Remove data from engine.
getdata - Return acquired data samples.
getsample - Immediately acquire a single sample.
muxchanidx - Return scan channel index associated with mux board.
peekdata - Preview most recent acquired data.
islogging - Determine if object is logging data.

Analog output functions.


addchannel - Add channels to analog output object.
putdata - Queue data samples for output.
putsample - Immediately output single sample to object.
issending - Determine if object is sending data.

Digital input/output functions.


addline - Add lines to digital input/output object.
getvalue - Read line values.
putvalue - Write line values.

General.
binvec2dec - Convert binary vector to decimal number.
daq/private/clear - Clear data acquisition object from the workspace.
daqcallback - Display event information for specified event.
daqfind - Find specified data acquisition objects.
daqmem - Allocate or display memory for one or more device
objects.
daqread - Read Data Acquisition Toolbox (.daq) data file.
daqregister - Register or unregister adaptor DLLs.
daqreset - Delete and unload all data acquisition objects and
DLLs.
daqdevice/delete - Remove data acquisition objects from the engine.
dec2binvec - Convert decimal number to binary vector.
ischannel - Determine if object is a channel.
isdioline - Determine if object is a line.
isvalid - Determine if object is associated with hardware.
isrunning - Determine if object is running.
length - Determine length of data acquisition object.
daq/private/load - Load data acquisition objects from disk into MATLAB
workspace.
makenames - Generate cell array of names for naming channels/lines.
obj2mfile - Convert data acquisition object to MATLAB code.
daq/private/save - Save data acquisition objects to disk.
showdaqevents - Display summary of event log.
size - Determine size of data acquisition object.
softscope - Data Acquisition oscilloscope GUI.

Information and help.


daqhelp - Data acquisition property and function help.
daqhwinfo - Information on available hardware.
daqsupport - Data acquisition technical support tool.
propinfo - Property information for data acquisition objects.

Data acquisition demos.


demodaq_intro - Introduction to Data Acquisition Toolbox.
demodaq_save - Methods for saving and loading data acquisition objects.
demodaq_callback - Introduction to data acquisition callback functions.
daqtimerplot - Example callback function which plots the data acquired.

Analog input demos.


daqrecord - Record data from the specified adaptor.
demoai_channel - Introduction to analog input channels.
demoai_fft - FFT display of an incoming analog input signal.
demoai_intro - Introduction to analog input objects.
demoai_logging - Demonstrate data logging.
demoai_trig - Demonstrate the use of immediate, manual and software
triggers.
daqscope - Example oscilloscope for the Data Acquisition Toolbox.

Analog output demos.


daqplay - Output data to the specified adaptor.
daqsong - Output data from HANDEL.MAT to a sound card.
demoao_channel - Introduction to analog output channels.
demoao_intro - Introduction to analog output objects.
demoao_trig - Demonstrate the use of immediate and manual triggers.
daqfcngen - Example function generator for the Data Acquisition Toolbox.

Digital I/O demos.


demodio_intro - Introduction to digital I/O objects.
demodio_line - Introduction to digital I/O lines.
diopanel - Display digital I/O panel.

See also analoginput, analogoutput, digitalio, daqhelp.

Accessing Analog Input Channels


DEMOAI_CHANNEL introduces analog input channels by demonstrating how
to add channels to an analog input object and how to configure the
channels for your acquisition.

This demo gives examples on using the get/set notation, dot notation,
and named index notation for obtaining information about the channel
and for configuring the channel for your acquisition.

See also addchannel, daqdevice/get, daqdevice/set, analoginput,


daqhelp.

Published output in the Help browser


showdemo demoai_channel
Cmo saber los dispositivos actualmente conectados?

out = daqhwinfo;
out.InstalledAdaptors

Si se tuviese conectados algunos dispositivos de adquisicin, podramos obtener algo como lo siguiente:

ans =
'advantech'
'mcc'
'nidaq'
'parallel'
'winsound'

Observacin: en el anexo 1 se explica el empleo de una daq de National Instruments y el uso del objeto
daq en las nuevas versiones de Matlab.

CREACIN DE OBJETOS DE ENTRADA ANALGICA EN MATLAB


(versiones anteriores de Matlab, ejemplo 2010):
Se puede crear varios objetos de entrada analgicos, cada uno asociado a un distinto hardware de
adquisicin. Sin embargo, normalmente puede ejecutar slo un objeto a la vez.

Como primer paso se crea el objeto de entrada analgica con la ayuda de la funcin de Matlab
(analoginput).

Sintaxis (mayores detalles, ver en la ayuda de Matlab):


AI = analoginput ('adaptor')
AI = analoginput ('adaptor',ID)

'adaptor': especifica el nombre del hardware a usar: como ya se dijo, los adaptadores soportados son
advantech, mcc, nidaq. Si se trata de la tarjeta de sonido que est incluida en la placa madre del PC, el
controlador empleado es winsound.

ID: Es el identificador del dispositivo de hardware que puede ser especificado por un nmero o por una
cadena de caracteres (ejemplo 'ni'). Si ID est asociado con una tarjeta de sonido, el Data Acquisition
Toolbox asocia automticamente cada tarjeta de sonido con un valor de ID entero. Si este ID es 0, no es
necesario especificarlo. As, la creacin del objeto de entrada analgica quedara de la siguiente manera:

% 1. Creando un objeto de entrada analgica


AI = analoginput('winsound');
El objeto de entrada analgica existe en el motor de adquisicin de datos y en el espacio de trabajo
de MATLAB (figura 3). Al dar doble click en la variable AI del workspace se obtiene una ventana de
propiedades de este objeto (figura 4).

Figura 3. Variable asociada al objeto AI y que aparece en el workspace


Figura 4. Al dar doble click en la variable AI del workspace se obtiene una ventana de propiedades de este objeto

Si hacemos click en el botn derecho de la variable AI (figura 5), obtendremos varias opciones.

Figura 5. Click en el botn derecho de la variable AI y seleccionar Display Hardware Info para obtener informacin
del objeto

Si en la figura 5 hacemos click en la opcin Display Hardware Info, obtendremos la siguiente informacin:
(Revisar cada una de las caractersticas)

Agregando canales de hardware:


Cuando se crea un objeto de entrada analgica, este todava no contiene ningn canal de hardware. Para
poder ejecutar el objeto, antes se deben agregar canales de hardware con la funcin addchannel.

% 2. Agregando canales de hardware:


chan = addchannel(AI,1); % monofnico

Si se hace doble click en la variable chan del workspace, apareceran sus propiedades (figura 6a). Se
puede ver que consta como monofnico, es decir, la adquisicin se la realiza por cualquiera de los dos
canales de ingreso (izquierdo o derecho).

DEBER:
Es posible muestrear dos seales a la vez, una con el canal izquierdo y otra con el derecho?
PC1: generar dos seales diferentes: CH1 sinusoide de 50 Hz, CH2 sinusoide de 100 Hz.
PC2: adquirir los dos canales (ver caractersticas anteriores):
chan = addchannel(AI,2); % la figura 6 (b) cambia a RIGHT

Figura 6. Propiedades del canal analgico de entrada: a) mono, b) Right.


TIEMPO DE ADQUISICIN:
Se puede especificar el tiempo que se va a adquirir la seal externa:

% 3. Tiempo de adquisicin: 2 segundos


duration = 2;

DEBER
Cmo se lo hara si se deseara realizar una adquisicin continua?
..

CONSULTA DE LA FRECUENCIA DE MUESTREO ACTUAL:


Se puede consultar la frecuencia de muestreo actual mediante la instruccin get de la siguiente manera:

% 4. Consulta de la frecuencia de muestreo actual:


ActualRate = get(AI,'SampleRate');

En el workspace se obtiene: 8000 muestra/segundo

Si se desea emplear una frecuencia de muestreo diferente, por ejemplo 44100 (muestras/segundo), se
puede emplear la instruccin set de la siguiente manera:

% Fijando una frecuencia de muestreo diferente:


set (AI,'SampleRate', 44100)

Verificacin: para verificar que se produjo el cambio, otra vez podemos emplear la instruccin:
ActualRate = get(AI,'SampleRate');

CONSULTA DEL NMERO DE MUESTRAS ADQUIRIDAS EN CADA DISPARO (TRIGGER):


Se puede consultar el nmero de muestras adquiridas en cada disparo mediante la instruccin get de la
siguiente manera:
blocksize = get (AI,'SamplesPerTrigger');
Por defecto se obtiene: 8000 muestras/disparo.

Si se desea emplear nmero de muestras adquiridas en cada disparo de acuerdo a los datos de
duration y ActualRate, se lo calculara de la siguiente manera:
duracin * ActualRate

Esto se lo configura mediante la instruccin set de la siguiente manera:


set(AI,'SamplesPerTrigger',duration*ActualRate)

CONFIGURACIN DEL TIPO DE DISPARO (TRIGGER):


Podemos configurarlo para que inicie la adquisicin una vez que el usuario lo ordene mediante las
instrucciones que ven ms adelante. En este caso, la propiedad TriggerType se la pone en Manual:

set(AI,'TriggerType','Manual');

DEBER: Qu otros posibilidades de trigger hay?

INICIO DE ADQUISICIN:
Hasta aqu todo est listo para proceder con la adquisicin de la seal externa. Para iniciarla, introducimos
las instrucciones de INICIO (start) y DISPARO (trigger)

start(AI)
trigger(AI)
Dejamos que se adquiera la seal durante el tiempo de duracin que se introdujo anteriormente:
wait(AI,duration + 1)

OBTENEMOS LOS DATOS ADQUIRIDOS:


Esto se lo realiza mediante la instruccin getdata de la siguiente manera:

senial_adquirida = getdata (AI); %obteniendo los datos desde el dispositivo empleado

GRAFICAR EN PANTALLA LA SEAL ADQUIRIDA:


% Grfica de la seal en el dominio del tiempo (eje t en segundos)
Fs = ActualRate;
Ts = 1/Fs
t = Ts:Ts:duration;

plot(t,senial_adquirida)
title('Adquisicin de senial analgica por el puerto de audio')
xlabel('t(segundos)')
ylabel('y(volts)')

BORRAR EL OBJETO:
Si ya no se va a emplear el objeto de adquisicin, se lo debe borrar:

delete(AI) %Eliminando el objeto

PROGRAMA COMPLETO Y PRUEBA DE ADQUISICIN EN TIEMPO REAL:

Generamos con el audiotester una onda seno de 1000 Hz y puenteamos el puerto de audio con el cable
macho-macho:

clc, close all, clear all

AI = analoginput('winsound');
chan = addchannel(AI,1);
duration = 1;
set(AI,'SampleRate',8000)
ActualRate = get(AI,'SampleRate');
set(AI,'SamplesPerTrigger',duration*ActualRate)
set(AI,'TriggerType','Manual');
blocksize = get(AI,'SamplesPerTrigger');

start(AI) %inicializamos el objeto


trigger(AI)
wait(AI,duration + 1)

senial_adquirida = getdata(AI);

% Grfica de la seal en el dominio del tiempo (eje t en segundos)


Fs = ActualRate;
Ts = 1/Fs
t = Ts:Ts:duration;

plot(t,senial_adquirida)
title('Adquisicin de seal analgica por el puerto de audio')
xlabel('t(segundos)')
ylabel('y(volts)')
%Eliminando el objeto
delete(AI)

Observacin: Vemos que s se adquiri 1 segundo pero al inicio hay un problema: considerarlo en futuros
proyectos
DEBER: REALIZAR EL SIGUIENTE PROYECTO (PASO A PASO)

ADQUISICIN DE SEALES DE ELECTROMIOGRAMA (EMG) POR MEDIO DEL PUERTO DE AUDIO


Y SU USO PARA DETERMINAR SI SE ABRE O SE CIERRA LA MANO

ver video:

https://www.youtube.com/watch?v=HmXs6bdkoAM

Emplear: dos sensores de presin resistivos como el siguiente (costo aproximado: $8)

PARTE I. Adquirir y mostrar en pantalla uno de los dos canales de EMG ubicados uno en la parte superior
y otro en la parte inferior del antebrazo segn la siguiente grfica:

PARTE II. En base a los dos canales de EMG, en una GUI, mostrar grficas de mano abierta o cerrada
segn el usuario abra o cierre la mano.

PARTE III. Repetir la parte II pero mediante hardware.


Como se haba especificado anteriormente, se tendrn dos canales de adquisicin de datos, por ejemplo,
el primer canal de color marrn que indicar el cierre de la mano, mientras que el canal de color azul indicar
la apertura de la mano, esto lo podemos apreciar en las siguientes figuras:

Seal marrn:
cierre de la
mano

Seal azul:
apertura de la
mano
Para saber si la persona abri o cerr la mano, en la siguiente figura se puede apreciar mejor el
voltaje pico-pico entre la seal azul que claramente es inferior a la seal de color marrn, esta
seal tiene un valor de 2.7 Vdc, esto se realiz sin ningn esfuerzo al cierre de la mano. Como se
puede ver, con el uso de dos canales de EMG s es factible diferenciar si la mano fue abierta o fue
cerrada y lo muestra en la ventana de comandos con la frase mano_cerrada.

Seal marrn:
cierre de la
mano

Figura. Adquisicin en tiempo real de la seal EMG del antebrazo el momento de cerrar la mano.

En la figura 08 se puede apreciar mejor el voltaje pico-pico entre la seal marrn que claramente
es inferior a la seal de color azul, esta seal tiene un valor de 4.9 Vdc, esto se realiz sin ningn
esfuerzo al abrir la mano, los datos son adquiridos en tiempo real y como se pudo ver en las figuras
05 y 06, el algoritmo de control detecta si la mano fue abierta o fue cerrada y lo muestra en la
ventana de comandos con la frase mano_abierta.

Seal azul:
apertura de la
mano

Figura. Adquisicin en tiempo real de la seal EMG del antebrazo el momento de abrir la mano.

AYUDA: PARA VERSIONES DE MATLAB ACTUALES, VER CDIGO EN EL ANEXO 1