資料介紹
描述
當(dāng)我們將智能手機(jī)從縱向傾斜到橫向時(shí)……它如何知道我們正在傾斜手機(jī)?
那是因?yàn)槲覀?a href='http://www.delux-kingway.cn/v/' target='_blank' class='arckwlink_none'>智能手機(jī)中的加速度計(jì)!為了解其工作原理,讓我們使用Apache NuttX RTOS(實(shí)時(shí)操作系統(tǒng))從PINE64 PinePhone中窺探原始加速度計(jì)數(shù)據(jù)。
構(gòu)建和啟動(dòng) NuttX RTOS
按照以下步驟使用 microSD 卡在 PinePhone 上啟動(dòng) NuttX RTOS(它不會(huì)觸及內(nèi)部 eMMC 存儲(chǔ))...
(1) 安裝構(gòu)建先決條件
(2) 下載適用于AArch64 裸機(jī)目標(biāo)的 ARM64 工具鏈:(跳過(guò)測(cè)試版部分)aarch64-none-elf
(3) 下載并構(gòu)建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) 這會(huì)生成 NuttX 圖像文件Image.gz
。我們一會(huì)兒將它復(fù)制到 PinePhone 中。
(5) 下載PinePhone Jumpdrive鏡像:pine64-pinephone.img.xz
(6) 使用Balena Etcher或GNOME Disks將下載的鏡像寫(xiě)入 microSD 卡。
(7) 還記得Image.gz
之前的事嗎?復(fù)制并覆蓋 microSD 卡上的文件。
(8) 將 microSD 卡插入 PinePhone 并將隱私開(kāi)關(guān) 6(耳機(jī))撥至關(guān)閉。
(9) 將PinePhone Serial Console Cable連接到我們的電腦并給PinePhone 上電。
(10) 在我們的電腦上,使用screen
或以115.2 kbps 的速度putty
連接到 PinePhone 串口控制臺(tái)(假設(shè)“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 加速度計(jì)InvenSense MPU-6050現(xiàn)在可以在. (那是慣性測(cè)量單元)/dev/imu0
獲取加速度計(jì)數(shù)據(jù)
讓我們從 PinePhone 的加速度計(jì)中讀取原始加速度計(jì)數(shù)據(jù)。
將我們的 PinePhone 豎直放在縱向。輸入這個(gè)命令...
hexdump /dev/imu0 count=14
這會(huì)從加速度計(jì)轉(zhuǎn)儲(chǔ) 14 個(gè)字節(jié)的原始數(shù)據(jù)...
/dev/imu0 at 00000000:
0000: 10 21 00 05 01 6a f7 9e ff d8 00 13 ff fd
現(xiàn)在將我們的 PinePhone 逆時(shí)針旋轉(zhuǎn) 90 度,進(jìn)入橫向。輸入相同的命令...
hexdump /dev/imu0 count=14
我們將看到一組不同的 14 字節(jié)原始數(shù)據(jù)......
/dev/imu0 at 00000000:
0000: 00 19 f0 48 01 12 f8 80 ff d6 00 0f ff fe
但是這些數(shù)字是什么意思?
解碼加速度計(jì)數(shù)據(jù)
NuttX 內(nèi)核將MPU-6050 加速度計(jì)數(shù)據(jù)格式定義為...
/* 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 */
};
當(dāng)我們從上面解碼數(shù)據(jù)時(shí),我們得到......
縱向:
- 加速度計(jì) X = 4129 (0x1021) ??
- 加速度計(jì) Y = 5 (0x0005)
- 加速度計(jì) Z = 362 (0x016A)
- 溫度 = -2146 (0xF79E)
- 陀螺儀 X = -40 (0xFFD8)
- 陀螺儀 Y = 19 (0x0013)
- 陀螺儀 Z = -3 (0xFFFD)
橫向:
- 加速度計(jì) X = 25 (0x0019)
- 加速度計(jì) Y = -4024 (0xF048) ??
- 加速度計(jì) Z = 274 (0x0112)
- 溫度 = -1920 (0xF880)
- 陀螺儀 X = -42 (0xFFD6)
- 陀螺儀 Y = 15 (0x000F)
- 陀螺儀 Z = -2 (0xFFFE)
啊哈,加速度計(jì)的 X 和 Y 值發(fā)生了顯著變化!
是的,加速度計(jì)測(cè)量三軸的加速度......
- X軸:指向PinePhone 的頂部邊緣
- Y軸:指向PinePhone 的左邊緣
- Z軸:指向PinePhone后蓋
加速度計(jì)檢測(cè)到加速度發(fā)生變化:在我們旋轉(zhuǎn)手機(jī)后,從 X 軸到 Y 軸。
但是我們沒(méi)有水平或垂直“加速”手機(jī)?
這是因?yàn)?/font>重力!地球表面對(duì)我們的手機(jī)施加向上的法向力。這是在我們旋轉(zhuǎn)手機(jī)時(shí)由加速度計(jì)測(cè)量的。
當(dāng)我們將手機(jī)從縱向傾斜到橫向時(shí),我們的手機(jī)就是這樣知道的!
讀取加速度計(jì)
最后,讓我們編寫(xiě)一個(gè)程序來(lái)讀取和解釋加速度計(jì)數(shù)據(jù)。
我們首先聲明MPU-6050 加速度計(jì)數(shù)據(jù)格式: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 */
};
接下來(lái)我們打開(kāi)加速度計(jì).../dev/imu0
/* Open the MPU-6050 Accelerometer for reading */
int fd = open("/dev/imu0", O_RDONLY);
assert(fd > 0); /* Check that it exists */
我們從加速度計(jì)中讀取了14 個(gè)字節(jié)的數(shù)據(jù)……
/* 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 */
但是加速度計(jì)數(shù)據(jù)是Big-Endian Format。我們?yōu)?PinePhone 轉(zhuǎn)換為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);
最后我們打印轉(zhuǎn)換后的數(shù)據(jù)并關(guān)閉加速度計(jì)......
/* 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 上運(yùn)行它,請(qǐng)?jiān)谖覀兊挠?jì)算機(jī)上查找此源文件...
apps/examples/hello/hello_main.c
通過(guò)以下內(nèi)容覆蓋該文件的內(nèi)容:hello_main.c
為 PinePhone 重建 NuttX RTOS...
make
cp nuttx.bin Image
rm -f Image.gz
gzip Image
按照前面的說(shuō)明復(fù)制到 PinePhone microSD 卡。在 PinePhone 上啟動(dòng) microSD 卡并輸入:Image.gz
hello
當(dāng) PinePhone 處于Portrait Orientation時(shí),我們會(huì)看到類(lèi)似...
nsh> hello
Accelerometer X: 4137
Accelerometer Y: -97
Accelerometer Z: 208
Temperature: -1500
Gyroscope X: -29
Gyroscope Y: 66
Gyroscope Z: 12
當(dāng)我們將 PinePhone 旋轉(zhuǎn)到Landscape Orientation時(shí),Accelerometer X 和 Y 值會(huì)發(fā)生顯著變化......
nsh> hello
Accelerometer X: -143
Accelerometer Y: -4007
Accelerometer Z: -443
是的,我們的程序已經(jīng)成功讀取了 PinePhone 加速度計(jì)!
(非常感謝Filipe Cavalcanti啟發(fā)了本教程?。?/font>
進(jìn)一步閱讀
要了解更多關(guān)于PinePhone 的 NuttX RTOS ...
MPU-6050 在微控制器上也能正常工作……
MPU-6050實(shí)際上是一個(gè)組合加速度計(jì)和陀螺儀...
我們可以計(jì)算傾斜角嗎?它在 3D 空間中變得復(fù)雜,請(qǐng)查看三角函數(shù)公式...
附錄:MPU-6050驅(qū)動(dòng)
MPU-6050 Driver是如何在NuttX Kernel中啟動(dòng)的?
啟動(dòng)時(shí),NuttX Kernel在PinePhone Bringup Function pinephone_bringup中啟動(dòng)MPU-6050 Driver ,并在/dev/imu0注冊(cè)驅(qū)動(dòng):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 驅(qū)動(dòng)中定義)
( pinephone_pmic_init來(lái)自PinePhone電源管理集成電路的驅(qū)動(dòng))
什么?i2c1
i2c1
是 Allwinner A64 SoC 上的第二個(gè) I2C 端口,連接到 MPU-6050 加速度計(jì)。(PinePhone 原理圖,第 12 頁(yè))
Allwinner A64 上的 I2C 端口被命名為 TWI0,TWI1,... 所以i2c1
實(shí)際上是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?
啟動(dòng)時(shí),NuttX Kernel 會(huì)初始化 PinePhone 的電源管理集成電路 (PMIC) ,然后再啟動(dòng) 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來(lái)自 PMIC 驅(qū)動(dòng)程序)
這是因?yàn)?MPU-6050 加速度計(jì)由 PinePhone 的 PMIC:X-Powers AXP803 供電。(PinePhone 原理圖,第 3 頁(yè),DLDO1)
X-Powers AXP803 上的DLDO1 電源為PinePhone 上的 I2C 傳感器供電,包括 MPU-6050 加速度計(jì)。
附錄:MPU-6050 介紹
我們?nèi)绾未_定 X 軸指向 PinePhone 的頂部邊緣?Y 軸指向左邊緣?
根據(jù)PinePhone Component List, MPU-6050 Accelerometer 的標(biāo)簽為U1202 。
從PinePhone 主板底部布局來(lái)看, U1202 在圖的左上角。這意味著加速度計(jì)位于PinePhone 的左上角。(從正面看時(shí))
U1202 有一個(gè)小圓圈,朝向PinePhone 的左下邊緣。
當(dāng)我們參考InvenSense MPU-6050 數(shù)據(jù)表(第 21 頁(yè))時(shí),我們得出結(jié)論...
- X軸:指向PinePhone 的頂部邊緣
- Y軸:指向PinePhone 的左邊緣
- Z軸:指向PinePhone后蓋
- 微加速度計(jì)的原理與應(yīng)用
- 基礎(chǔ)加速度計(jì)傳感器 26次下載
- 加速度計(jì)技術(shù)參數(shù) 8次下載
- 選擇一個(gè)加速度計(jì)的技巧 10次下載
- MEMSIC攻克加速度計(jì)難題 8次下載
- ADXL330_加速度計(jì) 0次下載
- 降低加速度計(jì)的平均功耗 11次下載
- 新型高精度光纖加速度計(jì)系統(tǒng)研究
- 電容式、隧道式加速度計(jì)檢測(cè)技術(shù)研究
- 厚膜混合集成電容式加速度計(jì)
- 三維MEMS加速度計(jì)的測(cè)試方法
- 微加速度計(jì)在惡劣環(huán)境下的可靠性
- 三維MEMS加速度計(jì)的性能測(cè)試方法與分析
- 基于微加速度計(jì)的AIR MOUSE的研究
- 梳齒式微機(jī)械加速度計(jì)靜態(tài)模型的辨識(shí)
- 狀態(tài)監(jiān)測(cè)中數(shù)字MEMS加速度計(jì)的混疊效應(yīng) 1265次閱讀
- MEMS加速度計(jì)中的振動(dòng)校正 2902次閱讀
- 如何使用加速度計(jì)提高傾角測(cè)量的準(zhǔn)確性 3364次閱讀
- MEMS加速度計(jì)性能成熟 1451次閱讀
- 為什么MEMS加速度計(jì)正在成為設(shè)計(jì)人員在CbM應(yīng)用中的最佳選擇 1634次閱讀
- ADXL345三軸數(shù)字加速度計(jì)的驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn) 8095次閱讀
- 如何擴(kuò)展MEMS加速度計(jì)的帶寬 4228次閱讀
- 加速度計(jì)的安裝方法分享 5489次閱讀
- 一文詳解壓電加速度計(jì) 3248次閱讀
- 九軸傳感器之加速度計(jì)是怎么回事 2889次閱讀
- digilentPmodACL三軸加速度計(jì)介紹 2296次閱讀
- 關(guān)于一種帶數(shù)模混合輸出的加速度計(jì)系統(tǒng)的設(shè)計(jì)和驗(yàn)證 4578次閱讀
- MEMS加速度計(jì)是什么 加速度計(jì)工作原理 2.7w次閱讀
- 如何用加速度計(jì)中斷引腳執(zhí)行喚醒和非運(yùn)動(dòng)檢測(cè) 4885次閱讀
- 新型MEMS加速度計(jì)與商用壓電(PZT)狀態(tài)監(jiān)控加速度計(jì)的比較 8141次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開(kāi)發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊(cè)
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論
查看更多