1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-300792-1-1.html 4)对正点原子Linux感兴趣的同学可以加群讨论:935446741
第二十三章 ICM20608本章是ICM20608实验,与上一章类似,都是获取传感器的数据,ICM20608是一款六轴MEMS传感器,包括三轴加速度和三轴陀螺仪。因为与上一章类似,故本章只提供获取ICM20608的接口,不再重复设计界面程序。 更多ICM20608的信息请看【正点原子】I.MX6U用户快速体验V1.x.pdf的第3.21小节。
23.1 资源简介在正点原子I.MX6ULL ALPHA开发板底板上有一个6轴MEMS传感器,也就是在底板上晶振旁边的传感器,采用的是spi接口。(注意:I.MX6ULL MINI开发板没有这个传器)。下图为I.MX6ULL ALPHA开发板的6轴MEMS传感器原理图。
开发板底板实物图。
本实验提供ICM20608的Qt访问出厂系统ICM20608驱动设备文件/dev/icm20608的接口。接口类Icm20608根据【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.x.pdf第六十二章 Linux SPI 驱动实验编写,想要理解原理请看【正点原子】I.MX6U 嵌入式Linux驱动开发指南,第六十二章,已经写得很详细。对于Qt访问底层驱动接口,我们需要对驱动有一点了解,否则学习起来是比较难的!建议读者全方面学习一下正点原子的I.MX6U配套教程。 源码路径为Qt/3/09_spi_icm20608_sensor。 “icm20608.h”,头文件如下。
/******************************************************************
Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.
* @projectName sensor
* @brief icm20608.h
* @author Deng Zhimao
* @email 1252699831@qq.com
* @net www.openedv.com
* @date 2020-07-10
*******************************************************************/
1 #ifndef ICM20608_H
2 #define ICM20608_H
3
4 #include
5 #include
6
7 class Icm20608 : public QObject
8 {
9 Q_OBJECT
10
11 public:
12 explicit Icm20608(QObject *parent = 0);
13 ~Icm20608();
14
15 Q_INVOKABLE void setCapture(bool str);
16
17 private:
18 QTimer *timer;
19 QString gxdata;
20 QString gydata;
21 QString gzdata;
22 QString axdata;
23 QString aydata;
24 QString azdata;
25 QString tempdata;
26
27 QString gxData();
28 QString gyData();
29 QString gzData();
30 QString axData();
31 QString ayData();
32 QString azData();
33 QString tempData();
34
35 void icm20608ReadData();
36
37 Q_PROPERTY(QString gxData READ gxData NOTIFY icm20608DataChanged)
38 Q_PROPERTY(QString gyData READ gyData NOTIFY icm20608DataChanged)
39 Q_PROPERTY(QString gzData READ gzData NOTIFY icm20608DataChanged)
40 Q_PROPERTY(QString axData READ axData NOTIFY icm20608DataChanged)
41 Q_PROPERTY(QString ayData READ ayData NOTIFY icm20608DataChanged)
42 Q_PROPERTY(QString azData READ azData NOTIFY icm20608DataChanged)
43 Q_PROPERTY(QString tempData READ tempData NOTIFY icm20608DataChanged)
44
45 public slots:
46 void timer_timeout();
47
48
49 signals:
50 void icm20608DataChanged();
51 };
52
53 #endif // ICM20608_H
“icm20608.h”,源文件如下。
/******************************************************************
Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.
* @projectName sensor
* @brief icm20608.cpp
* @author Deng Zhimao
* @email 1252699831@qq.com
* @net www.openedv.com
* @date 2020-07-10
*******************************************************************/
1 #include "icm20608.h"
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9
10 Icm20608::Icm20608(QObject *parent) : QObject (parent)
11 {
12 timer = new QTimer();
13 #if __arm__
14 system("insmod /home/root/driver/icm20608/icm20608.ko");
15 #endif
16 connect(timer,SIGNAL(timeout()),this,SLOT(timer_timeout()));
17 }
18
19 Icm20608::~Icm20608()
20 {
21
22 }
23
24 void Icm20608::icm20608ReadData()
25 {
26 int fd;
27 char const *filename = "/dev/icm20608";
28 signed int databuf[7];
29 unsigned char data[14];
30 signed int gyro_x_adc, gyro_y_adc, gyro_z_adc;
31 signed int accel_x_adc, accel_y_adc, accel_z_adc;
32 signed int temp_adc;
33
34 float gyro_x_act, gyro_y_act, gyro_z_act;
35 float accel_x_act, accel_y_act, accel_z_act;
36 float temp_act;
37
38 int ret = 0;
39
40 fd = open(filename, O_RDWR);
41 if(fd start(500);
123 else
124 timer->stop();
125 }