ShareIdeas

本博客不再更新,欢迎访问我的github,https://github.com/sunke-github/

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

  使用Processing 软件, 通过 arduino 输入 电子罗盘的数据,通过PC端进行校准,程序如下:

 

import processing.serial.*;

Serial myPort;
ArrayList<Float> xList = new ArrayList<Float>();
ArrayList<Float> yList = new ArrayList<Float>();
ArrayList<Float> zList = new ArrayList<Float>();

float minX,maxX;
float minY,maxY;
float minZ,maxZ;
float moX,moY;
float count;

void setup() {
  size(600, 600, P3D);
  myPort = new Serial(this,"COM5", 38400);
  myPort.bufferUntil(10);
}

void draw() { 
  background(100); 
  float midX = (minX+maxX)/2;
  float midY = (minY+maxY)/2;
  float midZ = (minZ+maxZ)/2;
  if (mousePressed) {
    moX= mouseX;
    moY= mouseY;
  }
  
  //camera(moX,moY, (height/2) / tan(PI/5), midX, midY,midZ, 0, 1, 0);
  camera(moX,moY,(height/2) / tan(PI/5), width/2, height/2,0, 0, 1, 0);
  translate(width/2, height/2, -100);
  strokeWeight(2);  // Default 
  stroke(255);
  noFill();
 
 
  //x
  line(midX-100,midY,midZ,midX+100,midY,midZ);
  //y
  line(midX,midY+100,midZ,midX,midY-100,midZ);
  //z
  line(midX,midY,midZ-100,midX,midY,midZ+100);
  
  //box(200);
 
  for(int i = 0;i<xList.size();i++){
    point(xList.get(i),yList.get(i),zList.get(i));
  }
  println(count);
  println("midX:"+midX+","+"midY"+midY+","+"midZ:"+midZ);
  
}


void serialEvent (Serial myPort)
{
  
  float mX = 0;
  float mY = 0;
  float mZ = 0;
  String inString = myPort.readStringUntil(10);

 

  if (inString != null)
  {
   inString = trim(inString);
   String[] list = split(inString, ',');
   if(list.length ==4){
     count = float(list[0]);
     mX  = float(list[1])/100;
     mY  = float(list[2])/100;
     mZ  = float(list[3])/100;
     
     //-------------------------
     if(mX < minX){
       minX = mX;
     }
 
     if(mX > maxX){
       maxX = mX;
     }
 
     //----------------------------
     if(mY < minY){
       minY = mY;
     }
     
     if(mY > maxY){
       maxY = mY;
     }
     //----------------------------
     if(mZ > maxZ){
       maxZ = mZ;
     }
     if(mZ < minZ){
       minZ = mZ;
     }
     
      
     xList.add(mX);
     yList.add(mY);
     zList.add(mZ); 
   } 

  }
}

  

 

 

 

arduino 代码如下:

   int mx,my,mz;
   : 
   :
   :  略

    Serial.print(count);  
    Serial.print(",");    
    Serial.print(mx);  //Inclination X axis (as measured by accelerometer)
    Serial.print(",");
    Serial.print(my);  //Inclination X axis (estimated / filtered)
    Serial.print(",");
    Serial.print(mz);  //Inclination X axis (estimated / filtered)
    
    Serial.println("");
    count++;

  

PC端获取的效果如下图:

 

 

最终坐标系完全落入球内表示校准成功.

 

 

视频:

 

 

posted on 2016-04-17 22:55  ShareIdeas  阅读(5758)  评论(3编辑  收藏  举报