查看: 3246|回复: 3

基于curienano的随动摄像头(求精)

[复制链接]
  • TA的每日心情
    慵懒
    2017-12-1 15:28
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    发表于 2017-6-16 22:14 | 显示全部楼层 |阅读模式
    本帖最后由 422234 于 2017-6-16 22:16 编辑

    论坛的图片限制居然是1M 1M!!!!好绝望
    随动云台的原理是用CurieNano采集角度数据,然后发给云台舵机,使舵机可以随着控制板的运动而运动。
    接线图


    D7是左右 D8是上下     PS画的很丑,没元件资源
    材料清单
    CurieNano*1
    舵机*2(也可加第三轴)
    舵机云台架*1
    bluno*1(还没调好,备用)

    这个主要是控制云台的,云台上的东西你们随便搭吧,什么摄像头,机枪之类的
    效果


    摄像头视角


    最大的问题是不能无线传数据,本来想着用CurieNano的BLE和BLUNO蓝牙通讯,然后用BLUNO控制舵机的,但是CurieNano的BLE和BLUNO怎么也调不好卡了好几天

    左右角度会漂,如果左右移动太快的画角度会漂。。。。。其他两轴不漂。还没滤波,有点抖动,等有时间滤一下波,让小角度变化不会输出。

    这次的东西只用了六个轴,将 加速度计和陀螺仪的数据融合,用的是MadgwickAHRS库还没做到9轴融合,正在学习卡尔曼滤波,努力将九轴数据融合,现在先放上来让大家解解馋,也希望大神解决后可以分享方法!!!

    分享加速度计和陀螺仪的原理和融合资料:http://blog.csdn.net/bbzz2/article/details/51354267

    代码:
    [mw_shl_code=cpp,true]/*
    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;
    }[/mw_shl_code]
    库:#include <CurieIMU.h>安装101的那个板后就会有
    #include <Servo.h>舵机库,貌似IDE自带
    #include <MadgwickAHRS.h> 先打开Arduino IDE,然后依次点击Sketch -> Include Library -> Manage Libraries"。接着搜索'Madgwick'这个名字 ,就找到这个库了,安装即可
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

    发表于 2017-6-16 22:30 | 显示全部楼层
    你什么图啊?图片打开,然后QQ截图下,肯定小于1M吧gif不如传视频了
  • TA的每日心情
    慵懒
    2017-12-1 15:28
  • 签到天数: 12 天

    [LV.3]偶尔看看II

     楼主| 发表于 2017-6-17 12:37 | 显示全部楼层
    奈何col 发表于 2017-6-16 22:30
    你什么图啊?图片打开,然后QQ截图下,肯定小于1M吧gif不如传视频了

    视频给删了
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    5分钟带你快速了解新一代开发板:M5STACK
    5分钟带你快速了解新一代
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    创客火首发无人机编队套装,开启不一样的人工智能教育
    创客火首发无人机编队套装
    2017年国务院发布《新一代人工智能发展规划》,提出要广泛开展人工智能科普活动,在中
    这个F()函数是做什么的?
    这个F()函数是做什么的
    如图上,在看代码的时候,发现了这么一个函数,然后后面又一行英文注释。 我用有道翻
    隔离论坛在搞一个开源的arduino墨水屏,值得入手吗?
    隔离论坛在搞一个开源的ar
    amobbs论坛出来了一个众筹的arduino的墨水屏终端,100多块钱,有大神加入了吗? 看着
    两轮自平衡小车的线性CCD循迹总结
    两轮自平衡小车的线性CCD
    继之前的两轮自平衡小车的制作总结(https://www.arduino.cn/thread-99011-1-1.html)
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表