树莓派4B-用串口读取JY901S陀螺仪数据

news/2024/11/18 21:53:21/文章来源:https://www.cnblogs.com/kevenduan/p/18292231

相关知识介绍

陀螺仪是一种用来感测与维持方向的装置,基于角动量的理论设计出来的。陀螺仪主要是由一个位于轴心可以旋转的轮子构成,陀螺仪一旦开始旋转,由于轮子的「角动量」,陀螺仪有抗拒方向改变的趋向。陀螺仪多用于导航、定位等系统

JY901S是9轴姿态角度传感器,支持串口和 IIC 两种数字接口。串口速率2400bps~921600bps 可调, IIC 接口支持全速 400K 速率,本文均是使用串口。

9轴分别为加速度传感器(即加速计)、角速度传感器(即陀螺仪)、磁感应传感器(即电子罗盘)。

连接说明

我是用的USB转TTL电平串口模块与树莓派连接,用的型号是CH340。

在windows电脑上的端口号都是ComX,在Liunx系统下的端口号如果是直接插在树莓派USB接口上的话就是写

'/dev/ttyAMA0'否则就是'/dev/ttyAMA0',具体如下。

port = '/dev/ttyUSB0' # use '/dev/ttyAMA0' for USB or '/dev/ttyAMA0' for GPIO

注意:RX和TX是需要反着接的,无论是直接连在GPIO上还是用USB转TTL,否则会出现问题。

轴向说明

如上图所示,模块的轴向在上图的右上方,向右为 X 轴,向上 Y 轴,垂直模块向外为 Z 轴。旋转的方向按右手法则定义,即右手大拇指指向轴向,四指弯曲的方向即为绕该轴 旋转的方向。X 轴角度即为绕 X 轴旋转方向的角度,Y 轴角度即为绕 Y 轴旋转方向的角度, Z 轴角度即为绕 Z

测试结果

完整代码

#coding:UTF-8
import serialACCData=[0.0]*8
GYROData=[0.0]*8
AngleData=[0.0]*8          
FrameState = 0            #通过0x后面的值判断属于哪一种情况
Bytenum = 0               #读取到这一段的第几位
CheckSum = 0              #求和校验位         a = [0.0]*3
w = [0.0]*3
Angle = [0.0]*3def DueData(inputdata):   #新增的核心程序,对读取的数据进行划分,各自读到对应的数组里global  FrameStateglobal  Bytenumglobal  CheckSumglobal  aglobal  wglobal  Anglefor data in inputdata:  #在输入的数据进行遍历# print(inputdata)# print(data, type(data))if FrameState==0:   #当未确定状态的时候,进入以下判断if data ==0x55 and Bytenum==0: #0x55位于第一位时候,开始读取数据,增大bytenumCheckSum=dataBytenum=1continueelif data==0x51 and Bytenum==1:#在byte不为0 且 识别到 0x51 的时候,改变frameCheckSum+=dataFrameState=1Bytenum=2elif data==0x52 and Bytenum==1: #同理CheckSum+=dataFrameState=2Bytenum=2elif data==0x53 and Bytenum==1:CheckSum+=dataFrameState=3Bytenum=2elif FrameState==1: # acc    #已确定数据代表加速度if Bytenum<10:            # 读取8个数据ACCData[Bytenum-2]=data # 从0开始CheckSum+=dataBytenum+=1else:if data == (CheckSum&0xff):  #假如校验位正确a = get_acc(ACCData)CheckSum=0                  #各数据归零,进行新的循环判断Bytenum=0FrameState=0elif FrameState==2: # gyroif Bytenum<10:GYROData[Bytenum-2]=dataCheckSum+=dataBytenum+=1else:if data == (CheckSum&0xff):w = get_gyro(GYROData)CheckSum=0Bytenum=0FrameState=0elif FrameState==3: # angleif Bytenum<10:AngleData[Bytenum-2]=dataCheckSum+=dataBytenum+=1else:if data == (CheckSum&0xff):Angle = get_angle(AngleData)d = a+w+Angleprint("a(g):%10.3f %10.3f %10.3f w(deg/s):%10.3f %10.3f %10.3f Angle(deg):%10.3f %10.3f %10.3f"%d)CheckSum=0Bytenum=0FrameState=0def get_acc(datahex):  axl = datahex[0]                                        axh = datahex[1]ayl = datahex[2]                                        ayh = datahex[3]azl = datahex[4]                                        azh = datahex[5]k_acc = 16.0acc_x = (axh << 8 | axl) / 32768.0 * k_accacc_y = (ayh << 8 | ayl) / 32768.0 * k_accacc_z = (azh << 8 | azl) / 32768.0 * k_accif acc_x >= k_acc:acc_x -= 2 * k_accif acc_y >= k_acc:acc_y -= 2 * k_accif acc_z >= k_acc:acc_z-= 2 * k_accreturn acc_x,acc_y,acc_zdef get_gyro(datahex):                                      wxl = datahex[0]                                        wxh = datahex[1]wyl = datahex[2]                                        wyh = datahex[3]wzl = datahex[4]                                        wzh = datahex[5]k_gyro = 2000.0gyro_x = (wxh << 8 | wxl) / 32768.0 * k_gyrogyro_y = (wyh << 8 | wyl) / 32768.0 * k_gyrogyro_z = (wzh << 8 | wzl) / 32768.0 * k_gyroif gyro_x >= k_gyro:gyro_x -= 2 * k_gyroif gyro_y >= k_gyro:gyro_y -= 2 * k_gyroif gyro_z >=k_gyro:gyro_z-= 2 * k_gyroreturn gyro_x,gyro_y,gyro_zdef get_angle(datahex):                                 rxl = datahex[0]                                        rxh = datahex[1]ryl = datahex[2]                                        ryh = datahex[3]rzl = datahex[4]                                        rzh = datahex[5]k_angle = 180.0angle_x = (rxh << 8 | rxl) / 32768.0 * k_angleangle_y = (ryh << 8 | ryl) / 32768.0 * k_angleangle_z = (rzh << 8 | rzl) / 32768.0 * k_angleif angle_x >= k_angle:angle_x -= 2 * k_angleif angle_y >= k_angle:angle_y -= 2 * k_angleif angle_z >=k_angle:angle_z-= 2 * k_anglereturn angle_x,angle_y,angle_zif __name__=='__main__': port = '/dev/ttyUSB0' # use '/dev/ttyAMA0' for USB or '/dev/ttyAMA0' for GPIObaud = 9600 # baudrateser = serial.Serial(port, baud, timeout=0.5)  # ser = serial.Serial('com7',115200, timeout=0.5) if ser.is_open:print('The serial port was opened successfully!')while True:datahex = ser.read(33) # How many bytes are read from the portDueData(datahex)else:print('Failed to open the serial!')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/741208.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 中的泛型 集合(List,Set) Map

泛型 集合(List,Set) Map 泛型泛型的本质是参数化类型,即允许在编译时对集合进行类型检查,从而避免安全问题,提高代码的复用性泛型的具体定义与作用定义:泛型是一种在编译阶段进行类型检查的机制,它允许在类,方法,接口后通过<> 来声明类型参数.这些参数在编译时会被具体的…

创建vue2项目执行npm install -g @vue/cli报错 no such file or directory, mkdir \\?

第一步:查看默认全局安装路径。 指令:npm config get prefix 我这里路径 npm config get prefix E:\NVM\nvm\node_global 第二步:不存在这个路劲进行更换 npm config set prefix "D:\Develop\nodejs" nodejs里面有 node_cache node_global node_modules 这些文件 …

NAND Flash基础介绍 一

Chip CI 颗粒厂商提供的是整个一块晶圆,晶圆上已经把芯片划分好了,如下图模组厂商或者颗粒厂商会把晶圆拿去分割,拆分出一个个芯片,每个拆分下来的芯片型号、工艺、空间大小等由颗粒厂家提前定制好了,具体说明可参考https://www.cnblogs.com/studywithallofyou/p/18291633…

各类插件

生成图片html2canvas : 基于页面中存在且可用的DOM结构、样式,构建“截图”,绘制到canvas画布中dom-to-image:将DOM 节点序列化为XML,包装到SVG中,再转为图片。

性能测试:性能测试流程与方法

简介 性能测试流程是指在进行性能测试时所遵循的一系列步骤和阶段,以确保对系统的全面测试和评估。性能测试流程的具体步骤可能会因组织、项目和测试需求而有所不同。 性能****测试流程分析现状:首先需要对应用程序或系统进行详细的分析,了解其当前的性能状况、发现性能瓶颈…

ESP32-S3开发板技术研究第一篇

1. 最小系统板原理图框架,第1路USB转串口,第2路USB直连模组 2. RGB灯是自带主控的,WS2812是一种智能控制LED灯源,集成了控制电路和RGB芯片在一个5050封装组件中。 3. 软件开发,编译环境 3.1 先安装 vs code 3.2 在vscode 的扩展里面搜索 ESP-IDF插件,安装

Flask API 如何接入 i18n 实现国际化多语言

如何在现有的 Flask API 项目中,引入 i18n 实现国际化多语言,同时与前端 Vue3 页面联动。​ 1. 介绍 上一篇文章分享了 Vue3 如何如何接入 i18n 实现国际化多语言,这里继续和大家分享 Flask 后端如何接入 i18n 实现国际化多语言。 用户请求 API 的多语言化其实有两种解决方案…

1 python介绍、基本语法、流程控制

一、 Python介绍python的创始人为吉多范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。 最新的TIOBE排行榜,Python赶超PHP占据第五, Python崇尚优美、清晰、简单,是一个优…

记录 中**信 ruoyi项目 部署全流程

零 本地环境改为线上环境 包括 1 后端的数据库连接地址 2 后端的文件存储本地地址 3 后端的文件存储ip地址 4 前端baseUrl 一 后端项目打包双击package 二 mstsc 进入服务器 三 备份四 后端jar包替换五 前端文件替换六 检查数据库需不需要备份 七 启动 java -jar ruoyi-admin.j…

hackmyvm-airbind

环境 靶机ip:未知 攻击机kali:ip1:192.168.96.59 ip2:192.168.56.103 主机探测 arp-scan -l发现了56.104这个机子应该就是我们的靶机,接下来先对其进行端口扫描 端口扫描发现开放了80端口,但是22端口状态显示为filtered,不知道开放还是关闭 访问80端口,发现是wallos的管理…

Vue3-slot

描述为了能在当前组件中使用其他组件中的内容,并且可以改变其他组件中的内容结构。使用的技术就叫做“插槽”。在某些场景中,我们可能想要为子组件传递一些模板片段,让子组件在它们的组件中渲染这些片段。举例:子组件<FancyButton/>: <template><button cl…

FPGA bit转bin文件

首先科普一下 什么是bitstream文件 FPGA比特流(bitstream)是一种用于配置可编程逻辑器件的数据格式,特别是现场可编程门阵列(FPGA)。比特流包含了硬件逻辑电路、路由信息以及芯片上寄存器和存储器(如查找表LUT)的初始值。通常认为比特流具有厂商特定的格式,因此很难反向…