功能
- 通过指南针模块反馈保持直行
- 碰到障碍物时掉头
- 掉头后保持直行
- 返回到起始点
器件清单
- 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 会控制船舵偏向,从而达到控制船身前进方向的效果。