资料介绍
描述
当我们将智能手机从纵向倾斜到横向时……它如何知道我们正在倾斜手机?
那是因为我们智能手机中的加速度计!为了解其工作原理,让我们使用Apache NuttX RTOS(实时操作系统)从PINE64 PinePhone中窥探原始加速度计数据。
构建和启动 NuttX RTOS
按照以下步骤使用 microSD 卡在 PinePhone 上启动 NuttX RTOS(它不会触及内部 eMMC 存储)...
(1) 安装构建先决条件
(2) 下载适用于AArch64 裸机目标的 ARM64 工具链:(跳过测试版部分)aarch64-none-elf
(3) 下载并构建NuttX RTOS for PinePhone ...
git clone https://github.com/apache/nuttx nuttx
git clone https://github.com/apache/nuttx-apps apps
cd nuttx
tools/configure.sh pinephone:sensor
make
cp nuttx.bin Image
rm -f Image.gz
gzip Image
(4) 这会生成 NuttX 图像文件Image.gz
。我们一会儿将它复制到 PinePhone 中。
(5) 下载PinePhone Jumpdrive镜像:pine64-pinephone.img.xz
(6) 使用Balena Etcher或GNOME Disks将下载的镜像写入 microSD 卡。
(7) 还记得Image.gz
之前的事吗?复制并覆盖 microSD 卡上的文件。
(8) 将 microSD 卡插入 PinePhone 并将隐私开关 6(耳机)拨至关闭。
(9) 将PinePhone Serial Console Cable连接到我们的电脑并给PinePhone 上电。
(10) 在我们的电脑上,使用screen
或以115.2 kbps 的速度putty
连接到 PinePhone 串口控制台(假设“usbserial-1410”是 USB 串口)...
screen /dev/tty.usbserial-1410 115200
(11) 在提示符下,输入:ls /dev
NuttShell (NSH) NuttX-12.0.3
nsh> ls /dev
/dev:
console
imu0
null
ram0
ram2
ttyS0
userleds
zero
NuttX 表示,PinePhone 加速度计InvenSense MPU-6050现在可以在. (那是惯性测量单元)/dev/imu0
获取加速度计数据
让我们从 PinePhone 的加速度计中读取原始加速度计数据。
将我们的 PinePhone 竖直放在纵向。输入这个命令...
hexdump /dev/imu0 count=14
这会从加速度计转储 14 个字节的原始数据...
/dev/imu0 at 00000000:
0000: 10 21 00 05 01 6a f7 9e ff d8 00 13 ff fd
现在将我们的 PinePhone 逆时针旋转 90 度,进入横向。输入相同的命令...
hexdump /dev/imu0 count=14
我们将看到一组不同的 14 字节原始数据......
/dev/imu0 at 00000000:
0000: 00 19 f0 48 01 12 f8 80 ff d6 00 0f ff fe
但是这些数字是什么意思?
解码加速度计数据
NuttX 内核将MPU-6050 加速度计数据格式定义为...
/* MPU-6050 Accelerometer Data Format
* (14 bytes, big-endian) */
struct sensor_data_s {
int16_t x_accel; /* Accelerometer X */
int16_t y_accel; /* Accelerometer Y */
int16_t z_accel; /* Accelerometer Z */
int16_t temp; /* Temperature */
int16_t x_gyro; /* Gyroscope X */
int16_t y_gyro; /* Gyroscope Y */
int16_t z_gyro; /* Gyroscope Z */
};
当我们从上面解码数据时,我们得到......
纵向:
- 加速度计 X = 4129 (0x1021) ⬆️
- 加速度计 Y = 5 (0x0005)
- 加速度计 Z = 362 (0x016A)
- 温度 = -2146 (0xF79E)
- 陀螺仪 X = -40 (0xFFD8)
- 陀螺仪 Y = 19 (0x0013)
- 陀螺仪 Z = -3 (0xFFFD)
横向:
- 加速度计 X = 25 (0x0019)
- 加速度计 Y = -4024 (0xF048) ⬇️
- 加速度计 Z = 274 (0x0112)
- 温度 = -1920 (0xF880)
- 陀螺仪 X = -42 (0xFFD6)
- 陀螺仪 Y = 15 (0x000F)
- 陀螺仪 Z = -2 (0xFFFE)
啊哈,加速度计的 X 和 Y 值发生了显着变化!
是的,加速度计测量三轴的加速度......
- X轴:指向PinePhone 的顶部边缘
- Y轴:指向PinePhone 的左边缘
- Z轴:指向PinePhone后盖
加速度计检测到加速度发生变化:在我们旋转手机后,从 X 轴到 Y 轴。
但是我们没有水平或垂直“加速”手机?
这是因为重力!地球表面对我们的手机施加向上的法向力。这是在我们旋转手机时由加速度计测量的。
当我们将手机从纵向倾斜到横向时,我们的手机就是这样知道的!
读取加速度计
最后,让我们编写一个程序来读取和解释加速度计数据。
我们首先声明MPU-6050 加速度计数据格式:hello_main.c
/* MPU-6050 Accelerometer Data Format
* (14 bytes, big-endian)
* Based on NuttX Kernel: https://github.com/apache/nuttx/blob/master/drivers/sensors/mpu60x0.c#L218-L233 */
struct sensor_data_s
{
int16_t x_accel; /* Accelerometer X */
int16_t y_accel; /* Accelerometer Y */
int16_t z_accel; /* Accelerometer Z */
int16_t temp; /* Temperature */
int16_t x_gyro; /* Gyroscope X */
int16_t y_gyro; /* Gyroscope Y */
int16_t z_gyro; /* Gyroscope Z */
};
接下来我们打开加速度计.../dev/imu0
/* Open the MPU-6050 Accelerometer for reading */
int fd = open("/dev/imu0", O_RDONLY);
assert(fd > 0); /* Check that it exists */
我们从加速度计中读取了14 个字节的数据……
/* Accelerometer Data will have 14 bytes */
struct sensor_data_s data;
assert(sizeof(data) == 14); /* We expect to read 14 bytes */
/* Read the Accelerometer Data (14 bytes) */
int bytes_read = read(fd, &data, sizeof(data));
assert(bytes_read == sizeof(data)); /* We expect 14 bytes read */
但是加速度计数据是Big-Endian Format。我们为 PinePhone 转换为Little-Endian 格式...
/* Flip the bytes from Big-Endian to Little-Endian for PinePhone.
* ntohs() is explained here: https://developer.ibm.com/articles/au-endianc/ */
int16_t x_accel = ntohs(data.x_accel);
int16_t y_accel = ntohs(data.y_accel);
int16_t z_accel = ntohs(data.z_accel);
int16_t temp = ntohs(data.temp);
int16_t x_gyro = ntohs(data.x_gyro);
int16_t y_gyro = ntohs(data.y_gyro);
int16_t z_gyro = ntohs(data.z_gyro);
最后我们打印转换后的数据并关闭加速度计......
/* Print the Accelerometer Data */
printf("Accelerometer X: %d\n", x_accel);
printf("Accelerometer Y: %d\n", y_accel);
printf("Accelerometer Z: %d\n", z_accel);
printf("Temperature: %d\n", temp);
printf("Gyroscope X: %d\n", x_gyro);
printf("Gyroscope Y: %d\n", y_gyro);
printf("Gyroscope Z: %d\n", z_gyro);
/* Close the Accelerometer */
close(fd);
要在 PinePhone 上运行它,请在我们的计算机上查找此源文件...
apps/examples/hello/hello_main.c
通过以下内容覆盖该文件的内容:hello_main.c
为 PinePhone 重建 NuttX RTOS...
make
cp nuttx.bin Image
rm -f Image.gz
gzip Image
按照前面的说明复制到 PinePhone microSD 卡。在 PinePhone 上启动 microSD 卡并输入:Image.gz
hello
当 PinePhone 处于Portrait Orientation时,我们会看到类似...
nsh> hello
Accelerometer X: 4137
Accelerometer Y: -97
Accelerometer Z: 208
Temperature: -1500
Gyroscope X: -29
Gyroscope Y: 66
Gyroscope Z: 12
当我们将 PinePhone 旋转到Landscape Orientation时,Accelerometer X 和 Y 值会发生显着变化......
nsh> hello
Accelerometer X: -143
Accelerometer Y: -4007
Accelerometer Z: -443
是的,我们的程序已经成功读取了 PinePhone 加速度计!
(非常感谢Filipe Cavalcanti启发了本教程!)
进一步阅读
要了解更多关于PinePhone 的 NuttX RTOS ...
MPU-6050 在微控制器上也能正常工作……
MPU-6050实际上是一个组合加速度计和陀螺仪...
我们可以计算倾斜角吗?它在 3D 空间中变得复杂,请查看三角函数公式...
附录:MPU-6050驱动
MPU-6050 Driver是如何在NuttX Kernel中启动的?
启动时,NuttX Kernel在PinePhone Bringup Function pinephone_bringup中启动MPU-6050 Driver ,并在/dev/imu0注册驱动:pinephone_bringup.c
/* To register the IMU Driver for MPU-6050 Accelerometer at Port TWI1... */
/* Init the Power Management Integrated Circuit */
ret = pinephone_pmic_init();
/* Wait 15 milliseconds for power supply and power-on init */
up_mdelay(15);
/* Allocate the IMU Driver struct */
mpu_config = kmm_zalloc(sizeof(struct mpu_config_s));
mpu_config->i2c = i2c1;
mpu_config->addr = 0x68;
/* Register the IMU Driver at /dev/imu0 */
mpu60x0_register("/dev/imu0", mpu_config);
(mpu60x0_register在 MPU-6050 驱动中定义)
( pinephone_pmic_init来自PinePhone电源管理集成电路的驱动)
什么?i2c1
i2c1
是 Allwinner A64 SoC 上的第二个 I2C 端口,连接到 MPU-6050 加速度计。(PinePhone 原理图,第 12 页)
Allwinner A64 上的 I2C 端口被命名为 TWI0,TWI1,... 所以i2c1
实际上是Allwinner A64 上的端口 TWI1 : pinephone_bringup.c
/* Initialize TWI1 as I2C Bus 1 */
i2c1 = a64_i2cbus_initialize(i2c1_bus);
/* Register I2C Driver for I2C Bus 1 at TWI1 */
ret = i2c_register(i2c1, i2c1_bus);
(TWI表示“双线接口”)
(a64_i2cbus_initialize定义在 Allwinner A64 I2C Driver 中)
这是什么 PMIC?
启动时,NuttX Kernel 会初始化 PinePhone 的电源管理集成电路 (PMIC) ,然后再启动 MPU-6050 Driver: pinephone_bringup.c
/* To register the IMU Driver for MPU-6050 Accelerometer at Port TWI1... */
/* Init the Power Management Integrated Circuit */
ret = pinephone_pmic_init();
/* Omitted: Start the IMU Driver at /dev/imu0 */
(pinephone_pmic_init来自 PMIC 驱动程序)
这是因为 MPU-6050 加速度计由 PinePhone 的 PMIC:X-Powers AXP803 供电。(PinePhone 原理图,第 3 页,DLDO1)
X-Powers AXP803 上的DLDO1 电源为PinePhone 上的 I2C 传感器供电,包括 MPU-6050 加速度计。
附录:MPU-6050 介绍
我们如何确定 X 轴指向 PinePhone 的顶部边缘?Y 轴指向左边缘?
根据PinePhone Component List, MPU-6050 Accelerometer 的标签为U1202 。
从PinePhone 主板底部布局来看, U1202 在图的左上角。这意味着加速度计位于PinePhone 的左上角。(从正面看时)
U1202 有一个小圆圈,朝向PinePhone 的左下边缘。
当我们参考InvenSense MPU-6050 数据表(第 21 页)时,我们得出结论...
- X轴:指向PinePhone 的顶部边缘
- Y轴:指向PinePhone 的左边缘
- Z轴:指向PinePhone后盖
- 微加速度计的原理与应用
- 基础加速度计传感器 26次下载
- 加速度计技术参数 8次下载
- 选择一个加速度计的技巧 10次下载
- MEMSIC攻克加速度计难题 8次下载
- ADXL330_加速度计 0次下载
- 降低加速度计的平均功耗 11次下载
- 新型高精度光纤加速度计系统研究
- 电容式、隧道式加速度计检测技术研究
- 厚膜混合集成电容式加速度计
- 三维MEMS加速度计的测试方法
- 微加速度计在恶劣环境下的可靠性
- 三维MEMS加速度计的性能测试方法与分析
- 基于微加速度计的AIR MOUSE的研究
- 梳齿式微机械加速度计静态模型的辨识
- 状态监测中数字MEMS加速度计的混叠效应 1094次阅读
- MEMS加速度计中的振动校正 2363次阅读
- 如何使用加速度计提高倾角测量的准确性 2942次阅读
- MEMS加速度计性能成熟 1181次阅读
- 为什么MEMS加速度计正在成为设计人员在CbM应用中的最佳选择 1234次阅读
- ADXL345三轴数字加速度计的驱动设计与实现 7546次阅读
- 如何扩展MEMS加速度计的带宽 3825次阅读
- 加速度计的安装方法分享 5001次阅读
- 一文详解压电加速度计 2935次阅读
- 九轴传感器之加速度计是怎么回事 2786次阅读
- digilentPmodACL三轴加速度计介绍 2097次阅读
- 关于一种带数模混合输出的加速度计系统的设计和验证 4394次阅读
- MEMS加速度计是什么 加速度计工作原理 2.6w次阅读
- 如何用加速度计中断引脚执行唤醒和非运动检测 4607次阅读
- 新型MEMS加速度计与商用压电(PZT)状态监控加速度计的比较 7791次阅读
下载排行
本周
- 1山景DSP芯片AP8248A2数据手册
- 1.06 MB | 532次下载 | 免费
- 2RK3399完整板原理图(支持平板,盒子VR)
- 3.28 MB | 339次下载 | 免费
- 3TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 4DFM软件使用教程
- 0.84 MB | 295次下载 | 免费
- 5元宇宙深度解析—未来的未来-风口还是泡沫
- 6.40 MB | 227次下载 | 免费
- 6迪文DGUS开发指南
- 31.67 MB | 194次下载 | 免费
- 7元宇宙底层硬件系列报告
- 13.42 MB | 182次下载 | 免费
- 8FP5207XR-G1中文应用手册
- 1.09 MB | 178次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33566次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21549次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6656次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537798次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420027次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191187次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183279次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多