一、项目说明
为了机械手臂手腕3自由度旋转,我研究了MPU6050加速度陀螺仪温度传感器,我用传感器3个旋转自由度数据来控制3个舵机角度旋转,以此来模拟手腕关节3个自由度的旋转。
这里记录下简单的代码,给有需要的朋友做个参考。
如果想了解MPU6050加速度陀螺仪温度传感器的朋友可以查看这篇前置文章,有MPU6050陀螺仪教程和简单案例。
MPU6050 6轴加速度和陀螺仪传感器的数据读取。-CSDN博客
如果想了解舵机库如何使用,或者了解弯曲传感器控制舵机,可以参考我的这篇文章,有舵机控制和弯曲传感器控制舵机的教程,有需要可以找出自行查阅。基于弯曲传感器的舵机控制,及LCD和串口监视器数据显示_舵机监视器-CSDN博客
二、项目原理
代码控制原理:
舵机新角度=舵机原角度+传感器读数。然后把新角度写入舵机对象。
如果角度大于舵机最大角度,则舵机新角度等于舵机最大角度。
如果角度小于舵机最小角度,则舵机新角度等于舵机最小角度。
//创建变量
static float x;
//改变角度
x=x+g.gyro.x;
if(x>180)x=180;
else if(x<0)x=0;
//角度写入舵机
myservo.write(x);
具体的陀螺仪使用和舵机使用本文就不给出了,有需要可以查看上文给出的两篇文章,里面写有陀螺仪和舵机的具体使用教程。本文就主要给出陀螺仪数据与舵机对接部分的代码。
电路图接线:
为了方便识别,控制线为(黄线),正极为(红线),负极为(黑线)。
电路图接线:
附上控制部分完整代码:(逗比写的逗比代码,但能用ヽ(゚∀゚)メ(゚∀゚)ノ (ノ≧∀≦)ノ)
static float x,y,z;
x=x+g.gyro.x;
if(x>180)x=180;
else if(x<0)x=0;
y=y+g.gyro.y;
if(y>180)y=180;
else if(y<0)y=0;
z=z+g.gyro.z;
if(z>180)z=180;
else if(z<0)z=0;
//角度写入舵机
myservo.write(x);
myservo1.write(y);
myservo2.write(z);
最后是给出整个程序的完整代码,如果有看不懂的地方可以参考上文给出的两篇文章,里面写有详细的使用教程。
附上项目完整代码:
//添加库
#include <Servo.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
//创建三个舵机对象和一个陀螺仪对象
Servo myservo;
Servo myservo1;
Servo myservo2;
Adafruit_MPU6050 mpu;
void setup() {
//初始化串口监视器
Serial.begin(115200);
//确认是否成功接入陀螺仪
if(!mpu.begin())
{
Serial.println("未能找到MPU6050芯片");
while(1)delay(10);
}
Serial.println("找到 MPU6050!");
//舵机引脚设置
myservo.attach(6);
myservo1.attach(9);
myservo2.attach(10);
//加速度计设置
mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
mpu.setGyroRange(MPU6050_RANGE_2000_DEG);
mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
Serial.println();
delay(100);
}
void loop() {
// put your main code here, to run repeatedly:
sensors_event_t a,g,temp;
mpu.getEvent(&a,&g,&temp);
Serial.print("旋转 X:");Serial.print(g.gyro.x);
Serial.print("旋转 Y:");Serial.print(g.gyro.y);
Serial.print("旋转 Z:");Serial.print(g.gyro.z);
Serial.println("rad/s");
//简单的角速度改变角度
static float x,y,z;
x=x+g.gyro.x;
if(x>180)x=180;
else if(x<0)x=0;
y=y+g.gyro.y;
if(y>180)y=180;
else if(y<0)y=0;
z=z+g.gyro.z;
if(z>180)z=180;
else if(z<0)z=0;
//角度写入舵机
myservo.write(x);
myservo1.write(y);
myservo2.write(z);
}
感谢大家看到这里,祝各位朋友好运。(๑╹◡╹)ノ"""