J'ai utilisé la carte NXP FRDM-KL25Z. Depuis que le capteur d'accélération 3 axes MMA8451Q a été répertorié, j'ai repris les informations par communication série à partir d'ici et les ai tracées en temps réel avec Python. Vu.
(Capteur d'accélération) FRDM-KL25Z --- (Série) ---> PC (tracé en temps réel)
FRDM-KL25Z a la configuration ci-dessous.
J'ai utilisé mbed. Maintenant, pour inclure le fichier MMA8451Q.h
, allez sur here pour ajouter la bibliothèque MMA8451Q au compilateur mbed. Importer.
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);
}
}
Après avoir écrit le programme, je l'ai compilé, téléchargé le fichier binaire et écrit le FRDM-KL25Z dans le dossier reconnu par USB par glisser-déposer.
J'ai utilisé Python. Installez la bibliothèque avec pip
$ pip install numpy matplotlib seaborn pyserial
Ensuite, connectez FRDM-KL25Z avec USB et vérifiez la destination d'allocation.
$ ls /dev/tty*
Dans mon environnement, il a été attribué à / dev / ttyACM1
.
S'ils sont différents, réécrivez la partie / dev / ttyACM1
dans le programme.
Créez le fichier python suivant et exécutez-le pour terminer. (Veuillez exécuter avec l'autorité sudo)
Lorsque le FRDM-KL25Z est incliné, les informations d'accélération sont reflétées dans le graphique.
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)
Commentaire complémentaire
L'obtention du signal série est la partie suivante:
s = serial.Serial('/dev/ttyACM1')
acc = s.readline().split(",")
Les mises à jour des tracés en temps réel peuvent être effectuées en utilisant ce qui suit au lieu de plt.show ()
.
plt.draw()
# ... matplotlib.Mise à jour des éléments de lignes...
plt.pause(.0001)
Référence: http://qiita.com/hausen6/items/b1b54f7325745ae43e47
Recommended Posts