在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

電子發燒友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涂鴉各WiFi模塊原理圖加PCB封裝
  2. 11.75 MB   |  76次下載  |  1 積分
  3. 2錦銳科技CA51F2 SDK開發包
  4. 24.06 MB   |  29次下載  |  1 積分
  5. 3錦銳CA51F005 SDK開發包
  6. 19.47 MB   |  3次下載  |  1 積分
  7. 4蘋果iphone 11電路原理圖
  8. 4.98 MB   |  3次下載  |  2 積分
  9. 5基礎模擬電子電路
  10. 3.80 MB   |  3次下載  |  1 積分
  11. 6RA-Eco-RA6M4-100PIN-V1.0開發板資料
  12. 34.89 MB  |  1次下載  |  免費
  13. 7STM32F3系列、STM32F4系列、STM32L4系列和STM32L4+系列Cortex-M4編程手冊
  14. 3.32 MB   |  1次下載  |  免費
  15. 8聯想A820t手機維修圖紙包括主板原理圖 尾板原理圖 點位圖
  16. 0.62 MB   |  次下載  |  5 積分

本月

  1. 1AI智能眼鏡產業鏈分析
  2. 4.43 MB   |  383次下載  |  免費
  3. 2蘇泊爾電磁爐線路的電路原理圖資料合集
  4. 2.02 MB   |  296次下載  |  5 積分
  5. 3貼片三極管上的印字與真實名稱的對照表詳細說明
  6. 0.50 MB   |  94次下載  |  1 積分
  7. 4長虹液晶電視R-HS310B-5HF01的電源板電路原理圖
  8. 0.46 MB   |  91次下載  |  5 積分
  9. 5涂鴉各WiFi模塊原理圖加PCB封裝
  10. 11.75 MB   |  76次下載  |  1 積分
  11. 6錦銳科技CA51F2 SDK開發包
  12. 24.06 MB   |  29次下載  |  1 積分
  13. 7AO4803A雙P通道增強型場效應晶體管的數據手冊
  14. 0.11 MB   |  28次下載  |  2 積分
  15. 8長虹液晶彩電LS29機芯的技術資料說明
  16. 3.42 MB   |  16次下載  |  2 積分

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935127次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
  4. 1.48MB  |  420064次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233089次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費下載
  8. 340992  |  191388次下載  |  10 積分
  9. 5十天學會AVR單片機與C語言視頻教程 下載
  10. 158M  |  183342次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81588次下載  |  10 積分
  13. 7Keil工具MDK-Arm免費下載
  14. 0.02 MB  |  73815次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65988次下載  |  10 積分
主站蜘蛛池模板: 伊人狠狠丁香婷婷综合色 | 在线视频综合网 | 国产欧美日韩电影 | 色一欲一性一乱一区二区三区 | www.伊人网| 亚洲韩国欧美一区二区三区 | 久久国产精品系列 | 日本一区二区三区在线网 | 四虎国产精品免费视 | 男人午夜视频在线观看 | 国产主播在线播放 | 免费啪| 婷婷免费视频 | 4444狠狠| 日本大片网| 免费看黄在线观看 | 4438全国最大成人免费高清 | 免费看一级大片 | 丁香婷婷综合五月六月 | 国产黄mmd在线观看免费 | 夜夜夜夜爽 | bt天堂资源| 婷婷性 | 色婷婷成人 | 亚洲人成人77777网站 | 在线观看一区二区三区视频 | 精品视频一区二区三区四区五区 | 久久精品网站免费观看 | 手机在线看片你懂得 | 成人伊人亚洲人综合网站222 | 亚a在线| 狠狠色丁香久久婷婷综合丁香 | 黄色三级免费网站 | 日本有色视频 | 国产成都一二三四区 | 狠狠躁 | 777成了人乱视频 | 热re99久久精品国产99热 | 未成人禁止视频高清在线观看 | 亚洲二区在线观看 | 久青草国产在线视频_久青草免 |