黄工无刷电机学习
直播中

杨云

7年用户 780经验值
私信 关注
[问答]

如何使用MPU6050陀螺仪自制Arduino数字量角器?

什么是加速度计和陀螺仪传感器?

如何使用MPU6050陀螺仪自制Arduino数字量角器?

回帖(1)

肖青

2021-10-13 11:33:11
MPU6050惯性单元是一个3轴加速度计和一个3轴陀螺仪组合的单元。它还包含温度传感器和DCM,可执行复杂的任务。 MPU6050通常用于制作无人机和其他远程控制机器人,如自平衡机器人。在本篇文章中,我们将使用MPU6050和Arduino开发板制作一款数字量角器。本文使用伺服电机在量角器上显示角度。伺服电机轴安装有指针,该指针可以在量角器上旋转,以指示角度,同时该角度值也显示在1602液晶显示屏上。在开始制作之前,让我们先了解陀螺仪传感器。
   
   什么是加速度计和陀螺仪传感器?
   加速度计用于测量加速度。它实际上可以感知到静态和动态加速度。例如,移动电话使用加速计传感器来感知移动设备处于横向模式或纵向模式。
   陀螺仪用于测量角速度,该角速度使用地球的重力来确定运动中物体的方向。角速度是旋转体的角位置的变化率。
   
   例如,今天的手机使用陀螺仪传感器根据手机的方向来玩手机游戏。此外,VR耳机使用陀螺仪传感器以360度方向观看。
   
   因此,虽然加速度计可以测量线性加速度,但陀螺仪可以帮助找到旋转加速度。当将两个传感器用作单独的模块时,很难找到方向、位置和速度。但是通过组合这两个传感器,它可以作为惯性测量单元(IMU)。因此,在MPU6050模块中,加速度计和陀螺仪存在于单个PCB上,以找到方向、位置和速度。
   
   常见的应用:
   ◾    用于无人机的方向控制
   ◾    自平衡机器人
   ◾    机器人手臂控制
   ◾    倾斜传感器
   ◾    用于手机、视频游戏机
   ◾    人形机器人
   ◾    用于飞机、汽车等
   
   MPU6050加速度计和陀螺仪传感器模块
   
   MPU6050是一种微电子机械系统(MEMS),由3轴加速度计和3轴陀螺仪组成。它还有温度传感器。
   它可以测量:
   ◾    加速度
   ◾    速度
   ◾    方向
   ◾    移位
   ◾    温度
   
   该模块内部还有一个(DMP)数字运动处理器,功能强大,可以执行复杂的计算,从而腾出微控制器的工作空间。
   该模块还有两个辅助引脚,可用于连接外部IIC模块,如磁力计。由于模块的IIC地址是可配置的,因此可以使用AD0引脚将多个MPU6050传感器连接到微控制器。
   
   功能和规格:
   ◾    电源:3-5V
   ◾    通信:I2C协议
   ◾    内置16位ADC提供高精度
   ◾    内置DMP提供高计算能力
   ◾    可用于与磁力计等其他IIC设备连接
   ◾    可配置的IIC地址
   ◾    内置温度传感器
   
   MPU6050的引脚说明:
   
  

  

   
      
                引脚编号      
                引脚名称      
                引脚说明      
1Vcc为模块供电,可以+3V至+5V。通常使用+5V
2Ground连接到系统的接地
3Serial Clock (SCL)用于为I2C通信提供时钟脉冲
4Serial Data (SDA)用于通过I2C通信传输数据
5Auxiliary Serial Data (XDA)可用于将其他I2C模块与MPU6050连接。可选。
6Auxiliary Serial Clock (XCL)可用于将其他I2C模块与MPU6050连接。可选。
7AD0如果MCU使用多个MPU6050,该引脚可用于更改地址
8Interrupt (INT)中断引脚,指示数据可供MCU读取。
  
   
   所需的组件
   ●    Arduino UNO
   ●    MPU6050陀螺仪模块
   ●    LCD显示屏1602
   ●    SG90-伺服电机
   ●    量角器图片
   
   电路原理图
   这款自制的Arduino量角器的电路图如下:
   
  

  

   
   Arduino UNO和MPU6050之间的电路连接如下:
      
                MPU6050      
                Arduino UNO      
                VCC      
                + 5V      
                GND      
                GND      
                SCL      
                A5      
                SDA      
                A4      
  
   
   Arduino UNO和伺服电机之间的电路连接如下:
      
                伺服电机      
                Arduino UNO      
                红色线(VCC)      
                + 5V      
                橙色线(PWM)      
                9      
                棕色线(GND)      
                GND      
  
   
   
  

  

   
   编程说明
   本文末尾给出了完整的代码。这里伺服电机与Arduino连接,其轴投影在量角器图片上,表示倾斜的MPU6050的角度。本文的编程很简单。让我们详细看一下。
   
   首先包括所有必需的库 - Servo库用于伺服电机,LiquidCrystal库用于LCD显示和wire库用于I2C通信。MPU6050使用I2C通信,因此必须连接到Arduino的I2C引脚。因此,Wire.h库用于建立Arduino UNO和MPU6050之间的通信。
       #include                #include #include    
   接下来定义连接到Arduino UNO的LCD显示引脚RS、E、D4、D5、D6、D7。
                  LiquidCrystal lcd(2,3,4,5,6,7);      
     定义MPU6050的I2C地址。
   
   
                  1 const int MPU_addr=0x68;         
     然后使用Servo类初始化myservo对象,以及定义三个变量来存储X轴、Y轴和Z轴的值。
   
   
                  1 Servo myservo;                 2 int16_t axis_X,axis_Y,axis_Z;        
     将最小值和最大值设置为265和402,用于测量从0到360的角度。
   
   
                  1 int minVal=265; 2 int maxVal=402;     
     在void setup()函数中,首先启动I2C通信,并使用地址为0x68的MPU6050开始传输。
   
   
                  1   Wire.begin();             2   Wire.beginTransmission(MPU_addr);      
     通过写入0x6B将MPU6050置于休眠模式,然后通过写0唤醒它
   
   
                  1 Wire.write(0x6B);                    2 Wire.write(0);        
     使MPU6050激活后,结束传输
           1 Wire.endTransmission(true);        
     伺服电机的PWM引脚与Arduino UNO引脚9连接。
           1 myservo.attach(9);               
     电路通电后,LCD就会显示一条欢迎信息,然后在3秒后清除
   
   
                   1 lcd.begin(16,2);                 //Sets LCD in 16X2 Mode  2   lcd.print("CIRCUIT DIGEST");    3   delay(1000);  4   lcd.clear();  5   lcd.setCursor(0,0);  6   lcd.print("Arduino");  7   lcd.setCursor(0,1);  8   lcd.print("MPU6050");  9   delay(3000); 10 lcd.clear();     
      
     在void loop()函数中 ,同样,首先MPU6050开始I2C通信。
           1 Wire.beginTransmission(MPU_addr);     
     然后从寄存器0x3B(ACCEL_XOUT_H)开始
   
   
                  1 Wire.write(0x3B);            
     现在,通过以false设置结束传输将重新进程,但连接处于活动状态。
   
   
                  1 Wire.endTransmission(false);     
     之后,请求来自14个寄存器的数据。
   
   
                  1 Wire.requestFrom(MPU_addr,14,true);     
     现在获得了轴寄存器值(x、y、z)并将其存储在变量axis_X、axis_Y、axis_Z中。
   
   
                  1 axis_X=Wire.read()<<8|Wire.read(); 2 axis_Y=Wire.read()<<8|Wire.read(); 3 axis_Z=Wire.read()<<8|Wire.read();     
     然后将这些值从265到402映射为-90到90。
   
   
                  1 int xAng = map(axis_X,minVal,maxVal,-90,90); 2 int yAng = map(axis_Y,minVal,maxVal,-90,90); 3 int zAng = map(axis_Z,minVal,maxVal,-90,90);     
     下面给出以度(0到360)计算x值的公式。这里我们仅转换x,因为伺服电机旋转基于x值运动。
   
   
                  1 x= RAD_TO_DEG * (atan2(-yAng, -zAng)+PI);        
     X角度值,从0到360度,被转换为0到180。
   
   
                  1 int pos = map(x,0,180,0,180);     
     然后写入角度值以旋转伺服电机指向量角器卡片上的位置,并在1602 LCD显示屏上打印这些值。
   
   
                  1 myservo.write(pos);          2 lcd.setCursor(0,0); 3 lcd.print("Angle"); 4 lcd.setCursor(0,1); 5 lcd.print(x);                6 delay(500); 7 lcd.clear();     
      
   
   
   
  

  

举报

更多回帖

发帖
×
20
完善资料,
赚取积分