Dr. GÜRAY SONUGÜR

Dr. Öğr. Üyesi Güray SONUGÜR – Öğrenci Bilgi Paylaşım Platformu

Arduino’dan Matlab ile seri (com) port kullanarak sensör verilerini okumak

Bu yöntemde arduino destek paketinin sağladığı avantajlar bulunmadığı için işimiz biraz daha zor ve karmaşık. Matlab ile seri porttan sensör verileri okuyabilmemiz için arduino’nun bu değerleri bize yine seri port üzerinden göndermesi gerekir. Yani iki tarafa da kod yazmamız gerekecek. İlk aşamada arduino’nun kendi kod arayüzünü kullanarak sensör verilerini seri porta göndermemiz gerekiyor.

Devremiz aşağıdaki şekilde kuruluyor.

Kullanılan devre şeması

Bu kod:

#define ADC1 A0  //ADC1 analog 0 pinini temsil ediyor.
#define ADC2 A1 //ADC2 analog 1 pinini temsil ediyor.
#define ADC4 A3 //ADC4 analog 3 pinini temsil ediyor.

void setup() {
// Başlangıçta seri iletişim hızını 115200 bps hızına set ediyoruz.
Serial.begin(115200);
}

void loop() {
// Sürekli run edilecek kodlarımız burada kullanılıyor.
// ADC1 yani analog 0 pininden okunan değeri seri porta yaz. (Potansiyometre) 
Serial.println(analogRead(ADC1));
delay(100); // 100 ms duraklama yap.
// ADC2 yani analog 1 pininden okunan değeri seri porta yaz. (LDR) 
Serial.println(analogRead(ADC2));
delay(100);
// ADC4 yani analog 2 pininden okunan değeri seri porta yaz. (Sıcaklık)
Serial.println(analogRead(ADC4));
delay(100);
}

 

Şu anda verilerimizi arduino üzerinden seri porta göndermeye başladık. Bu aşamadan sonra matlab ile seri port okuma ve analiz işlemine başlayacağız.

clc;
clear;
%Önce COM (Seri) portumuzu Matlab üzerinde tanımlıyoruz.
%Seri porta “comport” adını verdik. Seri haberleşme hızını 115200 olarak
%ayarladık.
comport = serial(‘COM5′,’BaudRate’,115200);
%Seri portumuzu iletişime açtık.
fopen(comport);

%arduino üzerindeki sensörlerden aldığımız her değeri biz dizide (array)
%tutmamız gerekir. Üç sensörümüz var.
%1.) Potansiyometre 2.) Işık sensörü LDR  3.) Sıcaklık sensörü
%Dizide indis değişkenini “i” olarak seçtik.
%Potansiyometre verilerini “y” dizisinde
%LDR verilerini “z” dizisinde
%Sıcaklık verilerini “k” dizisinde topluyoruz.
%dizilerimizdeki indis değerimiz “i”
%bir for döngüsü içinde tüm değerleri alıyoruz.
for i=1:100
y(i)=fscanf(comport,’%d’); % “%d” tamsayı okuyacağımız için kullanıldı.
fprintf(‘voltage=%d’,y(i)); % seri porttan veri okuma komutu “fscanf”
z(i)=fscanf(comport,’%d’);%ldr
fprintf(‘  ldr=%d’,z(i));
k(i)=fscanf(comport,’%d’);%sicaklik
fprintf(‘   sıcaklık=%d\n’,k(i));

%okunan değerler döngü içerisinde grafiğe yansıtılıyor.
plot(y,’r’, ‘linewidth’, 2); %kırmızı ve “2” çizgi kalınlığında
hold on %tüm grafikler aynı ekranda çizilebilsin diye kullanıldı.
plot(z,’b’,’linewidth’, 2);%mavi ve “2” çizgi kalınlığında
plot(k,’g’,’linewidth’, 2);%yeşil ve “2” çizgi kalınlığında
hold off
drawnow % gerçek zamanlı grafik çizimi yapılabilmesi için kullanıldı.
end
%%
% işimiz bittikten sonra seri portu kapatıyoruz ve siliyoruz.
fclose(comport);
delete(comport);

 

Ekran çıktısı

Burada dikkat edilecek husus: arduino sensör analog verilerini örnekledikten sonra 10 bitlik setler halinde sayısala çevirir. Bunun anlamı en küçük değer 0 olurken en yüksek değer 2^10 (2 üzeri 10) = 1023 ile temsil edilir.

Sensör verilerinin grafiği