mbed + Python으로 마이크로 컴퓨터 보드의 가속도 센서 정보를 실시간으로 시각화

NXP FRDM-KL25Z 보드를 사용했습니다. 3축의 가속도 센서 MMA8451Q 가 실려 있었으므로, 여기에서 시리얼 통신으로 정보를 빨아 올려, Python으로 리얼타임에 플롯 해 보았습니다.

(가속도 센서) FRDM-KL25Z --- (Serial) ---> PC (실시간 플롯)

FRDM-KL25Z는 아래 그림과 같은 구성입니다.



마이크로 컴퓨터 보드 측 농장 개발



mbed 을 사용했습니다. 여기서 MMA8451Q.h 의 파일을 포함하려면 여기 에서 mbed 컴파일러로 MMA8451Q 라이브러리를 가져옵니다.

accel_serial.cpp
#include "mbed.h"
#include "MMA8451Q.h"

#define MMA8451_I2C_ADDRESS (0x1d<<1)

DigitalOut myled(LED_GREEN);
Serial pc(USBTX, USBRX);
MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS);
PwmOut rled(LED_RED);
PwmOut gled(LED_GREEN);
PwmOut bled(LED_BLUE);

int main()
{
    pc.printf("Hello World!\n");

    while (true) {
        pc.printf("%f,", acc.getAccX());
        pc.printf("%f,", acc.getAccY());
        pc.printf("%f\n", acc.getAccZ());
        rled = 1.0 - abs(acc.getAccX());
        gled = 1.0 - abs(acc.getAccY());
        bled = 1.0 - abs(acc.getAccZ());
        wait(0.2);
    }
}

프로그램을 쓸 수 있으면 컴파일해 바이너리 파일을 다운로드해, ​​FRDM-KL25Z를 USB로 인식한 폴더에 대해서, 드래그&드롭으로 기입했습니다.

PC측의 시각화 어플리케이션 개발



파이썬을 사용했습니다. 라이브러리를 pip로 설치합니다.
$ pip install numpy matplotlib seaborn pyserial

그런 다음 FRDM-KL25Z를 USB로 연결하여 할당 대상을 확인합니다.
$ ls /dev/tty*

내 환경에서는 /dev/ttyACM1에 할당되었습니다.
다르면 프로그램의 /dev/ttyACM1 부분을 다시 씁니다.
아래 파이썬 파일을 만들어 실행하면 완성됩니다. (sudo 권한을 붙여 실행해 주세요)
FRDM-KL25Z를 기울이면 연동하여 가속도 정보가 그래프에 반영됩니다.

plot_accel.py
from __future__ import unicode_literals, print_function
import numpy as np
import matplotlib.pyplot as plt
import serial
import seaborn as sns
sns.set(font_scale=2)
s = serial.Serial('/dev/ttyACM1')

fig, ax = plt.subplots(3, 1)

t = np.arange(0,10,0.1)
list_x = np.zeros(100).tolist()
list_y = np.zeros(100).tolist()
list_z = np.zeros(100).tolist()

lines_x, = ax[0].plot(t, list_x)
lines_y, = ax[1].plot(t, list_y)
lines_z, = ax[2].plot(t, list_z)

ax[0].set_ylim((-90,90))
ax[1].set_ylim((-90,90))
ax[2].set_ylim((-1,1))
ax[0].set_ylabel("Rot_X", size=30)
ax[1].set_ylabel("Rot_Y", size=30)
ax[2].set_ylabel("Z", size=30)

acc = s.readline().split(",") # just for warming up

while True:
    t += 0.1
    acc = s.readline().split(",")
    acc_x = float(acc[0])*90
    acc_y = float(acc[1])*90
    acc_z = float(acc[2])

    list_x.pop(0)
    list_x.append(acc_x)
    list_y.pop(0)
    list_y.append(acc_y)
    list_z.pop(0)
    list_z.append(acc_z)

    plt.draw()

    lines_x.set_data(t, list_x)
    lines_y.set_data(t, list_y)
    lines_z.set_data(t, list_z)
    ax[0].set_xlim((t.min(), t.max()))
    ax[1].set_xlim((t.min(), t.max()))
    ax[2].set_xlim((t.min(), t.max()))

    plt.pause(.0001)

보충 코멘트

serial 신호의 취득은 이하의 부분입니다.
s = serial.Serial('/dev/ttyACM1')
acc = s.readline().split(",")

실시간 플롯 업데이트는 plt.show() 대신 다음을 사용하여 구현할 수 있었습니다.
plt.draw()

# ... matplotlib.lines要素のアップデート ...

plt.pause(.0001)

참고 : ぃ tp // 이 m/하우센 6/이고 ms/b1b54f7325745

좋은 웹페이지 즐겨찾기