JY61P可以通过串口进行数据通信,这使得它可以与各种设备和控制器进行连接和交互。下面是关于JY61P串口使用的简要介绍:
硬件连接:将JY61P的串口引脚(TX和RX)连接到要使用的设备的串口引脚(如STM32的TX和RX引脚)。同时,确保连接共地(GND)引脚以建立电气连接。
通信协议:JY61P使用标准的串口通信协议,通常是UART或USART。要与JY61P进行通信,需要设置相同的波特率(数据传输速率)、数据位、停止位和奇偶校验位等参数。通常,JY61P的默认波特率是115200。
数据格式:JY61P通过串口发送和接收数据,数据格式通常是ASCII字符或二进制格式。要正确解析JY61P发送的数据,需要了解数据的结构和含义。可以查询JY61P的技术文档或用户手册,获取有关数据格式和解析方法的详细信息。
数据读取:通过串口,可以向JY61P发送指令并读取传感器的数据。可以使用相应的串口读取函数或库函数,从串口接收缓冲区中读取数据。读取的数据可以是姿势、角速度、加速度、磁场等各种传感器数据。
数据处理:读取到的数据可以通过适当的处理方法进行解析、滤波和转换,以满足具体应用的需求。数据处理可以包括单位转换、坐标系变换、滤波算法等操作。
总之,JY61P通过串口进行数据通信,需要进行硬件连接、设置通信协议参数、理解数据格式和解析方法,并使用相应的串口读取函数进行数据读取和处理。这样,就可以与JY61P进行串口通信,并获取传感器数据用于后续的应用。
1.配置时钟:外部晶振
2.配置时基:串行总线调试(否则只能下载一次)、系统滴答定时器
3.配置时钟树:HCLK输入72MHZ主频,回车自动分配时钟树
3.串口UART配置
下面还要开启中断
4.OLED模块配置
下面直接勾选I2C1即可
mian.c主函数代码:
#include "main.h"
#include "usart.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include
#include
#include
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
uint8_t YAWCMD[3] = {0XFF,0XAA,0X52};
uint8_t ACCCMD[3] = {0XFF,0XAA,0X67};
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
#define GYROSCOPE_BUFFER_SIZE 33
#define GYROSCOPE_CH_DATA_SIZE 10
uint8_t GyroscopeUsart3RxBuffer[GYROSCOPE_BUFFER_SIZE]; //接收缓存
double GyroscopeChannelData[GYROSCOPE_CH_DATA_SIZE];
uint8_t tempBuffer=0,RxBuffer;
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart2, (uint8_t *)GyroscopeUsart3RxBuffer,33); //开启接收中断,并保证开启成功
while(GyroscopeUsart3RxBuffer[0] != 0x55)
{
HAL_UART_Receive_IT(&huart2, (uint8_t *)GyroscopeUsart3RxBuffer,33); //开启接收中断,并保证开启成功
};
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
/* USER CODE BEGIN 4 */
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) //中断回调函数
{
if(RESET != __HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE)) //判断是否是空闲中断
{
__HAL_UART_CLEAR_IDLEFLAG(&huart2); //清楚空闲中断标志(否则会一直不断进入中断)
HAL_UART_RxCpltCallback(&huart2); //调用中断处理函数
}
}
static void GYROSCOPE_DATA_Decoder(uint8_t *buf)
{
if(buf[1] == 0x51)//解析X、Y、Z加速度数据
{
GyroscopeChannelData[0] = (int16_t)((int16_t)buf[3]<<8|buf[2])/32768.0*16.0;//X轴加速度(m/s*s)
GyroscopeChannelData[1] = (int16_t)((int16_t)buf[5]<<8|buf[4])/32768.0*16.0;//Y轴加速度
GyroscopeChannelData[2] = (int16_t)((int16_t)buf[7]<<8|buf[6])/32768.0*16.0;//Z轴加速度
GyroscopeChannelData[9] = (int16_t)((int16_t)buf[9]<<8|buf[8])/100.0;//实时温度(摄氏度)
}
if(buf[12] == 0x52)//解析X、Y、Z角速度数据
{
GyroscopeChannelData[3] = (int16_t)((int16_t)buf[14]<<8|buf[13])/32768.0*2000.0;//X轴角速度(°/s)
GyroscopeChannelData[4] = (int16_t)((int16_t)buf[16]<<8|buf[15])/32768.0*2000.0;//Y轴角速度
GyroscopeChannelData[5] = (int16_t)((int16_t)buf[18]<<8|buf[17])/32768.0*2000.0;//Z轴角速度
}
if(buf[23] == 0x53)//解析X、Y、Z角度数据
{
GyroscopeChannelData[6] = (int16_t)((int16_t)buf[25]<<8|buf[24])/32768.0*180.0;//X轴(滚转角)角度(°)
GyroscopeChannelData[7] = (int16_t)((int16_t)buf[27]<<8|buf[26])/32768.0*180.0;//Y轴(俯仰角)角度
GyroscopeChannelData[8] = (int16_t)((int16_t)buf[29]<<8|buf[28])/32768.0*180.0;//Z轴(偏航角)角度
//GyroscopeChannelData[9] = (double)((int16_t)buf[31]<<8|(int16_t)buf[30])/100.0;//实时温度(摄氏度)
}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) //中断处理函数
{
if(huart == &huart2)
{
if(GyroscopeUsart3RxBuffer[0] == 0x55)
{
uint16_t AccelerationSumData = 0,AngularSumData = 0,AngleSumData = 0;
for(uint8_t index=0; index<GYROSCOPE_BUFFER_SIZE/3-1; index++)//求加速度校验和
{
AccelerationSumData += GyroscopeUsart3RxBuffer[index];
}
for(uint8_t index=GYROSCOPE_BUFFER_SIZE/3; index<2*GYROSCOPE_BUFFER_SIZE/3-1; index++)//求角速度校验和
{
AngularSumData += GyroscopeUsart3RxBuffer[index];
}
for(uint8_t index=2*GYROSCOPE_BUFFER_SIZE/3; index<GYROSCOPE_BUFFER_SIZE-1; index++)//求角度校验和
{
AngleSumData += GyroscopeUsart3RxBuffer[index];
}
if(GyroscopeUsart3RxBuffer[GYROSCOPE_BUFFER_SIZE/3-1] == (uint8_t)(AccelerationSumData&0X00FF)
&& GyroscopeUsart3RxBuffer[2*GYROSCOPE_BUFFER_SIZE/3-1] == (uint8_t)(AngularSumData&0X00FF)
&& GyroscopeUsart3RxBuffer[GYROSCOPE_BUFFER_SIZE-1] == (uint8_t)(AngleSumData&0X00FF))
{
GYROSCOPE_DATA_Decoder(GyroscopeUsart3RxBuffer);
HAL_UART_Receive_IT(&huart2, (uint8_t *)GyroscopeUsart3RxBuffer,33);
}
else
{
HAL_UART_Receive_IT(&huart2, (uint8_t *)GyroscopeUsart3RxBuffer,33);
}
}
else
{
memset(GyroscopeUsart3RxBuffer,0x00,sizeof(GyroscopeUsart3RxBuffer));
HAL_UART_Receive_IT(&huart2, (uint8_t *)GyroscopeUsart3RxBuffer,33);
}
}
}
/* USER CODE END 4 */
JY61P陀螺仪
JY61P陀螺仪在某些情况下可能存在精准度不高的问题,可能会对姿态感知和运动跟踪的准确性产生影响。另外,其使用方法可能具有一定的复杂性,需要一定的技术知识和调校经验。建议在选择使用之前仔细考虑其适用性和需求。
链接:https://pan.baidu.com/s/13HpeaYE70aQpGVw2BhLDEg?pwd=bovk
提取码:bovk。