Trong những bài viết trước, mình có thực hiện một số giao tiếp giữa TIVA và máy tính thông qua Processing, tuy nhiên với những yêu cầu về hiển thị, phân tích, xử lý các dữ liệu từ các cảm biến thì Processing chỉ làm được chức năng hiển thị đơn giản. Với MATLAB chúng ta có thể nhận được gói dữ liệu với thông tin từ nhiều cảm biến, vẽ và quan sát được nhiều đồ thị giá trị cùng một lúc, ngoài ra với sức mạnh tính toán nhanh chóng sẽ giúp giảm thiểu được rất nhiều thời gian cho các thuật toán phức tạp. Công việc giờ chia làm 2: TIVA thu thập dữ liệu và MATLAB xử lý/ hiển thị dữ liệu. Chúng ta cùng tìm hiểu xem cách làm như thế nào ?

Chuẩn bị

Phần cứng

  • TIVA C Launchpad
  • Dây nối
  • Cảm biến siêu âm SRF04

Phần mềm

  • Energia IDE
  • Matlab (mình dùng bản  2016)

Đọc dữ liệu cảm biến siêu âm

Trước tiên chúng ta cần tìm hiểu một chút về cách đọc dữ liệu từ cảm biến siêu âm dùng TIVA C, ở đây mình sẽ khóa dòng lệnh  Serial.write(distance); và mở dòng Serial.println(distance); để debug qua cổng COM.

/*
  Chương trình hiển thị giá trị khoảng cách từ cảm biến siêu âm SRF04
  ---------------------
  Sơ đồ nối chân
  SRF04       TIVA C
  VCC         Vbus(5V)
  Trig        PE0
  Echo        PB2
  GND         GND
*/
//Cấu hình chân
#define echoPin PB_2    
#define trigPin PE_0 
#define BUTTON_PIN PF_4 //khai báo nút nhấn để bắt đầu gửi dữ liệu
void setup()
{
  //Cấu hình Serial baud 115200
  Serial.begin(115200);
  //Khai báo chân nút nhấn, chờ tới khi nút nhấn được ấn thì
  //mới kích hoạt chức năng đọc khoảng cách
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  while(digitalRead(BUTTON_PIN) == HIGH);
  
  pinMode(echoPin, INPUT);
  pinMode(trigPin, OUTPUT);
}

void loop()
{
  /* Đọc khoảng cách từ cảm biến siêu âm */
  long duration, distance;
  digitalWrite(trigPin, LOW);   // Cho chân trig xuống LOW
  delayMicroseconds(2);         // Delay 2ms
  digitalWrite(trigPin, HIGH);  // Cho chân trig lên HIGH
  delayMicroseconds(10);        // Delay 10ms
  digitalWrite(trigPin, LOW);   
  duration = pulseIn(echoPin, HIGH); // lấy chu kỳ xung của tín hiệu
  distance = (duration) / 58;        // tính khoảng cách

  //Do chỉ dùng 1 byte để lưu dữ liệu nên sẽ giới hạn khoảng cách từ 0-255
  if(distance > 255)
    distance = 255;
    
  //Gửi byte này lên MATLAB
  Serial.write(distance);
  //Nếu debug giá trị thì khóa dòng Serial.write(distance); 
  //và mở dòng Serial.println(distance); để xem khoảng cách
  //Serial.println(distance);
  
  delay(50);
}

Sau khi mở Terminal lên và ấn nút SW1 trên TIVA để kích hoạt thì ta có kết quả như sau

Gửi và hiển thị dữ liệu lên Matlab

Coi như đã xong bước đọc dữ liệu về khoảng cách, giờ là hiển thị dữ liệu này lên MATLAB

%=================================================================
% Tạo đồ thị thời gian thực về khoảng cách nhận được từ TIVA C
% Dữ liệu là gói tin bao gồm 1 byte duy nhất
% Thay đổi cổng COM trong hàm serial() trước khi chạy script này
%=================================================================

% Xóa hết cổng COM từ bộ nhớ
delete(instrfindall);

% Khởi tạo và mở COM với baud là 115200
s = serial('COM10', 'baudrate', 115200);
fopen(s);

%Đóng hết tất cả các giao diện
close ALL

points = 100;     %Số lượng giá trị khoảng cách hiển thị trên đồ thị
data_period = 50; %Chu kỳ dữ liệu (ms)
%x là trục biểu thị thời gian
x = linspace(0,points*data_period, points);

%y là trục biểu thị giá trị của khoảng cách
y = linspace(0,0,points);

% Vẽ đồ thị với 2 trục x,y
figure;
lh = area(x,y);

% Set giá trị giới hạn của trục x là [0, points*data_period] và trục y là [0, 255]
axis([0,points*data_period,0,255]);
shg;

key = get(gcf,'CurrentKey');      %Đọc phím được ấn từ bàn phím
while ( strcmp(key, 's') == 0)    %Kiểm tra nếu phím bấm là "s" thì dừng
 
    %Chờ tới khi nhận được 1 byte từ TIVA
    while s.BytesAvailable == 0 
    end
    
    %Đưa hết dữ liệu cũ về phía trái đồ thị
    for k = 1:1:points-1
       y(k) = y(k+1);
    end

    %Đọc và hiển thị dữ liệu mới nhận về phía bên phải đồ thị
    y(points) = fread(s,1);
    
    %Lưu giá trị vào biến distance để hiển thị lên console
    distance = y(points)
 
    % Chỉnh sửa giá trị trên trục y
    set(lh, 'YData',y);   
    % Cập nhật lại biểu đồ
    drawnow;

    key = get(gcf,'CurrentKey'); %Kiểm tra lại xem có ấn nút trên bàn phím không
end
    
close ALL   %Tắt hết đồ thị
fclose(s);  %Tắt cổng COM
delete(s);  %Xóa cổng COM từ bộ nhớ
clear s;    %Xóa biến s

Kết quả sau khi đã nạp chương trình xuống TIVA, chạy script của MATLAB và ấn nút SW1 thì dữ liệu sẽ được hiển thị lên đồ thị

Tạm kết

Trong bài viết mình tập trung chủ yếu về cách để truyền dữ liệu từ TIVA lên MATLAB và hiển thị, do đó những vấn đề như giá trị đọc chưa chính xác hay có sai số xin tạm bỏ qua. Với cách hiện dữ liệu như trên bạn hoàn toàn có thể áp dụng được với Arduino mà không cần cài thêm add-on Arduino cho Matlab nữa. Hi vọng bài viết sẽ giúp cho các bạn có thêm kiến thức để làm ra nhiều thứ hay ho hơn nữa.