본문 바로가기

카테고리 없음

Simulink 3D Animation을 이용한 MPU6050 가속도 센서의 visualization(#3)

요구사항 2번에 대해 구현해보겠습니다.

2. MATLAB 스크립트를 통해 Serial 통신을 구현할 수 있다.

 

아직 MCU쪽의 MPU6050이 구현되지 않았으므로, 

시리얼 포트를 관련 코드를 작성하고 loopback 테스트 환경을 꾸며 시리얼 데이터에 따라 rotation이 되는지까지만 확인해보도록 하겠습니다.

Tx로 전송한 rotation값이 Rx로 잘 들어오는 지 확인할 수 있고, 이후 UART코드가 작성된 MCU를 연결하기만 하면 의도대로 동작할 것 입니다.

 

serial port의 loopback test

 

아래는 matlab main 코드입니다.

 

윗 부분에 serial port관련 코드가 추가된것을 볼 수 있습니다.

serialport_device 객체를 생성하고 serial_open 메소드로 해당하는 포트를 열어줍니다.

port와 baudrate는 상황에 맞게 바꿔줄 수 있도록 변수화 하였습니다.

 

아래 while문에서는 serial로 값을 write하고 read하는 부분이 추가되었습니다.

loopback으로 write한 값을 read 했을떄만 그 값에 따라 rotaition이 됩니다.

 

추가로 visualization을 실감나게 하기 위해 

actor1.Texture = fullfile(pwd, "mpu6050.png");
 
위 코드를 추가하였습니다.
말 그대로 actor의 texture에 이미지 파일을 import하는 기능입니다.
단순히 박스가 돌아가는 것보다 좀 더 보기좋습니다.
clear;
clc;

port = 'COM6';
baudrate = 9600;
device = serialport_device;
device = serial_open(device,port,baudrate);

% Define world
world = sim3d.World();
viewport = world.createViewport();
viewport.Translation = [-6,0,0];

% Define Actor
actor1 = sim3d.Actor();
actor1.createShape('plane', [2 2 1]);
actor1.Rotation = [0,0,1];
actor1.Color = [0, 1, 1];
actor1.Texture = fullfile(pwd, "mpu6050.png");
actor1.TextureTransform.Scale = [3, 1];

actor1.Mobility = sim3d.utils.MobilityTypes.Movable;

% add actor to the world
add(world,actor1);
% start 3d animation 
run(world,0.02,inf);

a=0;
val=0;
while true
    if a == 10000000
        a=0;
        rotation = read(device);
        propagate(actor1,"Rotation", rotation)
    else
        %%%%%%%%%%%%
        % to be deleted
        if a==0
            val= val + 0.005*pi;
            if val > 2*pi
                val = 0;
            end
            write(device,val);
        end
        %%%%%%%%%%%%%
        a=a+1;
    end
end

 

 

다음은 serial port class입니다.

아직은 클래스 작성 초기이므로 간단히 serial port open, read, write 만 추가하였습니다.

아래 변환공식은 uart의 8bit 값을 radian으로 converting 하기 위해 존재합니다

Rx로 받은 0~255 값은 0이 0 rad 255가 2Pi rad 가 되도록 합니다. 

classdef serialport_device
    properties
        device
    end
    
    methods
        function obj = serial_open(obj,port,baudrate)
            obj.device = serialport(port,baudrate);
        end
        
        function read_in_radian = read(obj)
            rot= read(obj.device,3,"uint8");
            read_in_radian =rot*6.28/255;
        end

        function write(obj,val)
            val_to_byte = val*255/6.28;
            write(obj.device,[val_to_byte,val_to_byte,val_to_byte],"uint8");
        end
    end
end

 

 

이렇게 작성한 main 파일과 class 파일을 한 폴더에 넣고 실행합니다.

 

 

아래 영상과 같이 회전하는 mpu 6050 actor를 확인할 수 있습니다.