前两天拿到的CurieNano做了个小东西,先放上来。
随动云台的原理是用CurieNano采集角度数据,然后发给云台舵机,使舵机可以随着控制板的运动而运动。
接线图
D7是左右 D8是上下 PS画的很丑,没元件资源 材料清单 | CurieNano*1 | 舵机*2(也可加第三轴) | 舵机云台架*1 | bluno*1(还没调好,备用) |
这个主要是控制云台的,云台上的东西你们随便搭吧,什么摄像头,机枪之类的
效果
跟随头部运动无视掉我的内裤发型吧,勒的。
摄像头视角
问题:
最大的问题是不能无线传数据,本来想着用DFR0453 CurieNano的BLE和BLUNO蓝牙通讯,然后用BLUNO控制舵机的,但是CurieNano的BLE和BLUNO怎么也调不好卡了好几天
左右角度会漂,如果左右移动太快的画角度会漂。。。。。其他两轴不漂。还没滤波,有点抖动,等有时间滤一下波,让小角度变化不会输出。
这次的东西只用了六个轴,将 加速度计和陀螺仪的数据融合,用的是MadgwickAHRS库还没做到9轴融合,正在学习卡尔曼滤波,努力将九轴数据融合,现在先放上来让大家解解馋,也希望大神解决后可以分享方法!!!
分享加速度计和陀螺仪的原理和融合资料: http://blog.csdn.net/bbzz2/article/details/51354267
代码:
- /*
- Name: suidon.ino
- Created: 2017/4/29 12:35:42
- Author: hb
- */
- // the setup function runs once when you press reset or power the board
- #include <CurieIMU.h> //6轴传感器库
- #include <MadgwickAHRS.h> //Madgwick滤波
- #include <Servo.h> //舵机库
- //#include "BLESerial.h" //蓝牙库
- Servo myservoLR; //左右舵机
- Servo myservoUD; //上下舵机
- int LR; //左右变量
- int UD; //上下变量
-
-
- Madgwick filter; //初始化对象
- unsigned long microsPerReading, microsPrevious;
- float accelScale, gyroScale;
-
- void setup() {
- //初始化串口
- Serial.begin(9600);
- /*
- pinMode(13, OUTPUT); // 配置13号引脚的LED,当连接成功后亮起
- BLESerial.setName("Bluno101");
- BLESerial.begin();
- while (!BLESerial);
- */
- //初始化设备
- CurieIMU.begin();
-
- //设置陀螺仪采样频率
- CurieIMU.setGyroRate(25);
- //设置加速度计采样频率
- CurieIMU.setAccelerometerRate(25);
- //设置加速度计范围为2G
- CurieIMU.setAccelerometerRange(2);
- //设置陀螺仪范围为250度/秒
- CurieIMU.setGyroRange(250);
-
- filter.begin(25);
-
- //初始化变量以更新正确率
- microsPerReading = 1000000 / 25;
- microsPrevious = micros();
-
- //陀螺仪自动校准
- CurieIMU.autoCalibrateGyroOffset();
-
- //加速度自动计校准
- CurieIMU.autoCalibrateAccelerometerOffset(X_AXIS, 0);
- CurieIMU.autoCalibrateAccelerometerOffset(Y_AXIS, 0);
- CurieIMU.autoCalibrateAccelerometerOffset(Z_AXIS, 1);
-
- myservoLR.attach(7); //D7控制L R
- myservoUD.attach(8); //D8控制U D
- //舵机归零
- myservoLR.write(90);
- myservoUD.write(90);
- delay(15);
-
-
- }
-
- // the loop function runs over and over again until power down or reset
- void loop() {
-
- //加速度计和陀螺仪原始数据
- int aix, aiy, aiz; //加速度
- int gix, giy, giz; //陀螺仪
- //转换后的数据
- float ax, ay, az;
- float gx, gy, gz;
- //处理后的数据
- float roll, pitch, heading;
- //pitch是上下角度 heading是左右角度 我只使用了两轴云台,不需要roll的自旋参数,有兴趣可以自己加
-
- unsigned long microsNow;
-
- //检查是否要读取数据并更新过滤器
- microsNow = micros();
- if (microsNow - microsPrevious >= microsPerReading) {
- //得到加速度计和陀螺仪的姿态数据
- CurieIMU.readMotionSensor(aix, aiy, aiz, gix, giy, giz);
-
- //从原始数据转换为重力和度/秒单位
- ax = convertRawAcceleration(aix);
- ay = convertRawAcceleration(aiy);
- az = convertRawAcceleration(aiz);
- gx = convertRawGyro(gix);
- gy = convertRawGyro(giy);
- gz = convertRawGyro(giz);
- //使用Madgwick库中的功能函数updateIMU()滤波
- filter.updateIMU(gx, gy, gz, ax, ay, az);
- roll = filter.getRoll();
- pitch = filter.getPitch();
- heading = filter.getYaw();
-
- //打印3轴角度,可有可无
- Serial.print("Orientation: ");
- Serial.print(heading);
- Serial.print(" ");
- Serial.print(pitch);
- Serial.print(" ");
- Serial.println(roll);
-
-
- //增加以前的时间,所以我们保持适当的速度
- microsPrevious = microsPrevious + microsPerReading;
- }
- delay(30);
- LR = heading;
- UD = roll; //这里放的时候改了一下 roll 和 pitch都可以
- if (UD <= 0)
- {
- UD = 90 + 0 - UD;
- }
- else
- {
- UD = 90 - UD;
- }
- if (LR >= 90 && LR <= 270)
- {
- LR = LR - 90;
- }
- else
- {
- if (LR < 90)
- {
- LR = 0;
- }
- else
- {
- LR = 270;
- }
- }
-
- Serial.print(" ");
- Serial.print(LR);
- Serial.print(" ");
- Serial.println(UD);
- /*失败的蓝牙部分
- while (BLESerial.operator bool()) {
- digitalWrite(13, HIGH);
- while (Serial.available()) {
- BLESerial.write(LR);
- BLESerial.write(UD);
- }
- }
- digitalWrite(13, LOW);
- */
- myservoLR.write(LR);
- myservoUD.write(UD);
- delay(15);
- }
-
- //加速度计范围
- float convertRawAcceleration(int aRaw) {
- float a = (aRaw * 2.0) / 32768.0;
- return a;
- }
- //陀螺仪范围
- float convertRawGyro(int gRaw) {
- float g = (gRaw * 250.0) / 32768.0;
- return g;
- }
复制代码
库:#include <CurieIMU.h>安装101的那个板后就会有
#include <Servo.h>舵机库,貌似IDE自带
#include <MadgwickAHRS.h> 先打开Arduino IDE,然后依次点击Sketch -> Include Library -> Manage Libraries"。接着搜索'Madgwick'这个名字 ,就找到这个库了,安装即可。
|