<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

ch347連接mpu6050模塊的方法

CHANBAEK ? 來源:FunIO ? 作者:FunIO ? 2023-07-23 11:04 ? 次閱讀

在上一篇文章 詳解 I2C的末尾,有這樣一張波形圖:

圖片
實例2

這個對應的就是常見的從設備寄存器讀數據的波形,只是在寫數據時多了一個字節。

通用的從 I2C 設備讀寄存器數據的模式應該是這樣的:

圖片
從從設備寄存器讀數據示例

在mpu6050 數據表 中的9.3 I2C Communications Protocol章節說明了 mpu6050 的 i2c 接口協議,符合通用模式。

mpu6050 單字節寫和加速寫序列如下:

圖片

mpu6050單字節寫和加速寫

mpu6050 單字節讀和加速讀序列如下:

圖片

mpu6050單字節讀和加速讀

上面的加速寫和加速讀都是以 2 個數據字節為例的。

從實例 2 的波形圖可以看出,啟動傳輸后,寫了0x12``0x13``0x143 個字節,這 3 個字節后都是NACK,然后是重復起始信號,跟著剛才地址字節0x12+10x13,I2C 從寫轉換到讀,然后開始讀數據字節。

對應代碼為:

result = ch347_driver.i2c_set(device_index, 1)
if result:
    print("Success to set I2C speed.")
else:
    print("Failed to set I2C speed.")

result = ch347_driver.i2c_set_delay_ms(device_index, 1)
if result:
    print("Success to set I2C delay.")
else:
    print("Failed to set I2C delay.")


result = ch347_driver.stream_i2c(device_index, b'x12x13x14', 8)
if result:
    print("Success!")
else:
    print("Failed!")

將上面這段代碼稍加修改:

result = ch347_driver.i2c_set(device_index, 1)
if result:
    print("Success to set I2C speed.")
else:
    print("Failed to set I2C speed.")

result = ch347_driver.i2c_set_delay_ms(device_index, 1)
if result:
    print("Success to set I2C delay.")
else:
    print("Failed to set I2C delay.")


result = ch347_driver.stream_i2c(device_index, b'xd0x75', 1)
if result:
    print("Success! result:", result.hex())
else:
    print("Failed!")

mpu6050 模塊的地址是0b1101000(AD0 = 0),左移 1 位得到設備寫地址0xd0,讀數據時的讀地址 ch347 會自動產生,波形如下:

圖片
讀寄存器0x75

還沒有連接 mpu6050 模塊,所以沒有數據返回?,F在把 mpu6050 模塊 i2c 接口連接到 ch347 模塊上,運行程序,結果為:

?  python test.py
Successfully opened device index: 0
Device Information:
iIndex: 0
DevicePath: ?USB#VID_1A86&PID_55DB&MI_02#7&2887B016&0&0002#{5446F048-98B4-4EF0-96E8-27994BAC0D00}
UsbClass: 0
FuncType: 1
DeviceID: USBVID_1A86&PID_55DB&MI_02#7&2887B016&0&0002#
ChipMode: 1
DevHandle: 912
BulkOutEndpMaxSize: 512
BulkInEndpMaxSize: 512
UsbSpeedType: 1
CH347IfNum: 0
DataUpEndp: 6
DataDnEndp: 6
ProductString:
ManufacturerString:
WriteTimeout: 500
ReadTimeout: 500
FuncDescStr: USB2.0 To SPI&IIC
FirewareVer: 64
 ch347.mDeviceInforS object at 0x000002465A1E63C0 >
Version Information:
Driver Version: 35
DLL Version: 34
Device Version: 64
Chip Type: 1
Success to set I2C speed.
Success to set I2C delay.
Success! result: 68
Successfully closed device index: 0

可以看到返回了數據0x68,0x75是'WHO_AM_I'寄存器,默認值為0x68。

圖片
'WHO_AM_I'寄存器

完整代碼:

import ch347

dll_path = "ch347dlla64.dll"  # Replace with the actual path to the DLL
device_index = 0  # Set the device index according to your requirements

ch347_driver = ch347.CH347Driver(dll_path)

result = ch347_driver.open_device(device_index)
if result:
    print(f"Successfully opened device index: {device_index}")
else:
    print(f"Failed to close device index: {device_index}")

result, device_info = ch347_driver.get_device_info(device_index)
if result:
    print("Device Information:")
    print(f"iIndex: {device_info.iIndex}")
    print(f"DevicePath: {device_info.DevicePath.decode()}")
    print(f"UsbClass: {device_info.UsbClass}")
    print(f"FuncType: {device_info.FuncType}")
    print(f"DeviceID: {device_info.DeviceID.decode()}")
    print(f"ChipMode: {device_info.ChipMode}")
    print(f"DevHandle: {device_info.DevHandle}")
    print(f"BulkOutEndpMaxSize: {device_info.BulkOutEndpMaxSize}")
    print(f"BulkInEndpMaxSize: {device_info.BulkInEndpMaxSize}")
    print(f"UsbSpeedType: {device_info.UsbSpeedType}")
    print(f"CH347IfNum: {device_info.CH347IfNum}")
    print(f"DataUpEndp: {device_info.DataUpEndp}")
    print(f"DataDnEndp: {device_info.DataDnEndp}")
    print(f"ProductString: {device_info.ProductString.decode()}")
    print(f"ManufacturerString: {device_info.ManufacturerString.decode()}")
    print(f"WriteTimeout: {device_info.WriteTimeout}")
    print(f"ReadTimeout: {device_info.ReadTimeout}")
    print(f"FuncDescStr: {device_info.FuncDescStr.decode()}")
    print(f"FirewareVer: {device_info.FirewareVer}")
    print(repr(device_info))
else:
    print("Failed to get device information.")

result, driver_ver, dll_ver, device_ver, chip_type = ch347_driver.get_version(device_index)
if result:
    print("Version Information:")
    print(f"Driver Version: {driver_ver}")
    print(f"DLL Version: {dll_ver}")
    print(f"Device Version: {device_ver}")
    print(f"Chip Type: {chip_type}")
else:
    print("Failed to get version information.")

result = ch347_driver.i2c_set(device_index, 1)
if result:
    print("Success to set I2C speed.")
else:
    print("Failed to set I2C speed.")

result = ch347_driver.i2c_set_delay_ms(device_index, 1)
if result:
    print("Success to set I2C delay.")
else:
    print("Failed to set I2C delay.")


result = ch347_driver.stream_i2c(device_index, b'xd0x75', 1)
if result:
    print("Success! result:", result.hex())
else:
    print("Failed!")


# Example usage of CH347CloseDevice
result = ch347_driver.close_device(device_index)
if result:
    print(f"Successfully closed device index: {device_index}")
else:
    print(f"Failed to close device index: {device_index}")

接下來就可以對 mpu6050 各種功能進行封裝,然后在電腦上直接獲取傳感器數據了。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 模塊
    +關注

    關注

    7

    文章

    2513

    瀏覽量

    46681
  • 寄存器
    +關注

    關注

    30

    文章

    5141

    瀏覽量

    118055
  • I2C
    I2C
    +關注

    關注

    28

    文章

    1350

    瀏覽量

    121065
  • MPU6050
    +關注

    關注

    38

    文章

    304

    瀏覽量

    70037
收藏 人收藏

    評論

    相關推薦

    MPU6050連接失敗錯誤

    大家好,我想知道是否有人能快速瀏覽一下我的項目,讓我知道我做錯了什么。這是我從山姆的博客下載的一個項目,我遵循了他推薦的內容。代碼運行但引發了一個錯誤:“MPU6050連接失敗”,然后打印0遍。我想
    發表于 10-24 16:57

    用示波器測試mpu6050和stm32連接后的scl

    mpu6050和stm32連接后的scl,算了一下周期確實是2.5us即400kHz,那么這樣直接連接速度沒問題。下圖是示波器連線圖下圖是波形3.測試了遙控器信號(輸入a),發現1234...
    發表于 08-06 06:17

    MPU6050模塊

    2.4 STM32 MPU6050數據獲?。↖IC + DMP)本篇文章主要針對廉價的MPU6050模塊。我們這里完成了MPU6050的數據獲取、零偏自動設置、溫漂抑制。這里提供源碼工
    發表于 08-09 07:17

    使用esp32連接mpu6050讀取角度數據

    使用esp32連接mpu6050,讀取角度(這里只是讀取角度,其他的自行去查閱,很多廠家都有例程的)。這邊使用的是維特一家廠家的(他們的技術服務很好),看了官方的arduino例程,發現他們
    發表于 02-10 07:11

    MPU6050原理圖

    MPU6050原理圖,PDF格式,還蠻清晰。
    發表于 03-24 17:25 ?114次下載

    MPU6050(硬件IIC)

    MPU6050(硬件IIC)MPU6050(硬件IIC)
    發表于 04-02 16:29 ?74次下載

    Arduino與MPU6050的通信

    為避免糾纏于電路細節,我們直接使用集成的MPU6050模塊。MPU6050的數據接口用的是I2C總線協議,因此我們需要Wire程序庫的幫助來實現Arduino與MPU6050之間的通信
    發表于 11-07 14:25 ?7166次閱讀
    Arduino與<b class='flag-5'>MPU6050</b>的通信

    STM32F1的MPU6050模塊軟件卡爾曼濾波資料

    STM32F1的MPU6050模塊軟件卡爾曼濾波資料
    發表于 11-13 14:54 ?22次下載

    一文看懂mpu9150和mpu6050區別

    本文開始對mpu9150進行了介紹,其次介紹了mpu6050的定義、mpu6050感測范圍以及mpu6050的特征,最后闡述了mpu9150
    發表于 03-08 10:07 ?4.1w次閱讀

    mpu6050怎么與單片機連接

    本文開始介紹了mpu6050的定義和mpu6050的感測范圍,其次闡述了mpu6050特征,最后介紹了mpu6050與單片機的連接
    發表于 03-09 08:42 ?2.6w次閱讀

    mpu6050姿態解算原理_mpu6050姿態解算程序

    mpu6050常用作提供飛控運行時的姿態測量和計算。本文首先介紹了MPU6050姿態解算的原理,其次詳細的介紹了mpu6050姿態解算程序。
    的頭像 發表于 03-09 09:15 ?4.3w次閱讀

    MPU6050專用穩壓模塊的原理圖設計

    MPU6050專用穩壓模塊的原理圖設計
    發表于 11-07 19:21 ?41次下載
    <b class='flag-5'>MPU6050</b>專用穩壓<b class='flag-5'>模塊</b>的原理圖設計

    MPU6050簡介

    MPU6050簡介什么是MPU6050MPU6050的特點MPU6050框圖MPU6050初始化MPU6050—DMP使用介紹
    發表于 12-06 11:51 ?75次下載
    <b class='flag-5'>MPU6050</b>簡介

    MPU6050( )

    MPU6050( )
    發表于 12-06 15:06 ?30次下載
    <b class='flag-5'>MPU6050</b>( )

    高速USB轉接芯片 CH347

    CH347 是一款高速 USB 總線轉接芯片,通過 USB 總線提供異步串口、I2C 同步串行接口、SPI 同 步串行接口和 JTAG 接口等。 在異步串口方式下,CH347 提供
    的頭像 發表于 04-28 11:27 ?2100次閱讀
    高速USB轉接芯片 <b class='flag-5'>CH347</b>
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>