本帖最后由 JUESHANZHE 于 2017-10-24 12:39 编辑
项目简介
(1)通过Arduino驱动九轴加速度传感器(三轴陀螺仪 + 三轴加速度+三轴磁场),分别采集加速度值、陀螺仪值、磁力计值。
(2)采用2.4G模块,与Arduino、NanoPi NEO Plus2之间通过串口通信。
(3)NanoPi NEO Plus2进行数据的处理,并通过微信发出预警。
预设环境
假设你的电脑上已经安装好ArduinoIDE,NanoPi NEO Plus2已经安装好linux系统。
需要工具和材料
Arduino开发板、一对2.4G模块、九轴加速度传感器、至少一个u***转ttl、NanoPi NEO Plus2。
步骤一:在电脑上测试Arduino正常读取数据连接方式:Arduino连接电脑u***口(一般会自己安装驱动)、九轴加速度传感器和Arduino连接是(5V->5V、GND->GND、SDA->A4、SCL->A5)
烧写代码:这里做了很大的阉割,数据只上传融合姿态的矢量,陀螺仪、加速度、磁力的数据都没有上传,相应的库也注释了很多。 图片来自CSDN--博主BerMaker的博客pitch yaw roll是什么
- #include
- #include "I2Cdev.h"
- #include "RTIMUSettings.h"
- #include "RTIMU.h"
- #include "RTFusionRTQF.h"
- #include "CalLib.h"
- #include
- RTIMU *imu; // the IMU object
- RTFusionRTQF fusion; // the fusion object
- RTIMUSettings settings; // the settings object
- // DISPLAY_INTERVAL sets the rate at which results are displayed
- #define DISPLAY_INTERVAL 300 // interval between pose displays
- // SERIAL_PORT_SPEED defines the speed to use for the debug serial port
- #define SERIAL_PORT_SPEED 9600
- unsigned long lastDisplay;
- unsigned long lastRate;
- int sampleCount;
- void setup()
- {
- int errcode;
- pinMode(A3,INPUT);
- Serial.begin(SERIAL_PORT_SPEED);
- Wire.begin();
- imu = RTIMU::createIMU(&settings); // create the imu object
- Serial.print("ArduinoIMU starting using device "); Serial.println(imu->IMUName());
- if ((errcode = imu->IMUInit()) < 0) {
- Serial.print("Failed to init IMU: "); Serial.println(errcode);
- }
- if (imu->getCalibrationValid())
- Serial.println("Using compass calibration");
- else
- Serial.println("No valid compass calibration data");
- lastDisplay = lastRate = millis();
- sampleCount = 0;
-
- // use of sensors in the fusion algorithm can be controlled here
- // change any of these to false to disable that sensor
- fusion.setGyroEnable(true);
- fusion.setAccelEnable(true);
- fusion.setCompassEnable(true);
- }
- void loop()
- {
- unsigned long now = millis();
- unsigned long delta;
- double Accel,fused;
- double num;
- char k;
- if (imu->IMURead()) { // get the latest data if ready yet
- fusion.newIMUData(imu->getGyro(), imu->getAccel(), imu->getCompass(), imu->getTimestamp());
- sampleCount++;
- if ((delta = now - lastRate) >= 1000) {
- if (imu->IMUGyroBiasValid())
- sampleCount = 0;
- lastRate = now;
- }
- if ((now - lastDisplay) >= DISPLAY_INTERVAL) {
- lastDisplay = now;
- // Serial.print("tuoluoyi");
- // RTMath::display("", (RTVector3&)imu->getGyro()); // gyro data 陀螺仪(角加速度,单位°/S)
- // Serial.print(",");
- #Accel=RTMath::display("", (RTVector3&)imu->getAccel()); // accel data 加速度(直线加速度,单位g)
- fused=RTMath::displayRollPitchYaw("", (RTVector3&)fusion.getFusionPose()); // fused output 融合姿态输出
- //if(analogRead(A3)>0)
- //{
- Serial.println(Accel); //输出融合姿态
- //}
- // Serial.print(",");
- // RTMath::display("", (RTVector3&)imu->getCompass()); // compass data 磁力计(轴磁场强度,单位uT)
- // Serial.println(analogRead(A3));
- }
- }
- }
复制代码
注意:我修改了库RTIMULib的RMath.cpp的输出函数,使得程序最后输出的是pitch yaw roll的矢量(未经修改的库和相应的资料)
修改了部分代码 测试结果:(拿起来的时候使劲摇了一下)
步骤二:测试Arduino和NanoPi NEO Plus2之间的 通信 启动NanoPi:Nanopi NEO Plus2要连接wifi,2.4G模块和u***转ttl连接(5v->5V,Gnd->Gnd,Tx->Rx,Rx->Tx) 插到u***口之后,查看是否识别 安装minicom并配置, 在主菜单的第三项Serial Port Setup,进入下一级菜单,根据菜单项的提示字母选择,按A将串口设备修改为 /dev/ttyAMA0 ,按E将波特率修改为9600,设置好以后返回主菜单,选择Save Setup as Dfl .
- sudo apt-get install minicom
复制代码
测试代码:
- import serial
- ser=serial.Serial("/dev/USB0",9600,timeout=5)
- try:
- while 1:
- response=ser.readall()
- print(response) #python3 python2 print response
- except:
- ser.close() #今天先到此未知,后半部随后奉上
复制代码
|