Boa noite. Obrigada pelas respostas à outra questão que submeti mas entretanto consegui resolver o problema. Só que agora tenho outro problema. Vou tentar explicar-me melhor.
Estou a tentar fazer um projecto que dê para medir a pressão arterial (esfigmomanómetro método oscilométrico). na minha breadboar tenho um sensor de pressão, 2 transistores (onde ligam a valvula que está fechada e nao deixa sair ar ou aberta e deixa sair o ar, e o motor que ligado aumenta a pressão), depois tenho um amplificador instrumentação que esta ligado ao arduino e passa os valores de tensao lidos. entretanto pus o arduino a ligar e desligar o motor para conseguir encher ate aos 160mmHg de pressão (que é o normal nos aparelhos a venda).
Fiz o meu código no arduino com o objectivo de comunicar com o matlab (pois o tratamento dos dados é feito no matlab, o arduino so serve de placa de aquisição):
int AI_Pin = A3;
int motor_Pin = 11;
int valvula_Pin = 12;
int i = 0;
double t = 0;
double s = 0;
int nbits_160 = 469;
void setup() {
// start serial port at 9600 bps:
Serial.begin(115200);
pinMode(motor_Pin, OUTPUT);
pinMode(valvula_Pin, OUTPUT);
pinMode(AI_Pin,INPUT);
establishContact(); // send a byte to establish contact until receiver responds
s=millis();
digitalWrite(motor_Pin,HIGH);
digitalWrite(valvula_Pin,HIGH);
}
void loop() {
i = analogRead(AI_Pin);
if (i > nbits_160)
{
digitalWrite(motor_Pin,LOW);
}
t=millis()-s;
Serial.println(t);
Serial.println(i);
}
void establishContact() {
while (Serial.available() <= 0) {
Serial.println('A', BYTE); // send a capital A
delay(300);
}
}
E o código no matlab utilizado é:
numSec=60;
t=[];
v=[];
s1 = serial('/dev/tty.usbmodem411'); % define serial port
s1.BaudRate=115200; % define baud rate
set(s1, 'terminator', 'LF'); % define the terminator for println
fopen(s1);
try % use try catch to ensure fclose
% signal the arduino to start collection
w=fscanf(s1,'%s'); % must define the input % d or %s, etc.
if (w=='A')
display(['Collecting data']);
fprintf(s1,'%s\n','A'); % establishContact just wants
% something in the buffer
end
i=0;
t0=tic;
while (toc(t0)<=numSec)
i=i+1;
t(i)=fscanf(s1,'%f')/1000.;
v(i)=fscanf(s1,'%d'); % must define the input % d, %f, %s, etc.
end
fclose(s1);
plot(t,v,'-r') % another interesting graph
% if you need precise timing
% you better get it from the
% arduino (see file 2) but
% THAT takes time
% down to 60 pts in .7 sec
catch exception
fclose(s1); % always, always want to close s1
throw (exception);
end
end
Só que tou a ter um problema. Como eu não sei funcionar mt bem com o arduino, fiz a calibraçao, para saber o valor de tensão que equivale a cada pressão, a partir da placa de aquisição do computador. Então agora os valores parecem não me dar coerentes.
Fiz a calibração manual. Ajustei manualmente a pressão a 180mmHg no manómetro de mercúrio e adquiri 4000amostras e fiz a média dos valores de tensão obtidos para esse valor de pressão, depois para 160mmHg igual e até 20mmHg. O meu código utilizado no matlab foi:
% criação de canal
ai = analoginput('nidaq','Dev1');
chan = addchannel (ai,1);
chan.InputRange = [-5 5];
chan.SensorRange = [-5 5];
chan.UnitsRange = [-5 5];
% escolha da frequência de amostragem (Aps)
ai.SampleRate = 10000;
% escolha do número de amostras adquiridas (tempo de aquisição = 0.4s)
ai.SamplesPerTrigger=4000;
fprintf('Quando a pressão estiver fixa nos 180mmHg escrever 180.\n');
resposta = input('');
if resposta == 180
% pressão 180 mmHg
start(ai);
pause(ai.SamplesPerTrigger/ai.SampleRate);
tensao_180mmHg = getdata(ai);
media_tensao_180 = mean (tensao_180mmHg)
end
fprintf('Quando a pressão estiver fixa nos 160mmHg escrever 160.\n');
resposta = input('');
if resposta == 160
% pressão 160 mmHg
start(ai);
pause(ai.SamplesPerTrigger/ai.SampleRate);
tensao_160mmHg = getdata(ai);
media_tensao_160 = mean (tensao_160mmHg)
end
fprintf('Quando a pressão estiver fixa nos 140mmHg escrever 140.\n');
resposta = input('');
if resposta == 140
% pressão 140 mmHg
start(ai);
pause(ai.SamplesPerTrigger/ai.SampleRate);
tensao_140mmHg = getdata(ai);
media_tensao_140 = mean (tensao_140mmHg)
end
fprintf('Quando a pressão estiver fixa nos 120mmHg escrever 120.\n');
resposta = input('');
if resposta == 120
% pressão 120 mmHg
start(ai);
pause(ai.SamplesPerTrigger/ai.SampleRate);
tensao_120mmHg = getdata(ai);
media_tensao_120 = mean (tensao_120mmHg)
end
fprintf('Quando a pressão estiver fixa nos 100mmHg escrever 100.\n');
resposta = input('');
if resposta == 100
% pressão 100 mmHg
start(ai);
pause(ai.SamplesPerTrigger/ai.SampleRate);
tensao_100mmHg = getdata(ai);
media_tensao_100 = mean (tensao_100mmHg)
end
fprintf('Quando a pressão estiver fixa nos 80mmHg escrever 80.\n');
resposta = input('');
if resposta == 80
% pressão 80 mmHg
start(ai);
pause(ai.SamplesPerTrigger/ai.SampleRate);
tensao_80mmHg = getdata(ai);
media_tensao_80 = mean (tensao_80mmHg)
end
fprintf('Quando a pressão estiver fixa nos 60mmHg escrever 60.\n');
resposta = input('');
if resposta == 60
% pressão 60 mmHg
start(ai);
pause(ai.SamplesPerTrigger/ai.SampleRate);
tensao_60mmHg = getdata(ai);
media_tensao_60 = mean (tensao_60mmHg)
end
fprintf('Quando a pressão estiver fixa nos 40mmHg escrever 40.\n');
resposta = input('');
if resposta == 40
% pressão 40 mmHg
start(ai);
pause(ai.SamplesPerTrigger/ai.SampleRate);
tensao_40mmHg = getdata(ai);
media_tensao_40 = mean (tensao_40mmHg)
end
fprintf('Quando a pressão estiver fixa nos 20mmHg escrever 20.\n');
resposta = input('');
if resposta == 20
% pressão 20 mmHg
start(ai);
pause(ai.SamplesPerTrigger/ai.SampleRate);
tensao_20mmHg = getdata(ai);
media_tensao_20 = mean (tensao_20mmHg)
end
% conjunto de todos os valores de tensão determinados
valores_tensao = [media_tensao_20 media_tensao_40 media_tensao_60 media_tensao_80 media_tensao_100 media_tensao_120 media_tensao_140 media_tensao_160 media_tensao_180];
% calibração feita para valores de pressão de 20mmHg, 40mmHg, 60mmHg...até 180mmH
valores_pressao = 20:20:180;
% determinação dos coeficientes do polinómio de grau 1
coeficientes = polyfit(valores_pressao,valores_tensao,1);
% para todos os valores de pressão de 0 a 180mmHg
todos_valores_pressao = 0:179;
% determinação da recta de calibração
% recta_calibracao = coeficientes(1) * todos_valores_pressao + coeficientes(2);
todos_valores_tensao = polyval(coeficientes,todos_valores_pressao);
% conversão dos valores de tensão para valores inteiros dados pelo arduino
% (apenas para comparação de resultados)
arduino_inteiros = valores_tensao * 1023/5;
% visualização da recta de calibração
figure(1)
plot(valores_pressao,valores_tensao,'xr')
hold on
plot(todos_valores_pressao,todos_valores_tensao)
xlabel ('Tensão/ V')
ylabel ('Pressão/ mmHg')
title ('Recta de calibração')
hold off
Estes foram os valores de tensão da calibração de 20 a 180mmHg:
0.3958 0.6859 0.9668 1.2514 1.5192 1.7817 2.0308 2.2908 2.5384
E estes os equivalentes inteiros no arduino (para poder depois especificar até quando o motor vai (se reparar no primeiro código tem lá o max tensao a 160mmHg, vem daqui)
80.9882 140.3325 197.8141 256.0396 310.8289 364.5342 415.5096 468.7015 519.3472
depois se a partir dos meus dados adquiridos no arduino (t--> tempo e v --> amplitudes em inteiros), fizer:
max(v) devia dar 468.7015 mas dá 486 e por isso tenho um valor de tensão também diferente (2.3754), que equivale a uma pressão superior a 160mmHg de acordo com a recta de calibração. Não sei porque isto acontece, será pela freq. aquisição ser diferente no arduino e na placa?
Isto depois influencia-me nos valores seguintes e por isso gostava de fazer a calibração no arduino, utilizando na mesma aquele esquema de mandar para o matlab os dados, para ficar lá com os valores.
Alguém me sabe dizer como podia fazer isto no arduino? é que tenho sempre que fixar o valor manual no manómetro e o loop do arduino não pára :s
mt obrigada!!
Desculpem o longo texto!