电子发烧友App

硬声App

0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示
电子发烧友网>电子资料下载>电子资料>智能手机加速度计内部:带有NuttX RTOS的PinePhone

智能手机加速度计内部:带有NuttX RTOS的PinePhone

2023-06-12 | zip | 0.00 MB | 次下载 | 免费

资料介绍

描述

当我们将智能手机从纵向倾斜到横向时……它如何知道我们正在倾斜手机

那是因为我们智能手机中的加速度计为了解其工作原理,让我们使用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 EtcherGNOME 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.gzhello

当 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 加速度计。

(更多关于 DLDO1)

附录: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后盖

下载该资料的人也在下载 下载该资料的人还在阅读
更多 >

评论

查看更多

下载排行

本周

  1. 1山景DSP芯片AP8248A2数据手册
  2. 1.06 MB  |  532次下载  |  免费
  3. 2RK3399完整板原理图(支持平板,盒子VR)
  4. 3.28 MB  |  339次下载  |  免费
  5. 3TC358743XBG评估板参考手册
  6. 1.36 MB  |  330次下载  |  免费
  7. 4DFM软件使用教程
  8. 0.84 MB  |  295次下载  |  免费
  9. 5元宇宙深度解析—未来的未来-风口还是泡沫
  10. 6.40 MB  |  227次下载  |  免费
  11. 6迪文DGUS开发指南
  12. 31.67 MB  |  194次下载  |  免费
  13. 7元宇宙底层硬件系列报告
  14. 13.42 MB  |  182次下载  |  免费
  15. 8FP5207XR-G1中文应用手册
  16. 1.09 MB  |  178次下载  |  免费

本月

  1. 1OrCAD10.5下载OrCAD10.5中文版软件
  2. 0.00 MB  |  234315次下载  |  免费
  3. 2555集成电路应用800例(新编版)
  4. 0.00 MB  |  33566次下载  |  免费
  5. 3接口电路图大全
  6. 未知  |  30323次下载  |  免费
  7. 4开关电源设计实例指南
  8. 未知  |  21549次下载  |  免费
  9. 5电气工程师手册免费下载(新编第二版pdf电子书)
  10. 0.00 MB  |  15349次下载  |  免费
  11. 6数字电路基础pdf(下载)
  12. 未知  |  13750次下载  |  免费
  13. 7电子制作实例集锦 下载
  14. 未知  |  8113次下载  |  免费
  15. 8《LED驱动电路设计》 温德尔著
  16. 0.00 MB  |  6656次下载  |  免费

总榜

  1. 1matlab软件下载入口
  2. 未知  |  935054次下载  |  免费
  3. 2protel99se软件下载(可英文版转中文版)
  4. 78.1 MB  |  537798次下载  |  免费
  5. 3MATLAB 7.1 下载 (含软件介绍)
  6. 未知  |  420027次下载  |  免费
  7. 4OrCAD10.5下载OrCAD10.5中文版软件
  8. 0.00 MB  |  234315次下载  |  免费
  9. 5Altium DXP2002下载入口
  10. 未知  |  233046次下载  |  免费
  11. 6电路仿真软件multisim 10.0免费下载
  12. 340992  |  191187次下载  |  免费
  13. 7十天学会AVR单片机与C语言视频教程 下载
  14. 158M  |  183279次下载  |  免费
  15. 8proe5.0野火版下载(中文版免费下载)
  16. 未知  |  138040次下载  |  免费