使用ardunio nano 开发自动小船


功能

  • 通过指南针模块反馈保持直行
  • 碰到障碍物时掉头
  • 掉头后保持直行
  • 返回到起始点

器件清单

  • Arduino Nano x 1;
  • Boat cover x 1;
  • Battery case x 1;
  • 1.5v Battery x 4;
  • Breadboard x 1;
  • LSM303 3 Axis Digital Compass sensor;
  • Z6322 Ultrasonic Distance Sensor;
  • Eletric motor x2 ;

硬件设置

程序逻辑

指南针模块的读取:

要将microTesla读数转换为0-360度指南针航向,需要使用atan2()函数计算由Y和X轴读数定义的矢量的角度。结果将以弧度为单位,因此我们乘以180度,然后除以Pi以将其转换为度。同时加上360度将范围定在0到360度之间。

float compassRead(float heading){
  /* Get a new sensor event */ 
  sensors_event_t   event; 
  mag.getEvent(&event);
  
  float Pi = 3.14159;
  
  // Calculate the angle of the vector y,x
  heading = (atan2(event.magnetic.y,event.magnetic.x) * 180) / Pi;// 计算arctan(x,y)
  
  // Normalize to 0-360
  if (heading < 0)
  {
    heading = 360 + heading;
  }
  return heading;
}

超声波距离传感器模块的读取:

给Trig发送一个低高低的短时间脉冲,触发测距,存储回波等待时间,pulseIn函数会等待引脚变为HIGH,开始计算时间,再等待变为LOW并停止计时,等待返回脉冲的长度。

声速是:340m/1s 换算成 34000cm / 1000000μs => 34 / 1000
因为发送到接收,实际是相同距离走了2回,所以要除以2
距离(厘米) = (回波时间 * (34 / 1000)) / 2
简化后的计算公式为 (回波时间 * 17)/ 1000 cm

void distance(){
  digitalWrite(Trig, LOW); 
  delayMicroseconds(2);    
  digitalWrite(Trig,HIGH); 
  delayMicroseconds(10);    
  digitalWrite(Trig, LOW); 
  
  temp = float(pulseIn(Echo, HIGH)); 
  //calculte the time between HIGH to LOW
  
  
  //34000cm / 1000000μs => 34 / 1000
  //
  //distance(cm)  =  (temp * (34 / 1000)) / 2
  // (temp * 17)/ 1000
  
  cm = (temp * 17 )/1000; //transfer to cm
}

servo转向角度:

转向角度=初始角度-实时角度
特殊情况1:
船身角度330°转到30°,转向角度=实时角度-初始角度:30°-330°+360° = 60°
Servo偏向等于90°+60°=150°
特殊情况2:
船身角度30°转到330°,转向角度=初始角度-实时角度:30°-330°+360° = 60°
Servo偏向等于90°-60° = 30°

    turnAngle = int(init_angle)-int(angle);
    if(turnAngle>180){
      turnAngle = int(angle)-int(init_angle)+360;
      servoValue = 90+turnAngle;
    }
    else if(turnAngle<=-180){
       turnAngle+=360;
       servoValue = 90-turnAngle;
    }
    else if(turnAngle>-180&&turnAngle<180)
    {
      servoValue = 90-turnAngle;
    }

servo 会控制船舵偏向,从而达到控制船身前进方向的效果。

项目地址: https://github.com/Dennis174698/auto_boat


评论
 Previous
使用Dijkstra算法,MPI并行编程解决全源最短路径问题(All-Pairs Shortest Paths Problem) 使用Dijkstra算法,MPI并行编程解决全源最短路径问题(All-Pairs Shortest Paths Problem)
该项目的目标是设计并行算法,并使用Dijkstra算法来解决全源最短路径问题(All-Pairs Shortest Paths Problem) 。 Dijkstra算法mpi 全源最短路径问题: 确定给定图中每对顶点之间
2019-10-24
Next 
slitherlink puzzle game slitherlink puzzle game
slitherlink slitherlink game: 数回:游戏由0,1,2,3四个数字组成。每一个数字,代表四周划线的数目,并在最后成为一个不间断 、不分岔的回路。 把点与点以直线和横线相连,使之成为一个回路,且只能有
2019-05-15
  TOC